diff options
Diffstat (limited to 'java')
1484 files changed, 83792 insertions, 40536 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 031d62e0c..ab9b13eb5 100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -18,7 +18,7 @@ coreApp="true" package="com.android.inputmethod.latin"> - <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> + <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> @@ -32,9 +32,10 @@ <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> <application android:label="@string/english_ime_name" - android:icon="@mipmap/ic_launcher_keyboard" + android:icon="@drawable/ic_launcher_keyboard" android:killAfterRestore="false" - android:supportsRtl="true"> + android:supportsRtl="true" + android:allowBackup="true"> <service android:name="LatinIME" android:label="@string/english_ime_name" @@ -56,8 +57,9 @@ </service> <activity android:name=".setup.SetupActivity" + android:theme="@style/platformActivityTheme" android:label="@string/english_ime_name" - android:icon="@mipmap/ic_launcher_keyboard" + android:icon="@drawable/ic_launcher_keyboard" android:launchMode="singleTask" android:noHistory="true"> <intent-filter> @@ -67,6 +69,7 @@ </activity> <activity android:name=".setup.SetupWizardActivity" + android:theme="@style/platformActivityTheme" android:label="@string/english_ime_name" android:clearTaskOnLaunch="true"> <intent-filter> @@ -74,7 +77,7 @@ </intent-filter> </activity> - <receiver android:name=".setup.LauncherIconVisibilityManager"> + <receiver android:name="SystemBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> @@ -83,6 +86,7 @@ </receiver> <activity android:name=".settings.SettingsActivity" + android:theme="@style/platformActivityTheme" android:label="@string/english_ime_settings" android:uiOptions="splitActionBarWhenNarrow"> <intent-filter> @@ -91,6 +95,7 @@ </activity> <activity android:name=".spellcheck.SpellCheckerSettingsActivity" + android:theme="@style/platformActivityTheme" android:label="@string/android_spell_checker_settings"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -98,6 +103,7 @@ </activity> <activity android:name=".settings.DebugSettingsActivity" + android:theme="@style/platformActivityTheme" android:label="@string/english_ime_debug_settings"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -110,13 +116,14 @@ </intent-filter> </receiver> - <receiver android:name=".personalization.DictionaryDecayBroadcastReciever"> + <receiver android:name=".personalization.DictionaryDecayBroadcastReciever" + android:exported="false"> <intent-filter> <action android:name="com.android.inputmethod.latin.personalization.DICT_DECAY" /> </intent-filter> </receiver> - <receiver android:name=".DictionaryPackInstallBroadcastReceiver"> + <receiver android:name=".DictionaryPackInstallBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.android.inputmethod.dictionarypack.aosp.UNKNOWN_CLIENT" /> </intent-filter> @@ -143,8 +150,8 @@ </receiver> <activity android:name="com.android.inputmethod.dictionarypack.DictionarySettingsActivity" + android:theme="@style/platformActivityTheme" android:label="@string/dictionary_settings_title" - android:theme="@android:style/Theme.Holo" android:uiOptions="splitActionBarWhenNarrow"> <intent-filter> <action android:name="android.intent.action.MAIN"/> @@ -152,8 +159,8 @@ </activity> <activity android:name="com.android.inputmethod.dictionarypack.DownloadOverMeteredDialog" - android:label="@string/dictionary_install_over_metered_network_prompt" - android:theme="@android:style/Theme.Holo"> + android:theme="@style/platformActivityTheme" + android:label="@string/dictionary_install_over_metered_network_prompt"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> diff --git a/java/proguard.flags b/java/proguard.flags index c08a968bc..35b3ac3d3 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -14,3 +14,11 @@ -keepclassmembers class * { native <methods>; } + +# Keep classes that are used as a parameter type of methods that are also marked as keep +# to preserve changing those methods' signature. +-keep class com.android.inputmethod.latin.AssetFileAddress +-keep class com.android.inputmethod.latin.Dictionary +-keep class com.android.inputmethod.latin.PrevWordsInfo +-keep class com.android.inputmethod.latin.makedict.ProbabilityInfo +-keep class com.android.inputmethod.latin.utils.LanguageModelParam diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_active_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_ics_dark.9.png Binary files differindex 9aa8db60e..9aa8db60e 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_active_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_active_ics_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_active_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_klp_dark.9.png Binary files differindex fa2cb8542..fa2cb8542 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_active_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_active_klp_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..82e850c6b --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_active_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..e2b9e3d9c --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png Binary files differdeleted file mode 100644 index bc130cab6..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png Binary files differdeleted file mode 100644 index 43099899c..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png Binary files differdeleted file mode 100644 index 2d1acf22f..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png Binary files differdeleted file mode 100644 index af5ea6bd2..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png Binary files differdeleted file mode 100644 index 3e25a9817..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png Binary files differdeleted file mode 100644 index fc7ba2aeb..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png Binary files differdeleted file mode 100644 index 005c4e498..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_normal.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png Binary files differdeleted file mode 100644 index 9a07acd91..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_popup_selected.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png Binary files differdeleted file mode 100644 index be420a7af..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png Binary files differdeleted file mode 100644 index 3e25180f0..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_holo_dark.9.png Binary files differindex fa2cb8542..fa2cb8542 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_holo.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_holo_dark.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_normal_holo_light.9.png Binary files differindex 6da273b09..6da273b09 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_normal_holo.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_holo_light.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png Binary files differdeleted file mode 100644 index bad360f77..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_holo_dark.9.png Binary files differindex b1af23b6c..b1af23b6c 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_off_holo.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_holo_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..2e6489cf5 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_off_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png Binary files differdeleted file mode 100644 index 49f519860..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_ics_dark.9.png Binary files differindex 9f4587b4a..9f4587b4a 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_ics_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_klp_dark.9.png Binary files differindex 814e40235..814e40235 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_normal_on_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_klp_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..0b1482281 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_normal_on_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png Binary files differdeleted file mode 100644 index e784eddf8..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_ics_dark.9.png Binary files differindex 7ec33dd20..7ec33dd20 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_ics_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_ics_light.9.png Binary files differindex 5612c51a1..5612c51a1 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_ics_light.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_klp_dark.9.png Binary files differindex 90abe3940..90abe3940 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_klp_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_klp_light.9.png Binary files differindex 6768241a7..6768241a7 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_light_pressed_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_klp_light.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png Binary files differdeleted file mode 100644 index a4731cf1a..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_ics_dark.9.png Binary files differindex 655bc01b1..655bc01b1 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_ics_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_klp_dark.9.png Binary files differindex 48eeb3f54..48eeb3f54 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_off_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_klp_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..4bf38fc35 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png Binary files differdeleted file mode 100644 index 03e163c9c..000000000 --- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_ics.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_ics_dark.9.png Binary files differindex 138e915d9..138e915d9 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_ics.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_ics_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_klp.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_klp_dark.9.png Binary files differindex 71e0683cd..71e0683cd 100644 --- a/java/res/drawable-hdpi/btn_keyboard_key_dark_pressed_on_klp.9.png +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_klp_dark.9.png diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..ea12c7776 --- /dev/null +++ b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/btn_suggestion_pressed.9.png b/java/res/drawable-hdpi/btn_suggestion_pressed.9.png Binary files differdeleted file mode 100644 index 7acceaee7..000000000 --- a/java/res/drawable-hdpi/btn_suggestion_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/emoji_category_tab_selected_ics.9.png b/java/res/drawable-hdpi/emoji_category_tab_selected_ics.9.png Binary files differnew file mode 100644 index 000000000..9138cef9c --- /dev/null +++ b/java/res/drawable-hdpi/emoji_category_tab_selected_ics.9.png diff --git a/java/res/drawable-hdpi/emoji_category_tab_selected_klp.9.png b/java/res/drawable-hdpi/emoji_category_tab_selected_klp.9.png Binary files differnew file mode 100644 index 000000000..345d05e9d --- /dev/null +++ b/java/res/drawable-hdpi/emoji_category_tab_selected_klp.9.png diff --git a/java/res/drawable-hdpi/tab_unselected.9.png b/java/res/drawable-hdpi/emoji_category_tab_unselected_holo_dark.9.png Binary files differindex bbcfb2c64..bbcfb2c64 100644 --- a/java/res/drawable-hdpi/tab_unselected.9.png +++ b/java/res/drawable-hdpi/emoji_category_tab_unselected_holo_dark.9.png diff --git a/java/res/drawable-hdpi/ic_emoji_emoticons_activated_holo_dark.png b/java/res/drawable-hdpi/ic_emoji_emoticons_activated_holo_dark.png Binary files differnew file mode 100644 index 000000000..1c937c9ef --- /dev/null +++ b/java/res/drawable-hdpi/ic_emoji_emoticons_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_emoticons_normal_holo_dark.png b/java/res/drawable-hdpi/ic_emoji_emoticons_normal_holo_dark.png Binary files differnew file mode 100644 index 000000000..3508d242a --- /dev/null +++ b/java/res/drawable-hdpi/ic_emoji_emoticons_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_nature_light_activated.png b/java/res/drawable-hdpi/ic_emoji_nature_activated_holo_dark.png Binary files differindex 5525df2f7..5525df2f7 100644 --- a/java/res/drawable-hdpi/ic_emoji_nature_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_nature_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_nature_light_normal.png b/java/res/drawable-hdpi/ic_emoji_nature_normal_holo_dark.png Binary files differindex 34e16b9de..34e16b9de 100644 --- a/java/res/drawable-hdpi/ic_emoji_nature_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_nature_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_objects_light_activated.png b/java/res/drawable-hdpi/ic_emoji_objects_activated_holo_dark.png Binary files differindex c3c7ec1b8..c3c7ec1b8 100644 --- a/java/res/drawable-hdpi/ic_emoji_objects_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_objects_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_objects_light_normal.png b/java/res/drawable-hdpi/ic_emoji_objects_normal_holo_dark.png Binary files differindex f012d7707..f012d7707 100644 --- a/java/res/drawable-hdpi/ic_emoji_objects_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_objects_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_people_light_activated.png b/java/res/drawable-hdpi/ic_emoji_people_activated_holo_dark.png Binary files differindex cfacbc2e7..cfacbc2e7 100644 --- a/java/res/drawable-hdpi/ic_emoji_people_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_people_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_people_light_normal.png b/java/res/drawable-hdpi/ic_emoji_people_normal_holo_dark.png Binary files differindex c54dbc1f5..c54dbc1f5 100644 --- a/java/res/drawable-hdpi/ic_emoji_people_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_people_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_places_light_activated.png b/java/res/drawable-hdpi/ic_emoji_places_activated_holo_dark.png Binary files differindex 959dfdfd5..959dfdfd5 100644 --- a/java/res/drawable-hdpi/ic_emoji_places_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_places_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_places_light_normal.png b/java/res/drawable-hdpi/ic_emoji_places_normal_holo_dark.png Binary files differindex fc0d9711d..fc0d9711d 100644 --- a/java/res/drawable-hdpi/ic_emoji_places_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_places_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_recent_light_activated.png b/java/res/drawable-hdpi/ic_emoji_recents_activated_holo_dark.png Binary files differindex de570a185..de570a185 100644 --- a/java/res/drawable-hdpi/ic_emoji_recent_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_recents_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_recent_light_normal.png b/java/res/drawable-hdpi/ic_emoji_recents_normal_holo_dark.png Binary files differindex b2562088d..b2562088d 100644 --- a/java/res/drawable-hdpi/ic_emoji_recent_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_recents_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_symbols_light_activated.png b/java/res/drawable-hdpi/ic_emoji_symbols_activated_holo_dark.png Binary files differindex af1fd27ec..af1fd27ec 100644 --- a/java/res/drawable-hdpi/ic_emoji_symbols_light_activated.png +++ b/java/res/drawable-hdpi/ic_emoji_symbols_activated_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_emoji_symbols_light_normal.png b/java/res/drawable-hdpi/ic_emoji_symbols_normal_holo_dark.png Binary files differindex 02b84d51b..02b84d51b 100644 --- a/java/res/drawable-hdpi/ic_emoji_symbols_light_normal.png +++ b/java/res/drawable-hdpi/ic_emoji_symbols_normal_holo_dark.png diff --git a/java/res/drawable-hdpi/ic_launcher_keyboard.png b/java/res/drawable-hdpi/ic_launcher_keyboard.png Binary files differnew file mode 100644 index 000000000..7ae00ed3f --- /dev/null +++ b/java/res/drawable-hdpi/ic_launcher_keyboard.png diff --git a/java/res/drawable-hdpi/ic_subtype_mic_dark.png b/java/res/drawable-hdpi/ic_subtype_mic_dark.png Binary files differdeleted file mode 100644 index eacbcd255..000000000 --- a/java/res/drawable-hdpi/ic_subtype_mic_dark.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_background_gb.9.png b/java/res/drawable-hdpi/keyboard_background_gb.9.png Binary files differdeleted file mode 100644 index fa3d449f7..000000000 --- a/java/res/drawable-hdpi/keyboard_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_klp.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_klp.9.png Binary files differindex 50ed568ff..be394151a 100644 --- a/java/res/drawable-hdpi/keyboard_key_feedback_background_klp.9.png +++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_klp.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..9d6514bdd --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_background_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..8ad54f69d --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_key_feedback_more_background_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_gb.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_gb.9.png Binary files differdeleted file mode 100644 index baff80950..000000000 --- a/java/res/drawable-hdpi/keyboard_popup_panel_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..f9dd3b8b1 --- /dev/null +++ b/java/res/drawable-hdpi/keyboard_popup_panel_background_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/keyboard_suggest_strip_gb.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip_gb.9.png Binary files differdeleted file mode 100644 index 7cab5a899..000000000 --- a/java/res/drawable-hdpi/keyboard_suggest_strip_gb.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png Binary files differnew file mode 100644 index 000000000..5f5eb3fe7 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_delete_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_done_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_done_lxx_dark.png Binary files differnew file mode 100644 index 000000000..f81130d1a --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_done_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png Binary files differindex d75fcacd5..d85663bf3 100644 --- a/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png +++ b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png diff --git a/java/res/drawable-hdpi/sym_keyboard_go_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_go_lxx_dark.png Binary files differnew file mode 100644 index 000000000..516a7f1c7 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_go_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png Binary files differnew file mode 100644 index 000000000..edf9a20de --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_language_switch_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_mic_holo_dark.png b/java/res/drawable-hdpi/sym_keyboard_mic_holo_dark.png Binary files differdeleted file mode 100644 index 3c5469403..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_mic_holo_dark.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_next_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_next_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8a88a90d7 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_next_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_previous_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_previous_lxx_dark.png Binary files differnew file mode 100644 index 000000000..ee804abce --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_previous_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_return_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_return_lxx_dark.png Binary files differnew file mode 100644 index 000000000..6ab33a76d --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_return_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_search_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_search_lxx_dark.png Binary files differnew file mode 100644 index 000000000..de117d35b --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_search_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_send_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_send_lxx_dark.png Binary files differnew file mode 100644 index 000000000..52feef04c --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_send_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_holo_dark.png b/java/res/drawable-hdpi/sym_keyboard_settings_holo_dark.png Binary files differindex 5af09ad8c..2ea4a74a5 100644 --- a/java/res/drawable-hdpi/sym_keyboard_settings_holo_dark.png +++ b/java/res/drawable-hdpi/sym_keyboard_settings_holo_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png Binary files differnew file mode 100644 index 000000000..f2613023f --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_settings_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_dark.png Binary files differnew file mode 100644 index 000000000..ef6b19efe --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_shift_locked_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png Binary files differnew file mode 100644 index 000000000..cb03e55a8 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_shift_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png Binary files differnew file mode 100644 index 000000000..3999d1e2d --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_smiley_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_space.png b/java/res/drawable-hdpi/sym_keyboard_space.png Binary files differindex 780733ec5..78cd6b7bf 100644 --- a/java/res/drawable-hdpi/sym_keyboard_space.png +++ b/java/res/drawable-hdpi/sym_keyboard_space.png diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led_gb.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led_gb.9.png Binary files differdeleted file mode 100644 index c76f64b94..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_space_led_gb.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led_holo.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led_holo.9.png Binary files differdeleted file mode 100644 index 34a1ebde2..000000000 --- a/java/res/drawable-hdpi/sym_keyboard_space_led_holo.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..f344deeec --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_spacebar_lxx_dark.9.png diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png Binary files differnew file mode 100644 index 000000000..6b68c8af5 --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_voice_lxx_dark.png diff --git a/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png Binary files differnew file mode 100644 index 000000000..e67697b3f --- /dev/null +++ b/java/res/drawable-hdpi/sym_keyboard_voice_off_lxx_dark.png diff --git a/java/res/drawable-hdpi/tab_selected.9.png b/java/res/drawable-hdpi/tab_selected.9.png Binary files differdeleted file mode 100644 index 84e63df17..000000000 --- a/java/res/drawable-hdpi/tab_selected.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_active_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_ics_dark.9.png Binary files differindex e810c7789..e810c7789 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_active_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_active_ics_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_active_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_klp_dark.9.png Binary files differindex 8e9a34957..8e9a34957 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_active_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_active_klp_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..281b5d3bc --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_active_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..eb1564353 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png Binary files differdeleted file mode 100644 index 49329f094..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png Binary files differdeleted file mode 100644 index 46e9db092..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png Binary files differdeleted file mode 100644 index ee60e4864..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed.9.png Binary files differdeleted file mode 100644 index c6876f76e..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off.9.png Binary files differdeleted file mode 100644 index 1f8f318d1..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on.9.png Binary files differdeleted file mode 100644 index 2bb7b64f4..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_normal.9.png Binary files differdeleted file mode 100644 index f5ce40cf6..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_normal.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_popup_selected.9.png Binary files differdeleted file mode 100644 index ca73b9249..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_popup_selected.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_light_pressed.9.png Binary files differdeleted file mode 100644 index 73f2006d4..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png Binary files differdeleted file mode 100644 index 12bc97928..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_holo_dark.9.png Binary files differindex 8e9a34957..8e9a34957 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_holo.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_holo_dark.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_normal_holo_light.9.png Binary files differindex 2915588bf..2915588bf 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_normal_holo.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_holo_light.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png Binary files differdeleted file mode 100644 index 44bd414a1..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_holo_dark.9.png Binary files differindex 58a316fba..58a316fba 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_off_holo.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_holo_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..9f244f2e9 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_off_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png Binary files differdeleted file mode 100644 index 43fdf5b88..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_ics_dark.9.png Binary files differindex f3fc64114..f3fc64114 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_ics_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_klp_dark.9.png Binary files differindex b7b2dca43..b7b2dca43 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_normal_on_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_klp_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..c5b3fbbd7 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_normal_on_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png Binary files differdeleted file mode 100644 index 1c1f3d711..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_ics_dark.9.png Binary files differindex 8f340d355..8f340d355 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_ics_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_ics_light.9.png Binary files differindex c39dd4a94..c39dd4a94 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_ics_light.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_klp_dark.9.png Binary files differindex 4a92b80dd..4a92b80dd 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_klp_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_klp_light.9.png Binary files differindex 049385984..049385984 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_light_pressed_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_klp_light.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png Binary files differdeleted file mode 100644 index dacb675a9..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_ics_dark.9.png Binary files differindex 53ea5f894..53ea5f894 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_ics_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_klp_dark.9.png Binary files differindex 72125a065..72125a065 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_off_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_klp_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..66824cf8e --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png Binary files differdeleted file mode 100644 index 3daa69f31..000000000 --- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_ics.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_ics_dark.9.png Binary files differindex 69c84e7ec..69c84e7ec 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_ics.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_ics_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_klp.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_klp_dark.9.png Binary files differindex 82413d4cc..82413d4cc 100644 --- a/java/res/drawable-mdpi/btn_keyboard_key_dark_pressed_on_klp.9.png +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_klp_dark.9.png diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..527dfd014 --- /dev/null +++ b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/btn_suggestion_pressed.9.png b/java/res/drawable-mdpi/btn_suggestion_pressed.9.png Binary files differdeleted file mode 100644 index 02b4e9a53..000000000 --- a/java/res/drawable-mdpi/btn_suggestion_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/emoji_category_tab_selected_ics.9.png b/java/res/drawable-mdpi/emoji_category_tab_selected_ics.9.png Binary files differnew file mode 100644 index 000000000..1731b46ad --- /dev/null +++ b/java/res/drawable-mdpi/emoji_category_tab_selected_ics.9.png diff --git a/java/res/drawable-mdpi/emoji_category_tab_selected_klp.9.png b/java/res/drawable-mdpi/emoji_category_tab_selected_klp.9.png Binary files differnew file mode 100644 index 000000000..6354b997a --- /dev/null +++ b/java/res/drawable-mdpi/emoji_category_tab_selected_klp.9.png diff --git a/java/res/drawable-mdpi/tab_unselected.9.png b/java/res/drawable-mdpi/emoji_category_tab_unselected_holo_dark.9.png Binary files differindex bb45ab960..bb45ab960 100644 --- a/java/res/drawable-mdpi/tab_unselected.9.png +++ b/java/res/drawable-mdpi/emoji_category_tab_unselected_holo_dark.9.png diff --git a/java/res/drawable-mdpi/ic_emoji_emoticons_activated_holo_dark.png b/java/res/drawable-mdpi/ic_emoji_emoticons_activated_holo_dark.png Binary files differnew file mode 100644 index 000000000..c7394e1b0 --- /dev/null +++ b/java/res/drawable-mdpi/ic_emoji_emoticons_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_emoticons_normal_holo_dark.png b/java/res/drawable-mdpi/ic_emoji_emoticons_normal_holo_dark.png Binary files differnew file mode 100644 index 000000000..eb4dab4c7 --- /dev/null +++ b/java/res/drawable-mdpi/ic_emoji_emoticons_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_nature_light_activated.png b/java/res/drawable-mdpi/ic_emoji_nature_activated_holo_dark.png Binary files differindex d4c8d8da8..d4c8d8da8 100644 --- a/java/res/drawable-mdpi/ic_emoji_nature_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_nature_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_nature_light_normal.png b/java/res/drawable-mdpi/ic_emoji_nature_normal_holo_dark.png Binary files differindex 1555aa7a9..1555aa7a9 100644 --- a/java/res/drawable-mdpi/ic_emoji_nature_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_nature_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_objects_light_activated.png b/java/res/drawable-mdpi/ic_emoji_objects_activated_holo_dark.png Binary files differindex 081dc66c2..081dc66c2 100644 --- a/java/res/drawable-mdpi/ic_emoji_objects_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_objects_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_objects_light_normal.png b/java/res/drawable-mdpi/ic_emoji_objects_normal_holo_dark.png Binary files differindex 58e6f6e75..58e6f6e75 100644 --- a/java/res/drawable-mdpi/ic_emoji_objects_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_objects_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_people_light_activated.png b/java/res/drawable-mdpi/ic_emoji_people_activated_holo_dark.png Binary files differindex 067ad5496..067ad5496 100644 --- a/java/res/drawable-mdpi/ic_emoji_people_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_people_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_people_light_normal.png b/java/res/drawable-mdpi/ic_emoji_people_normal_holo_dark.png Binary files differindex d835d4ec7..d835d4ec7 100644 --- a/java/res/drawable-mdpi/ic_emoji_people_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_people_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_places_light_activated.png b/java/res/drawable-mdpi/ic_emoji_places_activated_holo_dark.png Binary files differindex 1aecec598..1aecec598 100644 --- a/java/res/drawable-mdpi/ic_emoji_places_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_places_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_places_light_normal.png b/java/res/drawable-mdpi/ic_emoji_places_normal_holo_dark.png Binary files differindex c70e484e1..c70e484e1 100644 --- a/java/res/drawable-mdpi/ic_emoji_places_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_places_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_recent_light_activated.png b/java/res/drawable-mdpi/ic_emoji_recents_activated_holo_dark.png Binary files differindex 8009e932f..8009e932f 100644 --- a/java/res/drawable-mdpi/ic_emoji_recent_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_recents_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_recent_light_normal.png b/java/res/drawable-mdpi/ic_emoji_recents_normal_holo_dark.png Binary files differindex c2e598dfb..c2e598dfb 100644 --- a/java/res/drawable-mdpi/ic_emoji_recent_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_recents_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_symbols_light_activated.png b/java/res/drawable-mdpi/ic_emoji_symbols_activated_holo_dark.png Binary files differindex caea87191..caea87191 100644 --- a/java/res/drawable-mdpi/ic_emoji_symbols_light_activated.png +++ b/java/res/drawable-mdpi/ic_emoji_symbols_activated_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_emoji_symbols_light_normal.png b/java/res/drawable-mdpi/ic_emoji_symbols_normal_holo_dark.png Binary files differindex 0edada626..0edada626 100644 --- a/java/res/drawable-mdpi/ic_emoji_symbols_light_normal.png +++ b/java/res/drawable-mdpi/ic_emoji_symbols_normal_holo_dark.png diff --git a/java/res/drawable-mdpi/ic_launcher_keyboard.png b/java/res/drawable-mdpi/ic_launcher_keyboard.png Binary files differnew file mode 100644 index 000000000..cc73f3be1 --- /dev/null +++ b/java/res/drawable-mdpi/ic_launcher_keyboard.png diff --git a/java/res/drawable-mdpi/keyboard_background_gb.9.png b/java/res/drawable-mdpi/keyboard_background_gb.9.png Binary files differdeleted file mode 100644 index 4f81704c4..000000000 --- a/java/res/drawable-mdpi/keyboard_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_klp.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_klp.9.png Binary files differindex 564f5460c..625490b1f 100644 --- a/java/res/drawable-mdpi/keyboard_key_feedback_background_klp.9.png +++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_klp.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..d3200921a --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_background_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..60a36333e --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_key_feedback_more_background_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_gb.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_gb.9.png Binary files differdeleted file mode 100644 index 0d9ab97f0..000000000 --- a/java/res/drawable-mdpi/keyboard_popup_panel_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..896505518 --- /dev/null +++ b/java/res/drawable-mdpi/keyboard_popup_panel_background_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/keyboard_suggest_strip_gb.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip_gb.9.png Binary files differdeleted file mode 100644 index fa6c0feff..000000000 --- a/java/res/drawable-mdpi/keyboard_suggest_strip_gb.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/more_keys_divider.png b/java/res/drawable-mdpi/more_keys_divider.png Binary files differindex a46284f21..0f71c6172 100644 --- a/java/res/drawable-mdpi/more_keys_divider.png +++ b/java/res/drawable-mdpi/more_keys_divider.png diff --git a/java/res/drawable-mdpi/more_suggestions_divider.png b/java/res/drawable-mdpi/more_suggestions_divider.png Binary files differindex a46284f21..0f71c6172 100644 --- a/java/res/drawable-mdpi/more_suggestions_divider.png +++ b/java/res/drawable-mdpi/more_suggestions_divider.png diff --git a/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png Binary files differnew file mode 100644 index 000000000..2d3ac9749 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_delete_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_done_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_done_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8a63c116a --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_done_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-mdpi/sym_keyboard_feedback_tab.png Binary files differindex a10dc8fa2..fee15807c 100644 --- a/java/res/drawable-mdpi/sym_keyboard_feedback_tab.png +++ b/java/res/drawable-mdpi/sym_keyboard_feedback_tab.png diff --git a/java/res/drawable-mdpi/sym_keyboard_go_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_go_lxx_dark.png Binary files differnew file mode 100644 index 000000000..89051722a --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_go_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_label_mic_holo_dark.png b/java/res/drawable-mdpi/sym_keyboard_label_mic_holo_dark.png Binary files differdeleted file mode 100644 index 537f39b02..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_label_mic_holo_dark.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png Binary files differnew file mode 100644 index 000000000..a90bf757c --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_language_switch_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_mic_holo_dark.png b/java/res/drawable-mdpi/sym_keyboard_mic_holo_dark.png Binary files differdeleted file mode 100644 index 5e58866a7..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_mic_holo_dark.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png b/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png Binary files differdeleted file mode 100644 index 84a63dc7f..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_next_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_next_lxx_dark.png Binary files differnew file mode 100644 index 000000000..414cb0d58 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_next_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_previous_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_previous_lxx_dark.png Binary files differnew file mode 100644 index 000000000..40655ca3b --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_previous_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_return_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_return_lxx_dark.png Binary files differnew file mode 100644 index 000000000..d060c89f6 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_return_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_search_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_search_lxx_dark.png Binary files differnew file mode 100644 index 000000000..722d40258 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_search_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_send_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_send_lxx_dark.png Binary files differnew file mode 100644 index 000000000..29dd9defc --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_send_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_holo_dark.png b/java/res/drawable-mdpi/sym_keyboard_settings_holo_dark.png Binary files differindex 36c8c9623..613f4dc88 100644 --- a/java/res/drawable-mdpi/sym_keyboard_settings_holo_dark.png +++ b/java/res/drawable-mdpi/sym_keyboard_settings_holo_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png Binary files differnew file mode 100644 index 000000000..dea7addfe --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_settings_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_dark.png Binary files differnew file mode 100644 index 000000000..c70084339 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_locked_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png Binary files differnew file mode 100644 index 000000000..c10066e81 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_shift_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8276d992c --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_smiley_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_space.png b/java/res/drawable-mdpi/sym_keyboard_space.png Binary files differindex cbe4a88d6..6d03e6347 100644 --- a/java/res/drawable-mdpi/sym_keyboard_space.png +++ b/java/res/drawable-mdpi/sym_keyboard_space.png diff --git a/java/res/drawable-mdpi/sym_keyboard_space_led_gb.9.png b/java/res/drawable-mdpi/sym_keyboard_space_led_gb.9.png Binary files differdeleted file mode 100644 index 1c1ca2cc7..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_space_led_gb.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_space_led_holo.9.png b/java/res/drawable-mdpi/sym_keyboard_space_led_holo.9.png Binary files differdeleted file mode 100644 index abd8b742e..000000000 --- a/java/res/drawable-mdpi/sym_keyboard_space_led_holo.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..ed32cf652 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_spacebar_lxx_dark.9.png diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png Binary files differnew file mode 100644 index 000000000..5661f6b33 --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_voice_lxx_dark.png diff --git a/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png Binary files differnew file mode 100644 index 000000000..5182f1e8f --- /dev/null +++ b/java/res/drawable-mdpi/sym_keyboard_voice_off_lxx_dark.png diff --git a/java/res/drawable-mdpi/tab_selected.9.png b/java/res/drawable-mdpi/tab_selected.9.png Binary files differdeleted file mode 100644 index 4b00f350a..000000000 --- a/java/res/drawable-mdpi/tab_selected.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_active_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_ics_dark.9.png Binary files differindex d990c0258..d990c0258 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_active_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_ics_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_active_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_klp_dark.9.png Binary files differindex a2f6ac0e2..a2f6ac0e2 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_active_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_klp_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..0f6a3e1e0 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..44c84f1f8 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png Binary files differdeleted file mode 100644 index d0090a305..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png Binary files differdeleted file mode 100644 index 2baf7d90c..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png Binary files differdeleted file mode 100644 index 6812f9e8f..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png Binary files differdeleted file mode 100644 index a932249a8..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png Binary files differdeleted file mode 100644 index 16416f000..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png Binary files differdeleted file mode 100644 index 3ca93fdb3..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png Binary files differdeleted file mode 100644 index aa4f44fdd..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png Binary files differdeleted file mode 100644 index 4539255c2..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_popup_selected.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png Binary files differdeleted file mode 100644 index 568392444..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png Binary files differdeleted file mode 100644 index 026005d6f..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_holo_dark.9.png Binary files differindex a2f6ac0e2..a2f6ac0e2 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_holo.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_holo_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_holo_light.9.png Binary files differindex 0ef4a4b5f..0ef4a4b5f 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_normal_holo.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_holo_light.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png Binary files differdeleted file mode 100644 index 38c5f244b..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_holo_dark.9.png Binary files differindex 2f00fc623..2f00fc623 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_off_holo.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_holo_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..98c085b15 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png Binary files differdeleted file mode 100644 index f1223e50e..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_ics_dark.9.png Binary files differindex ab8fb2e86..ab8fb2e86 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_ics_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_klp_dark.9.png Binary files differindex 20251a000..20251a000 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_normal_on_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_klp_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..f0c132869 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png Binary files differdeleted file mode 100644 index ec35db54d..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_ics_dark.9.png Binary files differindex 3871689ef..3871689ef 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_ics_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_ics_light.9.png Binary files differindex c23a4b225..c23a4b225 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_ics_light.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_klp_dark.9.png Binary files differindex 84d173967..84d173967 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_klp_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_klp_light.9.png Binary files differindex f770962c3..f770962c3 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_light_pressed_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_klp_light.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png Binary files differdeleted file mode 100644 index bd30464d6..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_ics_dark.9.png Binary files differindex 912506368..912506368 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_ics_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_klp_dark.9.png Binary files differindex ee4490eac..ee4490eac 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_off_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_klp_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..a2b17ba50 --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png Binary files differdeleted file mode 100644 index a3ff5d1bb..000000000 --- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_ics.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_ics_dark.9.png Binary files differindex 35ce67fdc..35ce67fdc 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_ics.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_ics_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_klp.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_klp_dark.9.png Binary files differindex e8124776c..e8124776c 100644 --- a/java/res/drawable-xhdpi/btn_keyboard_key_dark_pressed_on_klp.9.png +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_klp_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..99ff0affb --- /dev/null +++ b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/btn_suggestion_pressed.9.png b/java/res/drawable-xhdpi/btn_suggestion_pressed.9.png Binary files differdeleted file mode 100644 index 41e126a73..000000000 --- a/java/res/drawable-xhdpi/btn_suggestion_pressed.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/emoji_category_tab_selected_ics.9.png b/java/res/drawable-xhdpi/emoji_category_tab_selected_ics.9.png Binary files differnew file mode 100644 index 000000000..11bc966b0 --- /dev/null +++ b/java/res/drawable-xhdpi/emoji_category_tab_selected_ics.9.png diff --git a/java/res/drawable-xhdpi/emoji_category_tab_selected_klp.9.png b/java/res/drawable-xhdpi/emoji_category_tab_selected_klp.9.png Binary files differnew file mode 100644 index 000000000..5e8549bdd --- /dev/null +++ b/java/res/drawable-xhdpi/emoji_category_tab_selected_klp.9.png diff --git a/java/res/drawable-xhdpi/tab_unselected.9.png b/java/res/drawable-xhdpi/emoji_category_tab_unselected_holo_dark.9.png Binary files differindex 8cede8d5e..8cede8d5e 100644 --- a/java/res/drawable-xhdpi/tab_unselected.9.png +++ b/java/res/drawable-xhdpi/emoji_category_tab_unselected_holo_dark.9.png diff --git a/java/res/drawable-xhdpi/ic_emoji_emoticons_activated_holo_dark.png b/java/res/drawable-xhdpi/ic_emoji_emoticons_activated_holo_dark.png Binary files differnew file mode 100644 index 000000000..997c9b700 --- /dev/null +++ b/java/res/drawable-xhdpi/ic_emoji_emoticons_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_emoticons_normal_holo_dark.png b/java/res/drawable-xhdpi/ic_emoji_emoticons_normal_holo_dark.png Binary files differnew file mode 100644 index 000000000..23a519c5d --- /dev/null +++ b/java/res/drawable-xhdpi/ic_emoji_emoticons_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_nature_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_nature_activated_holo_dark.png Binary files differindex 3e6744343..3e6744343 100644 --- a/java/res/drawable-xhdpi/ic_emoji_nature_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_nature_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_nature_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_nature_normal_holo_dark.png Binary files differindex 5344a9ee9..5344a9ee9 100644 --- a/java/res/drawable-xhdpi/ic_emoji_nature_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_nature_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_objects_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_objects_activated_holo_dark.png Binary files differindex 75695d43d..75695d43d 100644 --- a/java/res/drawable-xhdpi/ic_emoji_objects_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_objects_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_objects_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_objects_normal_holo_dark.png Binary files differindex 2adb186e6..2adb186e6 100644 --- a/java/res/drawable-xhdpi/ic_emoji_objects_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_objects_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_people_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_people_activated_holo_dark.png Binary files differindex e6baa2e59..e6baa2e59 100644 --- a/java/res/drawable-xhdpi/ic_emoji_people_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_people_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_people_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_people_normal_holo_dark.png Binary files differindex c26aa4efb..c26aa4efb 100644 --- a/java/res/drawable-xhdpi/ic_emoji_people_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_people_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_places_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_places_activated_holo_dark.png Binary files differindex eaa3b86cf..eaa3b86cf 100644 --- a/java/res/drawable-xhdpi/ic_emoji_places_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_places_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_places_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_places_normal_holo_dark.png Binary files differindex d6e1eaa35..d6e1eaa35 100644 --- a/java/res/drawable-xhdpi/ic_emoji_places_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_places_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_recent_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_recents_activated_holo_dark.png Binary files differindex 06003b82d..06003b82d 100644 --- a/java/res/drawable-xhdpi/ic_emoji_recent_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_recents_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_recent_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_recents_normal_holo_dark.png Binary files differindex da2effedb..da2effedb 100644 --- a/java/res/drawable-xhdpi/ic_emoji_recent_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_recents_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_symbols_light_activated.png b/java/res/drawable-xhdpi/ic_emoji_symbols_activated_holo_dark.png Binary files differindex 438fde2b4..438fde2b4 100644 --- a/java/res/drawable-xhdpi/ic_emoji_symbols_light_activated.png +++ b/java/res/drawable-xhdpi/ic_emoji_symbols_activated_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_emoji_symbols_light_normal.png b/java/res/drawable-xhdpi/ic_emoji_symbols_normal_holo_dark.png Binary files differindex 757863233..757863233 100644 --- a/java/res/drawable-xhdpi/ic_emoji_symbols_light_normal.png +++ b/java/res/drawable-xhdpi/ic_emoji_symbols_normal_holo_dark.png diff --git a/java/res/drawable-xhdpi/ic_launcher_keyboard.png b/java/res/drawable-xhdpi/ic_launcher_keyboard.png Binary files differnew file mode 100644 index 000000000..f2ac50dfe --- /dev/null +++ b/java/res/drawable-xhdpi/ic_launcher_keyboard.png diff --git a/java/res/drawable-xhdpi/ic_subtype_mic_dark.png b/java/res/drawable-xhdpi/ic_subtype_mic_dark.png Binary files differdeleted file mode 100644 index 17581ba89..000000000 --- a/java/res/drawable-xhdpi/ic_subtype_mic_dark.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/keyboard_background_gb.9.png b/java/res/drawable-xhdpi/keyboard_background_gb.9.png Binary files differdeleted file mode 100644 index 27b7a108c..000000000 --- a/java/res/drawable-xhdpi/keyboard_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_klp.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_klp.9.png Binary files differindex e8c65f677..c211d89c8 100644 --- a/java/res/drawable-xhdpi/keyboard_key_feedback_background_klp.9.png +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_klp.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..d40afebd8 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_background_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..d1a2f7599 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/keyboard_popup_panel_background_gb.9.png b/java/res/drawable-xhdpi/keyboard_popup_panel_background_gb.9.png Binary files differdeleted file mode 100644 index 79f7ab00a..000000000 --- a/java/res/drawable-xhdpi/keyboard_popup_panel_background_gb.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..36df715b6 --- /dev/null +++ b/java/res/drawable-xhdpi/keyboard_popup_panel_background_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/keyboard_suggest_strip_gb.9.png b/java/res/drawable-xhdpi/keyboard_suggest_strip_gb.9.png Binary files differdeleted file mode 100644 index 1b568df03..000000000 --- a/java/res/drawable-xhdpi/keyboard_suggest_strip_gb.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png Binary files differnew file mode 100644 index 000000000..7c9f34f12 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_delete_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_done_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_done_lxx_dark.png Binary files differnew file mode 100644 index 000000000..f25e3dfd9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_done_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png Binary files differindex 0650e01cb..b0ee35d59 100644 --- a/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png +++ b/java/res/drawable-xhdpi/sym_keyboard_feedback_tab.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_go_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_go_lxx_dark.png Binary files differnew file mode 100644 index 000000000..6cd43cf8a --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_go_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png Binary files differnew file mode 100644 index 000000000..f964346c1 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_language_switch_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_mic_holo_dark.png b/java/res/drawable-xhdpi/sym_keyboard_mic_holo_dark.png Binary files differdeleted file mode 100644 index 566ba1fcd..000000000 --- a/java/res/drawable-xhdpi/sym_keyboard_mic_holo_dark.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/sym_keyboard_next_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_next_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8b5b0b4de --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_next_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_dark.png Binary files differnew file mode 100644 index 000000000..9bc4fc81e --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_previous_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_return_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_return_lxx_dark.png Binary files differnew file mode 100644 index 000000000..5d6e6cbf9 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_return_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_search_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_search_lxx_dark.png Binary files differnew file mode 100644 index 000000000..28a4bd329 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_search_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_send_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_send_lxx_dark.png Binary files differnew file mode 100644 index 000000000..4360a4ea1 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_send_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings_holo_dark.png b/java/res/drawable-xhdpi/sym_keyboard_settings_holo_dark.png Binary files differindex 99ee97dbf..15a97394e 100644 --- a/java/res/drawable-xhdpi/sym_keyboard_settings_holo_dark.png +++ b/java/res/drawable-xhdpi/sym_keyboard_settings_holo_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8c83d9fb6 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_settings_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_dark.png Binary files differnew file mode 100644 index 000000000..e329cbc8f --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift_locked_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png Binary files differnew file mode 100644 index 000000000..19acffaeb --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_shift_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png Binary files differnew file mode 100644 index 000000000..78923fadb --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_smiley_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_space.png b/java/res/drawable-xhdpi/sym_keyboard_space.png Binary files differindex 66fc3e9d3..3691280e3 100644 --- a/java/res/drawable-xhdpi/sym_keyboard_space.png +++ b/java/res/drawable-xhdpi/sym_keyboard_space.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_space_led_gb.9.png b/java/res/drawable-xhdpi/sym_keyboard_space_led_gb.9.png Binary files differdeleted file mode 100644 index 6525fefab..000000000 --- a/java/res/drawable-xhdpi/sym_keyboard_space_led_gb.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/sym_keyboard_space_led_holo.9.png b/java/res/drawable-xhdpi/sym_keyboard_space_led_holo.9.png Binary files differdeleted file mode 100644 index ba4e9ec49..000000000 --- a/java/res/drawable-xhdpi/sym_keyboard_space_led_holo.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..71234e570 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_spacebar_lxx_dark.9.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png Binary files differnew file mode 100644 index 000000000..4e9631e7b --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_voice_lxx_dark.png diff --git a/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png Binary files differnew file mode 100644 index 000000000..66c0e3c56 --- /dev/null +++ b/java/res/drawable-xhdpi/sym_keyboard_voice_off_lxx_dark.png diff --git a/java/res/drawable-xhdpi/tab_selected.9.png b/java/res/drawable-xhdpi/tab_selected.9.png Binary files differdeleted file mode 100644 index 95e5f4341..000000000 --- a/java/res/drawable-xhdpi/tab_selected.9.png +++ /dev/null diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_active_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_ics_dark.9.png Binary files differindex 680421eaf..680421eaf 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_active_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_ics_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_active_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_klp_dark.9.png Binary files differindex 17f0a7a58..17f0a7a58 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_active_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_klp_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..dc67c6f19 --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..2e12dd1d4 --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_active_pressed_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_holo.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_holo_dark.9.png Binary files differindex 17f0a7a58..17f0a7a58 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_holo.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_holo_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_light_normal_holo.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_holo_light.9.png Binary files differindex 4ddfdcb6c..4ddfdcb6c 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_light_normal_holo.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_holo_light.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_off_holo.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_holo_dark.9.png Binary files differindex b0e815eb2..b0e815eb2 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_off_holo.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_holo_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..4ec5864c1 --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_off_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_on_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_ics_dark.9.png Binary files differindex 40f5011c0..40f5011c0 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_on_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_ics_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_on_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_klp_dark.9.png Binary files differindex 97f96258e..97f96258e 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_normal_on_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_klp_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..6b5c0c0a4 --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_normal_on_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_ics_dark.9.png Binary files differindex 6ff6319d3..6ff6319d3 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_ics_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_light_pressed_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_ics_light.9.png Binary files differindex 3c17c5eec..3c17c5eec 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_light_pressed_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_ics_light.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_klp_dark.9.png Binary files differindex dfb16a76b..dfb16a76b 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_klp_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_light_pressed_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_klp_light.9.png Binary files differindex 17144b673..17144b673 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_light_pressed_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_klp_light.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_off_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_ics_dark.9.png Binary files differindex 818ea70fd..818ea70fd 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_off_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_ics_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_off_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_klp_dark.9.png Binary files differindex bf1d34686..bf1d34686 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_off_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_klp_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..6fd8eedd3 --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_off_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_on_ics.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_ics_dark.9.png Binary files differindex a476d2a9e..a476d2a9e 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_on_ics.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_ics_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_on_klp.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_klp_dark.9.png Binary files differindex 962277165..962277165 100644 --- a/java/res/drawable-xxhdpi/btn_keyboard_key_dark_pressed_on_klp.9.png +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_klp_dark.9.png diff --git a/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..91322882f --- /dev/null +++ b/java/res/drawable-xxhdpi/btn_keyboard_key_pressed_on_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/emoji_category_tab_selected_ics.9.png b/java/res/drawable-xxhdpi/emoji_category_tab_selected_ics.9.png Binary files differnew file mode 100644 index 000000000..b13ee2b6a --- /dev/null +++ b/java/res/drawable-xxhdpi/emoji_category_tab_selected_ics.9.png diff --git a/java/res/drawable-xxhdpi/emoji_category_tab_selected_klp.9.png b/java/res/drawable-xxhdpi/emoji_category_tab_selected_klp.9.png Binary files differnew file mode 100644 index 000000000..c81e651dd --- /dev/null +++ b/java/res/drawable-xxhdpi/emoji_category_tab_selected_klp.9.png diff --git a/java/res/drawable-xxhdpi/tab_unselected.9.png b/java/res/drawable-xxhdpi/emoji_category_tab_unselected_holo_dark.9.png Binary files differindex 389188695..389188695 100644 --- a/java/res/drawable-xxhdpi/tab_unselected.9.png +++ b/java/res/drawable-xxhdpi/emoji_category_tab_unselected_holo_dark.9.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_emoticons_activated_holo_dark.png b/java/res/drawable-xxhdpi/ic_emoji_emoticons_activated_holo_dark.png Binary files differnew file mode 100644 index 000000000..a217269cb --- /dev/null +++ b/java/res/drawable-xxhdpi/ic_emoji_emoticons_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_emoticons_normal_holo_dark.png b/java/res/drawable-xxhdpi/ic_emoji_emoticons_normal_holo_dark.png Binary files differnew file mode 100644 index 000000000..dfa43cd5b --- /dev/null +++ b/java/res/drawable-xxhdpi/ic_emoji_emoticons_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_nature_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_nature_activated_holo_dark.png Binary files differindex 470fd695c..470fd695c 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_nature_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_nature_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_nature_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_nature_normal_holo_dark.png Binary files differindex a7fde0ec5..a7fde0ec5 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_nature_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_nature_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_objects_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_objects_activated_holo_dark.png Binary files differindex c582b704a..c582b704a 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_objects_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_objects_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_objects_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_objects_normal_holo_dark.png Binary files differindex acc95d725..acc95d725 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_objects_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_objects_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_people_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_people_activated_holo_dark.png Binary files differindex 5973ac355..5973ac355 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_people_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_people_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_people_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_people_normal_holo_dark.png Binary files differindex 22e06f808..22e06f808 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_people_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_people_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_places_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_places_activated_holo_dark.png Binary files differindex 690e95fd5..690e95fd5 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_places_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_places_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_places_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_places_normal_holo_dark.png Binary files differindex ced4b08cf..ced4b08cf 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_places_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_places_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_recent_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_recents_activated_holo_dark.png Binary files differindex 25e847ef3..25e847ef3 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_recent_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_recents_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_recent_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_recents_normal_holo_dark.png Binary files differindex c86368d73..c86368d73 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_recent_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_recents_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_symbols_light_activated.png b/java/res/drawable-xxhdpi/ic_emoji_symbols_activated_holo_dark.png Binary files differindex 29dfc7118..29dfc7118 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_symbols_light_activated.png +++ b/java/res/drawable-xxhdpi/ic_emoji_symbols_activated_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_emoji_symbols_light_normal.png b/java/res/drawable-xxhdpi/ic_emoji_symbols_normal_holo_dark.png Binary files differindex 0570567cf..0570567cf 100644 --- a/java/res/drawable-xxhdpi/ic_emoji_symbols_light_normal.png +++ b/java/res/drawable-xxhdpi/ic_emoji_symbols_normal_holo_dark.png diff --git a/java/res/drawable-xxhdpi/ic_launcher_keyboard.png b/java/res/drawable-xxhdpi/ic_launcher_keyboard.png Binary files differnew file mode 100644 index 000000000..df386e827 --- /dev/null +++ b/java/res/drawable-xxhdpi/ic_launcher_keyboard.png diff --git a/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png b/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png Binary files differdeleted file mode 100644 index 811103a56..000000000 --- a/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png +++ /dev/null diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_klp.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_klp.9.png Binary files differindex 11eee94f3..fd2f9e514 100644 --- a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_klp.9.png +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_klp.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..f7814917d --- /dev/null +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_background_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_left_background_klp.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_left_background_klp.9.png Binary files differindex 2079e0462..3ab79007e 100644 --- a/java/res/drawable-xxhdpi/keyboard_key_feedback_left_background_klp.9.png +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_left_background_klp.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_left_more_background_klp.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_left_more_background_klp.9.png Binary files differindex c4178d9a8..99543a1e0 100644 --- a/java/res/drawable-xxhdpi/keyboard_key_feedback_left_more_background_klp.9.png +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_left_more_background_klp.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..a79499f24 --- /dev/null +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_more_background_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_right_background_klp.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_right_background_klp.9.png Binary files differindex d3d8733fd..e9e379287 100644 --- a/java/res/drawable-xxhdpi/keyboard_key_feedback_right_background_klp.9.png +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_right_background_klp.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_key_feedback_right_more_background_klp.9.png b/java/res/drawable-xxhdpi/keyboard_key_feedback_right_more_background_klp.9.png Binary files differindex d7ec8bcb2..6c1143aeb 100644 --- a/java/res/drawable-xxhdpi/keyboard_key_feedback_right_more_background_klp.9.png +++ b/java/res/drawable-xxhdpi/keyboard_key_feedback_right_more_background_klp.9.png diff --git a/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..91d5d7f90 --- /dev/null +++ b/java/res/drawable-xxhdpi/keyboard_popup_panel_background_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png Binary files differnew file mode 100644 index 000000000..dd95be61e --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_delete_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_dark.png Binary files differnew file mode 100644 index 000000000..ccd270e78 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_done_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_dark.png Binary files differnew file mode 100644 index 000000000..0617c15e3 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_go_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png Binary files differnew file mode 100644 index 000000000..fc85e512d --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_language_switch_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_mic_holo_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_mic_holo_dark.png Binary files differdeleted file mode 100644 index f55af308c..000000000 --- a/java/res/drawable-xxhdpi/sym_keyboard_mic_holo_dark.png +++ /dev/null diff --git a/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_dark.png Binary files differnew file mode 100644 index 000000000..1e2819b73 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_next_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_dark.png Binary files differnew file mode 100644 index 000000000..bae6cb1fa --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_previous_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_dark.png Binary files differnew file mode 100644 index 000000000..8c34d1160 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_return_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_dark.png Binary files differnew file mode 100644 index 000000000..a32b6c5d9 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_search_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_dark.png Binary files differnew file mode 100644 index 000000000..21a9e0909 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_send_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_settings_holo_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_settings_holo_dark.png Binary files differindex 7041bb6ce..bf643e1d8 100644 --- a/java/res/drawable-xxhdpi/sym_keyboard_settings_holo_dark.png +++ b/java/res/drawable-xxhdpi/sym_keyboard_settings_holo_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png Binary files differnew file mode 100644 index 000000000..d513ad9e6 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_settings_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_dark.png Binary files differnew file mode 100644 index 000000000..316903ef8 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_shift_locked_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png Binary files differnew file mode 100644 index 000000000..ddfc1a90d --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_shift_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png Binary files differnew file mode 100644 index 000000000..a4df3bb0e --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_smiley_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png Binary files differnew file mode 100644 index 000000000..01075ebf3 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_spacebar_lxx_dark.9.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png Binary files differnew file mode 100644 index 000000000..a36724cac --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png Binary files differnew file mode 100644 index 000000000..2706dca57 --- /dev/null +++ b/java/res/drawable-xxhdpi/sym_keyboard_voice_off_lxx_dark.png diff --git a/java/res/drawable-xxhdpi/tab_selected.9.png b/java/res/drawable-xxhdpi/tab_selected.9.png Binary files differdeleted file mode 100644 index e5efc5828..000000000 --- a/java/res/drawable-xxhdpi/tab_selected.9.png +++ /dev/null diff --git a/java/res/drawable/btn_keyboard_key_functional_ics.xml b/java/res/drawable/btn_keyboard_key_functional_ics.xml index 847ca72f4..846bccc49 100644 --- a/java/res/drawable/btn_keyboard_key_functional_ics.xml +++ b/java/res/drawable/btn_keyboard_key_functional_ics.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Functional keys. --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_ics" /> - <item android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_ics_dark" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_dark" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_functional_klp.xml b/java/res/drawable/btn_keyboard_key_functional_klp.xml index 0e17ed234..7b444f7c5 100644 --- a/java/res/drawable/btn_keyboard_key_functional_klp.xml +++ b/java/res/drawable/btn_keyboard_key_functional_klp.xml @@ -17,6 +17,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Functional keys. --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_klp" /> - <item android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_klp_dark" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_dark" /> </selector> diff --git a/java/res/drawable/keyboard_key_feedback_gb.xml b/java/res/drawable/btn_keyboard_key_functional_lxx_dark.xml index 397e948d8..fd1dbb9f0 100644 --- a/java/res/drawable/keyboard_key_feedback_gb.xml +++ b/java/res/drawable/btn_keyboard_key_functional_lxx_dark.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project +<!-- Copyright (C) 2014 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. @@ -14,11 +14,9 @@ limitations under the License. --> -<selector - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <item latin:state_has_morekeys="true" - android:drawable="@drawable/keyboard_key_feedback_more_background" /> - <item android:drawable="@drawable/keyboard_key_feedback_background" /> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Functional keys. --> + <item android:state_pressed="true" + android:drawable="@color/key_background_pressed_lxx_dark" /> + <item android:drawable="@color/key_background_lxx_dark" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_gb.xml b/java/res/drawable/btn_keyboard_key_gb.xml deleted file mode 100644 index 3fc253e85..000000000 --- a/java/res/drawable/btn_keyboard_key_gb.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?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"> - <!-- Functional keys. --> - <item android:state_single="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed" /> - <item android:state_single="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal" /> - - <!-- Action keys. --> - <item android:state_active="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed" /> - <item android:state_active="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal" /> - - <!-- 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" /> - <item android:state_checkable="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_off" /> - <item android:state_checkable="true" android:state_checked="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_on" /> - <item android:state_checkable="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_off" /> - - <!-- Empty background keys. --> - <item android:state_empty="true" - android:drawable="@drawable/transparent" /> - - <!-- Normal keys. --> - <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_light_pressed" /> - <item android:drawable="@drawable/btn_keyboard_key_light_normal" /> -</selector> diff --git a/java/res/drawable/btn_keyboard_key_ics.xml b/java/res/drawable/btn_keyboard_key_ics.xml index 259bb9ba5..0bb098d23 100644 --- a/java/res/drawable/btn_keyboard_key_ics.xml +++ b/java/res/drawable/btn_keyboard_key_ics.xml @@ -15,34 +15,28 @@ --> <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_ics" /> - <item android:state_single="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> - <!-- Action keys. --> <item android:state_active="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_ics" /> + android:drawable="@drawable/btn_keyboard_key_pressed_ics_dark" /> <item android:state_active="true" - android:drawable="@drawable/btn_keyboard_key_dark_active_ics" /> + android:drawable="@drawable/btn_keyboard_key_active_ics_dark" /> <!-- 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_ics" /> + android:drawable="@drawable/btn_keyboard_key_pressed_on_ics_dark" /> <item android:state_checkable="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_ics" /> + android:drawable="@drawable/btn_keyboard_key_pressed_off_ics_dark" /> <item android:state_checkable="true" android:state_checked="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_on_ics" /> + android:drawable="@drawable/btn_keyboard_key_normal_on_ics_dark" /> <item android:state_checkable="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" /> + android:drawable="@drawable/btn_keyboard_key_normal_off_holo_dark" /> <!-- Empty background keys. --> <item android:state_empty="true" - android:drawable="@drawable/transparent" /> + android:drawable="@android:color/transparent" /> <!-- Normal keys. --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_light_pressed_ics" /> - <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_ics_light" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_light" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_klp.xml b/java/res/drawable/btn_keyboard_key_klp.xml index 16b5fa00b..2a202a179 100644 --- a/java/res/drawable/btn_keyboard_key_klp.xml +++ b/java/res/drawable/btn_keyboard_key_klp.xml @@ -15,34 +15,28 @@ --> <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_klp" /> - <item android:state_single="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_holo" /> - <!-- Action keys. --> <item android:state_active="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_klp" /> + android:drawable="@drawable/btn_keyboard_key_pressed_klp_dark" /> <item android:state_active="true" - android:drawable="@drawable/btn_keyboard_key_dark_active_klp" /> + android:drawable="@drawable/btn_keyboard_key_active_klp_dark" /> <!-- 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_klp" /> + android:drawable="@drawable/btn_keyboard_key_pressed_on_klp_dark" /> <item android:state_checkable="true" android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed_off_klp" /> + android:drawable="@drawable/btn_keyboard_key_pressed_off_klp_dark" /> <item android:state_checkable="true" android:state_checked="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_on_klp" /> + android:drawable="@drawable/btn_keyboard_key_normal_on_klp_dark" /> <item android:state_checkable="true" - android:drawable="@drawable/btn_keyboard_key_dark_normal_off_holo" /> + android:drawable="@drawable/btn_keyboard_key_normal_off_holo_dark" /> <!-- Empty background keys. --> <item android:state_empty="true" - android:drawable="@drawable/transparent" /> + android:drawable="@android:color/transparent" /> <!-- Normal keys. --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_light_pressed_klp" /> - <item android:drawable="@drawable/btn_keyboard_key_light_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_klp_light" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_light" /> </selector> diff --git a/java/res/color/key_text_color_holo.xml b/java/res/drawable/btn_keyboard_key_lxx_dark.xml index d034a945f..bb1789ae3 100644 --- a/java/res/color/key_text_color_holo.xml +++ b/java/res/drawable/btn_keyboard_key_lxx_dark.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 The Android Open Source Project +<!-- Copyright (C) 2014 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. @@ -15,34 +15,28 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- Functional keys. --> - <item android:state_single="true" android:state_pressed="true" - android:color="@color/key_text_color_functional_holo" /> - <item android:state_single="true" - android:color="@color/key_text_color_functional_holo" /> - <!-- Action keys. --> <item android:state_active="true" android:state_pressed="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_active_pressed_lxx_dark" /> <item android:state_active="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_active_lxx_dark" /> <!-- Toggle keys. Use checkable/checked state. --> <item android:state_checkable="true" android:state_checked="true" android:state_pressed="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_on_lxx_dark" /> <item android:state_checkable="true" android:state_pressed="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_pressed_off_lxx_dark" /> <item android:state_checkable="true" android:state_checked="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_normal_on_lxx_dark" /> <item android:state_checkable="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@drawable/btn_keyboard_key_normal_off_lxx_dark" /> <!-- Empty background keys. --> <item android:state_empty="true" - android:color="@color/key_text_color_normal_holo" /> + android:drawable="@color/key_background_lxx_dark" /> <!-- Normal keys. --> <item android:state_pressed="true" - android:color="@color/key_text_color_normal_holo" /> - <item android:color="@color/key_text_color_normal_holo" /> + android:drawable="@color/key_background_pressed_lxx_dark" /> + <item android:drawable="@color/key_background_lxx_dark" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_popup_ics.xml b/java/res/drawable/btn_keyboard_key_popup_ics.xml index 31b613176..17d646b8f 100644 --- a/java/res/drawable/btn_keyboard_key_popup_ics.xml +++ b/java/res/drawable/btn_keyboard_key_popup_ics.xml @@ -17,5 +17,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/btn_keyboard_key_popup_selected_ics" /> - <item android:drawable="@drawable/transparent" /> + <item android:drawable="@android:color/transparent" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_popup_klp.xml b/java/res/drawable/btn_keyboard_key_popup_klp.xml index 62cbca8ae..9dfc93ae8 100644 --- a/java/res/drawable/btn_keyboard_key_popup_klp.xml +++ b/java/res/drawable/btn_keyboard_key_popup_klp.xml @@ -17,5 +17,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/btn_keyboard_key_popup_selected_klp" /> - <item android:drawable="@drawable/transparent" /> + <item android:drawable="@android:color/transparent" /> </selector> diff --git a/java/res/drawable/btn_keyboard_key_functional_gb.xml b/java/res/drawable/btn_keyboard_spacebar_ics.xml index 431359c20..229f7a965 100644 --- a/java/res/drawable/btn_keyboard_key_functional_gb.xml +++ b/java/res/drawable/btn_keyboard_spacebar_ics.xml @@ -15,8 +15,7 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- Functional keys. --> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_dark_pressed" /> - <item android:drawable="@drawable/btn_keyboard_key_dark_normal" /> + android:drawable="@drawable/btn_keyboard_key_pressed_ics_light" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_light" /> </selector> diff --git a/java/res/drawable/btn_keyboard_spacebar_klp.xml b/java/res/drawable/btn_keyboard_spacebar_klp.xml new file mode 100644 index 000000000..9882f9a74 --- /dev/null +++ b/java/res/drawable/btn_keyboard_spacebar_klp.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 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_pressed_klp_light" /> + <item android:drawable="@drawable/btn_keyboard_key_normal_holo_light" /> +</selector> diff --git a/java/res/drawable/btn_keyboard_key_popup_gb.xml b/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml index 9e3670d22..5c595d9ed 100644 --- a/java/res/drawable/btn_keyboard_key_popup_gb.xml +++ b/java/res/drawable/btn_keyboard_spacebar_lxx_dark.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2011 The Android Open Source Project +<!-- Copyright (C) 2014 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. @@ -16,6 +16,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" - android:drawable="@drawable/btn_keyboard_key_light_popup_selected" /> - <item android:drawable="@drawable/transparent" /> + android:drawable="@color/key_background_pressed_lxx_dark" /> + <item android:drawable="@color/key_background_lxx_dark" /> </selector> diff --git a/java/res/drawable/btn_suggestion_gb.xml b/java/res/drawable/btn_suggestion_lxx_dark.xml index cde12fe55..84a91209e 100644 --- a/java/res/drawable/btn_suggestion_gb.xml +++ b/java/res/drawable/btn_suggestion_lxx_dark.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2011, The Android Open Source Project +** Copyright 2014, 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. @@ -23,5 +23,5 @@ > <item android:state_pressed="true" - android:drawable="@drawable/btn_suggestion_pressed" /> + android:drawable="@color/suggested_word_background_selected_lxx_dark" /> </selector> diff --git a/java/res/drawable/ic_emoji_emoticons_holo_dark.xml b/java/res/drawable/ic_emoji_emoticons_holo_dark.xml new file mode 100644 index 000000000..59e23499e --- /dev/null +++ b/java/res/drawable/ic_emoji_emoticons_holo_dark.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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_focused="true" + android:drawable="@drawable/ic_emoji_emoticons_activated_holo_dark" /> + <item + android:state_pressed="true" + android:drawable="@drawable/ic_emoji_emoticons_activated_holo_dark" /> + <item + android:state_selected="true" + android:drawable="@drawable/ic_emoji_emoticons_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_emoticons_normal_holo_dark" /> +</selector> diff --git a/java/res/color/emoji_tab_label_color_gb.xml b/java/res/drawable/ic_emoji_nature_holo_dark.xml index e1d2f715e..b94629580 100644 --- a/java/res/color/emoji_tab_label_color_gb.xml +++ b/java/res/drawable/ic_emoji_nature_holo_dark.xml @@ -21,13 +21,13 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" - android:color="@color/key_text_color_gb" /> + android:drawable="@drawable/ic_emoji_nature_activated_holo_dark" /> <item android:state_pressed="true" - android:color="@color/key_text_color_gb" /> + android:drawable="@drawable/ic_emoji_nature_activated_holo_dark" /> <item android:state_selected="true" - android:color="@color/key_text_color_gb" /> + android:drawable="@drawable/ic_emoji_nature_activated_holo_dark" /> <item - android:color="@color/key_text_inactivated_color_gb" /> + android:drawable="@drawable/ic_emoji_nature_normal_holo_dark" /> </selector> diff --git a/java/res/drawable/ic_emoji_nature_light.xml b/java/res/drawable/ic_emoji_objects_holo_dark.xml index 543409e03..266e81e0b 100644 --- a/java/res/drawable/ic_emoji_nature_light.xml +++ b/java/res/drawable/ic_emoji_objects_holo_dark.xml @@ -21,13 +21,12 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" - android:drawable="@drawable/ic_emoji_nature_light_activated" /> + android:drawable="@drawable/ic_emoji_objects_activated_holo_dark" /> <item android:state_pressed="true" - android:drawable="@drawable/ic_emoji_nature_light_activated" /> + android:drawable="@drawable/ic_emoji_objects_activated_holo_dark" /> <item android:state_selected="true" - android:drawable="@drawable/ic_emoji_nature_light_activated" /> - <item - android:drawable="@drawable/ic_emoji_nature_light_normal" /> + android:drawable="@drawable/ic_emoji_objects_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_objects_normal_holo_dark" /> </selector> diff --git a/java/res/color/emoji_tab_label_color_holo.xml b/java/res/drawable/ic_emoji_people_holo_dark.xml index 373e9314b..15955d261 100644 --- a/java/res/color/emoji_tab_label_color_holo.xml +++ b/java/res/drawable/ic_emoji_people_holo_dark.xml @@ -21,13 +21,12 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" - android:color="@color/key_text_color_holo" /> + android:drawable="@drawable/ic_emoji_people_activated_holo_dark" /> <item android:state_pressed="true" - android:color="@color/key_text_color_holo" /> + android:drawable="@drawable/ic_emoji_people_activated_holo_dark" /> <item android:state_selected="true" - android:color="@color/key_text_color_holo" /> - <item - android:color="@color/key_text_inactivated_color_holo" /> + android:drawable="@drawable/ic_emoji_people_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_people_normal_holo_dark" /> </selector> diff --git a/java/res/drawable/ic_emoji_people_light.xml b/java/res/drawable/ic_emoji_people_light.xml deleted file mode 100644 index ea9e406a4..000000000 --- a/java/res/drawable/ic_emoji_people_light.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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_focused="true" - android:drawable="@drawable/ic_emoji_people_light_activated" /> - <item - android:state_pressed="true" - android:drawable="@drawable/ic_emoji_people_light_activated" /> - <item - android:state_selected="true" - android:drawable="@drawable/ic_emoji_people_light_activated" /> - <item android:drawable="@drawable/ic_emoji_people_light_normal" /> -</selector> diff --git a/java/res/drawable/ic_emoji_objects_light.xml b/java/res/drawable/ic_emoji_places_holo_dark.xml index 4096e695b..260bbd843 100644 --- a/java/res/drawable/ic_emoji_objects_light.xml +++ b/java/res/drawable/ic_emoji_places_holo_dark.xml @@ -21,12 +21,12 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" - android:drawable="@drawable/ic_emoji_objects_light_activated" /> + android:drawable="@drawable/ic_emoji_places_activated_holo_dark" /> <item android:state_pressed="true" - android:drawable="@drawable/ic_emoji_objects_light_activated" /> + android:drawable="@drawable/ic_emoji_places_activated_holo_dark" /> <item android:state_selected="true" - android:drawable="@drawable/ic_emoji_objects_light_activated" /> - <item android:drawable="@drawable/ic_emoji_objects_light_normal" /> + android:drawable="@drawable/ic_emoji_places_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_places_normal_holo_dark" /> </selector> diff --git a/java/res/drawable/ic_emoji_places_light.xml b/java/res/drawable/ic_emoji_places_light.xml deleted file mode 100644 index 312cad9c3..000000000 --- a/java/res/drawable/ic_emoji_places_light.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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_focused="true" - android:drawable="@drawable/ic_emoji_places_light_activated" /> - <item - android:state_pressed="true" - android:drawable="@drawable/ic_emoji_places_light_activated" /> - <item - android:state_selected="true" - android:drawable="@drawable/ic_emoji_places_light_activated" /> - <item android:drawable="@drawable/ic_emoji_places_light_normal" /> -</selector> diff --git a/java/res/drawable/ic_emoji_recent_light.xml b/java/res/drawable/ic_emoji_recent_light.xml deleted file mode 100644 index 8c2123f83..000000000 --- a/java/res/drawable/ic_emoji_recent_light.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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_focused="true" - android:drawable="@drawable/ic_emoji_recent_light_activated" /> - <item - android:state_pressed="true" - android:drawable="@drawable/ic_emoji_recent_light_activated" /> - <item - android:state_selected="true" - android:drawable="@drawable/ic_emoji_recent_light_activated" /> - <item android:drawable="@drawable/ic_emoji_recent_light_normal" /> -</selector> diff --git a/java/res/drawable/ic_emoji_recents_holo_dark.xml b/java/res/drawable/ic_emoji_recents_holo_dark.xml new file mode 100644 index 000000000..f14349f34 --- /dev/null +++ b/java/res/drawable/ic_emoji_recents_holo_dark.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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_focused="true" + android:drawable="@drawable/ic_emoji_recents_activated_holo_dark" /> + <item + android:state_pressed="true" + android:drawable="@drawable/ic_emoji_recents_activated_holo_dark" /> + <item + android:state_selected="true" + android:drawable="@drawable/ic_emoji_recents_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_recents_normal_holo_dark" /> +</selector> diff --git a/java/res/drawable/ic_emoji_symbols_holo_dark.xml b/java/res/drawable/ic_emoji_symbols_holo_dark.xml new file mode 100644 index 000000000..831d6594b --- /dev/null +++ b/java/res/drawable/ic_emoji_symbols_holo_dark.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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_focused="true" + android:drawable="@drawable/ic_emoji_symbols_activated_holo_dark" /> + <item + android:state_pressed="true" + android:drawable="@drawable/ic_emoji_symbols_activated_holo_dark" /> + <item + android:state_selected="true" + android:drawable="@drawable/ic_emoji_symbols_activated_holo_dark" /> + <item android:drawable="@drawable/ic_emoji_symbols_normal_holo_dark" /> +</selector> diff --git a/java/res/drawable/ic_emoji_symbols_light.xml b/java/res/drawable/ic_emoji_symbols_light.xml deleted file mode 100644 index 79aaf0fc5..000000000 --- a/java/res/drawable/ic_emoji_symbols_light.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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_focused="true" - android:drawable="@drawable/ic_emoji_symbols_light_activated" /> - <item - android:state_pressed="true" - android:drawable="@drawable/ic_emoji_symbols_light_activated" /> - <item - android:state_selected="true" - android:drawable="@drawable/ic_emoji_symbols_light_activated" /> - <item android:drawable="@drawable/ic_emoji_symbols_light_normal" /> -</selector> diff --git a/java/res/drawable/keyboard_key_feedback_lxx_dark.xml b/java/res/drawable/keyboard_key_feedback_lxx_dark.xml new file mode 100644 index 000000000..ab1109bcc --- /dev/null +++ b/java/res/drawable/keyboard_key_feedback_lxx_dark.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 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" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <!-- Left edge --> + <item latin:state_left_edge="true" latin:state_has_morekeys="true" + android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_dark" /> + <item latin:state_left_edge="true" + android:drawable="@drawable/keyboard_key_feedback_background_lxx_dark" /> + + <!-- Right edge --> + <item latin:state_right_edge="true" latin:state_has_morekeys="true" + android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_dark" /> + <item latin:state_right_edge="true" + android:drawable="@drawable/keyboard_key_feedback_background_lxx_dark" /> + + <item latin:state_has_morekeys="true" + android:drawable="@drawable/keyboard_key_feedback_more_background_lxx_dark" /> + <item android:drawable="@drawable/keyboard_key_feedback_background_lxx_dark" /> +</selector> diff --git a/java/res/layout/dictionary_line.xml b/java/res/layout/dictionary_line.xml index 7268cd468..bb1843d6c 100644 --- a/java/res/layout/dictionary_line.xml +++ b/java/res/layout/dictionary_line.xml @@ -42,7 +42,7 @@ android:orientation="vertical"> <TextView - android:id="@+android:id/title" + android:id="@android:id/title" android:layout_marginLeft="5dip" android:layout_marginStart="5dip" android:layout_width="wrap_content" @@ -59,7 +59,7 @@ android:layout_marginLeft="5dip"> <TextView - android:id="@+android:id/summary" + android:id="@android:id/summary" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" @@ -77,14 +77,14 @@ </LinearLayout> <com.android.inputmethod.dictionarypack.ButtonSwitcher - android:id="@+android:id/wordlist_button_switcher" + android:id="@+id/wordlist_button_switcher" android:layout_weight="0" android:layout_marginStart="13dip" android:layout_marginLeft="13dip" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button - android:id="@+android:id/dict_install_button" + android:id="@+id/dict_install_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" @@ -92,7 +92,7 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/install_dict" /> <Button - android:id="@+android:id/dict_cancel_button" + android:id="@+id/dict_cancel_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" @@ -100,7 +100,7 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/cancel_download_dict" /> <Button - android:id="@+android:id/dict_delete_button" + android:id="@+id/dict_delete_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" diff --git a/java/res/layout/emoji_keyboard_page.xml b/java/res/layout/emoji_keyboard_page.xml index e0b752b32..0d1086171 100644 --- a/java/res/layout/emoji_keyboard_page.xml +++ b/java/res/layout/emoji_keyboard_page.xml @@ -18,16 +18,9 @@ */ --> -<com.android.inputmethod.keyboard.internal.ScrollViewWithNotifier +<com.android.inputmethod.keyboard.emoji.EmojiPageKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/emoji_keyboard_scroller" - android:clipToPadding="false" - android:layout_width="match_parent" - android:layout_height="match_parent" -> - <com.android.inputmethod.keyboard.internal.ScrollKeyboardView - android:id="@+id/emoji_keyboard_page" - android:layoutDirection="ltr" - android:layout_width="wrap_content" - android:layout_height="wrap_content" /> -</com.android.inputmethod.keyboard.internal.ScrollViewWithNotifier> + android:id="@+id/emoji_keyboard_page" + android:layoutDirection="ltr" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> diff --git a/java/res/layout/emoji_keyboard_tab_icon.xml b/java/res/layout/emoji_keyboard_tab_icon.xml index 1609f6a26..15f9c3a3e 100644 --- a/java/res/layout/emoji_keyboard_tab_icon.xml +++ b/java/res/layout/emoji_keyboard_tab_icon.xml @@ -18,10 +18,16 @@ */ --> +<!-- Note: contentDescription will be added programatically in {@link EmojiPalettesView}. --> +<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dip" android:layout_weight="1.0" android:layout_height="wrap_content" android:gravity="center" android:scaleType="center" + android:contentDescription="@null" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" /> diff --git a/java/res/layout/emoji_palettes_view.xml b/java/res/layout/emoji_palettes_view.xml index 1c6da90ba..9ff090aad 100644 --- a/java/res/layout/emoji_palettes_view.xml +++ b/java/res/layout/emoji_palettes_view.xml @@ -18,7 +18,7 @@ */ --> -<com.android.inputmethod.keyboard.EmojiPalettesView +<com.android.inputmethod.keyboard.emoji.EmojiPalettesView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/emoji_keyboard_view" android:orientation="vertical" @@ -29,7 +29,7 @@ <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="@dimen/suggestions_strip_height" + android:layout_height="@dimen/config_suggestions_strip_height" > <TabHost android:id="@+id/emoji_category_tabhost" @@ -41,11 +41,7 @@ android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/tab_selected" - android:divider="@null" - android:tabStripEnabled="true" - android:tabStripLeft="@drawable/tab_unselected" - android:tabStripRight="@drawable/tab_unselected" /> + android:divider="@null" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dip" @@ -65,23 +61,26 @@ android:layout_width="2dip" android:layout_height="match_parent" android:background="@drawable/suggestions_strip_divider" /> + <!-- TODO: Implement KeyView and replace this. --> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> <ImageButton android:id="@+id/emoji_keyboard_delete" android:layout_width="0dip" android:layout_weight="12.5" android:layout_height="match_parent" - android:background="@color/emoji_key_background_color" - android:src="@drawable/sym_keyboard_delete_holo_dark" /> + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" + android:contentDescription="@string/spoken_description_delete" /> </LinearLayout> <android.support.v4.view.ViewPager android:id="@+id/emoji_keyboard_pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> - <com.android.inputmethod.keyboard.EmojiCategoryPageIndicatorView + <com.android.inputmethod.keyboard.emoji.EmojiCategoryPageIndicatorView android:id="@+id/emoji_category_page_id_view" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/emoji_category_page_id_view_background" /> + android:layout_height="2dip" /> <LinearLayout android:id="@+id/emoji_action_bar" android:orientation="horizontal" @@ -89,22 +88,47 @@ android:layout_height="0dip" android:layout_weight="1" > - <ImageButton - android:id="@+id/emoji_keyboard_alphabet" + <!-- TODO: Implement a KeyView and replace this. --> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <TextView + android:id="@+id/emoji_keyboard_alphabet_left" android:layout_width="0dip" android:layout_weight="0.15" + android:gravity="center" android:layout_height="match_parent" - android:src="@drawable/ic_ime_switcher_dark" /> - <ImageButton + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" /> + <!-- TODO: Implement KeyView and replace this. --> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <RelativeLayout android:id="@+id/emoji_keyboard_space" android:layout_width="0dip" android:layout_weight="0.70" - android:layout_height="match_parent" /> - <ImageButton - android:id="@+id/emoji_keyboard_alphabet2" + android:layout_height="match_parent" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" + android:contentDescription="@string/spoken_description_space"> + <!-- WORKAROUND: Show the spacebar icon as a bacground of this View. --> + <View + android:id="@+id/emoji_keyboard_space_icon" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="12dp" + android:layout_marginRight="12dp" + android:layout_centerInParent="true" /> + </RelativeLayout> + <!-- TODO: Implement KeyView and replace this. --> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <TextView + android:id="@+id/emoji_keyboard_alphabet_right" android:layout_width="0dip" android:layout_weight="0.15" + android:gravity="center" android:layout_height="match_parent" - android:src="@drawable/ic_ime_switcher_dark" /> + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" /> </LinearLayout> -</com.android.inputmethod.keyboard.EmojiPalettesView> +</com.android.inputmethod.keyboard.emoji.EmojiPalettesView> diff --git a/java/res/layout/hint_add_to_dictionary.xml b/java/res/layout/hint_add_to_dictionary.xml deleted file mode 100644 index 68a9faf19..000000000 --- a/java/res/layout/hint_add_to_dictionary.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- This is derived from suggestion_word.xml without minWidth attribute and padding --> -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:textSize="@dimen/suggestion_text_size" - android:gravity="center" - android:paddingLeft="0dp" - android:paddingTop="0dp" - android:paddingRight="0dp" - android:paddingBottom="0dp" - android:focusable="false" - android:clickable="false" - android:singleLine="true" - android:ellipsize="none" - style="?attr/suggestionWordStyle" /> diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml index 1e7a3844e..ff0b403d1 100644 --- a/java/res/layout/input_view.xml +++ b/java/res/layout/input_view.xml @@ -41,10 +41,8 @@ android:id="@+id/suggestion_strip_view" android:layoutDirection="ltr" android:layout_width="match_parent" - android:layout_height="@dimen/suggestions_strip_height" + android:layout_height="@dimen/config_suggestions_strip_height" android:gravity="center_vertical" - android:paddingRight="@dimen/suggestions_strip_padding" - android:paddingLeft="@dimen/suggestions_strip_padding" style="?attr/suggestionStripViewStyle" /> <!-- To ensure that key preview popup is correctly placed when the current system locale is diff --git a/java/res/layout/key_preview_gb.xml b/java/res/layout/key_preview_gb.xml deleted file mode 100644 index 2f2a321a3..000000000 --- a/java/res/layout/key_preview_gb.xml +++ /dev/null @@ -1,27 +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. -*/ ---> - -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/keyboard_key_feedback_gb" - android:minWidth="32dp" - android:gravity="center" -/> diff --git a/java/res/layout/more_keys_keyboard.xml b/java/res/layout/more_keys_keyboard.xml index 6637117e0..f3795afdc 100644 --- a/java/res/layout/more_keys_keyboard.xml +++ b/java/res/layout/more_keys_keyboard.xml @@ -22,11 +22,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - style="?attr/moreKeysKeyboardContainerStyle" + android:orientation="vertical" > <com.android.inputmethod.keyboard.MoreKeysKeyboardView - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/more_keys_keyboard_view" android:layout_width="wrap_content" android:layout_height="wrap_content" /> diff --git a/java/res/layout/more_suggestions.xml b/java/res/layout/more_suggestions.xml index 8659f0761..0869992c9 100644 --- a/java/res/layout/more_suggestions.xml +++ b/java/res/layout/more_suggestions.xml @@ -22,16 +22,15 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - style="?attr/moreKeysKeyboardContainerStyle" + android:orientation="vertical" > <com.android.inputmethod.latin.suggestions.MoreSuggestionsView xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:id="@+id/more_suggestions_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - latin:keyLetterSize="@dimen/suggestion_text_size" - latin:keyLabelSize="@dimen/suggestion_text_size" - latin:keyHintLetterRatio="@fraction/more_suggestions_info_ratio" + latin:keyLetterSize="@dimen/config_suggestion_text_size" + latin:keyLabelSize="@dimen/config_suggestion_text_size" + latin:keyHintLetterRatio="@fraction/config_more_suggestions_info_ratio" latin:keyHintLetterColor="@android:color/white" /> </LinearLayout> diff --git a/java/res/layout/research_feedback_activity.xml b/java/res/layout/research_feedback_activity.xml deleted file mode 100644 index a6b8b8a43..000000000 --- a/java/res/layout/research_feedback_activity.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<com.android.inputmethod.research.FeedbackLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:id="@+id/research_feedback_layout" -> - - <fragment - android:id="@+id/research_feedback_fragment" - android:name="com.android.inputmethod.research.FeedbackFragment" - android:layout_width="match_parent" - android:layout_height="wrap_content" - /> -</com.android.inputmethod.research.FeedbackLayout> diff --git a/java/res/layout/research_feedback_fragment_layout.xml b/java/res/layout/research_feedback_fragment_layout.xml deleted file mode 100644 index 505a1e8d9..000000000 --- a/java/res/layout/research_feedback_fragment_layout.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<!-- Adapted from frameworks/base/core/res/res/layout/alert_dialog_holo.xml. We - want a dialog, but it must be its own activity so we can launch the soft - keyboard on it. A regular dialog will not work since it would be launched from - the IME. --> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="8dip" - android:layout_marginEnd="8dip" - android:orientation="vertical"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - <View android:layout_width="match_parent" - android:layout_height="2dip" - android:visibility="gone" - android:background="@android:color/holo_blue_light" /> - <TextView - style="?android:attr/windowTitleStyle" - android:singleLine="true" - android:ellipsize="end" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="64dip" - android:layout_marginLeft="16dip" - android:layout_marginRight="16dip" - android:gravity="center_vertical|left" - android:text="@string/research_feedback_dialog_title" /> - <View - android:layout_width="match_parent" - android:layout_height="2dip" - android:background="@android:color/holo_blue_light" /> - </LinearLayout> - - <EditText - android:id="@+id/research_feedback_contents" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_gravity="fill_horizontal|center_vertical" - android:layout_marginLeft="8dip" - android:layout_marginRight="8dip" - android:layout_marginBottom="8dip" - android:layout_marginTop="8dip" - android:minLines="2" - android:scrollbars="vertical" - android:hint="@string/research_feedback_hint" - android:inputType="textMultiLine|textCapSentences"> - <requestFocus /> - </EditText> - <CheckBox - android:id="@+id/research_feedback_include_account_name" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_marginLeft="16dip" - android:layout_marginRight="16dip" - android:layout_marginBottom="8dip" - android:checked="false" - android:text="@string/research_feedback_include_account_name_label" /> - <CheckBox - android:id="@+id/research_feedback_include_recording_checkbox" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_marginLeft="16dip" - android:layout_marginRight="16dip" - android:layout_marginBottom="8dip" - android:checked="false" - android:text="@string/research_feedback_include_recording_label" /> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:divider="?android:attr/dividerHorizontal" - android:showDividers="beginning" - android:dividerPadding="0dip"> - <LinearLayout - style="?android:attr/buttonBarStyle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layoutDirection="locale" - android:measureWithLargestChild="true"> - <Button - android:id="@+id/research_feedback_cancel_button" - android:layout_width="wrap_content" - android:layout_gravity="left" - android:layout_weight="1" - android:maxLines="2" - style="?android:attr/buttonBarButtonStyle" - android:textSize="14sp" - android:text="@string/research_feedback_cancel" - android:layout_height="wrap_content" /> - <Button - android:id="@+id/research_feedback_send_button" - android:layout_width="wrap_content" - android:layout_gravity="right" - android:layout_weight="1" - android:maxLines="2" - style="?android:attr/buttonBarButtonStyle" - android:textSize="14sp" - android:text="@string/research_feedback_send" - android:layout_height="wrap_content" /> - </LinearLayout> - </LinearLayout> - </LinearLayout> -</ScrollView> diff --git a/java/res/layout/research_feedback_layout.xml b/java/res/layout/research_feedback_layout.xml deleted file mode 100644 index bacd19101..000000000 --- a/java/res/layout/research_feedback_layout.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:orientation="vertical" -> - - <EditText - android:id="@+id/research_feedback_contents" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_gravity="fill_horizontal|center_vertical" - android:layout_marginLeft="8dip" - android:layout_marginRight="8dip" - android:layout_marginBottom="8dip" - android:layout_marginTop="8dip" - android:lines="2" - android:hint="@string/research_feedback_hint" - android:inputType="textMultiLine" - android:imeOptions="flagNoFullscreen" - android:focusable="true" - > - <requestFocus /> - </EditText> - - <CheckBox - android:id="@+id/research_feedback_include_history" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_marginBottom="8dip" - android:checked="true" - android:text="@string/research_feedback_include_history_label" - /> -</LinearLayout> diff --git a/java/res/layout/seek_bar_dialog.xml b/java/res/layout/seek_bar_dialog.xml index a47e9a038..e723ad9bb 100644 --- a/java/res/layout/seek_bar_dialog.xml +++ b/java/res/layout/seek_bar_dialog.xml @@ -33,7 +33,7 @@ <TextView android:id="@+id/seek_bar_dialog_value" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="20dp"/> + android:textSize="20sp"/> </LinearLayout> <SeekBar android:id="@+id/seek_bar_dialog_bar" diff --git a/java/res/layout/setup_steps_title.xml b/java/res/layout/setup_steps_title.xml index e3694bfe0..9ee8693f8 100644 --- a/java/res/layout/setup_steps_title.xml +++ b/java/res/layout/setup_steps_title.xml @@ -21,7 +21,5 @@ <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/setup_title" - style="@style/setupTitleStyle" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" /> + style="@style/setupTitleStyle" /> </merge> diff --git a/java/res/layout/setup_welcome_title.xml b/java/res/layout/setup_welcome_title.xml index af7053a37..2c3b48919 100644 --- a/java/res/layout/setup_welcome_title.xml +++ b/java/res/layout/setup_welcome_title.xml @@ -21,9 +21,7 @@ <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/setup_welcome_title" - style="@style/setupTitleStyle" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" /> + style="@style/setupTitleStyle" /> <TextView android:id="@+id/setup_welcome_description" android:text="@string/setup_welcome_additional_description" diff --git a/java/res/layout/suggestion_divider.xml b/java/res/layout/suggestion_divider.xml index a8b78c082..563599d82 100644 --- a/java/res/layout/suggestion_divider.xml +++ b/java/res/layout/suggestion_divider.xml @@ -18,10 +18,17 @@ */ --> +<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" - android:src="@drawable/suggestions_strip_divider" android:padding="0dp" - android:gravity="center" /> + android:gravity="center" + android:src="@drawable/suggestions_strip_divider" + android:contentDescription="@null" + android:clickable="false" + android:longClickable="false" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" /> diff --git a/java/res/layout/suggestion_info.xml b/java/res/layout/suggestion_info.xml deleted file mode 100644 index 0aa26000d..000000000 --- a/java/res/layout/suggestion_info.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?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. -*/ ---> - -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="6dp" - android:textColor="@android:color/white" - style="?attr/suggestionWordStyle" /> diff --git a/java/res/layout/suggestion_word.xml b/java/res/layout/suggestion_word.xml deleted file mode 100644 index c82a13c99..000000000 --- a/java/res/layout/suggestion_word.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?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. -*/ ---> - -<!-- Provide a haptic feedback by ourselves based on the keyboard settings. - We just need to ignore the system's haptic feedback settings. --> -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:minWidth="@dimen/suggestion_min_width" - android:textSize="@dimen/suggestion_text_size" - android:gravity="center" - android:paddingLeft="@dimen/suggestion_padding" - android:paddingTop="0dp" - android:paddingRight="@dimen/suggestion_padding" - android:paddingBottom="0dp" - android:hapticFeedbackEnabled="false" - android:focusable="false" - android:clickable="false" - android:singleLine="true" - android:ellipsize="none" - style="?attr/suggestionWordStyle" /> diff --git a/java/res/layout/suggestions_strip.xml b/java/res/layout/suggestions_strip.xml index cbf31e6dc..489477990 100644 --- a/java/res/layout/suggestions_strip.xml +++ b/java/res/layout/suggestions_strip.xml @@ -19,12 +19,69 @@ --> <merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> + xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> <LinearLayout android:id="@+id/suggestions_strip" android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent" + android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin" + android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" /> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <LinearLayout + android:id="@+id/add_to_dictionary_strip" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin" + android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false"> + <TextView + android:id="@+id/word_to_save" + android:layout_width="match_parent" + android:layout_height="match_parent" + style="?attr/suggestionWordStyle" /> + <include + layout="@layout/suggestion_divider" /> + <TextView + android:id="@+id/hint_add_to_dictionary" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:textAlignment="viewStart" + style="?attr/suggestionWordStyle" /> + </LinearLayout> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <LinearLayout + android:id="@+id/important_notice_strip" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin" + android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin" + android:hapticFeedbackEnabled="false" + android:soundEffectsEnabled="false" > + <TextView + android:id="@+id/important_notice_title" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="6sp" + android:textSize="16sp" + style="?attr/suggestionWordStyle" /> + </LinearLayout> + <ImageButton + android:id="@+id/suggestions_strip_voice_key" + android:layout_width="@dimen/config_suggestions_strip_edge_key_width" + android:layout_height="fill_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:contentDescription="@string/spoken_description_mic" + style="?attr/suggestionWordStyle" /> </merge> diff --git a/java/res/layout/user_dictionary_add_word.xml b/java/res/layout/user_dictionary_add_word.xml index bbf9b1b5b..615fde589 100644 --- a/java/res/layout/user_dictionary_add_word.xml +++ b/java/res/layout/user_dictionary_add_word.xml @@ -52,48 +52,39 @@ android:hint="@string/user_dict_settings_add_word_hint" android:imeOptions="flagNoFullscreen" android:inputType="textNoSuggestions" - android:maxLength="@integer/user_dictionary_max_word_length" > + android:maxLength="@integer/config_user_dictionary_max_word_length" > <requestFocus /> </EditText> <LinearLayout + style="?android:attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:divider="?android:attr/dividerHorizontal" - android:dividerPadding="0dip" - android:orientation="vertical" - android:showDividers="beginning" > + android:measureWithLargestChild="true" + android:orientation="horizontal" > - <LinearLayout - style="?android:attr/buttonBarStyle" - android:layout_width="match_parent" + <Button + style="?android:attr/buttonBarButtonStyle" + android:layout_width="0dip" android:layout_height="wrap_content" - android:measureWithLargestChild="true" - android:orientation="horizontal" > - - <Button - style="?android:attr/buttonBarButtonStyle" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_gravity="start" - android:layout_weight="1" - android:maxLines="2" - android:onClick="onClickCancel" - android:text="@string/cancel" - android:textSize="14sp" /> + android:layout_gravity="start" + android:layout_weight="1" + android:maxLines="2" + android:onClick="onClickCancel" + android:text="@string/cancel" + android:textSize="14sp" /> - <Button - style="?android:attr/buttonBarButtonStyle" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_weight="1" - android:maxLines="2" - android:onClick="onClickConfirm" - android:text="@string/user_dict_settings_add_dialog_confirm" - android:textSize="14sp" /> - </LinearLayout> + <Button + style="?android:attr/buttonBarButtonStyle" + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_weight="1" + android:maxLines="2" + android:onClick="onClickConfirm" + android:text="@string/user_dict_settings_add_dialog_confirm" + android:textSize="14sp" /> </LinearLayout> </LinearLayout>
\ No newline at end of file diff --git a/java/res/layout/user_dictionary_add_word_fullscreen.xml b/java/res/layout/user_dictionary_add_word_fullscreen.xml index 219485b66..9bcb189b4 100644 --- a/java/res/layout/user_dictionary_add_word_fullscreen.xml +++ b/java/res/layout/user_dictionary_add_word_fullscreen.xml @@ -30,7 +30,7 @@ android:hint="@string/user_dict_settings_add_word_hint" android:imeOptions="flagNoFullscreen" android:inputType="textNoSuggestions" - android:maxLength="@integer/user_dictionary_max_word_length" > + android:maxLength="@integer/config_user_dictionary_max_word_length" > <requestFocus /> </EditText> @@ -61,7 +61,7 @@ android:hint="@string/user_dict_settings_add_shortcut_hint" android:imeOptions="flagNoFullscreen" android:inputType="textNoSuggestions" - android:maxLength="@integer/user_dictionary_max_word_length" /> + android:maxLength="@integer/config_user_dictionary_max_word_length" /> <TextView android:id="@+id/user_dictionary_add_locale_label" diff --git a/java/res/layout/user_dictionary_item.xml b/java/res/layout/user_dictionary_item.xml index 56bad7743..b8d48b56d 100644 --- a/java/res/layout/user_dictionary_item.xml +++ b/java/res/layout/user_dictionary_item.xml @@ -19,10 +19,11 @@ android:background="?android:attr/selectableItemBackground" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeight" - android:paddingEnd="?android:attr/scrollbarSize" > + android:paddingEnd="?android:attr/scrollbarSize" + android:baselineAligned="false" > <RelativeLayout - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="wrap_content" android:padding="6dip" android:layout_weight="1" > diff --git a/java/res/mipmap-hdpi/ic_launcher_keyboard.png b/java/res/mipmap-hdpi/ic_launcher_keyboard.png Binary files differdeleted file mode 100644 index 36b1ccae2..000000000 --- a/java/res/mipmap-hdpi/ic_launcher_keyboard.png +++ /dev/null diff --git a/java/res/mipmap-mdpi/ic_launcher_keyboard.png b/java/res/mipmap-mdpi/ic_launcher_keyboard.png Binary files differdeleted file mode 100644 index 67ef189ff..000000000 --- a/java/res/mipmap-mdpi/ic_launcher_keyboard.png +++ /dev/null diff --git a/java/res/mipmap-xhdpi/ic_launcher_keyboard.png b/java/res/mipmap-xhdpi/ic_launcher_keyboard.png Binary files differdeleted file mode 100644 index b33208332..000000000 --- a/java/res/mipmap-xhdpi/ic_launcher_keyboard.png +++ /dev/null diff --git a/java/res/mipmap-xxhdpi/ic_launcher_keyboard.png b/java/res/mipmap-xxhdpi/ic_launcher_keyboard.png Binary files differdeleted file mode 100644 index acc424fe2..000000000 --- a/java/res/mipmap-xxhdpi/ic_launcher_keyboard.png +++ /dev/null diff --git a/java/res/raw/main_de.dict b/java/res/raw/main_de.dict Binary files differindex 69796bbaa..3cbf7105d 100644 --- a/java/res/raw/main_de.dict +++ b/java/res/raw/main_de.dict diff --git a/java/res/raw/main_en.dict b/java/res/raw/main_en.dict Binary files differindex 09b69927f..d631d6fbc 100644 --- a/java/res/raw/main_en.dict +++ b/java/res/raw/main_en.dict diff --git a/java/res/raw/main_es.dict b/java/res/raw/main_es.dict Binary files differindex 261ab8c87..8c42fda8e 100644 --- a/java/res/raw/main_es.dict +++ b/java/res/raw/main_es.dict diff --git a/java/res/raw/main_fr.dict b/java/res/raw/main_fr.dict Binary files differindex 0e5a71360..19532d9bf 100644 --- a/java/res/raw/main_fr.dict +++ b/java/res/raw/main_fr.dict diff --git a/java/res/raw/main_it.dict b/java/res/raw/main_it.dict Binary files differindex e161c2475..ff11b9798 100644 --- a/java/res/raw/main_it.dict +++ b/java/res/raw/main_it.dict diff --git a/java/res/raw/main_pt_br.dict b/java/res/raw/main_pt_br.dict Binary files differindex 21bbe7c67..9fa50442a 100644 --- a/java/res/raw/main_pt_br.dict +++ b/java/res/raw/main_pt_br.dict diff --git a/java/res/raw/main_ru.dict b/java/res/raw/main_ru.dict Binary files differindex 7dec62425..0f08f1735 100644 --- a/java/res/raw/main_ru.dict +++ b/java/res/raw/main_ru.dict diff --git a/java/res/values-af/strings-action-keys.xml b/java/res/values-af/strings-action-keys.xml index c5cd71ab7..c7ae3f759 100644 --- a/java/res/values-af/strings-action-keys.xml +++ b/java/res/values-af/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Vorige"</string> <string name="label_done_key" msgid="7564866296502630852">"Klaar"</string> <string name="label_send_key" msgid="482252074224462163">"Stuur"</string> + <string name="label_search_key" msgid="7965186050435796642">"Soek"</string> <string name="label_pause_key" msgid="2225922926459730642">"Laat wag"</string> <string name="label_wait_key" msgid="5891247853595466039">"Wag"</string> </resources> diff --git a/java/res/values-af/strings-config-important-notice.xml b/java/res/values-af/strings-config-important-notice.xml new file mode 100644 index 000000000..edd54d6f0 --- /dev/null +++ b/java/res/values-af/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Leer uit jou kommunikasie en getikte data om voorstelle te verbeter"</string> +</resources> diff --git a/java/res/values-af/strings-letter-descriptions.xml b/java/res/values-af/strings-letter-descriptions.xml new file mode 100644 index 000000000..1238a4312 --- /dev/null +++ b/java/res/values-af/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Vroulike rangtelwoordaanwyser"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikroteken"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Manlike rangtelwoordaanwyser"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Stemlose S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, gravis"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akuut"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, kappie"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, deelteken"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, sirkel bo"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, koppelletter"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cédille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, gravis"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akuut"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, kappie"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, deelteken"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, gravis"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akuut"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, kappie"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, deelteken"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, gravis"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akuut"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, kappie"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, deelteken"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, deurhaal"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, gravis"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akuut"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, kappie"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, deelteken"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akuut"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, deelteken"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brevis"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akuut"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, kappie"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, kol bo"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, onderstebo kappie"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, onderstebo kappie"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, deurhaal"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brevis"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, kol bo"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, onderstebo kappie"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, kappie"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brevis"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, kol bo"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cédille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, kappie"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, deurhaal"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brevis"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Kollose I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, koppelletter"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, kappie"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cédille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akuut"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cédille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, onderstebo kappie"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middelkol"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, deurhaal"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akuut"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cédille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, onderstebo kappie"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, voorafgegaan deur apostroof"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brevis"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dubbelakuut"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, koppelletter"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akuut"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cédille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, onderstebo kappie"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akuut"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, kappie"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cédille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, onderstebo kappie"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cédille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, onderstebo kappie"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, deurhaal"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brevis"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, sirkel bo"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dubbelakuut"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, kappie"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, kappie"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akuut"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, kol bo"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, onderstebo kappie"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Lang S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horing"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horing"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, komma onder"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, komma onder"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Sjwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, kol onder"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, haak bo"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, kappie en akuut"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, kappie en gravis"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, kappie en haak bo"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, kappie en tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, kappie en kol onder"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brevis en akuut"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brevis en gravis"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brevis en haak bo"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brevis en tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brevis en kol onder"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, kol onder"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, haak bo"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, kappie en akuut"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, kappie en gravis"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, kappie en haak bo"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, kappie en tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, kappie en kol onder"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, haak bo"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, kol onder"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, kol onder"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, haak bo"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, kappie en akuut"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, kappie en gravis"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, kappie en haak bo"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, kappie en tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, kappie en kol onder"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horing en akuut"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horing en gravis"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horing en haak bo"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horing en tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horing en kol onder"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, kol onder"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, haak bo"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horing en akuut"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horing en gravis"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horing en haak bo"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horing en tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horing en kol onder"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, gravis"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, kol onder"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, haak bo"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Onderstebo uitroepteken"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dubbele hoekaanhalingsteken na links"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middelkol"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Boskrif-een"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dubbele hoekaanhalingsteken na regs"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Onderstebo vraagteken"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Enkele linkeraanhalingsteken"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Enkele regteraanhalingsteken"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkele lae-9-aanhalingsteken"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dubbele linkeraanhalingsteken"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dubbele regteraanhalingsteken"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kruisie"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubbelkruisie"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per-duisend-teken"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Aksent"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubbelaksent"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkele hoekaanhalingsteken na links"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkele hoekaanhalingsteken na regs"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Boskrif-vier"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Klein Latynse boskrif-letter-n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso-teken"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Per adres"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pyl na regs"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pyl na onder"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Leë versameling"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Vermeerdering"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Minder as of gelyk aan"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Meer as of gelyk aan"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Swart ster"</string> +</resources> diff --git a/java/res/values-af/strings-talkback-descriptions.xml b/java/res/values-af/strings-talkback-descriptions.xml new file mode 100644 index 000000000..3b6ba0ad2 --- /dev/null +++ b/java/res/values-af/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Koppel \'n kopstuk om te hoor hoe wagwoordsleutels hardop gesê word."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Huidige teks is %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Geen teks is ingevoer nie"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> korrigeer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> voer outokorrigering uit"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Onbekende karakter"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Meer simbole"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simbole"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Vee uit"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simbole"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letters"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Nommers"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Instellings"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Spasie"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Steminvoer"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emosiekone"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Keer terug"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Soek"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Verander taal"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Volgende"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Vorige"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift geaktiveer"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Bokas-slot geaktiveer"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Simboolmodus"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Meersimbole-modus"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Lettermodus"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Foonmodus"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Foonsimbool-modus"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Sleutelbord is versteek"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Wys tans <xliff:g id="KEYBOARD_MODE">%s</xliff:g>-sleutelbord"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum en tyd"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-pos"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"boodskappe"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"nommer"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"foon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teks"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"tyd"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Onlangse emosiekone"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Mense"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Voorwerpe"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natuur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Plekke"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbole"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emosiekone"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Hoofletter-<xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Hoofletter-I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Hoofletter-I, kol bo"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Onbekende simbool"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Onbekende emosiekoon"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatiewe karakters is beskikbaar"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatiewe karakters is toegemaak"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatiewe voorstelle is beskikbaar"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatiewe voorstelle is toegemaak"</string> +</resources> diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index 045e97d94..b7a27eb7e 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropsies"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Navorsing-loglêerbevele"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Soek kontakname op"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Speltoetser gebruik inskrywings uit jou kontaklys"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreer met sleuteldruk"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Klank met sleuteldruk"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Opspring met sleuteldruk"</string> - <string name="general_category" msgid="1859088467017573195">"Algemeen"</string> - <string name="correction_category" msgid="2236750915056607613">"Tekskorrigering"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Gebaar-tik"</string> - <string name="misc_category" msgid="6894192814868233453">"Ander opsies"</string> - <string name="advanced_settings" msgid="362895144495591463">"Gevorderde instellings"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opsies vir kundiges"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Skakel oor na die ander invoermetodes"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Taal-wisselsleutel dek ook ander invoermetodes"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Taal-wisselsleutel"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Stelsel se verstek"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Gepersonaliseerde voorstelle"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Verbeter <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelspasie-punt"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbeltik op spasiebalk voeg \'n punt in, gevolg deur \'n spasie"</string> <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Wys gebaarspoor"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamiese sweefvoorskou"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Sien die voorgestelde woord tydens gebare"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gestoor"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Koppel \'n kopstuk om te hoor hoe wagwoordsleutels hardop gesê word."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Huidige teks is %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Geen teks ingevoer nie"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> korrigeer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> voer outokorreksie uit"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Sleutelkode %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift aan (tik om te deaktiveer)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Kasslot aan (tik om te deaktiveer)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Vee uit"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simbole"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letters"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Nommers"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Instellings"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Oortjie"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spasie"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Steminvoering"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Glimlag-gesiggie"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Soek"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Verander taal"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Volgende"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Vorige"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift geaktiveer"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Kasslot geaktiveer"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift gedeaktiveer"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Simboolmodus"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Lettermodus"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Foonmodus"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Foonsimbool-modus"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Sleutelbord versteek"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Wys <xliff:g id="MODE">%s</xliff:g>-sleutelbord"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tyd"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pos"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"boodskappe"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"nommer"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"foon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"tyd"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frasegebaar"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Voer spasies tydens gebare in deur na die spasiesleutel te gly"</string> <string name="voice_input" msgid="3583258583521397548">"Steminvoerinstellings"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Op hoofsleutelbord"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Op simbolesleutelbord"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Af"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofoon op hoofsleutelbord"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofoon op simbolesleutelbord"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Geen steminvoermetodes geaktiveer nie. Gaan taal- en invoerinstellings na."</string> <string name="configure_input_method" msgid="373356270290742459">"Stel invoermetodes op"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string> <string name="send_feedback" msgid="1780431884109392046">"Stuur terugvoer"</string> <string name="select_language" msgid="3693815588777926848">"Invoertale"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak weer om te stoor"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordeboek beskikbaar"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiveer gebruikerterugvoer"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Help om hierdie invoermetode-redigeerder te verbeter deur gebruikstatistiek en omvalverslae outomaties te stuur"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Sleutelbordtema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engels (VK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engels (VS)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spaans (VS)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engels (VK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engels (VS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spaans (VS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Tradisioneel)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engels (VK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engels (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spaans (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradisioneel)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyrillies)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latyns)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Geen taal nie (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emosiekone"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Kleurskema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Wit"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blou"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Gepasmaakte invoerstyle"</string> <string name="add_style" msgid="6163126614514489951">"Voeg styl by"</string> <string name="add" msgid="8299699805688017798">"Voeg by"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktiveer"</string> <string name="not_now" msgid="6172462888202790482">"Nie nou nie"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Dieselfde invoerstyl bestaan reeds: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Bruikbaarheidstudie-modus"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Vertraging van sleutellangdruk"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Sleuteldruk se vibrasie-tydsduur"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Sleuteldruk se klankvolume"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lees eksterne woordeboeklêer"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordeboeklêers in die aflaaiselsvouer nie"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Kies \'n woordeboeklêer om te installeer"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Moet hierdie lêer regtig vir <xliff:g id="LOCALE_NAME">%s</xliff:g> geïnstalleer word?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Moet hierdie lêer regtig vir <xliff:g id="LANGUAGE_NAME">%s</xliff:g> geïnstalleer word?"</string> <string name="error" msgid="8940763624668513648">"Daar was \'n fout"</string> <string name="button_default" msgid="3988017840431881491">"Verstek"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Welkom by <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Verfris"</string> <string name="last_update" msgid="730467549913588780">"Laas opgedateer"</string> <string name="message_updating" msgid="4457761393932375219">"Kontroleer vir opdaterings"</string> - <string name="message_loading" msgid="8689096636874758814">"Laai tans…"</string> + <string name="message_loading" msgid="5638680861387748936">"Laai tans…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Hoofwoordeboek"</string> <string name="cancel" msgid="6830980399865683324">"Kanselleer"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Instellings"</string> <string name="install_dict" msgid="180852772562189365">"Installeer"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Kanselleer"</string> <string name="delete_dict" msgid="756853268088330054">"Vee uit"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Die gekose taal op jou mobiele toestel het \'n beskikbare woordeboek.<br/> Ons beveel aan dat die <xliff:g id="LANGUAGE">%1$s</xliff:g>-woordeboek <b>afgelaai</b> word om jou tikervaring te verbeter.<br/> <br/> Dit kan \'n minuut of twee neem om oor 3G af te laai. Heffings kan dalk geld as jy nie \'n <b>onbeperkte dataplan</b> het nie.<br/> As jy onseker oor jou dataplan is, beveel ons aan dat jy \'n Wi-Fi-verbinding soek om outomaties te begin aflaai.<br/> <br/> Wenk: Jy kan woordeboeke aflaai en verwyder deur te gaan na <b>Taal en invoer</b> in die <b>Instellings</b>-kieslys van jou mobiele toestel."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Die gekose taal op jou mobiele toestel het \'n beskikbare woordeboek.<br/> Ons beveel aan dat die <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-woordeboek <b>afgelaai</b> word om jou tikervaring te verbeter.<br/> <br/> Dit kan \'n minuut of twee duur om oor 3G af te laai. Heffings kan dalk geld as jy nie \'n <b>onbeperkte dataplan</b> het nie.<br/> As jy onseker is oor watter dataplan jy het, beveel ons aan dat jy \'n Wi-Fi-verbinding soek om outomaties te begin aflaai.<br/> <br/> Wenk: Jy kan woordeboeke aflaai en verwyder deur te gaan na <b>Taal en invoer</b> in die <b>Instellings</b>-kieslys van jou mobiele toestel."</string> <string name="download_over_metered" msgid="1643065851159409546">"Laai nou af (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Laai oor Wi-Fi af"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"\'n Woordeboek is vir <xliff:g id="LANGUAGE">%1$s</xliff:g> beskikbaar"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"\'n Woordeboek is beskikbaar vir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te hersien en af te laai"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Laai tans af: voorstelle vir <xliff:g id="LANGUAGE">%1$s</xliff:g> sal binnekort gereed wees."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Laai tans af: voorstelle vir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sal binnekort gereed wees."</string> <string name="version_text" msgid="2715354215568469385">"Weergawe <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Voeg by"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Voeg by woordeboek"</string> diff --git a/java/res/values-am/strings-action-keys.xml b/java/res/values-am/strings-action-keys.xml index 1813a86d8..51c253823 100644 --- a/java/res/values-am/strings-action-keys.xml +++ b/java/res/values-am/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"ቀዳሚ"</string> <string name="label_done_key" msgid="7564866296502630852">"ተደርጓል"</string> <string name="label_send_key" msgid="482252074224462163">"ላክ"</string> + <string name="label_search_key" msgid="7965186050435796642">"ፈልግ"</string> <string name="label_pause_key" msgid="2225922926459730642">"ቆም በል"</string> <string name="label_wait_key" msgid="5891247853595466039">"ጠብቅ"</string> </resources> diff --git a/java/res/values-am/strings-config-important-notice.xml b/java/res/values-am/strings-config-important-notice.xml new file mode 100644 index 000000000..db537dc25 --- /dev/null +++ b/java/res/values-am/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"የአስተያየት ጥቆማዎችን ለማሻሻል ከእርስዎ ግንኙነቶች እና የተተየበ ውሂብ ይማሩ"</string> +</resources> diff --git a/java/res/values-am/strings-letter-descriptions.xml b/java/res/values-am/strings-letter-descriptions.xml new file mode 100644 index 000000000..5c9486975 --- /dev/null +++ b/java/res/values-am/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"እንስት የደረጃ አመልካች"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"የማይክሮ ምልክት"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ተባዕታይ የደረጃ አመልካች"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ሻርፕ ኤስ"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ኤ፣ ጭረት"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ኤ፣ ይዘት"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ኤ፣ ድፋት"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ኤ፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ኤ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ኤ፣ ቀለበት ከላይ"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ኤ፣ ኢ፣ ማሰሪያ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"ሲ፣ ጭራ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ኢ፣ ጭረት"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ኢ፣ ይዘት"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ኢ፣ ድፋት"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ኢ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"አይ፣ ጭረት"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"አይ፣ ይዘት"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"አይ፣ ድፋት"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"አይ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ኤት"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"ኤን፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ኦ፣ ጭረት"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ኦ፣ ይዘት"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ኦ፣ ድፋት"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ኦ፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ኦ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ኦ፣ ሰያፍ ሰረዝ"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"ዩ፣ ጭረት"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"ዩ፣ ይዘት"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"ዩ፣ ድፋት"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"ዩ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"ዋይ፣ ይዘት"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ቶርን"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"ዋይ፣ ባለሁለት ነጥብ"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ኤ፣ ማክሮን"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ኤ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ኤ፣ ኦጎነክ"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"ሲ፣ ይዘት"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"ሲ፣ ድፋት"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"ሲ፣ ነጥብ ከላይ"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"ሲ፣ ካሮን"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"ዲ፣ ካሮን"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"ዲ፣ ሰያፍ ሰረዝ"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ኢ፣ ማክሮን"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ኢ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ኢ፣ ነጥብ ከላይ"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ኢ፣ ኦጎነክ"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ኢ፣ ካሮን"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"ጂ፣ ድፋት"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"ጂ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"ጂ፣ ነጥብ ከላይ"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"ጂ፣ ጭራ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"ኤች፣ ድፋት"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"ኤች፣ ሰያፍ ሰረዝ"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"አይ፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"አይ፣ ማክሮን"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"አይ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"አይ፣ ኦጎነክ"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ነጥብ አልባ አይ"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"አይ፣ ጄ፣ ማሰሪያ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"ጄ፣ ድፋት"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"ኬ፣ ጭራ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ክራ"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"ኤል፣ ይዘት"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"ኤል፣ ጭራ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"ኤል፣ ካሮን"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"ኤል፣ የመሃል ነጥብ"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"ኤል፣ ሰያፍ ሰረዝ"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"ኤን፣ ይዘት"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"ኤን፣ ጭራ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"ኤን፣ ካሮን"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"ኤን፣ በትእምርተ ጭረት የተቀደመ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"እንግ"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ኦ፣ ማክሮን"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ኦ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ኦ፣ ድርብ ይዘት"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ኦ፣ ኢ፣ ማሰሪያ"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"አር፣ ይዘት"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"አር፣ ጭራ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"አር፣ ካሮን"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"ኤስ፣ ይዘት"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"ኤስ፣ ድፋት"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"ኤስ፣ ጭራ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"ኤስ፣ ካሮን"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"ቲ፣ ጭራ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"ቲ፣ ካሮን"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"ቲ፣ ሰያፍ ሰረዝ"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"ዩ፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"ዩ፣ ማክሮን"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"ዩ፣ ቁንጽል"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"ዩ፣ ቀለበት ከላይ"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"ዩ፣ ድርብ ይዘት"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"ዩ፣ ኦጎነክ"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"ደብልዩ፣ ድፋት"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"ዋይ፣ ድፋት"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"ዜድ፣ ይዘት"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"ዜድ፣ ነጥብ ከላይ"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"ዜድ፣ ካሮን"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"ረጅም ኤስ"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ኦ፣ ቀንድ"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"ዩ፣ ቀንድ"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"ኤስ፣ ኮማ ከታች"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"ቲ፣ ኮማ ከታች"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ሽዋ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ኤ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ኤ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ኤ፣ ድፋት እና ይዘት"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ኤ፣ ድፋት እና ጭረት"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ኤ፣ ድፋት እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ኤ፣ ድፋት እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ኤ፣ ድፋት እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ኤ፣ ቁንጽል እና ይዘት"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ኤ፣ ቁንጽል እና ጭረት"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ኤ፣ ቁንጽል እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ኤ፣ ቁንጽል እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ኤ፣ ቁንጽል እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ኢ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ኢ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ኢ፣ ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ኢ፣ ድፋት እና ይዘት"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ኢ፣ ድፋት እና ጭረት"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ኢ፣ ድፋት እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ኢ፣ ድፋት እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ኢ፣ ድፋት እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"አይ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"አይ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ኦ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ኦ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ኦ፣ ድፋት እና ይዘት"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ኦ፣ ድፋት እና ጭረት"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ኦ፣ ድፋት እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ኦ፣ ድፋት እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ኦ፣ ድፋት እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ኦ፣ ቀንድ እና ይዘት"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ኦ፣ ቀንድ እና ጭረት"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ኦ፣ ቀንድ እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ኦ፣ ቀንድ እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ኦ፣ ቀንድ እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"ዩ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"ዩ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"ዩ፣ ቀንድ እና ይዘት"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"ዩ፣ ቀንድ እና ጭረት"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"ዩ፣ ቀንድ እና መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"ዩ፣ ቀንድ እና ድፋትቅናት"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"ዩ፣ ቀንድ እና ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"ዋይ፣ ጭረት"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"ዋይ፣ ነጥብ ከታች"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"ዋይ፣ መንጠቆ ከላይ"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"ዋይ፣ ድፋትቅናት"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"የተገለበጠ ቃለ አጋኖ"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ግራ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"የመሃል ነጥብ"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ራስጌ አደር አንድ"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ቀኝ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"የተገለበጠ የጥያቄ ምልክት"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"የግራ ነጠላ ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"የቀኝ ነጠላ ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ነጠላ ዝቅተኛ-9 ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"የግራ ድርብ ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"የቀኝ ድርብ ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ሾተል"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ድርብ ሾተል"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"የሺኛ ምልክት"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"ፕራይም"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ድርብ ፕራይም"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ነጠላ ግራ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ነጠላ ቀኝ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ራስጌ አደር አራት"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"የራስጌ አደር ላቲን ንዑስ ሆሄ ኤን"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"የፔሶ ምልክት"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"ባለአደራ"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"የቀኝ ቀስት"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"የታች ቀስት"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ባዶ ስብስብ"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"ጨምር"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ያንሳል ወይም እክሉ ነው ከ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ይበልጣል ወይም እክሉ ነው ከ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ጥቁር ኮከብ"</string> +</resources> diff --git a/java/res/values-am/strings-talkback-descriptions.xml b/java/res/values-am/strings-talkback-descriptions.xml new file mode 100644 index 000000000..84c3cb0c8 --- /dev/null +++ b/java/res/values-am/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"የይለፍ ቃል ቁልፎች ጮክ ተብለው ሲነገሩ ለመስማት የጆሮ ማዳመጫ ይሰኩ።"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"የአሁኑ ፅሁፍ %s ነው"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ምንም ፅሁፍ አልገባም"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ን ወደ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ያርመዋል"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> የራስ ሰር እርማት ያከናውናል"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"ያልታወቀ ቁምፊ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"ቀይር"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ተጨማሪ ምልክቶች"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ምልክቶች"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ሰርዝ"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ምልክቶች"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ደብዳቤዎች"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"ቁጥሮች"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ቅንብሮች"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ትር"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ባዶ ቦታ"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"የድምፅ ግቤት"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ኢሞጂ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ተመለስ"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ፈልግ"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ነጥብ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ቋንቋ ቀይር"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"ቀጣይ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"ቀዳሚ"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"መቀያየሪያ ቁልፍ ነቅቷል"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"አብይ ፊደል ማድረጊያ ቁልፍ ነቅቷል"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"የምልክቶች ሁኔታ"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"የተጨማሪ ምልክቶች ሁነታ"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"የደብዳቤዎች ሁኔታ"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"የስልክ ሁኔታ"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"የስልክ ምልክቶች ሁኔታ"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"የቁልፍ ሰሌዳ ተደብቋል"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"የ<xliff:g id="KEYBOARD_MODE">%s</xliff:g> የቁልፍ ሰሌዳ በማሳየት ላይ"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ቀን"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ቀን እና ሰዓት"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ኢሜይል"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"መልዕክት መላላክ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"ቁጥር"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ስልክ"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ፅሁፍ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ጊዜ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"ዩአርኤል"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"የቅርብ ጊዜዎቹ"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ሰዎች"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ነገሮች"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ተፈጥሮ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ቦታዎች"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ምልክቶች"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ስሜት ገላጭ አዶዎች"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"አቢይ ሆሄ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"አቢይ ሆሄ አይ"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"አቢይ ሆሄ አይ፣ ነጥብ ከላይ"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"ያልታወቀ ምልክት"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ያልታወቀ ስሜት ገላጭ ምስል"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ተለዋጭ ቁምፊዎች ይገኛሉ"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ተለዋጭ ቁምፊዎች ተሰናብተዋል"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ተለዋጭ የአስተያየት ጥቆማዎች ይገኛሉ"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ተለዋጭ የአስተያየት ጥቆማዎች ተሰናብተዋል"</string> +</resources> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index 0b81034f4..7f5b32264 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"የጥናት የምዝግብ ማስታወሻ ትዕዛዞች"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"የእውቅያ ስሞችን ተመልከት"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ፊደል አራሚ ከእውቅያ ዝርዝርህ የገቡትን ይጠቀማል"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"በቁልፍመጫንጊዜ አንዝር"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"በቁልፍ መጫን ላይ የሚወጣ ድምፅ"</string> <string name="popup_on_keypress" msgid="123894815723512944">"ቁልፍ ጫን ላይ ብቅ ባይ"</string> - <string name="general_category" msgid="1859088467017573195">"አጠቃላይ"</string> - <string name="correction_category" msgid="2236750915056607613">"ፅሁፍ አስተካክል"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"በምልክት መተየብ"</string> - <string name="misc_category" msgid="6894192814868233453">"ሌሎች አማራጮች"</string> - <string name="advanced_settings" msgid="362895144495591463">"የላቁ ቅንብሮች"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"ለብቁ ተጠቃሚዎች አማራጮች"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ወደ ሌሎች የግቤት ስልቶች ቀይር"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"የቋንቋ መቀየሪያ ቁልፍ ሌሎች የግቤት ስልቶችንም ይሸፍናል"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"የቋንቋ መቀየሪያ ቁልፍ"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"የስርዓት ነባሪ"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"የዕውቂያ ስም ጠቁም"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ከዕውቂያዎች ለጥቆማዎች እና ማስተካከያዎች ስሞች ተጠቀም"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ግላዊ የጥቆማ አስተያየቶች"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ን አሻሽል"</string> <string name="use_double_space_period" msgid="8781529969425082860">"የድርብ-ክፍተት ነጥብ"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"የክፍተት አሞሌው ላይ ሁለቴ መታ ማድረግ አንድ ነጥብ እና ክፍተት አስከትሎ ያስገባል"</string> <string name="auto_cap" msgid="1719746674854628252">"ራስ-ሰር አቢይ ማድረግ"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"ምልክት የሚሄድበት መንገድ አሳይ"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ተለዋዋጭ ተንሳፋፊ ቅድመ-እይታ"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ምልክት እየሰጡ ሳሉ በአስተያየት የተጠቆመው ቃል ይመልከቱ"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ተቀምጧል"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"የይለፍቃል ቁልፎች ጮክ በለው ሲነገሩ ለመስማት የጆሮ ማዳመጫ ሰካ::"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"የአሁኑ ፅሁፍ %s ነው"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"ምንም ፅሁፍ አልገባም"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ን ወደ <xliff:g id="CORRECTED">%3$s</xliff:g> ያርመዋል"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> ራስ-ሰር እርማትን ያከናውናል"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"የቁልፍ ኮድ%d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"ቀይር"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"ቅያር በርቷል (ለማሰናክል ንካ)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"አቢያት ማድረጊያ ቁልጥ በርቷል (ለማሰናክል ንካ)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"ሰርዝ"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"ምልክቶች"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"ደብዳቤዎች"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"ቁጥሮች"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"ቅንብሮች"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"ትር"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"ባዶ ቦታ"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"የድምፅ ግቤ ት"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"የፈገግታ ፊት"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"ተመለስ"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"ፍለጋ"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"ነጥብ"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"ቋንቋ ቀይር"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"ቀጣይ"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"ቀዳሚ"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"ቅያር ቁልፍ ነቅቷል"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"አቢያት ማድረጊያ ነቅቷል"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"ቅያር ተሰናክሏል"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"የምልክቶች ሁኔታ ላይ"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"የደብዳቤዎች ሁኔታ ላይ"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"የስልክ ሁኔታ ላይ"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"የስልክ ምልክቶች ሁኔታ ላይ"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"የቁልፍ ሰሌዳ ተደብቋል"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"የ<xliff:g id="MODE">%s</xliff:g> ቁልፍ ሰሌዳን በማሳየት ላይ"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ቀን"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ቀን እና ሰዓት"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"ኢሜይል"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"አላላክ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"ቁጥር"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"ስልክ"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"ፅሁፍ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ጊዜ"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"ዩ አር ኤል"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"የሐረግ ምልክት"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ምልክት በሚሰጡበት ጊዜ ወደ ክፍተት ቁልፉ በማንሸራተት ክፍተቶችን ያስገቡ"</string> <string name="voice_input" msgid="3583258583521397548">"የድምፅ ግቤት ቁልፍ"</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="voice_input_disabled_summary" msgid="8141750303464726129">"ምንም የግቤት ስልቶች አልነቁም። የቋንቋ እና የግቤት ቅንብሮችን ይፈትሹ።"</string> <string name="configure_input_method" msgid="373356270290742459">"ግቤት ሜተዶችን አዋቀር"</string> <string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string> <string name="send_feedback" msgid="1780431884109392046">"ግብረ-መልስ ላክ"</string> <string name="select_language" msgid="3693815588777926848">"ቋንቋዎች አግቤት"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"ለማስቀመጥ እንደገና ንካ"</string> <string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"የተጠቃሚ ግብረ ምላሽ አንቃ"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"አጠቃቀም ስታስቲክስ እና የብልሽት ሪፖርቶችን በራስ-ሰር በመላክ ይህን ግቤት ስልት አርታዒ እንዲሻሻል ያግዙ።"</string> <string name="keyboard_layout" msgid="8451164783510487501">"የቁልፍ ሰሌዳ ገጽታ"</string> <string name="subtype_en_GB" msgid="88170601942311355">"እንግሊዘኛ (የታላቋ ብሪታንያ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"እንግሊዘኛ (ዩ.ኤስ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"ስፓኒሽኛ (ዩኤስ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"እንግሊዘኛ (ዩናይትድ ኪንግደም) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"እንግሊዘኛ (አሜሪካ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"ስፓኒሽኛ (ዩኤስ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (ተለምዷዊ)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"እንግሊዝኛ (ዩኬ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"እንግሊዝኛ (አሜሪካ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ስፓኒሽ (አሜሪካ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ተለምዷዊ)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ሳይሪሊክ)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ላቲን)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"ምንም ቋንቋ (ፊደላት)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ፊደላት (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ፊደላት (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ፊደላት (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ፊደላት (ፒሲ)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"ኢሞጂ"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"የቀለም ዘዴ"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"ነጭ"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"ሰማያዊ"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"የተበጁ የግቤት ስታይሎች"</string> <string name="add_style" msgid="6163126614514489951">"ስታይል አክል"</string> <string name="add" msgid="8299699805688017798">"አክል"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"አንቃ"</string> <string name="not_now" msgid="6172462888202790482">"አሁን አልፈልግም"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ተመሳሳዩ የግብዓት ቅጥ አስቀድሞ አለ፦ <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"የተገልጋይነት ጥናት ሁነታ"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"የሰሌዳ ቁልፍ ጠቅታ በመጫን መዘግየት"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"የቁልፍ ጭነት ንዝረት ርዝመት"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"የቁልፍ ጭነት ድምጽ መጠን"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ውጫዊ የመዝገበቃላት ፋይል አንብብ"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"በውርዶች አቃፊው ውስጥ ምንም የመዝገበ-ፋይሎች የሉም"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"የሚጭኑት የመዝገበ-ቃላት ፋይል ይምረጡ"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"እውን ይሄ ፋይል ለ<xliff:g id="LOCALE_NAME">%s</xliff:g> ይጫን?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"እውን ይሄ ፋይል ለ<xliff:g id="LANGUAGE_NAME">%s</xliff:g> ይጫን?"</string> <string name="error" msgid="8940763624668513648">"ስህተት ተከስቶ ነበር"</string> <string name="button_default" msgid="3988017840431881491">"ነባሪ"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"እንኳን ወደ <xliff:g id="APPLICATION_NAME">%s</xliff:g> በደህና መጡ"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"አድስ"</string> <string name="last_update" msgid="730467549913588780">"ለመጨረሻ ጊዜ የተዘመነው"</string> <string name="message_updating" msgid="4457761393932375219">"ዝማኔዎችን በመፈለግ ላይ"</string> - <string name="message_loading" msgid="8689096636874758814">"በመጫን ላይ..."</string> + <string name="message_loading" msgid="5638680861387748936">"በመጫን ላይ…"</string> <string name="main_dict_description" msgid="3072821352793492143">"ዋና መዝገበ-ቃላት"</string> - <string name="cancel" msgid="6830980399865683324">"ሰርዝ"</string> + <string name="cancel" msgid="6830980399865683324">"ይቅር"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ቅንብሮች"</string> <string name="install_dict" msgid="180852772562189365">"ጫን"</string> - <string name="cancel_download_dict" msgid="7843340278507019303">"ሰርዝ"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ይቅር"</string> <string name="delete_dict" msgid="756853268088330054">"ሰርዝ"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ተንቀሳቃሽ መሣሪያዎ ላይ ለተመረጠው ቋንቋ የሚሆን መዝገበ-ቃላት ይገኛል።<br/> የትየባ ተሞክሮዎን ለማሻሻል የ<xliff:g id="LANGUAGE">%1$s</xliff:g> መዝገበ-ቃላቱን <b>እንዲያወርዱ</b> እንመክራለን።<br/> <br/> ውርዱ በ3ጂ ላይ አንድ ወይም ሁለት ደቂቃ ሊወስድ ይችላል። <b>ያልተገደበ የውሂብ ዕቅድ</b> ከሌለዎት ክፍያዎች መከፈል ሊኖርባቸው ይችላል።<br/> የትኛው የውሂብ ዕቅድ እንዳለዎት እርግጠኛ ካልሆኑ ውርዱን በራስ-ሰር ለመጀመር የWi-Fi ግንኙነት እንዲፈልጉ እንመክራለን።<br/> <br/> ጠቃሚ ምክር፦ የተንቀሳቃሽ መሣሪያዎ <b>ቅንብሮች</b> ምናሌ ውስጥ ወዳለው <b>ቋንቋ እና ግብዓት</b> በመሄድ መዝገበ-ቃላትን ማውረድና ማስወገድ ይችላሉ።"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"በተንቀሳቃሽ መሣሪያዎ ላይ ለተመረጠው ቋንቋ የሚሆን መዝገበ-ቃላት ይገኛል።<br/> የትየባ ተሞክሮዎን ለማሻሻል የ<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> መዝገበ-ቃላቱን <b>እንዲያወርዱ</b> እንመክራለን።<br/> <br/> ማውረድ በ3ጂ ላይ አንድ ወይም ሁለት ደቂቃ ሊወስድ ይችላል። <b>ያልተገደበ የውሂብ ዕቅድ</b> ከሌለዎት ክፍያዎች መከፈል ሊኖርባቸው ይችላል።<br/> የትኛው የውሂብ ዕቅድ እንዳለዎት እርግጠኛ ካልሆኑ ውርዱን በራስ-ሰር ለመጀመር የWi-Fi ግንኙነት እንዲፈልጉ እንመክራለን።<br/> <br/> ጠቃሚ ምክር፦ የተንቀሳቃሽ መሣሪያዎ <b>ቅንብሮች</b> ምናሌ ውስጥ ወዳለው <b>ቋንቋ እና ግብዓት</b> በመሄድ መዝገበ-ቃላትን ማውረድና ማስወገድ ይችላሉ።"</string> <string name="download_over_metered" msgid="1643065851159409546">"አሁን አውርድ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> ሜባ)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"በWi-Fi አውርድ"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"መዝገበ-ቃላት ለ<xliff:g id="LANGUAGE">%1$s</xliff:g> ይገኛል"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"የ<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> መዝገበ-ቃላት ማግኘት ይችላል"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"ለመገምገምና ለማውረድ ይጫኑ"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"በማውረድ ላይ፦ የ<xliff:g id="LANGUAGE">%1$s</xliff:g> ጥቆማ አስተያየቶች በቅርቡ ዝግጁ ይሆናሉ።"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"በማውረድ ላይ፦ ለ<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> የሚሰጡ ጥቆማዎች በቅርቡ ዝግጁ ይሆናሉ።"</string> <string name="version_text" msgid="2715354215568469385">"ሥሪት <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"አክል"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ወደ መዝገበ-ቃላት አክል"</string> diff --git a/java/res/values-ar-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/res/values-ar-sw600dp/donottranslate-config-spacing-and-punctuations.xml new file mode 100644 index 000000000..d7aca6fb4 --- /dev/null +++ b/java/res/values-ar-sw600dp/donottranslate-config-spacing-and-punctuations.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- The all letters need to be mirrored are found at + http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt --> + <!-- Symbols that are suggested between words --> + <!-- U+061F: "؟" ARABIC QUESTION MARK + U+061B: "؛" ARABIC SEMICOLON --> + <string name="suggested_punctuations">!,؟,:,؛,\",\',(|),)|(,-,/,@,_</string> +</resources> diff --git a/java/res/values-iw/donottranslate.xml b/java/res/values-ar/donottranslate-config-spacing-and-punctuations.xml index 57de2538b..21bb3318f 100644 --- a/java/res/values-iw/donottranslate.xml +++ b/java/res/values-ar/donottranslate-config-spacing-and-punctuations.xml @@ -21,5 +21,8 @@ <!-- The all letters need to be mirrored are found at http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt --> <!-- Symbols that are suggested between words --> - <string name="suggested_punctuations">!,?,\\,,:,;,\",(|),)|(,\',-,/,@,_</string> + <!-- U+061F: "؟" ARABIC QUESTION MARK + U+060C: "،" ARABIC COMMA + U+061B: "؛" ARABIC SEMICOLON --> + <string name="suggested_punctuations">!,؟,،,:,؛,\",(|),)|(,\',-,/,@,_</string> </resources> diff --git a/java/res/values-ar/strings-action-keys.xml b/java/res/values-ar/strings-action-keys.xml index 481b22f20..6b2e4b283 100644 --- a/java/res/values-ar/strings-action-keys.xml +++ b/java/res/values-ar/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"سابق"</string> <string name="label_done_key" msgid="7564866296502630852">"تم"</string> <string name="label_send_key" msgid="482252074224462163">"إرسال"</string> + <string name="label_search_key" msgid="7965186050435796642">"بحث"</string> <string name="label_pause_key" msgid="2225922926459730642">"توقف"</string> <string name="label_wait_key" msgid="5891247853595466039">"انتظر"</string> </resources> diff --git a/java/res/values-ar/strings-config-important-notice.xml b/java/res/values-ar/strings-config-important-notice.xml new file mode 100644 index 000000000..7af5f6d5c --- /dev/null +++ b/java/res/values-ar/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"التعلم من اتصالاتك والبيانات التي تكتبها لتحسين الاقتراحات"</string> +</resources> diff --git a/java/res/values-ar/strings-letter-descriptions.xml b/java/res/values-ar/strings-letter-descriptions.xml new file mode 100644 index 000000000..5067f6c54 --- /dev/null +++ b/java/res/values-ar/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"علامة ترتيب مؤنث"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"علامة ميكرو"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"علامة ترتيب مذكر"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"علامة تعجب مقلوبة"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"علامة تنصيص ثنائية بزاوية تشير لليسار"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"نقطة متوسطة"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"واحد مرتفع"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"علامة تنصيص ثنائية بزاوية تشير لليمين"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"علامة استفهام مقلوبة"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"علامة تنصيص مفردة لليسار"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"علامة تنصيص مفردة لليمين"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"علامة تنصيص مفردة أسفل 9"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"علامة تنصيص مزدوجة لليسار"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"علامة تنصيص مزدوجة لليمين"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"علامة كل ميل"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"علامة تنصيص مفردة بزاوية تشير لليسار"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"علامة تنصيص مفردة بزاوية تشير لليمين"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"أربعة مرتفع"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"سهم إلى اليمين"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"سهم لأسفل"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"زيادة"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"أصغر من أو يساوي"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"أكبر من أو يساوي"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"نجمة سوداء"</string> +</resources> diff --git a/java/res/values-ar/strings-talkback-descriptions.xml b/java/res/values-ar/strings-talkback-descriptions.xml new file mode 100644 index 000000000..bd2d7c6d5 --- /dev/null +++ b/java/res/values-ar/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور منطوقة بصوت عالٍ."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"النص الحالي هو %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"لم يتم إدخال نص"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> لتصحيح <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> إلى <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> لإجراء التصحيح التلقائي"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"حرف غير معروف"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"المزيد من الرموز"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"رموز"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"حذف"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"رموز"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"أحرف"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"أرقام"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"الإعدادات"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"مسافة"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"إدخال صوتي"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"رمز تعبيري"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"رجوع"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"بحث"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"نقطة"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"تبديل اللغة"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"التالي"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"السابق"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"تم تمكين Shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"تم تمكين Caps lock"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"وضع الرموز"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"المزيد من وضع الرموز"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"وضع الأحرف"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"وضع الهاتف"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"وضع رموز الهاتف"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"لوحة المفاتيح مخفية"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"إظهار لوحة مفاتيح <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"التاريخ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"التاريخ والوقت"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"بريد إلكتروني"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"مراسلة"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"رقم"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"هاتف"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"نص"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"الوقت"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"عنوان URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"الحديثة"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"أشخاص"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"كائنات"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"الطبيعة"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"أماكن"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"رموز"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"رموز تعبيرية"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> كبير"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I كبير"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"رمز غير معروف"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"رمز تعبيري غير معروف"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"تتوفر الأحرف البديلة"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"تم تجاهل الأحرف البديلة"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"تتوفر الاقتراحات البديلة"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"تم تجاهل الاقتراحات البديلة"</string> +</resources> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index da331196c..e76280d80 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"خيارات الإرسال"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"أوامر سجلات البحث"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"بحث في أسماء جهات الاتصال"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"يستخدم المدقق الإملائي إدخالات من قائمة جهات الاتصال"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"اهتزاز عند ضغط مفتاح"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صوت عند الضغط على مفتاح"</string> <string name="popup_on_keypress" msgid="123894815723512944">"انبثاق عند ضغط مفتاح"</string> - <string name="general_category" msgid="1859088467017573195">"عام"</string> - <string name="correction_category" msgid="2236750915056607613">"تصحيح النص"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"الكتابة بالإيماءة"</string> - <string name="misc_category" msgid="6894192814868233453">"خيارات أخرى"</string> - <string name="advanced_settings" msgid="362895144495591463">"الإعدادات المتقدمة"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"خيارات للخبراء"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"التبديل إلى أسلوب إدخال آخر"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"يغطي مفتاح تبديل اللغات أساليب الإدخال الأخرى أيضًا"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"مفتاح تبديل اللغة"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"الإعداد الافتراضي للنظام"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"اقتراح أسماء جهات الاتصال"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"استخدام الأسماء من جهات الاتصال للاقتراحات والتصحيحات"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"اقتراحات مخصصة"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"تحسين <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"نقطة المسافة المزدوجة"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"يؤدي النقر نقرًا مزدوجًا على مفتاح المسافة إلى إدخال نقطة متبوعة بمسافة"</string> <string name="auto_cap" msgid="1719746674854628252">"أحرف كبيرة تلقائيًا"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"عرض مسار الإيماءة"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"معاينة نصوص متحركة ديناميكية"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"مشاهدة الكلمة المقترحة أثناء الإيماءة"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : تم الحفظ"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"يمكنك توصيل سماعة رأس لسماع مفاتيح كلمة المرور منطوقة بصوت عالٍ."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"النص الحالي هو %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"لم يتم إدخال نص"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> لتصحيح <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> إلى <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> للتصحيح التلقائي"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"رمز المفتاح %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"العالي"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift يعمل (انقر للتعطيل)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock يعمل (انقر للتعطيل)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"حذف"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"الرموز"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"أحرف"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"أرقام"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"الإعدادات"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"علامة تبويب"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"مسافة"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"إدخال صوتي"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"وجه مبتسم"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"رجوع"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"بحث"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"نقطة"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"تبديل اللغة"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"التالي"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"السابق"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"تم تمكين Shift"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"تم تمكين Caps lock"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"تم تعطيل Shift"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"وضع الرموز"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"وضع الأحرف"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"وضع الهاتف"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"وضع رموز الهاتف"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"لوحة المفاتيح مخفية"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"إظهار لوحة مفاتيح <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"التاريخ"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"التاريخ والوقت"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"البريد الإلكتروني"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"المراسلة"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"الرقم"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"الهاتف"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"النص"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"الوقت"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"عنوان URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"عبارة الإيماء"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"إدخال مسافات خلال الإيماءات من خلال تمرير مفتاح المسافة"</string> <string name="voice_input" msgid="3583258583521397548">"مفتاح الإدخال الصوتي"</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="voice_input_disabled_summary" msgid="8141750303464726129">"لم يتم تمكين أي أساليب إدخال صوتي. تحقق من إعدادات اللغة والإدخال."</string> <string name="configure_input_method" msgid="373356270290742459">"تهيئة طرق الإدخال"</string> <string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string> <string name="send_feedback" msgid="1780431884109392046">"إرسال تعليقات"</string> <string name="select_language" msgid="3693815588777926848">"لغات الإدخال"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"المس مرة أخرى للحفظ"</string> <string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"المساعدة في تحسين محرر أسلوب الإدخال هذا من خلال إرسال إحصاءات الاستخدام وتقارير الأعطال تلقائيًا"</string> <string name="keyboard_layout" msgid="8451164783510487501">"مظهر لوحة المفاتيح"</string> <string name="subtype_en_GB" msgid="88170601942311355">"الإنجليزية (المملكة المتحدة)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"الإنجليزية (الولايات المتحدة)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"الإسبانية (الأميركية)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"الإنجليزية (المملكة المتحدة) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"الإنجليزية (الولايات المتحدة) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"الإسبانية (الأمريكية) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (التقليدية)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"الإنجليزية (المملكة المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"الإنجليزية (الولايات المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"الإسبانية (الولايات المتحدة) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (التقليدية)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (السريلية)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (اللاتينية)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"بدون لغة (أبجدية)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"الأبجدية (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"الأبجدية (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"الأبجدية (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"الأبجدية (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"الرموز التعبيرية"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"النمط اللوني"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"أبيض"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"أزرق"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"أنماط الإدخال المخصصة"</string> <string name="add_style" msgid="6163126614514489951">"إضافة نمط"</string> <string name="add" msgid="8299699805688017798">"إضافة"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"تمكين"</string> <string name="not_now" msgid="6172462888202790482">"ليس الآن"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"نمط الإدخال ذاته موجود من قبل: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"وضع سهولة الاستخدام"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"تأخير الضغط الطويل للمفاتيح"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"مدة اهتزاز الضغط على المفاتيح"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"مستوى صوت الضغط على المفاتيح"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"قراءة ملف قاموس خارجي"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ليست هناك ملفات قواميس في مجلد التنزيلات"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"تحديد ملف قاموس للتثبيت"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"هل تريد حقًا تثبيت هذا الملف للغة <xliff:g id="LOCALE_NAME">%s</xliff:g>؟"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"هل تريد حقًا تثبيت هذا الملف للغة <xliff:g id="LANGUAGE_NAME">%s</xliff:g>؟"</string> <string name="error" msgid="8940763624668513648">"حدث خطأ"</string> <string name="button_default" msgid="3988017840431881491">"الافتراضية"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"مرحبا بكم في <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"تحديث"</string> <string name="last_update" msgid="730467549913588780">"تاريخ آخر تحديث"</string> <string name="message_updating" msgid="4457761393932375219">"جارٍ البحث عن تحديثات"</string> - <string name="message_loading" msgid="8689096636874758814">"جارٍ التحميل..."</string> + <string name="message_loading" msgid="5638680861387748936">"جارٍ التحميل…"</string> <string name="main_dict_description" msgid="3072821352793492143">"القاموس الرئيسي"</string> <string name="cancel" msgid="6830980399865683324">"إلغاء"</string> + <string name="go_to_settings" msgid="3876892339342569259">"إعدادات"</string> <string name="install_dict" msgid="180852772562189365">"تثبيت"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"إلغاء"</string> <string name="delete_dict" msgid="756853268088330054">"حذف"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"اللغة المحددة على جهازك الجوال تشتمل على قاموس متوفر.<br/> نوصي <b>بتنزيل</b> قاموس <xliff:g id="LANGUAGE">%1$s</xliff:g> لتحسين تجربة الكتابة.<br/> <br/> قد يستغرق التنزيل دقيقة أو دقيقتين أكثر من المدة التي يستغرقها التنزيل عبر شبكة الجيل الثالث. قد تنطبق الرسوم إذا لم تكن مشتركًا في <b>خطة البيانات غير المحدودة</b>.<br/> إذا لم تكن متأكدًا من خطة البيانات المتوفرة لديك، فنحن نوصي بالبحث عن اتصال Wi-Fi لبدء عملية التنزيل تلقائيًا.<br/> <br/> نصيحة: يمكنك تنزيل القواميس وإزالتها عن طريق الانتقال إلى <b>اللغة والإدخال</b> في قائمة <b>إعدادات</b> في جهازك الجوَّال."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"اللغة المحددة على جهازك الجوّال تشتمل على قاموس متوفر.<br/> نوصي <b>بتنزيل</b> قاموس <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> لتحسين تجربة الكتابة.<br/> <br/> قد يستغرق التنزيل دقيقة أو دقيقتين عبر شبكة الجيل الثالث. قد تنطبق الرسوم إذا لم تكن مشتركًا في <b>خطة البيانات غير المحدودة</b>.<br/> إذا لم تكن متأكدًا من خطة البيانات المتوفرة لديك، فنحن نوصي بالبحث عن اتصال Wi-Fi لبدء عملية التنزيل تلقائيًا.<br/> <br/> نصيحة: يمكنك تنزيل القواميس وإزالتها من خلال الانتقال إلى <b>اللغة والإدخال</b> في القائمة <b>إعدادات</b> في جهازك الجوّال."</string> <string name="download_over_metered" msgid="1643065851159409546">"التنزيل الآن (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> ميغابايت)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"التنزيل عبر شبكة Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"هناك قاموس متوفر للغة <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"هناك قاموس متوفر للغة <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"اضغط للمراجعة والتنزيل"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"جارٍ التنزيل: ستتوفر اقتراحات للغة <xliff:g id="LANGUAGE">%1$s</xliff:g> بعد قليل."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"جارٍ التنزيل: ستتوفر اقتراحات للغة <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> قريبًا."</string> <string name="version_text" msgid="2715354215568469385">"الإصدار <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"إضافة"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"إضافة إلى القاموس"</string> diff --git a/java/res/values-az-rAZ/strings-action-keys.xml b/java/res/values-az-rAZ/strings-action-keys.xml new file mode 100644 index 000000000..1231370eb --- /dev/null +++ b/java/res/values-az-rAZ/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Keç"</string> + <string name="label_next_key" msgid="5586407279258592635">"Növbəti"</string> + <string name="label_previous_key" msgid="1421141755779895275">"Öncəki"</string> + <string name="label_done_key" msgid="7564866296502630852">"Hazırdır"</string> + <string name="label_send_key" msgid="482252074224462163">"Göndər"</string> + <string name="label_search_key" msgid="7965186050435796642">"Axtarış"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Gözlə"</string> +</resources> diff --git a/java/res/values-be/strings-appname.xml b/java/res/values-az-rAZ/strings-appname.xml index 2f9593bdc..2fcb76c69 100644 --- a/java/res/values-be/strings-appname.xml +++ b/java/res/values-az-rAZ/strings-appname.xml @@ -20,8 +20,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="5940510615957428904">"Клавіятура Android (AOSP)"</string> - <string name="spell_checker_service_name" msgid="1254221805440242662">"Iнструмент праверкi правапiсу для Android (AOSP)"</string> - <string name="english_ime_settings" msgid="5760361067176802794">"Налады клавіятуры Android (AOSP)"</string> - <string name="android_spell_checker_settings" msgid="6123949487832861885">"Налады інструмента праверкі правапісу для Android (AOSP)"</string> + <string name="english_ime_name" msgid="5940510615957428904">"Android Klaviatura (AOYP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android Orfoqrafik Yoxlanış (AOYP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android Klaviatura Parametrləri (AOYP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android Orfoqrafik Yoxlanış Parametrləri (AOYP)"</string> </resources> diff --git a/java/res/values-az-rAZ/strings-config-important-notice.xml b/java/res/values-az-rAZ/strings-config-important-notice.xml new file mode 100644 index 000000000..a5f1c6128 --- /dev/null +++ b/java/res/values-az-rAZ/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Əlaqələrdən və təkliflərin inkişafı üçün yazdığınız datadan öyrənin "</string> +</resources> diff --git a/java/res/values-az-rAZ/strings-emoji-descriptions.xml b/java/res/values-az-rAZ/strings-emoji-descriptions.xml new file mode 100644 index 000000000..b6c259f73 --- /dev/null +++ b/java/res/values-az-rAZ/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Müəllif hüququ nişanı"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Qeydiyyat nişanı"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"İki nida işarəsi"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Suallı nida işarəsi"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Ticarət nişanı"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"İnformasiya mənbəyi"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Sola-sağa ox"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Yuxarı-aşağı ox"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Şimal-qərb ox"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Şimal-şərq ox"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Cənub-şərq ox"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Cənub-qərb ox"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Qırmaqlı sola ox"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Qırmaqlı sağa ox"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"İzləyin"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Qum saatı"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Qara sağa ikiqat üçbucaq"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Qara sola ikiqat üçbucaq"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Qara yuxarı ikiqat üçbucaq"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Qara aşağı ikiqat üçbucaq"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Zəngli saat"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Axan qumlu qum saatı"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Çərçivəli böyük latın M hərfi"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Kiçik qara kvadrat"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Kiçik ağ kvadrat"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Qara sağa uçbucaq"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Qara sola üçbucaq"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Ağ orta kvadrat"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Qara orta kvadrat"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Ağ orta kiçik kvadrat"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Qara orta kiçik kvadrat"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Şüalı qara günəş"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Bulud"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Qara telefon"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Qeydli səsvermə qutusu"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Yağışlı çətir"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"İsti içki"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Yuxarı göstərən barmaq"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Ağ gülümsəyən sima"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Qoç"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Buğa"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Əkizlər"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Xərçəng"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Şir"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Qız"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Tərəzi"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Əqrəb"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Oxatan"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Oğlaq"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Dolça"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Balıqlar"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Qara nizə"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Qara xaç"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Qara ürək"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Qara romb"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"İsti bulaqlar"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Qara universal təkrar istifadə simvolu"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Təkərli kreslo"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Lövbər"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Xəbərdarlıq işarəsi"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Yüksək voltaj simvolu"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Orta ağ çevrə"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Orta qara çevrə"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Futbol topu"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Beysbol"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Qarsız qar adamı"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Bulud arxasında günəş"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"İlantutan"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Giriş qadağası"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Kilsə"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fəvvarə"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Deşikdə bayraq"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Yeklənli qayıq"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Çadır"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Yanacaq nasosu"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Qara qayçı"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Ağ qalın qeyd nişanı"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Təyyarə"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Zərf"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Qaldırılmış yumruq"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Qaldırılmış əl"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Qələbə əli"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Karandaş"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Qara pero"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Qalın qeyd nişanı"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Qalın x vurma işarəsi"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Qığılcımlar"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Səkkiz guşəli ulduz"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Səkkiz guşəli qara ulduz"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Qar dənəsi"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Qığılcım"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Çarpaz nişan"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Mənfi kvadratlı çarpaz nişan"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Qara sual işarəsi ornamenti"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Ağ sual işarəsi ornamenti"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Ağ nida işarəsi ornamenti"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Qalın nida işarəsi"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Yüklü qara ürək"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Qalın toplama işarəsi"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Qalın çıxma işarəsi"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Qalın bölmə işarəsi"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Qara sağa ox"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Burulmuş halqa"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"İki dəfə burulmuş halqa"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Yuxarı sağa əyilən ox"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Aşağı sağa əyilən ox"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Qara sola ox"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Qara yuxarı ox"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Qara aşağı ox"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Qara böyük kvadrat"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Ağ böyük kvadrat"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Ağ orta ulduz"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Böyük qalın çevrə"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Dalğalı tire"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Qismən dəyişmə işarəsi"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Çevrəli təbrik ideoqramı"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Çevrəli sirr ideoqramı"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahconq plitəsi qırmızı əjdaha"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Kart oyunu qara coker"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"A qan növü"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"B qan növü"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"O qan növü"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Parkinq yeri"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"AB qan növü"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"Kvadrat CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Kvadrat kul"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Kvadrat azad"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Kvadrat ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Kvadrat yeni"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Kvadrat N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Kvadrat OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Kvadrat SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Nidalı kvadrat"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Kvadrat vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Burada kvadrat katakana"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Kvadrat katakana xidməti"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Ödənişsiz kvadrat ideoqram"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Rezerv edilmiş yer kvadrat ideoqram"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Kvadrat qadağa ideoqramı"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Kvadrat vakansiya ideoqramı"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Kvadrat qəbul ideoqramı"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Kvadrat tam məşğulluq ideoqramı"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Kvadrat ödənilmiş ideoqramı"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Aylıq kvadrat ideoqram"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Kvadrat tətbiq ideoqramı"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Kvadrat endirim ideoqramı"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Kvadrat biznes ideoqramı"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Çevrəli üstünlük ideoqramı"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Çevrəli qəbul ideoqramı"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Siklon"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Dumanlı"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Bağlı çətir"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Ulduzlu gecə"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Dağların arxasından doğan günəş"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Günəşin doğuşu"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Toranlıqda şəhər peyzajı"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Binaların arxasında günün batması"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Göy qurşağı"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Gecə vaxtı körpü"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Su dalğası"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Vulkan"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Samanyolu"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Avropa-Afrika Yer Qlobusu"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Amerika Yer Qlobusu"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Asiya-Avstraliya Yer Qlobusu"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Meridianlı qlobus"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Yeni ay simvolu"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Böyüyən aypara simvolu"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"İlk rüb ay simvolu"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Böyüyən yumru ay simvolu"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Tam ay simvolu"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Kiçilən yumru ay simvolu"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Son rüb ay simvolu"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Kiçilən aypara simvolu"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Aypara"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Simalı yeni ay"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Simalı ilk rüb ayı"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Simalı son rüb ayı"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Simalı tam ay"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Simalı günəş"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Parlaq ulduz"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Düşən ulduz"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Şabalıd"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Fidan"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Həmişəyaşıl ağac"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Yarpaqlı ağac"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palma ağacı"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Kaktus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Zanbaq"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Albalı çiçəyi"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Qızılgül"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Əməköməci"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Günəbaxan"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Çiçək"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Qarğıdalı qıçası"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Düyü qıçası"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Ot"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Dörd yarpaqlı yonca"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Ağcaqayın yarpağı"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Düşmüş yarpaq"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Xəzan yarpağı"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Göbələk"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Pomidor"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Badımcan"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Üzüm"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Yemiş"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Qarpız"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Mandarin"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Lemon"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banan"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Ananas"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Qırmızı alma"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Yaşıl alma"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Armud"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Şaftalı"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Albalı"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Çiyələk"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamburger"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Pizza dilimi"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Sümüklü ət"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Quş ayağı"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Düyü krekeri"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Düyü küftəsi"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Bişmiş düyü"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Karri və düyü"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Buxarlanan kasa"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spagetti"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Çörək"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Fransızsayağı kartof"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Qovrulmuş şirin kartof"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Danqo"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Suşi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Qızardılmış krevet"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Burulğan dizaynlı balıq piroqu"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Yumşaq dondurma"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Buz deserti"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Dondurma"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Ponçik"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Kökə"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Şokolad batonu"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Konfet"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Nabat"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Bişmiş krem"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Bal dibçəyi"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Dənəvər peçenye"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Bento qutusu"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Qazan"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Yeməkbişirmə"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Çəngəl-bıçaq"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Qulpsuz fincan"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sake şüşəsi və fincan"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Şərab şüşəsi"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Kokteyl şüşəsi"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Tropik içki"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Pivə parçı"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Cingildəyən pivə parçları"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Uşaq qidası üçün şüşə"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Lent"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Bükülmüş hədiyyə"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Doğum günü tortu"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack fənəri"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Milad yolkası"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Şaxta Baba"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Fişəng"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Benqal odu fişəngi"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Şar"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Parti fişəngi"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Konfetti topu"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Tanabata ağacı"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Çarpaz bayraqlar"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Küknar dekorasiyası"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Yapon kuklaları"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Karp strimer"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Külək uğultusu"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Aya tamaşa mərasimi"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Məktəb çantası"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Akademik papaq"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Karusel at"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Mənzərə çarxı"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Dalğalı yelləncək"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Qırmaq və balıq"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Mikrofon"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Film kamerası"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Kino"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Qulaqlıq"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Rəssam palitrası"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Sehrbaz papağı"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Sirk çadırı"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Bilet"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Çəkiliş lövhəsi"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Tətbiqi incəsənət"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Video oyun"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Birbaşa zərbə"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Oyun avtomatı"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Bilyard"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Zər oyunu"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Boulinq"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Güllü oyun kartları"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Musiqili qeyd"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Çoxsaylı musiqili qeyd"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saksafon"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Gitara"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Musiqili klaviatura"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Truba"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Skripka"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Musiqi qiyməti"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Kəmərli qaçış köynəyi"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Tennis raketi və topu"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Xizək və xizək çəkməsi"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Basketbol və çənbər"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Dama-dama bayraq"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Snoubordçu"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Qaçışçı"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Sörfçü"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Kubok"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"At yarışması"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Amerikan futbolu"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Reqbi Futbolu"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Üzgüçü"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Ev tikintisi"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Bağçalı ev"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Ofis binası"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Yapon poçt ofisi"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Avropa poçt ofisi"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Hospital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Bank"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Bankomat"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Otel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Sevgi oteli"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Qarışıq mallar dükanı"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Məktəb"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Univermaq"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Zavod"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Izakaya fənəri"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Yapon qalası"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Avropa qalası"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Siçovul"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Siçan"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Öküz"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Su camışı"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"İnək"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopard"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Dovşan"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Pişik"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Əjdaha"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Timsah"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Balina"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"İlbiz"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"İlan"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"At"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Qoç"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Keçi"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Qoyun"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Meymun"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Xoruz"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Cücə"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"İt"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Donuz"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Qaban"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Fil"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Osminoq"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"İlbiz qabığı"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Böcək"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Qarışqa"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Bal arısı"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Parabüzən"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Balıq"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Tropik balıq"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Şar balığı"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Tısbağa"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Yumurtadan çıxan cücə"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Balaca cücə"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Önə baxan balaca cücə"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Quş"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Pinqvin"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Pudel"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Bir hörgüclü dəvə"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"İki hörgüclü dəvə"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Delfin"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Siçan sifəti"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"İnək sifəti"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Pələng sifəti"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Dovşan sifəti"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Pişik sifəti"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Əjdaha sifəti"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Fontan vuran balina"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"At sifəti"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Meymun sifəti"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"İt sifəti"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Donuz sifəti"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Qurbağa sifəti"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Xomyak sifəti"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Canavar sifəti"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Ayı sifəti"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Panda sifəti"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Donuz burnu"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Pəncə izləri"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Gözlər"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Qulaq"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Burun"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Ağız"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Dil"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Yuxarı işarə edən ağ rəngli əl indeksi"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Aşağı işarə edən ağ rəngli əl indeksi"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Sola işarə edən ağ rəngli əl indeksi"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Sağa işarə edən ağ rəngli əl indeksi"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Yumruq işarəsi"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Yellənən əl işarəsi"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Ok əl işarəsi"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Yuxarı baş barmaq işarəsi"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Aşağı baş barmaq işarəsi"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Çalan əllər işarəsi"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Açıq əllər işarəsi"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Tac"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Qadın papağı"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Eynək"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Qalstuk"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Qısaqol köynək"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Cins"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Don"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikini"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Qadın geyimi"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Pulqabı"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Çanta"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Kisə"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Kişi ayaqqabısı"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"İdmançı ayaqqabısı"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Dikdaban ayaqqabı"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Qadın sandalı"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Qadın çəkməsi"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Ayaq izi"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Büst silueti"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Büst siluetləri"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Oğlan"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Qız"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Kişi"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Qadın"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Ailə"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Qadın və kişi əl-ələ tutur"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"İki kişi əl-ələ tutur"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"İki qadın əl-ələ tutur"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Polis içşisi"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Dövşanqulaq qadın"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Duvaqlı gəlin"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Sarı saçlı adam"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Qua pi maolu kişi"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Çalmalı kişi"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Yaşlı kişi"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Yaşlı qadın"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Uşaq"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Fəhlə"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Şahzadə"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Yapon oqru"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Yapon qoblini"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Ruh"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Uşaq mələk"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Yad planetli"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Yad planetli qulyabani"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"İmp"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Kəllə"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Qəbul bölməsi adamı"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Keşikçi"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Rəqqas"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Dodaq boyası"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Dırnaq boyası"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Üz masajı"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Saç düzümü"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Bərbərxana"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Şpris"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Həb"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Öpüş izi"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Sevgi məktubu"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Zəng"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Qiymətli daş"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Öpüş"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Buket"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Ürəkli cütlük"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Toy"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Ürək döyüntüsü"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Sınmış qəlb"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"İki ürək"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Parlaq ürək"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Böyüyən ürək"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Oxlu ürək"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Göy ürək"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Yaşıl ürək"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Sarı ürək"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Bənövşəyi ürək"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Lentli ürək"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Fırlanan ürək"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Ürək bəzəyi"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Nöqtəli brilliant"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Elektrik lampası"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Hirs simvolu"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bomba"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Yuxu işarəsi"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Partlayış"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Tər işarəsi"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Damcı"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Tire simvolu"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Kakaşka"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Biseps əzələ"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Başgicəllənmə"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Nitq balonu"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Fikir balonu"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Ağ gül"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Yüz xal simvolu"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Pul kisəsi"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Valyuta mübadiləsi"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Ağır dollar işarəsi"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Kredit kartı"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Yen işarəli əskinaz"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Dollar nişanlı əskinaz"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Avro işarəli əskinaz"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Funt işarəli əskinaz"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Qanadlı pul"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Qalxan diaqram və yen işarəsi"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Oturacaq"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Şəxsi kompüter"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Portfel"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Mini disk"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Disket"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Optik disk"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Fayl qovluğu"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Açıq fayl qovluğu"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Qatlanmış səhifə"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Səhifə"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Təqvim"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Qoparılan təqvim"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Kart indeksi"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Qalxan diaqram"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Düşən diaqram"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Panel diaqramı"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Pano"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Basmadüymə"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Yumru basmadüymə"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Skrepka"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Düz xətkeş"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Üçbücaq xətkeş"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Əlfəcin tabları"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Qovluq"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Bloknot"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Bəzəkli bloknot"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Qapalı kitab"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Açıq kitab"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Yaşıl kitab"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Göy kitab"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Narıncı kitab"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Kitablar"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Ad kartı"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Tomar"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memo"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Telefon qəbuledici"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Peycer"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Faks cihazı"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Peyk antennası"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Dinamik səsyüksəldici"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Səsyüksəldici"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Göndəriləcək sənəd siyirməsi"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Gələn sənəd siyirməsi"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Paket"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"E-poçt simvolu"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Gələn zərf"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Üstündə aşağı ox olan zərf"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Enmiş bayraqlı qapalı poçt qutusu"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Qalxmış bayraqlı qapalı poçt qutusu"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Qalxmış bayraqlı açıq poçt qutusu"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Enmiş bayraqlı açıq poçt qutusu"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Poçt qutusu"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Poçt buynuzu"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Qəzet"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Mobil telefon"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Solunda sağa oxlu mobil telefon"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Vibrasiya rejimi"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Sönmüş mobil telefon"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Mobil telefon qadağası"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Şəbəkə dalğası"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Kamera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Videokamera"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Televiziya"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videokasset"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Sağa əyilmiş oxlar"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Saat əqrəbi istiqamətində sağa və sola açıq çevrəli oxlar"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Çevrəyə alınmış saat əqrəbi istiqamətində sağa və sola açıq çevrəli oxlar"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Saat əqrəbi istiqamətində aşağı və yuxarı açıq çevrəli oxlar"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Saat əqrəbi istiqaməti əksinə aşağı və yuxarı açıq çevrəli oxlar"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Alçaq parlaqlıq simvolu"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Yüksək parlaqlıq simvolu"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Ləğv edilmə xətli dinamik"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Dinamik"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Bir xətli dinamik"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Üç xətli dinamik"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Batareya"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Elektrik ştepseli"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Sola əyilmiş lupa"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Sağa əyilmiş lupa"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Dolma qələmli kilid"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Açarlı bağlı kilid"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Açar"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Kilid"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Açıq kilid"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Zəng"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Ləğv edilmiş zəng"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Əlfəcin"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Link simvolu"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Radio düyməsi"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Üzərində sola ox olan back simvolu"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Üzərində sola ox olan end simvolu"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Üzərində sola sağa ox olan nida işarəli on simvolu"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Üzərində sağa ox olan soon simvolu"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Üzərində yuxarı ox olan top simvolu"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"On səkkiz yaşdan aşağı qadağası"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Klaviş qapağı on"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Böyük latın hərfləri üçün daxiletmə simvolu"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Kiçik latın hərfləri üçün daxiletmə simvolu"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Rəqəmlər üçün daxiletmə simvolu"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Simvollar üçün daxiletmə simvolu"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Latın hərfləri üçün daxiletmə simvolu"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Alov"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Cib fənəri"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Qaz açarı"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Çəkic"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Bolt və qayka"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hoço"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Tapança"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Mikroskop"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Teleskop"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Büllur kürə"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Ortasında nöqtə olan altı guşəli ulduz"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Başlayan üçün yapon simvolu"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Üçdişli emblem"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Qara kvadrat düyməsi"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Ağ kvadrat düyməsi"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Böyük qırmızı çevrə"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Böyük göy çevrə"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Böyük narıncı brilliant"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Böyük göy brilliant"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Kiçik narıncı brilliant"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Kiçik göy brilliant"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Yuxarı göstərən qırmızı üçbucaq"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Aşağı göstərən qırmızı üçbucaq"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Yuxarı göstərən kiçik qırmızı üçbucaq"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Aşağı göstərən kiçik qırmızı üçbucaq"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Saat bir"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Saat iki"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Saat üç"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Saat dörd"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Saat beş"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Saat altı"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Saat yeddi"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Saat səkkiz"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Saat doqquz"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Saat on"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Saat on bir"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Saat on iki"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Saat ikinin yarısı"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Saat üçün yarısı"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Saat dördün yarısı"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Saat beşin yarısı"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Saat altının yarısı"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Saat yeddinin yarısı"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Saat səkkizin yarısı"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Saat doqquzun yarısı"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Saat onun yarısı"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Saat on birin yarısı"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Saat on ikinin yarısı"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Saat birin yarısı"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Fudzi dağı"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tokio qülləsi"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Azadlıq heykəli"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Yaponiya silueti"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Gülümsəyən sima"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Gülümsəyən gözlərlə sima"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Sevinc göz yaşları ilə sima"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Açıq ağızla gülümsəyən sima"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Açıq ağızlı, gülən gözlərlə gülümsəyən sima"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Açıq ağızlı, soyuq tərli gülümsəyən sima"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Açıq ağızlı, qapalı gözlü gülümsəyən sima"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Nimbalı gülümsəyən sima"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Buynuzlu gülümsəyən sima"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Göz vuran sima"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Gülən gözlərlə gülümsəyən sima"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Dadlı yemək yeyən sima"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Azad sima"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Ürək formalı gülümsəyən sima"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Gün eynəkli gülümsəyən sima"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Oğruncasına gülümsəyən sima"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Neytral sima"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"İfadəsiz sima"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Bezmiş sima"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Soyuq tərli sima"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Fikirli sima"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Çaşqın sima"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Məəttəl sima"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Öpən sima"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Öpüş atan sima"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Gülən gözlərlə öpən sima"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Bağlı gözlərlə öpən sima"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Dil çıxaran sima"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Dil çıxaran və göz vuran sima"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Qapalı gözlərlə dil çıxaran sima"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Məyus sima"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Narahat sima"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Hirsli sima"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"İncimiş sima"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Ağlayan sima"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"İnadlı sima"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Triumf baxışlı sima"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Məyus, lakin azad sima"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Mısmırıqlı sima"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Ağrılı sima"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Qorxan sima"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Bezmiş sima"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Yuxulu sima"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Yorğun sima"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Qırışdırılmış sima"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Hönkür-hönkür ağlayan sima"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Açıq ağızlı sima"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Susmağa məcbur sima"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Açıq ağızlı soyuq tərli sima"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Qorxudan qışqıran sima"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Heyran sima"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Qızarmış sima"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Yatan sima"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Gicəllənən sima"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Ağızsız sima"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Tibbi maskalı sima"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Gülən gözlərlə oğrun gülümsəyən pişik siması"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Sevinc göz yaşları ilə pişik siması"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Açıq ağızlı gülümsəyən pişik siması"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Ürəkli gözlərlə gülümsəyən pişik siması"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"İkrahlı təbəssümlü pişik siması"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Bağlı gözlərlə öpən pişik siması"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"İncimiş pişik siması"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Ağlayan pişik siması"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Bezmiş pişik siması"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Qadağa jestl sima"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Ok jestli sima"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Baş əyən adam"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Gözünü tutmuş meymun"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Qulağını tutmuş meymun"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Ağzını tutmuş meymun"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Əlini qaldırmış xoşbəxt adam"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Mərasimdə əllərini qaldırmış adam"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Mısmırıqlı adam"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"İncimiş adam"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Əllərini birləşdirmiş adam"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Raket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helikopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Parovoz"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Dəmiryol maşını"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Sürətli qatar"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Gülləburun sürətli qatar"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Qatar"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Monorels"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Stansiya"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tramvay"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Tramvay avtomobil"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Avtobus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Gələn avtobus"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Trolleybus"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Avtobus dayanacağı"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Minibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulans"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Yanğınsöndürən maşın"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Polis maşını"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Gələn polis maşını"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taksi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Gələn taksi"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Avtomobil"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Gələn avtomobil"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Rahatlıq avtomobili"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Yükdaşıyan maşın"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Avtoqatar"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Traktor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorels"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Dağ dəmir yolu"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Asma dəmiryol"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Dağ kabel yolu"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Asma kanat yolu"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Gəmi"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Avarlı qayıq"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Sürətli qayıq"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Horizontal svetofor"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Vertikal işıqfor"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Tikinti nişanı"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Yanar mayaklı polis maşınları"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Poçtda üçbucaq bayraq"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Qapı"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Giriş qadağası siqnalı"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Siqaret çəkmək simvolu"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Siqaret qadağası simvolu"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Zibili zibil yeşiyinə atmaq simvolu"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Zibilləmək qadağası simvolu"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"İçməli su simvolu"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Texniki su simvolu"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Velosiped"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Velosiped qadağası"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Velosipedçi"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Dağ velosipedçisi"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Piyada"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Piyada qadağası"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Yol keçən uşaqlar"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Kişi simvolu"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Qadın simvolu"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Dincəlmə otağı"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Uşaq simvolu"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Tualet"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Unitaz"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Duş"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Hamam"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Vanna"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Pasport nəzarəti"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Gömrük"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Baqaj iddiası"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Qalmış baqaj"</string> +</resources> diff --git a/java/res/values-az-rAZ/strings-letter-descriptions.xml b/java/res/values-az-rAZ/strings-letter-descriptions.xml new file mode 100644 index 000000000..1d0800beb --- /dev/null +++ b/java/res/values-az-rAZ/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Qadın sıra göstəricisi"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro işarə"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Kişi sıra göstəricisi"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Esset"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, qrav"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akut"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, sirkumfleks"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilda"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, umlaut"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, üstündə çevrə"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, liqatur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedil"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, qrav"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akut"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, sirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, umlaut"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, qrav"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akut"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, sirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, umlaut"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilda"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, qrav"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akut"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, sirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilda"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, umlaut"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, diaqonal xətli"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, qrav"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akut"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, sirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, umlaut"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akut"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Torn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, umlaut"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brev"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, oqonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akut"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, sirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, üstü nöqtəli"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, karon"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, karon"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, diaqonal xətli"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brev"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, üstü nöqtəli"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, oqonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, karon"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, sirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brev"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, üstü nöqtəli"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedil"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, sirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, diaqonal xətli"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilda"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brev"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, oqonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Nöqtəsiz I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, liqatur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, sirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedil"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akut"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedil"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, karon"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ortası nöqtəli"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, diaqonal xətli"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akut"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedil"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, karon"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, apostrofdan sonra"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brev"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, cüt akut"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, liqatur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akut"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedil"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, karon"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akut"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, sirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedil"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, karon"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedil"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, karon"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, diaqonal xətli"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilda"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brev"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, üstü çevrəli"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, cüt akut"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, oqonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, sirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, sirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akut"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, üstü nöqtəli"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, karon"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Uzun S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, buynuz"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, buynuz"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, altı vergüllü"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, altı vergüllü"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Şva"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, altı nöqtəli"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, sirkumfleks və akut"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, sirkumfleks və qrav"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, sirkumfleks və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, sirkumfleks və tilda"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, sirkumfleks və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brev və akut"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brev və qrav"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brev və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brev və tilda"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brev və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, altı nöqtəli"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilda"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, sirkumfleks və akut"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, sirkumfleks və qrav"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, sirkumfleks və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, sirkumfleks və tilda"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, sirkumfleks və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, altı nöqtəli"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, altı nöqtəli"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, sirkumfleks və akut"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, sirkumfleks və qrav"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, sirkumfleks və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, sirkumfleks və tilda"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, sirkumfleks və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, buynuz və akut"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, buynuz və qrav"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, buynuz və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, buynuz və tilda"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, buynuz və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, altı nöqtəli"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, buynuz və akut"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, buynuz və qrav"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, buynuz və üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, buynuz və tilda"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, buynuz və altı nöqtəli"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, qrav"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, altı nöqtəli"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, üstü qarmaqlı"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilda"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Tərs nida işarəsi"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Sol gilemet"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"ortası nöqtəli"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Üst indeks bir"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Sağ gilemet"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Tərs sual işarəsi"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Sol tək sitat işarəsi"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Sağ tək sitat işarəsi"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tək alt-9 sitat işarəsi"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Sol cüt sitat işarəsi"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Sağ cüt sitat işarəsi"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Xəncər"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"İkiqulplu xəncər"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Praym"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Cüt praym"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Tək sol gilemet"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Tək sağ gilemet"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Üst indeks dörd"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Üst indeks latın kiçik n hərfi"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Sağa ox"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Aşağıya ox"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Boş çoxluq"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Artım"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kiçik və ya bərabər"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Böyük və ya bərabər"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Qara ulduz"</string> +</resources> diff --git a/java/res/values-az-rAZ/strings-talkback-descriptions.xml b/java/res/values-az-rAZ/strings-talkback-descriptions.xml new file mode 100644 index 000000000..8f2362752 --- /dev/null +++ b/java/res/values-az-rAZ/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Parolu səsli eşitmək üçün qulaqlığı taxın."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Cari mətn %s\'dir"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Mətn daxil edilməyib"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> sözünü <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> sözü ilə əvəzləyərək düzəldir"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> avto-korreksiyanı həyata keçirir"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Naməlum simvol"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Sürüşdürmə"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Daha çox simvol"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Sürüşdürmə"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simvollar"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Sürüşdürmə"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Sil"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simvollar"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Hərflər"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Nömrələr"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ayarlar"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Boşluq"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Səs daxiletməsi"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Geri qayıt"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Axtarış"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Nöqtə"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Dil keçidi"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Növbəti"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Əvvəlki"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Sürüşdürmə aktivdir"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Böyük hərf kilidi aktivdir"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Simvol rejimi"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Daha çox simvol rejimi"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Hərf rejimi"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefon rejimi"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefon simvol rejimi"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Gizlədilmiş klaviatura"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> klaviaturası göstərilir"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"tarix"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"gün və tarix"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"E-poçt"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mesajlaşma"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"nömrə"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"mesaj"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"vaxt"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Sonuncular"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Adamlar"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Obyektlər"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Təbiə"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Yerlər"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simvollar"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikonlar"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Böyük <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Böyük I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Böyük I, üstü nöqtəli"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Naməlum rəmz"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Naməlum emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternativ simvollar əlçatandır"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternativ simvollar kənarlaşdırılıb"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternativ təkliflər əlçatandır"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternativ təkliflər kənarlaşdırılıb"</string> +</resources> diff --git a/java/res/values-az-rAZ/strings.xml b/java/res/values-az-rAZ/strings.xml new file mode 100644 index 000000000..dea1f6009 --- /dev/null +++ b/java/res/values-az-rAZ/strings.xml @@ -0,0 +1,199 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Daxiletmə seçimləri"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontakt adlarına baxın"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Orfoqrafik yoxlanış kontakt siyahınızdakı qeydlərdən istifadə edir"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrasiyalı klikləmə"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Klikləmə səsi"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Klikləmədə popup"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Daxiletmə tərcihləri"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Görünüş"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Çoxdilli seçimlər"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Jest ilə yazı tərcihləri"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Mətn korreksiyası"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Qabaqcıl"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Digər daxiletmə metodlarına keçin"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Dil keçid düyməsi başqa daxiletmə metodlarını da əhatə edir"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Dil keçidi düyməsi"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Çoxsaylı daxiletmə dilləri aktivləşdikdə göstər"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Slayd indikatorunu göstər"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Sürüşdürmə və ya Simvol düymələrinə keçərkən vizual işarəni göstər"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Klaviş popup kənarlaşdırılmasında gecikmə"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Gecikmə yoxdur"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Varsayılan"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> millisaniyə"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Sistem defoltu"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Kontakt adları təklif edin"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Təklif və korreksiya üçün Kontaktlardakı adlardan istifadə edin"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Fərdiləşmiş təkliflər"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> inkişaf etdirin"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"İkili boşluq periodu"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Boşluqdakı iki klik boşluqdan sonra pauza daxil edir"</string> + <string name="auto_cap" msgid="1719746674854628252">"Avtomatik böyük hərfləşmə"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Hər cümlənin ilk sözünü böyük hərflə yaz"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Şəxsi lüğət"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Əlavə lüğətlər"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Əsas lüğət"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Korreksiya təkliflərini göstər"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Yazarkən təklif edilən sözləri ekranda göstər"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Həmişə göstər"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Portret rejimində göstər"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Həmişə gizlət"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Təhqiredici sözləri əngəlləyin"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Potensial təhqiredici sözlər təklif etməyin"</string> + <string name="auto_correction" msgid="7630720885194996950">"Avtomatik-korreksiya"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Boşluq və punktuasiya avtomatik yanlış sözləri düzəldir"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Deaktiv"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Orta"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Aqressiv"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Çox aqressiv"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Növbəti-söz təklifləri"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Təkliflər edilməsində əvvəlki sözdən istifadə et"</string> + <string name="gesture_input" msgid="826951152254563827">"Jestlərlə yazmağı aktiv et"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Hərflər üzərində sürüşdürərək söz daxil edin"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Jest izini göstər"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamik üzmə önizləməsi"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Jest zamanı təklif edilmiş sözə baxın"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Jest bildirin"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Jest zamanı boşluq düyməsinə toxunmaqla boşluq daxil edin"</string> + <string name="voice_input" msgid="3583258583521397548">"Səs daxiletmə klavişi"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Heç bir səs daxiletmə metodu aktiv deyil. Dil və daxiletmə ayarlarını yoxlayın."</string> + <string name="configure_input_method" msgid="373356270290742459">"Daxiletmə üsullarını sazla"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Daxiletmə dilləri"</string> + <string name="send_feedback" msgid="1780431884109392046">"Cavab rəyi göndərin"</string> + <string name="select_language" msgid="3693815588777926848">"Daxiletmə dilləri"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Yadda saxlamaq üçün yenidən toxunun"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Lüğət mövcuddur"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Klaviatura teması"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"İngilis (BK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"İngilis (ABŞ)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"İspan (ABŞ)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"İngilis (Britaniya) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"İngilis (Amerika) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"İspan (Amerika) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Ənənəvi)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Kiril)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latın)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"Dil yoxdur (Əlifba)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Əlifba (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Əlifba (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Əlifba (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Əlifba (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Əlifba (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Əlifba (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Klaviatura teması"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Holo Ağ"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Holo Göy"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Material Tünd"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Material Açıq"</string> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Xüsusi daxiletmə üslubları"</string> + <string name="add_style" msgid="6163126614514489951">"Stil əlavə et"</string> + <string name="add" msgid="8299699805688017798">"Əlavə et"</string> + <string name="remove" msgid="4486081658752944606">"Ləğv et"</string> + <string name="save" msgid="7646738597196767214">"Yadda saxla"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Dil"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Tərtibat"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Xüsusi daxiletmə üslubunuz istifadəyə başlamazdan əvvəl aktivləşdirilməlidir. Aktiv etmək istəyirsiniz?"</string> + <string name="enable" msgid="5031294444630523247">"Aktiv et"</string> + <string name="not_now" msgid="6172462888202790482">"İndi yox"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Eyni daxiletmə üslubu artıq mövcuddur: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Klavişi uzun müddət basmada gecikmə"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrasiyalı klikləmə müddəti"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Səsli klikləmə səsi"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Xarici lüğət faylını oxuyun"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Endirmə Qovluğunda heç bir lüğət faylı yoxdur"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Yükləmək üçün lüğət faylı seçin"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> üçün faylı quraşdırmaq istədiyinizə əminsiniz?"</string> + <string name="error" msgid="8940763624668513648">"Xəta var idi"</string> + <string name="button_default" msgid="3988017840431881491">"Defolt"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> təbiqinə xoş gəlmisiniz"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"Jest Yazısı ilə"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Başlayın"</string> + <string name="setup_next_action" msgid="371821437915144603">"Növbəti addım"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> quraşdırılır"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> tətbiqini aktivləşdir"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Lütfən, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" tətbiqini Dil və daxiletmə parametrlərinizdə yoxlayın. Bununla tətbiqin cihazınızda işləməsinə icazə veriləcək."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> artıq sizin Dil və daxiletmə parametrlərinizdə aktivləşdirildi, beləliklə da bu mərhələ tamamlandı. İndi isə növbəti mərhələyə eçin!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Parametrlərdə aktivləşdir"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> tətbiqinə keçin"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Sonra, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" tətbiqini aktiv mətn-daxiletmə metodu olaraq seçin."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Daxil metodlarına keç"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Təbrik edirik, tam hazırsınız!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"İndi siz <xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə bütün sevimli tətbiqlərinizdə yaza bilərsiniz."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Əlavə dillər quraşdır"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Sona çatdı"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Tətbiq ikonasını göstər"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Başlatma panelində tətbiq ikonasını göstər"</string> + <string name="app_name" msgid="6320102637491234792">"Lüğət Provayderi"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Lüğət Provayderi"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Lüğət Xidməti"</string> + <string name="download_description" msgid="6014835283119198591">"Lüğət yeniləmə məlumatı"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Əlavə lüğətlər"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Lüğət mövcuddur"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Lüğət üçün ayarlar"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"İstifadəçi lüğətləri"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"İstifadəçi lüğəti"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Lüğət mövcuddur"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Hazırda endirilir"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Quraşdırılıb"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Quraşdırılıb, deaktiv edilib"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Lüğət xidmətinə bağlantı problemi"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Lüğət mövcud deyil"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Təzələ"</string> + <string name="last_update" msgid="730467549913588780">"Son yeniləmə"</string> + <string name="message_updating" msgid="4457761393932375219">"Güncəlləmələr yoxlanılır"</string> + <string name="message_loading" msgid="5638680861387748936">"Yüklənir..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Əsas lüğət"</string> + <string name="cancel" msgid="6830980399865683324">"Ləğv et"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ayarlar"</string> + <string name="install_dict" msgid="180852772562189365">"Quraşdırın"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Ləğv et"</string> + <string name="delete_dict" msgid="756853268088330054">"Sil"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Mobil telefonunuzda seçilmiş dilin əlçatımlı lüğəti var. Daha rahat yazmaq üçün <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> lüğətini endirməyinizi məsləhət görürük. Lüğətin endirilməsi 3G üzərindən bir-iki dəqiqə vaxt ala bilər. Limitsiz data planınızın olmadığı halda, data ödənişləri də tətbiq edilə bilər. Əgər hansı data planına malik olmağınıza əmin deyilsinizsə, Sizə Wi-Fi bağlantısı üzərindən avtomatik endirməyi məsləhət görürük. İpucu: Lüğətləri endirmək və ya sistemdən silmək üçün mobil cihazınızın menyusunda Ayarlar>Dil>Daxiletmə bölməsinə keçə bilərsiniz."</string> + <string name="download_over_metered" msgid="1643065851159409546">"İndi endirin (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi ilə endir"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> üçün lüğət əlçatımlıdır"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Nəzərdən keçirmək və endirmək üçün klikləyin"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Endirmə: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> üçün təkliflər tezliklə hazır olacaq."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> nömrəli versiya"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Əlavə edin"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Lüğətə əlavə edin"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"İfadə"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Daha çox seçim"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Daha az seçim"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"OK"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Söz:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Qısayol:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Dil:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Bir söz yazın"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Könüllü qısayol"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Sözü redaktə edin"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Düzəliş edin"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Silin"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"İstifadəçi lüğətinizdə heç bir söz yoxdur. Əlavə et (+) düyməsinə toxunmqla bir söz əlavə edin."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Bütün dillər üçün"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Digər dillər..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Silin"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-be/bools.xml b/java/res/values-be-rBY/bools.xml index 840d20c21..840d20c21 100644 --- a/java/res/values-be/bools.xml +++ b/java/res/values-be-rBY/bools.xml diff --git a/java/res/values-be/strings-action-keys.xml b/java/res/values-be-rBY/strings-action-keys.xml index 91416c8b7..91416c8b7 100644 --- a/java/res/values-be/strings-action-keys.xml +++ b/java/res/values-be-rBY/strings-action-keys.xml diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml deleted file mode 100644 index 02972f07e..000000000 --- a/java/res/values-be/strings.xml +++ /dev/null @@ -1,253 +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. -*/ - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_input_options" msgid="3909945612939668554">"Параметры ўводу"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Каманды гiсторыя даследаванняў"</string> - <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Шукаць імёны кантактаў"</string> - <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Модуль праверкі правапісу выкарыстоўвае запісы са спісу кантактаў"</string> - <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібрацыя пры націску клавіш"</string> - <string name="sound_on_keypress" msgid="6093592297198243644">"Гук пры націску"</string> - <string name="popup_on_keypress" msgid="123894815723512944">"Па націску на клавішы ўсплывае акно"</string> - <string name="general_category" msgid="1859088467017573195">"Агульныя"</string> - <string name="correction_category" msgid="2236750915056607613">"Выпраўленне тэксту"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Набор жэстамі"</string> - <string name="misc_category" msgid="6894192814868233453">"Іншыя параметры"</string> - <string name="advanced_settings" msgid="362895144495591463">"Адмысловыя налады"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Функцыi для спецыялістаў"</string> - <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Перакл. да інш. спос. ув."</string> - <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Кнопка пераключэння мовы звязана i з iншымi спосабамi ўводу"</string> - <string name="show_language_switch_key" msgid="5915478828318774384">"Кнопка пераключэння мовы"</string> - <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Паказваць, калі ўключана некалькі моў ўводу"</string> - <string name="sliding_key_input_preview" msgid="6604262359510068370">"Iндыкатар слайд-шоу"</string> - <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Паказаць візуальны сігнал падчас слiзгання клавiш Shift або Symbol"</string> - <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Затрым. скр. падк. клав."</string> - <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Няма затрымкі"</string> - <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Па змаўчанні"</string> - <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> мс"</string> - <!-- no translation found for settings_system_default (6268225104743331821) --> - <skip /> - <string name="use_contacts_dict" msgid="4435317977804180815">"Прапан. імёны кантактаў"</string> - <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Выкарыстоўваць імёны са спісу кантактаў для прапаноў і выпраўл."</string> - <string name="use_double_space_period" msgid="8781529969425082860">"Падвойны iнтэрвал"</string> - <string name="use_double_space_period_summary" msgid="6532892187247952799">"Падвойнае нацiсканне на прабел ўстаўляе iнтэрвал з наступным прабелам"</string> - <string name="auto_cap" msgid="1719746674854628252">"Аўтаматычна рабіць вялікія літары"</string> - <string name="auto_cap_summary" msgid="7934452761022946874">"Пісаць з загалоўнай літары першае слова ў кожным сказе"</string> - <string name="edit_personal_dictionary" msgid="3996910038952940420">"Персанальны слоўнік"</string> - <string name="configure_dictionaries_title" msgid="4238652338556902049">"Дадатковыя слоўнікі"</string> - <string name="main_dictionary" msgid="4798763781818361168">"Асноўны слоўнік"</string> - <string name="prefs_show_suggestions" msgid="8026799663445531637">"Паказаць прапановы на выпраўленне"</string> - <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Паказваць прапанаваныя словы падчас набору тэксту"</string> - <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Заўсёды паказваць"</string> - <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Паказаць у партрэтным рэжыме"</string> - <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Заўседы хаваць"</string> - <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Блакіраваць абразлівыя словы"</string> - <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Не прапануйце патэнцыяльна абразлівых слоў"</string> - <string name="auto_correction" msgid="7630720885194996950">"Аўтавыпраўленне"</string> - <string name="auto_correction_summary" msgid="5625751551134658006">"Прабелы і пунктуацыйныя знакі дазваляюць аўтаматычна выпраўляць памылкова ўведзеныя словы"</string> - <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Адключаны"</string> - <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Сціплы"</string> - <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> - <skip /> - <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> - <skip /> - <string name="bigram_prediction" msgid="1084449187723948550">"Падказкi для наступнага слова"</string> - <string name="bigram_prediction_summary" msgid="3896362682751109677">"Выкарыстоўваць папярэдняе слова, каб атрымлiваць падказкi"</string> - <string name="gesture_input" msgid="826951152254563827">"Уключыць набор жэстамі"</string> - <string name="gesture_input_summary" msgid="9180350639305731231">"Уводзьце слова, перасоўваючы палец па літарах"</string> - <string name="gesture_preview_trail" msgid="3802333369335722221">"Паказаць след жэста"</string> - <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Дынамічны плаваючы прагляд"</string> - <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Праглядаць прапанаванае слова падчас жэсту"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Захаваныя"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Каб праслухаць паролi, падключыце гарнiтуру."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Бягучы тэкст %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Тэкст не ўведзены"</string> - <!-- no translation found for spoken_auto_correct (8005997889020109763) --> - <skip /> - <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> - <skip /> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Клавішны код %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Зрух"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift уключаны (націснiце, каб адключыць)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock уключаны (націснiце, каб адключыць)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Выдаліць"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Сімвалы"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Літары"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Лічбы"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Налады"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Укладка"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Прабел"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Галасавы ўвод"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Смайлік"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Увод"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Пошук"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Кропка"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Пераключыць мову"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Далей"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Назад"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift уключаны"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock уключаны"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift адключаны"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Рэжым знакаў"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Рэжым лiтар"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Рэжым тэлефона"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Рэжым тэлефонных знакаў"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавіятура схавана"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Паказана клавiятура ў рэжыме \" <xliff:g id="MODE">%s</xliff:g>\""</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата i час"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"электронная пошта"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"абмен паведамленнямі"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"нумар"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"тэлефон"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"тэкст"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"час"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> - <string name="voice_input" msgid="3583258583521397548">"Ключ галасавога ўводу"</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="configure_input_method" msgid="373356270290742459">"Налада метадаў уводу"</string> - <string name="language_selection_title" msgid="1651299598555326750">"Мовы ўводу"</string> - <string name="send_feedback" msgid="1780431884109392046">"Адправіць водгук"</string> - <string name="select_language" msgid="3693815588777926848">"Мовы ўводу"</string> - <string name="hint_add_to_dictionary" msgid="573678656946085380">"Дакраніцеся зноў, каб захаваць"</string> - <string name="has_dictionary" msgid="6071847973466625007">"Слоўнік даступны"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Уключыць зваротную сувязь з карыстальнікамі"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Дапамажыце палепшыць гэты рэдактар метаду ўводу, аўтаматычна адпраўляючы статыстыку выкарыстання і справаздачы аб збоях Google."</string> - <string name="keyboard_layout" msgid="8451164783510487501">"Тэма клавіятуры"</string> - <string name="subtype_en_GB" msgid="88170601942311355">"Англійская (ЗК)"</string> - <string name="subtype_en_US" msgid="6160452336634534239">"Англійская (ЗША)"</string> - <string name="subtype_es_US" msgid="5583145191430180200">"iспанская (ЗША)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Англійская (Вялікабрытанія) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Англійская (ЗША) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"iспанская (ЗША) ( <xliff:g id="LAYOUT">%s</xliff:g> )"</string> - <!-- no translation found for subtype_nepali_traditional (9032247506728040447) --> - <skip /> - <!-- no translation found for subtype_no_language (7137390094240139495) --> - <skip /> - <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> - <skip /> - <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> - <skip /> - <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> - <skip /> - <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> - <skip /> - <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> - <skip /> - <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> - <skip /> - <!-- no translation found for subtype_emoji (7483586578074549196) --> - <skip /> - <string name="custom_input_styles_title" msgid="8429952441821251512">"Карыстальніцкія стылі ўводу"</string> - <string name="add_style" msgid="6163126614514489951">"Дадаць стыль"</string> - <string name="add" msgid="8299699805688017798">"Дадаць"</string> - <string name="remove" msgid="4486081658752944606">"Выдаліць"</string> - <string name="save" msgid="7646738597196767214">"Захаваць"</string> - <string name="subtype_locale" msgid="8576443440738143764">"Мова"</string> - <string name="keyboard_layout_set" msgid="4309233698194565609">"Раскладка"</string> - <string name="custom_input_style_note_message" msgid="8826731320846363423">"Карыстальніцкі метад уводу павінен быць уключаны, перш чым пачаць выкарыстоўваць яго. Жадаеце ўключыць яго зараз?"</string> - <string name="enable" msgid="5031294444630523247">"Уключыць"</string> - <string name="not_now" msgid="6172462888202790482">"Не цяпер"</string> - <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Такі метад уводу ўжо існуе: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Рэжым даследвання выкарыстальнасці"</string> - <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Затрымка доўгага націску клавішы"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Працягласць вібрацыі пры націску клавіш"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Гучнасць гуку пры націску клавіш"</string> - <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Чытанне знешняга файла слоўніка"</string> - <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У папцы загрузак няма файлаў слоўніка"</string> - <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вылучыце файл слоўніка для ўсталёўкі"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Сапраўды ўсталяваць гэты файл на мове: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> - <string name="error" msgid="8940763624668513648">"Была памылка"</string> - <string name="button_default" msgid="3988017840431881491">"Па змаўчанні"</string> - <string name="setup_welcome_title" msgid="6112821709832031715">"Вітаем у прыкладанні <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> - <string name="setup_welcome_additional_description" msgid="8150252008545768953">"з уводам жэстамі"</string> - <string name="setup_start_action" msgid="8936036460897347708">"Пачаць"</string> - <string name="setup_next_action" msgid="371821437915144603">"Далей"</string> - <string name="setup_steps_title" msgid="6400373034871816182">"Наладка прыкладання <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> - <string name="setup_step1_title" msgid="3147967630253462315">"Уключыць прыкладанне <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> - <string name="setup_step1_instruction" msgid="2578631936624637241">"Праверце прыкладанне \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" на сваёй мове і параметры ўводу. Гэта дасць магчымасць дазволіць яму працаваць на вашай прыладзе."</string> - <string name="setup_step1_finished_instruction" msgid="10761482004957994">"Прыкладанне <xliff:g id="APPLICATION_NAME">%s</xliff:g> ужо ўключана для вашай мовы і параметраў уводу, так што гэты крок зроблены. Пераходзім да наступнага!"</string> - <string name="setup_step1_action" msgid="4366513534999901728">"Уключыць у наладах"</string> - <string name="setup_step2_title" msgid="6860725447906690594">"Пераключыцца на прыкладанне <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string> - <string name="setup_step2_instruction" msgid="9141481964870023336">"Выберыце \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" як актыўны метад уводу тэксту."</string> - <string name="setup_step2_action" msgid="1660330307159824337">"Пераключэнне метадаў уводу"</string> - <string name="setup_step3_title" msgid="3154757183631490281">"Усё гатова!"</string> - <string name="setup_step3_instruction" msgid="8025981829605426000">"Цяпер вы можаце ўводзіць ўсе свае любімыя прыкладанні з iмем <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string> - <string name="setup_step3_action" msgid="600879797256942259">"Наладка дадатковых моў"</string> - <string name="setup_finish_action" msgid="276559243409465389">"Гатова"</string> - <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Паказаць значок прыкладання"</string> - <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Паказаць значок прыкладання ў панэлi запуску"</string> - <string name="app_name" msgid="6320102637491234792">"Пастаўшчык слоўніка"</string> - <string name="dictionary_provider_name" msgid="3027315045397363079">"Пастаўшчык слоўніка"</string> - <string name="dictionary_service_name" msgid="6237472350693511448">"Слоўнік"</string> - <string name="download_description" msgid="6014835283119198591">"Інфармацыя абнаўлення слоўніка"</string> - <string name="dictionary_settings_title" msgid="8091417676045693313">"Дадатковыя слоўнікі"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Даступны слоўнік"</string> - <string name="dictionary_settings_summary" msgid="5305694987799824349">"Налады для слоўнікаў"</string> - <string name="user_dictionaries" msgid="3582332055892252845">"Карыстальніцкія слоўнікі"</string> - <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Карыстацкі слоўнік"</string> - <string name="dictionary_available" msgid="4728975345815214218">"Даступны слоўнік"</string> - <string name="dictionary_downloading" msgid="2982650524622620983">"Спампоўваецца зараз"</string> - <string name="dictionary_installed" msgid="8081558343559342962">"Усталявана"</string> - <string name="dictionary_disabled" msgid="8950383219564621762">"Усталявана, адключана"</string> - <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Праблема падключэння да слоўніка"</string> - <string name="no_dictionaries_available" msgid="8039920716566132611">"Слоўнікаў няма"</string> - <string name="check_for_updates_now" msgid="8087688440916388581">"Абнавіць"</string> - <string name="last_update" msgid="730467549913588780">"Апошняе абнаўленне"</string> - <string name="message_updating" msgid="4457761393932375219">"Праверка наяўнасці абнаўленняў"</string> - <string name="message_loading" msgid="8689096636874758814">"Загрузка..."</string> - <string name="main_dict_description" msgid="3072821352793492143">"Асноўны слоўнік"</string> - <string name="cancel" msgid="6830980399865683324">"Адмяніць"</string> - <string name="install_dict" msgid="180852772562189365">"Усталяваць"</string> - <string name="cancel_download_dict" msgid="7843340278507019303">"Адмена"</string> - <string name="delete_dict" msgid="756853268088330054">"Выдаліць"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Для выбранай мовы на мабільнай прыладзе ёсць слоўнік.<br/> Мы рэкамендуем <b>спампаваць</b> слоўнік для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\" для паляпшэння зручнасці набору.<br/> <br/> Спампоўка можа заняць хвіліну або дзве ў 3G-сетках. Калі ў вас няма <b>безлімітнага тарыфнага плану перадачы дадзеных</b>, могуць прымяняцца дадатковыя плацяжы<br/>. Калі вы не ведаеце дакладна, які ў вас тарыфны план, мы рэкамендуем знайсці падлучэнне да сеткі Wi-Fi, каб пачаць аўтаматычную спампоўку.<br/> <br/> Парада: можна спампоўваць і выдаляць слоўнікі, перайшоўшы ў раздзел <b>Мова і ўвод</b> у меню <b>Налады</b> вашай мабільнай прылады."</string> - <string name="download_over_metered" msgid="1643065851159409546">"Спампаваць зараз (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>МБ)"</string> - <string name="do_not_download_over_metered" msgid="2176209579313941583">"Спампаваць праз Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Слоўнік для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\""</string> - <string name="dict_available_notification_description" msgid="1075194169443163487">"Нацiснiце, каб прагледзець i спампаваць"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Загрузка: прапановы для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\" хутка з\'явяцца."</string> - <string name="version_text" msgid="2715354215568469385">"Версія <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> - <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Дадаць"</string> - <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Дадаць у слоўнік"</string> - <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Выраз"</string> - <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Дадатковыя параметры"</string> - <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Асн. параметры"</string> - <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"OК"</string> - <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Слова:"</string> - <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Шлях хуткага доступу:"</string> - <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Мова:"</string> - <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Увядзіце слова"</string> - <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Дадатковы цэтлiк"</string> - <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Рэдагаваць слова"</string> - <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Рэдагаваць"</string> - <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Выдаліць"</string> - <string name="user_dict_settings_empty_text" msgid="558499587532668203">"У вашым карыстальніцкім слоўніку няма ніводнага слова. Вы можаце дадаваць словы, дакранаючыся да кнопкі \"+\" у пункце меню \"Дадаць\"."</string> - <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Для ўсіх моў"</string> - <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Іншыя мовы..."</string> - <string name="user_dict_settings_delete" msgid="110413335187193859">"Выдаліць"</string> - <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> -</resources> diff --git a/java/res/values-bg/strings-action-keys.xml b/java/res/values-bg/strings-action-keys.xml index 13374a29c..fa41c2861 100644 --- a/java/res/values-bg/strings-action-keys.xml +++ b/java/res/values-bg/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"Готово"</string> <string name="label_send_key" msgid="482252074224462163">"Изпр."</string> + <string name="label_search_key" msgid="7965186050435796642">"Търсене"</string> <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string> <string name="label_wait_key" msgid="5891247853595466039">"Изчакв."</string> </resources> diff --git a/java/res/values-bg/strings-config-important-notice.xml b/java/res/values-bg/strings-config-important-notice.xml new file mode 100644 index 000000000..465ed85dd --- /dev/null +++ b/java/res/values-bg/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Ползване на съобщ. ви и въведени от вас данни за подобр. на предлож."</string> +</resources> diff --git a/java/res/values-bg/strings-letter-descriptions.xml b/java/res/values-bg/strings-letter-descriptions.xml new file mode 100644 index 000000000..75c2c7867 --- /dev/null +++ b/java/res/values-bg/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Индикатор за поредност от женски род"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак за микро"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Индикатор за поредност от мъжки род"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Малка буква есцет"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Малка буква а с тежко ударение"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Малка буква а с остро ударение"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Малка буква а със сложно ударение"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Малка буква а с тилда"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"Малка буква а с трема"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Малка буква а с кръгче отгоре"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Малка лигатура ae"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Малка буква c със селил"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Малка буква e с тежко ударение"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Малка буква e с остро ударение"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Малка буква e със сложно ударение"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Малка буква e с трема"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Малка буква i с тежко ударение"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Малка буква i с остро ударение"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Малка буква i със сложно ударение"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Малка буква i с трема"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Малка пресечена буква"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Малка буква n с тилда"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Малка буква o с тежко ударение"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Малка буква o с остро ударение"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Малка буква o със сложно ударение"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Малка буква o с тилда"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Малка буква o с трема"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Малка буква o с черта"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Малка буква u с тежко ударение"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Малка буква u с остро ударение"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Малка буква u със сложно ударение"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Малка буква u с трема"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Малка буква y с остро ударение"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Малка буква торн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Малка буква y с трема"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Малка буква a с макрон"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Малка буква a с бревис"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"Малка буква a с огонек"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Малка буква c с остро ударение"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Малка буква c със сложно ударение"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Малка буква c с точка отгоре"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Малка буква c с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Малка буква d с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Малка буква d с черта"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Малка буква e с макрон"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Малка буква e с бревис"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Малка буква e с точка отгоре"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Малка буква e с огонек"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Малка буква e с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Малка буква g със сложно ударение"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Малка буква g с бревис"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Малка буква g с точка отгоре"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Малка буква g със селил"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Малка буква h със сложно ударение"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Малка буква h с черта"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Малка буква i с тилда"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Малка буква i с макрон"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Малка буква i с бревис"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Малка буква i с огонек"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Малка буква i без точка"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Малка лигатура ij"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Малка буква j със сложно ударение"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Малка буква k със селил"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Малка буква кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Малка буква l с остро ударение"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Малка буква l със селил"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Малка буква l с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"Малка буква l с точка в средата"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Малка буква l с черта"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Малка буква n с остро ударение"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Малка буква n със селил"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Малка буква n с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Малка буква n с апостроф отпред"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Малка буква енг"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Малка буква o с макрон"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Малка буква o с бревис"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Малка буква o с двойно остро ударение"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Малка лигатура oe"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Малка буква r с остро ударение"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Малка буква r със селил"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Малка буква r с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Малка буква s с остро ударение"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Малка буква s със сложно ударение"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Малка буква s със селил"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Малка буква s с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Малка буква t със селил"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Малка буква t с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Малка буква t с черта"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Малка буква u с тилда"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Малка буква u с макрон"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Малка буква u с бревис"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"Малка буква u с кръгче отгоре"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Малка буква u с двойно остро ударение"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Малка буква u с огонек"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Малка буква w със сложно ударение"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Малка буква y със сложно ударение"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Малка буква z с остро ударение"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Малка буква z с точка отгоре"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Малка буква z с обърнато сложно ударение"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Малка дълга буква s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Малка буква o с рогче"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"Малка буква u с рогче"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"Малка буква s със запетая отдолу"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Малка буква t със запетая отдолу"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Малка буква шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Малка буква a с точка отдолу"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"Малка буква a с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"Малка буква a със сложно и с остро ударение"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"Малка буква a със сложно и с тежко ударение"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"Малка буква a със сложно ударение и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"Малка буква a със сложно ударение и с тилда"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"Малка буква a със сложно ударение и с точка отдолу"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Малка буква a с бревис и с остро ударение"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"Малка буква a с бревис и с тежко ударение"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"Малка буква a с бревис и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"Малка буква a с бревис и с тилда"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"Малка буква a с бревис и с точка отдолу"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Малка буква e с точка отдолу"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Малка буква e с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Малка буква e с тилда"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Малка буква e със сложно и с остро ударение"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Малка буква e със сложно и с тежко ударение"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Малка буква e със сложно ударение и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Малка буква e със сложно ударение и с тилда"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Малка буква e със сложно ударение и с точка отдолу"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"Малка буква i с ченгел отгоре"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"Малка буква i с точка отдолу"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Малка буква o с точка отдолу"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"Малка буква o с ченгел отгоре"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Малка буква o със сложно и с остро ударение"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"Малка буква о със сложно и с тежко ударение"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"Малка буква o със сложно ударение и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"Малка буква o със сложно ударение и с тилда"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Малка буква o със сложно ударение и с точка отдолу"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Малка буква o с рогче и с остро ударение"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"Малка буква о с рогче и с тежко ударение"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"Малка буква o с рогче и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"Малка буква o с рогче и с тилда"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"Малка буква o с рогче и с точка отдолу"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Малка буква u с точка отдолу"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Малка буква u с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Малка буква u с рогче и с остро ударение"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Малка буква u с рогче и с тежко ударение"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Малка буква u с рогче и с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Малка буква u с рогче и с тилда"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Малка буква u с рогче и с точка отдолу"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Малка буква y с тежко ударение"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Малка буква y с точка отдолу"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Малка буква y с ченгел отгоре"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Малка буква y с тилда"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Обърнат удивителен знак"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Сочеща наляво двойна ъглова кавичка"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Точка в средата"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Горен индекс за първа степен"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Сочеща надясно двойна ъглова кавичка"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Обърнат въпросителен знак"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Лява единична кавичка"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Дясна единична кавичка"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Единична долна кавичка"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Лява двойна кавичка"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Дясна двойна кавичка"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Дагер"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Двоен дагер"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак за промил"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Щрих"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Двоен щрих"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Сочеща наляво единична ъглова кавичка"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Сочеща надясно единична ъглова кавичка"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Горен индекс за четвърта степен"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Горен индекс за n-та степен"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак за песо"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"На вниманието на"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Сочеща надясно стрелка"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Сочеща надолу стрелка"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Празно множество"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Инкремент"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"По-малко или равно на"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"По-голямо или равно на"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Черна звезда"</string> +</resources> diff --git a/java/res/values-bg/strings-talkback-descriptions.xml b/java/res/values-bg/strings-talkback-descriptions.xml new file mode 100644 index 000000000..c1271bfd3 --- /dev/null +++ b/java/res/values-bg/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Включете слушалки, за да чуете клавишите за паролата на висок глас."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Текущият текст е „%s“"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Няма въведен текст"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"„<xliff:g id="KEY_NAME">%1$s</xliff:g>“ коригира „<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>“ на „<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>“"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"„<xliff:g id="KEY_NAME">%1$s</xliff:g>“ изпълнява автоматично коригиране"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Неизвестен знак"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Още символи"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Символи"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Delete"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Символи"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Букви"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Цифри"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Настройки"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Интервал"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Гласово въвеждане"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Емоджи"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Търсене"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Точка"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Превключване на езика"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Напред"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Назад"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"„Shift“ е активиран"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"„Caps Lock“ е активиран"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Режим за символи"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Режим с още символи"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Режим за букви"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Режим за телефонни номера"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Режим за символи на телефона"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Клавиатурата е скрита"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Показва се клавиатурата за <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"дати"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"дати и часове"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"имейл aдреси"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"съобщения"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"числа"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"телефонни номера"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"текст"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"часове"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL адреси"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Скорошни"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Хора"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Предмети"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Природа"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Места"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Символи"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Емотикони"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Главна буква <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Главна буква I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Главна буква I с точка отгоре"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Неизвестен символ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Неизвестен емотикон"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Налице са алтернативни знаци"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Алтернативните знаци са отхвърлени"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Налице са алтернативни предложения"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Алтернативните предложения са отхвърлени"</string> +</resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index c3fbd7982..a2ded389c 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Опции за въвеждане"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Команди за рег. файл за проучвания"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Търсене на имена"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"За проверка на правописа се ползват записи от списъка с контакти"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Да вибрира при натискане на клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натискане на клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string> - <string name="general_category" msgid="1859088467017573195">"Общи"</string> - <string name="correction_category" msgid="2236750915056607613">"Корекция на текста"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Въвеждане чрез жест"</string> - <string name="misc_category" msgid="6894192814868233453">"Други опции"</string> - <string name="advanced_settings" msgid="362895144495591463">"Разширени настройки"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Опции за експерти"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Други методи за въвеждане"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Клавишът за превкл. на езика обхваща и други методи за въвеждане"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Клавиш за превкл. на езика"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Станд. за системата"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Предложения за контакти"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Използване на имена от „Контакти“ за предложения и поправки"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Персонализ. предложения"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Подобряване на <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Точка чрез двоен интервал"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Двукр. докосване на клав. за интервал вмъква точка, следвана от интервал"</string> <string name="auto_cap" msgid="1719746674854628252">"Автоматично поставяне на главни букви"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Следа на жестовете: Показване"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамична плаваща визуализация"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Преглед на предложената дума при използване на жестове"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Запазено"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Включете слушалки, за да чуете клавишите за паролата на висок глас."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Текущият текст е %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Няма въведен текст"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"„<xliff:g id="KEY">%1$s</xliff:g>“ коригира „<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>“ на „<xliff:g id="CORRECTED">%3$s</xliff:g>“"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"„<xliff:g id="KEY">%1$s</xliff:g>“ изпълнява автоматично коригиране"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Код на клавишa %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"„Shift“ е включен (докоснете за деактивиране)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"„Caps lock“ е включен (докоснете за деактивиране)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Символи"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Букви"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Цифри"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Настройки"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Интервал"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Гласово въвеждане"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Усмивка"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Търсене"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Точка"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Смяна на езика"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Следващ"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Предишен"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"„Shift“ е активиран"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"„Caps Lock“ е активиран"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"„Shift“ е деактивиран"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Режим за символи"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим за букви"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим за телефон"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим за символи на телефона"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавиатурата е скрита"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Показва се клавиатурата за <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата и час"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"имейл aдреси"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"съобщения"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"числа"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефонни номера"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"часа"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL адреси"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Жест за фрази"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"При жестове въвеждaйте интервали чрез плъзгане през съотв. клавиш"</string> <string name="voice_input" msgid="3583258583521397548">"Клавиш за гласово въвеждане"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Няма активирани методи на гласово въвеждане. Проверете настройките за език и въвеждане."</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигуриране на въвеждането"</string> <string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string> <string name="send_feedback" msgid="1780431884109392046">"Изпращане на отзиви"</string> <string name="select_language" msgid="3693815588777926848">"Езици за въвеждане"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Докоснете отново, за да запазите"</string> <string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Помогнете за подобряването на този редактор за въвеждане чрез автоматично изпращане на статистически данни за употребата и сигнали за сривове"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Тема на клавиатурата"</string> <string name="subtype_en_GB" msgid="88170601942311355">"английски (Великобритания)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"английски (САЩ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"испански (САЩ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"английски (Великобр.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"английски (САЩ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"испански (САЩ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (традиционен)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"английски (Великобр.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"английски (САЩ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"испански (САЩ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиционна клавиатура)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (кирилица)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (латиница)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Без език (латиница)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Латиница (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Латиница (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Латиница (Коулмак)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Латиница (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Емотикони"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Цветова схема"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Бяло"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Синьо"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Персон. стилове за въвежд."</string> <string name="add_style" msgid="6163126614514489951">"+ стил"</string> <string name="add" msgid="8299699805688017798">"Добавяне"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Активиране"</string> <string name="not_now" msgid="6172462888202790482">"Не сега"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Същият стил на въвеждане вече съществува: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим за изучаване на използваемостта"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Забавяне при продълж. натискане"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Продълж. на вибриране при натискане"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Сила на звука при натиск. на клавиш"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Четене на файл за външен речник"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"В папката „Изтегляния“ няма файлове за речник"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Изберете файл за речника, който да инсталирате"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Наистина ли да се инсталира този файл за <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Наистина ли да се инсталира този файл за <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Възникна грешка"</string> <string name="button_default" msgid="3988017840431881491">"Стандартни"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Добре дошли в/ъв <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Опресняване"</string> <string name="last_update" msgid="730467549913588780">"Последна актуализация:"</string> <string name="message_updating" msgid="4457761393932375219">"Проверява се за актуализации"</string> - <string name="message_loading" msgid="8689096636874758814">"Зарежда се..."</string> + <string name="message_loading" msgid="5638680861387748936">"Зарежда се…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Основен речник"</string> <string name="cancel" msgid="6830980399865683324">"Отказ"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Настройки"</string> <string name="install_dict" msgid="180852772562189365">"Инсталиране"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Отказ"</string> <string name="delete_dict" msgid="756853268088330054">"Изтриване"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Налице е речник за избрания език на мобилното ви устройство.<br/> Препоръчваме ви <b>dда изтеглите</b> речника за <xliff:g id="LANGUAGE">%1$s</xliff:g>, за да подобрите практическата си работа при писане.<br/> <br/> Изтеглянето през 3G може да отнеме една до две минути. Възможно е да бъдете таксувани, ако нямате <b>неограничен план за данни</b>.<br/> В случай че не сте сигурни какъв е вашият план, ви препоръчваме да намерите Wi-Fi връзка, за да започнете автоматично изтеглянето.<br/> <br/> Съвет: Можете да изтегляте и премахвате речници, като отворите <b>Език и въвеждане</b> в менюто <b>Настройки</b> на мобилното си устройство."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Налице е речник за избрания език на мобилното ви устройство.<br/> Препоръчваме ви <b>да изтеглите</b> речника за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>, за да подобрите практическата си работа при писане.<br/> <br/> Изтеглянето през 3G може да отнеме една до две минути. Възможно е да бъдете таксувани, ако нямате <b>неограничен план за данни</b>.<br/> В случай че не сте сигурни какъв е вашият план, ви препоръчваме да намерите Wi-Fi връзка, за да започнете автоматично изтеглянето.<br/> <br/> Съвет: Можете да изтегляте и премахвате речници, като отворите <b>Език и въвеждане</b> в менюто <b>Настройки</b> на мобилното си устройство."</string> <string name="download_over_metered" msgid="1643065851159409546">"Изтегляне сега (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> МБ)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Изтегляне през Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"За <xliff:g id="LANGUAGE">%1$s</xliff:g> е налице речник"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"За <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> е налице речник"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Натиснете, за да прегледате и изтеглите"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Изтегля се: Предложенията за <xliff:g id="LANGUAGE">%1$s</xliff:g> ще бъдат готови скоро."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Изтегля се: Предложенията за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ще бъдат готови скоро."</string> <string name="version_text" msgid="2715354215568469385">"Версия <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Добавяне"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Добавяне в речника"</string> diff --git a/java/res/values-bn-rBD/strings-action-keys.xml b/java/res/values-bn-rBD/strings-action-keys.xml new file mode 100644 index 000000000..ca2e0eb43 --- /dev/null +++ b/java/res/values-bn-rBD/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"যান"</string> + <string name="label_next_key" msgid="5586407279258592635">"পরবর্তী"</string> + <string name="label_previous_key" msgid="1421141755779895275">"পূর্ববর্তী"</string> + <string name="label_done_key" msgid="7564866296502630852">"সম্পন্ন"</string> + <string name="label_send_key" msgid="482252074224462163">"পাঠান"</string> + <string name="label_search_key" msgid="7965186050435796642">"সন্ধান"</string> + <string name="label_pause_key" msgid="2225922926459730642">"বিরাম"</string> + <string name="label_wait_key" msgid="5891247853595466039">"অপেক্ষা করুন"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings-appname.xml b/java/res/values-bn-rBD/strings-appname.xml new file mode 100644 index 000000000..8efa51e65 --- /dev/null +++ b/java/res/values-bn-rBD/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android কীবোর্ড (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android বানান পরীক্ষক (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android কীবোর্ড সেটিংস (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android বানান পরীক্ষক সেটিংস (AOSP)"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings-config-important-notice.xml b/java/res/values-bn-rBD/strings-config-important-notice.xml new file mode 100644 index 000000000..9bc815c0d --- /dev/null +++ b/java/res/values-bn-rBD/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"পরামর্শ উন্নত করতে আপনার যোগাযোগসমূহ এবং টাইপ করা তথ্য থেকে শিখুন"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings-emoji-descriptions.xml b/java/res/values-bn-rBD/strings-emoji-descriptions.xml new file mode 100644 index 000000000..3c58621f4 --- /dev/null +++ b/java/res/values-bn-rBD/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"কপিরাইট চিহ্ন"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"নিবন্ধিত চিহ্ণ"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"দুটি বিস্ময়বোধক চিহ্ন"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"বিস্ময়বোধক ও প্রশ্ন চিহ্ন"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"ট্রেড মার্ক চিহ্ন"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"তথ্য উৎস"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"বাম-ডান তীর"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"উপর-নীচ তীর"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"উত্তর-পশ্চিম নির্দেশকারী তীর"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"উত্তর-পূর্ব নির্দেশকারী তীর"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"দক্ষিণ-পূর্ব নির্দেশকারী তীর"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"দক্ষিণ-পশ্চিম নির্দেশকারী তীর"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"আকশিওয়ালা বামমুখী তীর"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"আকশিওয়ালা ডানমুখী তীর"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"ঘড়ি"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"বালিঘড়ি"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"ডানমুখী দুটি কালো ত্রিভুজ"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"বামমুখী দুটি কালো ত্রিভুজ"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"উর্ধ্বমুখী দুটি কালো ত্রিভুজ"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"নিম্নমুখী দুটি কালো ত্রিভুজ"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"অ্যালার্ম ঘড়ি"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"ঝরে পড়া বালু সহ বালিঘড়ি"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"বৃত্তাবদ্ধ ল্যাটিন বড় হাতের অক্ষর m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"ছোট কালো চৌকো"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"ছোট সাদা চৌকো"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"ডানমুখী কালো ত্রিভুজ"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"বামমুখী কালো ত্রিভুজ"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"মাঝারি সাদা চৌকো"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"মাঝারি কালো চৌকো"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"মাঝারি আকারের ছোট সাদা চৌকো"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"মাঝারি আকারের ছোট কালো চৌকো"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"রশ্মি সহ কালো সূর্য"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"মেঘ"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"কালো টেলিফোন"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"টিক চিহ্ণযুক্ত ব্যালট বাক্স"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"বৃষ্টির ফোঁটা সহ ছাতা"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"উষ্ণ পানীয়"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"সাদা উর্ধ্বমুখী তর্জনী"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"সাদা হাসি মুখ"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"মেষরাশি"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"বৃষরাশি"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"মিথুনরাশি"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"কর্কটরাশি"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"সিংহরাশি"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"কন্যারাশি"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"তুলারাশি"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"বৃশ্চিকরাশি"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"ধনুরাশি"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"মকররাশি"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"কুম্ভরাশি"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"মীনরাশি"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"কালো ইস্কাপন স্যুট"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"কালো চিড়িতন স্যুট"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"কালো হরতন স্যুট"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"কালো রুহিতন স্যুট"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"উষ্ণ প্রস্রবন"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"কালো সার্বজনীন রিসাইক্লিং প্রতীক"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"হুইলচেয়ার প্রতীক"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"নোঙর"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"সতর্কবার্তা চিহ্ণ"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"উচ্চ ভোল্টেজ চিহ্ণ"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"মাঝারি সাদা বৃত্ত"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"মাঝারি কালো বৃত্ত"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"ফুটবল"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"বেসবল"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"বরফ ছাড়া তুষারমানব"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"মেঘের পেছনে সূর্য"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"অফিউকাস তারকাপুঞ্জ"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"প্রবেশ নিষেধ"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"গির্জা"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"ঝরনা"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"গর্তে পতাকা"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"পালতোলা নৌকা"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"তাঁবু"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"জ্বালানি পাম্প"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"কালো কাঁচি"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"মোটা সাদা টিক চিহ্ণ"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"বিমান"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"খাম"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"মুষ্ঠি তোলা"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"হাত তোলা"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"দুই আঙুলের বিজয়চিহ্ণ"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"পেন্সিল"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"কালো নিব"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"মোটা টিক চিহ্ণ"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"মোটা গুণচিহ্ণ x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"ঝিকিমিকিগুলি"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"আট কোণা তারা"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"আট কোণা কালো তারা"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"তুষারফলক"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"ঝিকিমিকি"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"কাটা চিহ্ণ"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"চৌকাকৃতি নেতিবাচক কাটা চিহ্ণ"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"কালো প্রশ্ন চিহ্ন অলঙ্কার"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"সাদা প্রশ্ন চিহ্ন অলঙ্কার"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"সাদা বিস্ময়বোধক চিহ্ন অলঙ্কার"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"মোটা বিস্ময়বোধক চিহ্ন প্রতীক"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"ভারি কালো হৃদয়"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"মোটা যোগ চিহ্ণ"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"মোটা বিয়োগ চিহ্ণ"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"মোটা ভাগ চিহ্ণ"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"ডানমুখী কালো তীর"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"তরঙ্গায়িত লুপ"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"দুবার তরঙ্গায়িত লুপ"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"প্রথমে ডানমুখী পরে বাঁক খেয়ে উর্ধ্বমুখী তীর"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"প্রথমে ডানমুখী পরে বাঁক খেয়ে নিম্নমুখী তীর"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"বামমুখী কালো তীর"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"উর্ধ্বমুখী কালো তীর"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"নিম্নমুখী কালো তীর"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"বড় কালো চৌকো"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"বড় সাদা চৌকো"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"মাঝারি সাদা তারা"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"মোটা বড় বৃত্ত"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"তরঙ্গায়িত ড্যাশ"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"গায়কের ভূমিকা শুরুর চিহ্ণ"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"বৃত্তাকার আইডিওগ্রাফ অভিনন্দন"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"বৃত্তাকার আইডিওগ্রাফ গোপন"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"মাহজং টাইলে লাল ড্রাগন"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"তাস খেলার কালো জোকার"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"রক্ত গ্রুপ এ"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"রক্ত গ্রুপ বি"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"রক্ত গ্রুপ ও"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"পার্কিং স্থান"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"রক্ত গ্রুপ এবি"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"চৌকাকৃতি সাফ প্রতীক"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"চৌকাকৃতি শান্ত প্রতীক"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"চৌকাকৃতি মুক্ত প্রতীক"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"চৌকাকৃতি ID প্রতীক"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"চৌকাকৃতি নতুন প্রতীক"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"চৌকাকৃতি ভাল-না প্রতীক"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"চৌকাকৃতি ঠিক আছে প্রতীক"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"চৌকাকৃতি SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"চৌকাকৃতি ‘উপরে’ লেখা সহ বিস্ময়সূচক চিহ্ণ"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"vs লেখা চৌকো"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"চৌকাকৃতি কাতাকানা ‘এখানে’"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"চৌকাকৃতি কাতাকানা ‘পরিষেবা’"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"চৌকাকৃতি আইডিওগ্রাফ চার্জ-ফ্রি"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"চৌকাকৃতি আইডিওগ্রাফ রিজার্ভ করা আসন"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"চৌকাকৃতি আইডিওগ্রাফ নিষেধাজ্ঞা"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"চৌকাকৃতি আইডিওগ্রাফ কর্মখালি"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"চৌকাকৃতি আইডিওগ্রাফ গ্রহণযোগ্যতা"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"চৌকাকৃতি আইডিওগ্রাফ পূর্ণ ভোগদখল"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"চৌকাকৃতি আইডিওগ্রাফ পরিশোধিত"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"চৌকাকৃতি আইডিওগ্রাফ মাসিক"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"চৌকাকৃতি আইডিওগ্রাফ দরখাস্ত"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"চৌকাকৃতি আইডিওগ্রাফ ডিসকাউন্ট"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"চৌকাকৃতি আইডিওগ্রাফ কাজে ব্যস্ত"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"বৃত্তাকৃতি আইডিওগ্রাফ সুবিধা"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"বৃত্তাকৃতি আইডিওগ্রাফ গ্রহন করুন"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"সাইক্লোন"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"কুয়াশাচ্ছন্ন"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"বন্ধ ছাতা"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"তারা ভরা রাত"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"পাহাড়ের ওপারে সূর্যোদয়"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"সূর্যোদয়"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"গোধুলি দৃশ্য"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"বিল্ডিংয়ের ওপারে সূর্যাস্ত"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"রংধনু"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"রাতে বেলায় সেতু"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"পানির ঢেউ"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"আগ্নেয়গিরি"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"আকাশগঙ্গা"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"ভূ-গোলকে ইউরোপ-আফ্রিকা"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"ভূ-গোলকে আমেরিকা"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"ভূ-গোলকে এশিয়া অস্ট্রেলিয়া"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"মধ্যরেখা সহ ভূ-গোলক"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"অমাবস্যা প্রতীক"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"বর্ধনশীল অর্ধচন্দ্র প্রতীক"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"প্রথম অর্ধপক্ষের চন্দ্রকলা প্রতীক"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"বর্ধনশীল অর্ধেকের বেশী বড় চন্দ্রকলা প্রতীক"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"পূর্ণিমা প্রতীক"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"ক্ষয়িষ্ণু অর্ধেকের বেশী বড় চন্দ্রকলা প্রতীক"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"শেষ অর্ধপক্ষের চন্দ্রকলা প্রতীক"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"ক্ষয়িষ্ণু অর্ধচন্দ্র প্রতীক"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"অর্ধচন্দ্র"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"মুখমন্ডল সহ অমাবস্যার চাঁদ"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"মুখমন্ডল সহ প্রথম অর্ধপক্ষের চাঁদ"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"মুখমন্ডল সহ শেষ এক অর্ধপক্ষের চাঁদ"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"মুখমন্ডল সহ পূর্ণিমার চাঁদ"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"মুখমন্ডল সহ সূর্য"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"বর্ধনশীল তারা"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"উল্কা"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"চেস্টনাট বাদাম"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"চারাগাছ"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"চিরসবুজ গাছ"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"পর্ণমোচী গাছ"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"পাম গাছ"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"ক্যাকটাস"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"টিউলিপ"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"চেরি ব্লসম"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"গোলাপ"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"হিবিসকাস"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"সূর্যমুখী"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"ফোটা ফুল"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"ভুট্টা মঞ্জরি"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"ধানের শিষ"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"ঔষধি"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"চার পাতার ক্লোভার"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"ম্যাপল পাতা"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"ঝরে পড়া পাতা"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"বাতাসে উড়ন্ত পাতা"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"মাশরুম"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"টমেটো"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"বেগুন"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"আঙুর"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"পাতি লেবু"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"তরমুজ"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"মানডারিন লেবু"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"পাতি লেবু"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"কলা"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"আনারস"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"লাল আপেল"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"সবুজ আপেল"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"নাশপাতি"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"পীচফল"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"চেরিফল"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"স্ট্রবেরি"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"হ্যামবার্গার"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"টুকরো পিৎজা"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"হাড়ের গায়ে মাংস"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"মুরগির রান"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"রাইস ক্র্যাকার"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"রাইস বল"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"ভাত"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"তরকারি ও ভাত"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"স্টিমিং বৌল"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"স্প্যাগেটি সেমাই"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"পাউরুটি"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"ফ্রেঞ্চ ফ্রাই"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"ঝলসানো মিষ্টি আলু"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"ড্যাংগো"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ওডেন"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"সুশি"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"ভাজা চিংড়ি"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"ঢেউ খেলানো ডিজাইনে ফিশকেক"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"সফট আইস ক্রিম"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"জমানো শেভড আইস"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"আইস ক্রিম"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ডোনাট"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"কুকি"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"চকোলেট বার"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"ক্যান্ডি"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"ললিপপ"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"কাস্টার্ড"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"মধুর পাত্র"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"শর্টকেক"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"বেন্টো বাক্স"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"এক পাত্র খাবার"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"রান্না"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"কাঁটা চামচ ও ছুরি"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"হাতলবিহীন চায়ের কাপ"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"সাকি বোতল ও কাপ"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"ওয়াইন গ্লাস"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"ককটেল গ্লাস"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"ট্রপিকাল পানীয়"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"বীয়ার মগ"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"ঠোকাঠুকি করা বীয়ার মগ"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"দুধ খাওয়ার বোতল"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ফিতে"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"মোড়ানো উপহার"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"জন্মদিনের কেক"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"জ্যাক-ও-ল্যানটার্ন"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"ক্রিসমাস ট্রি"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"ফাদার ক্রিসমাস"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"আতশবাজি"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"হাতে ধরা আতশবাজি"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"বেলুন"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"পার্টি পপার"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"কনফেট্টি বল"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"টানাবাটা গাছ"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"আড়াআড়ি রাখা পতাকা"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"পাইন ডেকোরেশন"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"জাপানি পুতুল"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"কাঠিতে বাঁধা মাছের প্রতীক"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"উইন্ড চাইম"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"চাঁদ দেখার উৎসব"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"স্কুল ব্যাগ"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"গ্রাজুয়েশন ক্যাপ"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"ক্যারোজেল ঘোড়া"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"ফেরির চাকা"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"রোলার কোস্টার"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"মাছ ধরার ছিপ ও মাছ"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"মাইক্রোফোন"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"মুভি ক্যামেরা"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"সিনেমা"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"হেডফোন"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"চিত্রকরের রঙ গোলার পাত্র"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"লম্বা টুপি"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"সার্কাসের তাঁবু"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"টিকেট"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"শুটিংয়ে ব্যবহৃত ক্ল্যাপার বোর্ড"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"অভিনীত শিল্পকলা"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"ভিডিও গেম"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"সরাসরি আঘাত"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"স্লট মেশিন"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"বিলিয়ার্ড"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"খেলার গুটি"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"বৌলিং"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"জাপানি ফুলের তাস"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"সঙ্গীতের সুর"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"সঙ্গীতের একাধিক সুর"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"স্যাক্সোফোন"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"গিটার"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"মিউজিকাল কীবোর্ড"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"তূর্য"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"বেহালা"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"সঙ্গীতের স্বরলিপির অনুলিপি"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"স্যাশযুক্ত দৌড়ানোর শার্ট"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"টেনিস র্যাকেট ও বল"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"স্কি ও স্কি বুট"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"বাস্কেটবল ও হুপ"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"চৌখুপি নকশার পতাকা"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"স্নোবোর্ডার"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"দৌড়বিদ"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"সার্ফার"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"ট্রফি"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"ঘোড়দৌড়"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"আমেরিকান ফুটবল"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"রাগবি ফুটবল"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"সাঁতারু"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"বাড়ি তৈরী"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"বাগান সহ বাড়ি"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"অফিস বিল্ডিং"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"জাপানি পোস্ট অফিস"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"ইউরোপীয় পোস্ট অফিস"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"হাসপাতাল"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"ব্যাংক"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"অটোমেটেড টেলার মেশিন"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"হোটেল"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"লাভ হোটেল"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"দিনরাত্রি খোলা স্টোর"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"স্কুল"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"ডিপার্টমেন্ট স্টোর"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"কারখানা"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"ইজাকায়া লণ্ঠন"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"জাপানি দুর্গপ্রাসাদ"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"ইউরোপীয় দুর্গপ্রাসাদ"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"ধেড়ে ইঁদুর"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"ইঁদুর"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"ষাঁড়"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"মহিষ"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"গরু"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"চিতাবাঘ"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"খরগোশ"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"বিড়াল"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"ড্রাগন"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"কুমির"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"তিমি"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"শামুক"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"সাপ"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"ঘোড়া"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"পুরুষ ভেড়া"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"ছাগল"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"ভেড়া"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"বানর"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"মোরগ"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"মুরগির বাচ্চা"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"কুকুর"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"শূকর"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"মেয়ে শূকর"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"হাতি"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"অক্টোপাস"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"পেঁচানো ঝিনুক"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"ছারপোকা"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"পিঁপড়া"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"মৌমাছি"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"গুবরেপোকা"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"মাছ"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"ক্রান্তীয় মাছ"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"পটকা মাছ"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"কচ্ছপ"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"ডিম ফোটা মুরগির বাচ্চা"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"মুরগির ছোট ছানা"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"সামনে তাকানো মুরগির ছোট ছানা"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"পাখি"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"পেঙ্গুইন"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"কোয়ালা"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"পুডল কুকুর"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"এক কুঁজওয়ালা উট"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"দুই কুঁজওয়ালা উট"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"ডলফিন"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"ইঁদুর মুখমন্ডল"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"গরুর মুখমন্ডল"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"বাঘের মুখমন্ডল"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"খরগোসের মুখমন্ডল"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"বিড়ালের মুখমন্ডল"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"ড্রাগনের মুখমন্ডল"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"পানি উদগীরণকারী তিমি"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"ঘোড়ার মুখমন্ডল"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"বানরের মুখমন্ডল"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"কুকুরের মুখমন্ডল"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"শূকরের মুখমন্ডল"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"ব্যাঙের মুখমন্ডল"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"ইঁদুর মুখো"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"নেকড়ের মুখমন্ডল"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"ভালুকের মুখমন্ডল"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"পান্ডার মুখমন্ডল"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"শূকরের নাক"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"পায়ের থাবার ছাপ"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"চোখ"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"কান"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"নাক"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"মুখ"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"জিহ্বা"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"উপর দিক নির্দেশক পেছন ফেরা হাতের সাদা তর্জনী"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"নীচের দিক নির্দেশক পেছন ফেরা হাতের সাদা তর্জনী"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"বামদিক নির্দেশক পেছন ফেরা হাতের সাদা তর্জনী"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"ডানদিক নির্দেশক পেছন ফেরা হাতের সাদা তর্জনী"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"মুষ্ঠবদ্ধ হাতের প্রতীক"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"হাত নাড়ানোর চিহ্ণ"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ঠিক আছে বুঝানো হাতের চিহ্ণ"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"বৃদ্ধাঙ্গুলি উঠানো চিহ্ণ"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"বৃদ্ধাঙ্গুলি নামানো চিহ্ণ"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"হাততালির চিহ্ণ"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"উম্মুক্ত হাতের চিহ্ণ"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"মুকুট"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"মহিলাদের হ্যাট"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"চশমা"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"গলার টাই"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"টি-শার্ট"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"জিন্স"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"পোষাক"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"কিমোনো"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"বিকিনি"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"মহিলাদের কাপড়চোপড়"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"পার্স"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"হ্যান্ডব্যাগ"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"পাউচ থলে"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"পুরুষদের জুতা"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"এথলেটিক জুতা"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"হাই হিল জুতা"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"মেয়েদের স্যান্ডেল"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"মেয়েদের বুটজুতা"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"পদচিহ্ন"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"আবক্ষ প্রতিমার ছায়ামূর্তি"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"আবক্ষ প্রতিমার ছায়ামূর্তিগুলি"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"কিশোর"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"কিশোরী"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"পুরুষ"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"নারী"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"পরিবার"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"হাত ধরাধরি করে নারী পুরুষ"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"হাত ধরা অবস্থায় দুজন পুরুষ"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"হাত ধরা অবস্থায় দুজন নারী"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"পুলিশ অফিসার"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"খরগোশের মত কানওয়ালা নারী"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"ঘোমটাওয়ালা বধু"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"সোনালী চুলের ব্যক্তি"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"গুয়া পি মাও টুপি পরা পুরুষ"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"পাগড়ি পরা পুরুষ"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"বয়স্ক পুরুষ"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"বয়স্কা নারী"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"শিশু"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"নির্মাণ শ্রমিক"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"রাজকুমারী"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"জাপানি রাক্ষস"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"জাপানি ভূত"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"ভূত"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"শিশু দেবদূত"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"বহির্জাগতিক ভিনগ্রহবাসী"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"ভিনগ্রহবাসী দৈত্য"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"খুদে শয়তান"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"মাথার খুলি"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"তথ্য ডেস্কের ব্যক্তি"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"প্রহরী"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"নর্তকী"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"লিপস্টিক"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"নেল পলিশ"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"মুখ ম্যাসেজ"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"চুল কাটা"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"নাপিতের খুঁটি"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"সিরিঞ্জ"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"পিল"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"চুম্বন চিহ্ণ"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"প্রেমপত্র"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"আংটি"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"জহর পাথর"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"চুম্বন"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"তোড়া"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"হৃদয় সহ দম্পতি"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"বিবাহ"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"হৃৎকম্পনরত হৃদয়"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"ভগ্ন হৃদয়"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"দুটি হৃদয়"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"ঝিকিমিকি করা হৃদয়"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"বর্ধনশীল হৃদয়"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"তীর সহ হৃদয়"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"নীল হৃদয়"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"সবুজ হৃদয়"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"হলুদ হৃদয়"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"বেগুনি হৃদয়"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"ফিতে সহ হৃদয়"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"ঘূর্ণনরত হৃদয়"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"হৃদয় ডেকোরেশন"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"ভিতরে একটি বিন্দু সহ ডায়মন্ড আকৃতি"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"ইলেকট্রিক লাইট বাল্ব"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"রাগের প্রতীক"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"বোমা"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"ঘুমের প্রতীক"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"সংঘর্ষের প্রতীক"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"ঘাম ঝরা প্রতীক"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"তরল ফোঁটা"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"ধোঁয়ার রেখার প্রতীক"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"আইসক্রিমের দলা"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"ফোলানো বাইসেপ"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"মাথা ঘোরা প্রতীক"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"কথার বেলুন"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"চিন্তার বেলুন"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"সাদা ফুল"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"একশত পয়েন্ট প্রতীক"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"মানি ব্যাগ"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"মুদ্রা বিনিময়"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"মোটা ডলার চিহ্ণ"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"ক্রেডিট কার্ড"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ইয়েন চিহ্ণ সহ ব্যাংকনোট"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"ডলার চিহ্ণসহ ব্যাংকনোট"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ইউরো চিহ্ণ সহ ব্যাংকনোট"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"পাউন্ড চিহ্ণ সহ ব্যাংকনোট"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"পাখাওয়ালা টাকা"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"উর্ধ্বমুখী প্রবণতা ও ইয়েন চিহ্ণ সহ চার্ট"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"আসন"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"ব্যক্তিগত কম্পিউটার"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ব্রিফকেস"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"মিনিডিস্ক"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"ফ্লপি ডিস্ক"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"অপটিকাল ডিস্ক"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"ডিভিডি"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ফাইল ফোল্ডার"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"ফোল্ডারটি খুলুন"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"গুটিয়ে যাওয়া পৃষ্ঠা"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"উল্টানো হচ্ছে এমন পৃষ্ঠা"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"ক্যালেন্ডার"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"প্রতিদিন ছিঁড়ে ফেলা যায় এমন ক্যালেন্ডার"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"কার্ড ইন্ডেক্স"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"উর্ধ্বমুখী প্রবণতা সহ চার্ট"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"নিম্নমুখী প্রবণতা সহ চার্ট"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"বার চার্ট"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"ক্লিপবোর্ড"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"পুশপিন"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"গোল পুশপিন"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"কাগজ আঁটার ক্লিপ"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"সাধারণ রুলার"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"ক্রিকোণ রুলার"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"বুকমার্ক ট্যাব"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"লেজার খাতা"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"নোটবুক"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"ডেকোরেশন করা প্রচ্ছদযুক্ত নোটবুক"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"বন্ধ বই"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"খোলা বই"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"সবুজ বই"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"নীল বই"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"কমলা বই"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"বইগুলি"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"নামের ব্যাজ"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"স্ক্রোল করুন"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"মেমো"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"টেলিফোন রিসিভার"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"পেজার"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"ফ্যাক্স মেশিন"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"স্যাটেলােইট এন্টেনা"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"জনসাধারণের সামনে ঘোষনার জন্য লাউডস্পিকার"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"হর্ষধ্বনির জন্য মেগাফোন"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"আউটবক্স ট্রে"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"ইনবক্স ট্রে"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"প্যাকেজ"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"ইমেল প্রতীক"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"আগত খাম"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"ওপরে নিম্নমুখী তীরযুক্ত খাম"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"নামানো পতাকাযুক্ত বন্ধ মেলবাক্স"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"উত্তোলিত পতাকাযুক্ত বন্ধ মেলবাক্স"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"উত্তোলিত পতাকাযুক্ত খোলা মেলবাক্স"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"নামানো পতাকাযুক্ত খোলা মেলবাক্স"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"ডাকবাক্স"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"পোস্টাল শিঙা"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"খবরের কাগজ"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"মোবাইল ফোন"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"বাম দিকে ডানমুখী তীরযুক্ত মোবাইল ফোন"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"কম্পন মোড"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"মোবাইল ফোন বন্ধ"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"মোবাইল ফোন নিষেধ"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"বারযুক্ত এন্টেনা"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"ক্যামেরা"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"ভিডিও ক্যামেরা"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"টেলিভিশন"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"রেডিও"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"ভিডিও ক্যাসেট"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"মোচড়ানো ডানমুখী তীরগুলি"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"ঘড়ির কাঁটার দিকে ডানমুখী ও বামমুখী উম্মুক্ত বৃত্ত তীরগুলি"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"ঘড়ির কাঁটার দিকে ডানমুখী ও বামমুখী উম্মুক্ত বৃত্ত তীরগুলির মাঝে বৃত্তের মাঝে এক লেখা"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"ঘড়ির কাঁটার দিকে নিম্নমুখী ও উর্ধ্বমুখী উম্মুক্ত বৃত্ত তীরগুলি"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"ঘড়ির কাঁটার বিপরীত দিকে নিম্নমুখী ও উর্ধ্বমুখী উম্মুক্ত বৃত্ত তীরগুলি"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"কম উজ্জ্বলতার প্রতীক"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"বেশী উজ্জ্বলতার প্রতীক"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"বাতিল দাগ দেয়া স্পিকার"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"স্পিকার"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"একটি সাউন্ড ওয়েভ যুক্ত স্পিকার"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"তিনটি সাউন্ড ওয়েভ যুক্ত স্পিকার"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"ব্যাটারি"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"ইলেকট্রিক প্লাগ"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"বামদিক হেলানো বিবর্ধক কাচ"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"ডানদিক হেলানো বিবর্ধক কাচ"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"কালির কলম সহ তালা"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"চাবি সহ বন্ধ তালা"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"চাবি"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"তালা"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"খোলা তালা"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"ঘন্টা"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"বাতিল দাগ দেয়া ঘন্টা"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"বুকমার্ক"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"লিঙ্ক প্রতীক"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"রেডিও বোতাম"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"‘ব্যাক’লেখার উপর বামমুখী তীর"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"‘এন্ড’ লেখার উপর বামমুখী তীর"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"‘অন’ লেখার পাশে বিস্ময়সূচক চিহ্ণ সহ উপরে ডানমুখী তীর"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"‘সুন’ লেখা সহ উপরে ডানমুখী তীর"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"‘টপ’ লেখা সহ উপরে উর্ধ্বমুখী তীর"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"আঠারো বয়সের নীচে না প্রতীক"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"১০ লেখা কীবোর্ড বোতাম"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"ল্যাটিন বড় হাতের লেখার জন্য ইনপুট প্রতীক"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"ল্যাটিন ছোট হাতের লেখার জন্য ইনপুট প্রতীক"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"সংখ্যা লেখার জন্য ইনপুট প্রতীক"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"প্রতীকগুলির জন্য ইনপুট প্রতীক"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"ল্যাটিন অক্ষর লেখার জন্য ইনপুট প্রতীক"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"আগুন"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"ইলেকট্রিক টর্চ"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"পেঁচকল"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"হাতুড়ি"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"নাট ও বল্টু"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"হোচো চাকু"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"পিস্তল"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"অণুবীক্ষণ যন্ত্র"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"টেলিস্কোপ"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"ক্রিস্টাল বল"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"মাঝে বিন্দু সহ ছয় কোণা তারা"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"শিক্ষানবিসের জন্য জাপানি প্রতীক"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"ত্রিশূল প্রতীক"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"ব্ল্যাক চৌকোণা বোতাম"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"সাদা চৌকোণা বোতাম"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"বড় লাল বৃত্ত"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"বড় নীল বৃত্ত"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"বড় কমলা ডায়মন্ড"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"বড় নীল ডায়মন্ড"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"ছোট কমলা ডায়মন্ড"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"ছোট নীল ডায়মন্ড"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"উর্ধ্বমুখী লাল ত্রিভুজ"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"নিম্নমুখী লাল ত্রিভুজ"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"উর্ধ্বমুখী ছোট লাল ত্রিভুজ"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"নিম্নমুখী ছোট লাল ত্রিভুজ"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"ঘড়িতে সময় একটা"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"ঘড়িতে সময় দুইটা"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"ঘড়িতে সময় তিনটা"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"ঘড়িতে সময় চারটা"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"ঘড়িতে সময় পাঁচটা"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"ঘড়িতে সময় ছয়টা"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"ঘড়িতে সময় সাতটা"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"ঘড়িতে সময় আটটা"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"ঘড়িতে সময় নয়টা"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"ঘড়িতে সময় দশটা"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"ঘড়িতে সময় এগারটা"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"ঘড়িতে সময় বারটা"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"ঘড়িতে সময় একটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"ঘড়িতে সময় দুটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"ঘড়িতে সময় তিনটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"ঘড়িতে সময় চারটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"ঘড়িতে সময় পাঁচটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"ঘড়িতে সময় ছয়টা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"ঘড়িতে সময় সাতটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"ঘড়িতে সময় আটটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"ঘড়িতে সময় নয়টা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"ঘড়িতে সময় দশটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"ঘড়িতে সময় এগারটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"ঘড়িতে সময় বারটা বেজে তিরিশ মিনিট"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"ফুজি পর্বত"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"টোকিও টাওয়ার"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"স্ট্যাচু অব লিবার্টি"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"জাপানের ছায়ামূর্তি"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"মোয়াই মূর্তি"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"দেঁতো হাসি যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"স্মিত চোখে দেঁতো হাসি"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"আনন্দাশ্রু সহ মুখমন্ডল"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"খোলা মুখে হাসি হাসি চেহারা"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"খোলা মুখ ও হাসি হাসি চোখ যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"খোলা মুখ ও শীতল ঘাম যুক্ত হাসি হাসি চেহারা"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"খোলা মুখ ও জোরে চেপে বন্ধ রাখা চোখ যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"আলোর বলয় যুক্ত হাসিমুখের চেহারা"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"শিংযুক্ত হাসিমুখের চেহারা"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"চোখ টেপা চেহারা"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"হাসি হাসি চোখ যুক্ত হাসিমুখের চেহারা"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"সুস্বাদু খাবারের স্বাদে মজা পাওয়া চেহারা"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"স্বস্তি পাওয়া চেহারা"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"হৃদয় আকারের চোখওয়ালা হাসিমুখের চেহারা"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"সানগ্লাাস পরা হাসিমুখের চেহারা"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"বোকা হাসিযুক্ত চেহারা"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"স্বাভাবিক চেহারা"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"ভাবলেশহীন চেহারা"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"আমোদিত হয়নিএমন চেহারা"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"শীতল ঘামযুক্ত চেহারা"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"বিষণ্ণ চেহারা"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"বিভ্রান্ত চেহারা"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"হতবুদ্ধি চেহারা"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"চুম্বনরত চেহারা"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"চুমু উপহার দিচ্ছে এমন চেহারা"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"হাসি হাসি চোখযুক্ত চুম্বনরত চেহারা"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"বন্ধ চোখযুক্ত চুম্বনরত চেহারা"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"বের করা জিহ্বাযুক্ত চেহারা"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"বের করা জিহ্বা ও চোখ টেপা চেহারা"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"বের করা জিহ্বা ও জোরে চেপে রাখা চোখ যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"হতাশ চেহারা"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"দু:শ্চিন্তাগ্রস্ত চেহারা"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"রাগী চেহারা"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"ঠোঁট ফুলানো চেহারা"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"ক্রন্দনরত চেহারা"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"কঠোর পরিশ্রমী চেহারা"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"বিজয়ের দৃষ্টি যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"হতাশ তবে স্বস্তি পাওয়া চেহারা"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"খোলা মুখে ভ্রু কোঁচকানো চেহারা"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"বেদনাময় মুখ"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"ভীতিকর চেহারা"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"ক্লান্ত চেহারা"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"ঘুমঘুম চেহারা"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"অবসন্ন চেহারা"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"মুখ ঘেঙচানো চেহারা"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"উচ্চস্বরে কান্নারত চেহারা"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"খোলা মুখযুক্ত চেহারা"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"নীরব থাকা চেহারা"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"খোলা মুখ ও শীতল ঘাম যুক্ত চেহারা"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"ভয়ে চিৎকাররত চেহারা"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"বিস্মিত চেহারা"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"আরক্ত চেহারা"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"ঘুমন্ত চেহারা"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"বিহ্বল চেহারা"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"মুখহীন চেহারা"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"মেডিকাল মাস্ক পরা মুখ"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"দাঁত দেখানো স্মিত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"আনন্দাশ্রুসহ বিড়াল মুখ"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"উম্মুক্ত মুখের স্মিত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"হৃদয় আকারের চোখওয়ালা স্মিত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"বিকৃত হাসি মুখে বিড়াল চেহারা"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"চোখ বন্ধ রাখা চুমুরত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"ঠোঁট ফুলানো বিড়াল মুখ"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"ক্রন্দনরত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"ক্লান্ত বিড়াল মুখ"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"ঠিক নাই ভঙ্গি সহ মুখ"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"ঠিক আছে ভঙ্গি সহ মুখ"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"অনেকখানি বাউ করা ব্যক্তি"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"খারাপ-কিছু-দেখবেন-না বানর"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"খারাপ-কিছু-শুনবেন-না বানর"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"খারাপ-কথা-বলবেন-না বানর"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"এক হাত উপরে উঠানো সুখী ব্যক্তি"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"দুহাত তুলে আনন্দ উদযাপনরত ব্যক্তি"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"ভ্রু কোঁচকানো ব্যক্তি"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"ঠোঁট ফুলানো ব্যক্তি"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"ভাঁজ করা বাহুওয়ালা ব্যক্তি"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"রকেট"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"হেলিকপ্টার"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"বাষ্পীয় যান"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"রেলওয়ে কার"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"উচ্চ-গতির ট্রেন"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"বুলেট নাক সহ উচ্চ-গতির ট্রেন"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"ট্রেন"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"মেট্রো"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"লাইট রেল"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"স্টেশন"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"ট্রাম"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"ট্রাম গাড়ি"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"বাস"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"আগত বাস"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"ট্রলিবাস"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"বাস স্টপেজ"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"মিনিবাস"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"অ্যাম্বুলেন্স"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"দমকল"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"পুলিশ কার"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"আগত পুলিশ কার"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"ট্যাক্সি"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"আগত ট্যাক্সি"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"অটোমোবাইল"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"আগত অটোমোবাইল"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"বিনোদনমূলক গাড়ী"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"ডেলিভারি ট্রাক"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"আর্টিকুলেটেড লরি"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ট্রাক্টর"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"মনোরেল"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"পাহাড়ি রেলপথ"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"ঝুলন্ত রেলপথ"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"পাহাড়ি কেবলপথ"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"এরিয়াল ট্রামপথ"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"জাহাজ"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"বাইচের নৌকা"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"স্পিডবোট"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"আনুভূমিক ট্রাফিক লাইট"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"উল্লম্ব ট্রাফিক লাইট"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"নির্মাণ কাজের চিহ্ণ"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"আলো ছড়ানো পুলিশ কার"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"পতাকাদন্ডে পতাকা"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"দরজা"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"প্রবেশ নিষেধ চিহ্ণ"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"ধূমপান প্রতীক"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"ধূমপানবিহীন এলাকা প্রতীক"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"সঠিক স্থানে ময়লা ফেলুন প্রতীক"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"ময়লা ফেলবেন না প্রতীক"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"নিরাপদ পানির প্রতীক"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"অ-নিরাপদ পানির প্রতীক"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"সাইকেল"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"সাইকেল চলবে না"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"সাইকেল চালক"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"পাহাড়ে সাইকেল চালক"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"পথচারী"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"পথচারী পারপার না"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"শিশুদের পারপার"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"পুরুষ প্রতীক"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"নারী প্রতীক"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"রেস্টরুম"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"শিশুর প্রতীক"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"টয়লেট"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"বাথরুম"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"শাওয়ার"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"গোসল"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"বাথটব"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"পাসপোর্ট নিয়ন্ত্রণ"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"কাস্টমস"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"ভুলে ফেলে যাওয়া মাল দাবি"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"ভুলে যাওয়া মালপত্র"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings-letter-descriptions.xml b/java/res/values-bn-rBD/strings-letter-descriptions.xml new file mode 100644 index 000000000..37879f302 --- /dev/null +++ b/java/res/values-bn-rBD/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"স্ত্রীলিঙ্গাত্মক অর্ডিন্যাল সূচক"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"মাইক্রো চিহ্ন"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"পুংলিঙ্গবাচক অর্ডিন্যাল সূচক"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"শার্প S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, গ্রেভ"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, টিল্ডাা"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, উপরের রিং"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, লিগেচার"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, গ্রেভ"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, গ্রেভ"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ইথ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, টিল্ডাা"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, গ্রেভ"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, টিল্ডাা"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, স্ট্রোক"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, গ্রেভ"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"থর্ণ"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, ম্যাকরন"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ব্রীভ"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, অগোনিক"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, কারোন"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, কারোন"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, স্ট্রোক"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, ম্যাকরন"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ব্রীভ"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, অগোনিক"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, কারোন"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ব্রীভ"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, স্ট্রোক"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, টিল্ডাা"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, ম্যাকরন"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ব্রীভ"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, অগোনিক"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"বিন্দু বিহীন I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, লিগেচার"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ক্রা"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, অ্যাকুইট"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, কারোন"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, মধ্যম বিন্দু"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, স্ট্রোক"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, কারোন"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, পূর্বে ঊর্ধকমা দিয়ে"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ইং"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, ম্যাকরন"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ব্রীভ"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, যুগ্ম অ্যাকুইট"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, লিগেচার"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, কারোন"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, অ্যাকুইট"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, কারোন"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, কারোন"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, স্ট্রোক"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, টিল্ডাা"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, ম্যাকরন"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ব্রীভ"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, উপরে রিং"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, যুগ্ম অ্যাকুইট"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, অগোনিক"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, অ্যাকুইট"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, কারোন"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"দীর্ঘ S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, শিং"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, শিং"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, নীচে কমা"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, নীচে কমা"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"শোহয়া"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, উপরে হুক"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A,সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ব্রীভ এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ব্রীভ এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ব্রীভ এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ব্রীভ এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ব্রীভ এবং নীচে ডট"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, উপরে হুক"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, টিল্ডাা"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, উপরে হুক"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, উপরে হুক"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, শিং ও অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, শিং ও গ্রেভ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, শিং ও উপরে হুক"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, শিং ও টিল্ডা"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, শিং ও নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, উপরে হুক"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, হর্ন ও অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, হর্ন ও গ্রেভ"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, হর্ন ও উপরে হুক"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, হর্ন ও টিল্ডা"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, হর্ন ও নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, গ্রেভ"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, উপরে হুক"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, টিল্ডা"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"উল্টানো বিস্ময়বোধক চিহ্ন"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"বামদিকে-নির্দেশিত যুগ্ম কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"মধ্যম বিন্দু"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ঊর্ধ্বলিপি এক"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ডানদিকে-নির্দেশিত যুগ্ম কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"উল্টানো প্রশ্ন চিহ্ন"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"বাম একক উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"ডান একক উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"একটি, নিচু স্থানে লেখা-৯ এর মতো উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"বাম যুগ্ম উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ডান যুগ্ম উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ছুরি"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"জোড়া ছুরি"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"প্রতি মাইলের চিহ্ন"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"প্রাইম"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"যুগ্ম প্রাইম"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"বামদিকে-নির্দেশিত একক কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ডানদিকে-নির্দেশিত একক কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ঊর্ধ্বলিপি চার"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ঊর্ধ্বলিপিতে ল্যাটিন ছোট অক্ষর n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"পেসো চিহ্ন"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"প্রযত্নে"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ডানদিকে নির্দেশিত তীর"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"নিম্নাভিমুখী তীর"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ফাঁকা সেট"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"বর্ধিত"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"তুলনায় কম বা সমান"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"তুলনায় বড় বা সমান"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"কালো তারকা"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings-talkback-descriptions.xml b/java/res/values-bn-rBD/strings-talkback-descriptions.xml new file mode 100644 index 000000000..7cf17a1fb --- /dev/null +++ b/java/res/values-bn-rBD/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"সশব্দে উচ্চারিত পাসওয়ার্ডের কীগুলি শোনার জন্য একটি হেডসেট সংযুক্ত করুন।"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"বর্তমান পাঠ্য %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"কোনো পাঠ্য লেখা হয়নি"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> কী <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> কে <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> এ সংশোধন করছে"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> স্বত:সংশোধন করে"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"অজানা অক্ষর"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"শিফ্ট"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"আরো প্রতীক"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"শিফ্ট"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"প্রতীকগুলি"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"শিফ্ট"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"মুছুন"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"প্রতীকসমূহ"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"অক্ষরসমূহ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"নম্বরগুলি"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"সেটিংস"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ট্যাব"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"স্পেস"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ভয়েস ইনপুট"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ইমোজি"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ফেরত যান"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"অনুসন্ধান"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ডট"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ভাষা স্যুইচ করুন"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"পরবর্তী"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"পূর্ববর্তী"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"শিফ্ট সক্ষম করা হয়েছে"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"বড় হাতের অক্ষর সক্ষম করা হয়েছে"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"প্রতীক মোড"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"আরো প্রতীক মোড"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"অক্ষর মোড"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ফোন মোড"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ফোন প্রতীক মোড"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"কীবোর্ড লুকানো রয়েছে"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> কীবোর্ড দেখানো হচ্ছে"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"তারিখ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"তারিখ ও সময়"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ইমেল"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"বার্তাপ্রেরণ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"সংখ্যা"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ফোন"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"পাঠ্য"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"সময়"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"সাম্প্রতিকগুলি"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ব্যক্তিগণ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"বিষয়বস্তুগুলি"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"প্রকৃতি"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"স্থানসমূহ"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"প্রতীকসমূহ"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ইমোটিকনগুলি"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"বড় হাতের <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"বড় হাতের I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"বড় হাতের I, উপরে বিন্দু"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"অজানা প্রতীক"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"অজানা ইমোজি"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"বিকল্প অক্ষরগুলি উপলব্ধ রয়েছে"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"বিকল্প অক্ষরগুলি সরিয়ে দেওয়া হয়"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"বিকল্প প্রস্তাবনাগুলি উপলব্ধ রয়েছে"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"বিকল্প প্রস্তাবনাগুলি সরিয়ে দেওয়া হয়"</string> +</resources> diff --git a/java/res/values-bn-rBD/strings.xml b/java/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000..75bcc6b72 --- /dev/null +++ b/java/res/values-bn-rBD/strings.xml @@ -0,0 +1,199 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ইনপুট বিকল্পগুলি"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"পরিচিতি নাম খুঁজুন"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"বানান পরীক্ষক আপনার পরিচিতি তালিকা থেকে এন্ট্রি ব্যবহার করে"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"কীপ্রেস এর সময় কম্পন"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"কীপ্রেস এর সময়ের শব্দ"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"কীপ্রেস এর ফলে পপআপ"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"ইনপুট পছন্দগুলি"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"উপস্থিতি"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"একাধিক ভাষা বিকল্পগুলি"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"অঙ্গভঙ্গি টাইপিং অভিরুচি"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"পাঠ্য সংশোধন"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"উন্নত"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"অন্য ইনপুট পদ্ধতিতে স্যুইচ করুন"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ভাষা স্যুইচ কীতে অন্যান্য ইনপুট পদ্ধতি পাওয়া যায়"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ভাষা স্যুইচ কী"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"যখন একাধিক ইনপুট ভাষা সক্ষম থাকে তখন দেখান"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"স্লাইড সূচক দেখান"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"শিফ্ট বা সাংকেতিক চিহ্ন থেকে স্লাইড করার সময় চাক্ষুষ ইঙ্গিত প্রদর্শন"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"কী পপআপ বিলম্ব খারিজ"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"কোনো বিলম্ব হয়নি"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ডিফল্ট"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>মিলি.সে."</string> + <string name="settings_system_default" msgid="6268225104743331821">"সিস্টেম ডিফল্ট"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"পরিচিতি নাম প্রস্তাব করুন"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"পরামর্শ ও সংশোধনীর জন্য পরিচিতি থেকে নাম ব্যবহার করুন"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ব্যক্তিগতকৃত পরামর্শ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"উন্নত <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ডাবল-স্পেস পিরিয়ড"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"স্পেসবার দুবার টিপলে একটি স্পেস এর পর একটি পিরিয়ড লেখা হয়"</string> + <string name="auto_cap" msgid="1719746674854628252">"স্বতঃ-ক্যাপিটালাইজেশন"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"প্রতিটি বাক্যের প্রথম শব্দ বড় হাতের করুন"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"ব্যক্তিগত অভিধান"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"অ্যাড-অন অভিধানগুলি"</string> + <string name="main_dictionary" msgid="4798763781818361168">"মূল অভিধান"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"সংশোধনের পরামর্শগুলি দেখান"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"লেখার সময় প্রস্তাবিত শব্দের প্রদর্শন"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"সবসময় দেখান"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"প্রতিকৃতি মোডে দেখান"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"সর্বদা লুকান"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"আপত্তিজনক শব্দ অবরোধ করুন"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"সম্ভাব্য অশোভন শব্দ সুপারিশ করবেন না"</string> + <string name="auto_correction" msgid="7630720885194996950">"স্বত:সংশোধন"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"স্পেসবার ও যতিচিহ্ন ভুলভাবে টাইপ করা শব্দ স্বয়ংক্রিয়ভাবে সংশোধন করে"</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_aggressive" msgid="7319007299148899623">"আক্রমণাত্মক"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"খুব আক্রমণাত্মক"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"পরবর্তী-শব্দের জন্য পরামর্শগুলি"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"পরামর্শ দিতে পূর্ববর্তী শব্দ ব্যবহার করুন"</string> + <string name="gesture_input" msgid="826951152254563827">"অঙ্গভঙ্গির মাধ্যমে লেখা সক্ষম করুন"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"অক্ষরগুলোর মাঝে স্লাইড করে একটি শব্দ ইনপুট করুন"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"অঙ্গভঙ্গির ট্রেল দেখান"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ডায়নামিক ভাসমান পূর্বরূপ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"অঙ্গভঙ্গির সময় প্রস্তাবিত শব্দ দেখুন"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"শব্দবন্ধ অঙ্গভঙ্গি"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"অঙ্গভঙ্গির সময় ব্যবধান ইনপুট করতে স্পেস কীতে যান"</string> + <string name="voice_input" msgid="3583258583521397548">"ভয়েস ইনপুট কী"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"কোনো ভয়েস ইনপুট পদ্ধতি সক্ষম নয়। ভাষা & ইনপুট সেটিংস পরীক্ষা করুন।"</string> + <string name="configure_input_method" msgid="373356270290742459">"ইনপুট পদ্ধতি কনফিগার করুন"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ইনপুট ভাষাগুলি"</string> + <string name="send_feedback" msgid="1780431884109392046">"প্রতিক্রিয়া পাঠান"</string> + <string name="select_language" msgid="3693815588777926848">"ইনপুট ভাষাগুলি"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"সংরক্ষণ করতে আবার ছোঁন"</string> + <string name="has_dictionary" msgid="6071847973466625007">"অভিধান উপলব্ধ"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"কীবোর্ড থিম"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ইংরেজি (UK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ইংরেজি (US)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"স্প্যানিশ (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ইংরেজি (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ইংরেজি (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"স্প্যানিশ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ঐতিহ্যবাহি)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (সিরিলিক)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ল্যাটিন)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"কোনো ভাষা নয় (বর্ণমালা)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"বর্ণমালা (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"বর্ণমালা (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"বর্ণমালা (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"বর্ণমালা (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"বর্ণমালা (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"বর্ণমালা (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ইমোজি"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"কীবোর্ড থিম"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"হলো হোয়াইট"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"হলো ব্লু"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"ম্যাটেরিয়াল ডার্ক"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"ম্যাটেরিয়াল লাইট"</string> + <string name="custom_input_styles_title" msgid="8429952441821251512">"কাস্টম ইনপুট শৈলীগুলি"</string> + <string name="add_style" msgid="6163126614514489951">"শৈলী জুড়ুন"</string> + <string name="add" msgid="8299699805688017798">"জুড়ুন"</string> + <string name="remove" msgid="4486081658752944606">"সরান"</string> + <string name="save" msgid="7646738597196767214">"সংরক্ষণ করুন"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ভাষা"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"লেআউট"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"আপনার কাস্টম ইনপুট শৈলী ব্যবহার শুরু করার আগে এটি সক্ষম করা প্রয়োজন। আপনি কি এখন এটি সক্ষম করতে চান?"</string> + <string name="enable" msgid="5031294444630523247">"সক্ষম করুন"</string> + <string name="not_now" msgid="6172462888202790482">"এখন নয়"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"একই ইনপুট শৈলী ইতোমধ্যে বিদ্যমান: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"কী প্রেসে দীর্ঘ বিলম্ব"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"কীপ্রেস কম্পন সময়কাল"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"কীপ্রেস সাউন্ড ভলিউম"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"বহিরাগত অভিধান ফাইলটি পড়ুন"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ডাউনলোডস ফোল্ডারে কোনো অভিধান ফাইল নেই"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ইনস্টল করার জন্য একটি অভিধান ফাইল নির্বাচন করুন"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"সত্যিই কি <xliff:g id="LANGUAGE_NAME">%s</xliff:g> এর জন্য এই ফাইলটি ইনস্টল করবেন?"</string> + <string name="error" msgid="8940763624668513648">"একটি ত্রুটি ছিল"</string> + <string name="button_default" msgid="3988017840431881491">"ডিফল্ট"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এ স্বাগতম"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"অঙ্গভঙ্গি টাইপিং এর মাধ্যমে"</string> + <string name="setup_start_action" msgid="8936036460897347708">"শুরু করুন"</string> + <string name="setup_next_action" msgid="371821437915144603">"পরবর্তী পদক্ষেপ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> সেট আপ হচ্ছে"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> সক্ষম করুন"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"দয়া করে আপনার ভাষা ও ইনপুট সেটিংস <xliff:g id="APPLICATION_NAME">%s</xliff:g> পরীক্ষা করুন। এর ফলে এটি আপনার ডিভাইসে চলার জন্য অনুমোদন পাবে।"</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"আপনার ভাষা ও ইনপুট সেটিংসে ইতোমধ্যে <xliff:g id="APPLICATION_NAME">%s</xliff:g> সক্ষম করা হয়েছে, তাই এই পদক্ষেপটি সমাপ্ত। পরবর্তীটিতে এগোন!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"সেটিংসে সক্ষম করুন"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এ স্যুইচ করুন"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"এখন, সক্রিয় পাঠ্য-ইনপুট পদ্ধতি হিসেবে \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" নির্বাচন করুন।"</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ইনপুট পদ্ধতি স্যুইচ করুন"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"অভিনন্দন, আপনি পুরোপুরি প্রস্তুত!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"এখন <xliff:g id="APPLICATION_NAME">%s</xliff:g> এর সাহায্যে আপনার সব পছন্দসই অ্যাপ্লিকেশানে লিখতে পারবেন।"</string> + <string name="setup_step3_action" msgid="600879797256942259">"অতিরিক্ত ভাষাগুলি কনফিগার করুন"</string> + <string name="setup_finish_action" msgid="276559243409465389">"শেষ হয়েছে"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"অ্যাপ্লিকেশান আইকন দেখান"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"লঞ্চারে অ্যাপ্লিকেশান আইকন প্রদর্শন"</string> + <string name="app_name" msgid="6320102637491234792">"অভিধান প্রদানকারী"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"অভিধান প্রদানকারী"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"অভিধান পরিষেবা"</string> + <string name="download_description" msgid="6014835283119198591">"অভিধান আপডেট বিষয়ক তথ্য"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"অ্যাড-অন অভিধানগুলি"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"অভিধান উপলব্ধ"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"অভিধানের জন্য সেটিংস"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ব্যবহারকারী অভিধানগুলি"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ব্যবহারকারী অভিধান"</string> + <string name="dictionary_available" msgid="4728975345815214218">"অভিধান উপলব্ধ"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"বর্তমানে ডাউনলোড হচ্ছে"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ইনস্টল হয়েছে"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ইন্সটল হয়েছে, অক্ষম করা হয়েছে"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"অভিধান পরিষেবার সঙ্গে সংযুক্ত হতে সমস্যা"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"কোন অভিধান উপলব্ধ নয়"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"রিফ্রেশ"</string> + <string name="last_update" msgid="730467549913588780">"শেষ বার আপডেট হয়েছে"</string> + <string name="message_updating" msgid="4457761393932375219">"আপডেটের জন্য পরীক্ষা করছে"</string> + <string name="message_loading" msgid="5638680861387748936">"লোড হচ্ছে..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"মূল অভিধান"</string> + <string name="cancel" msgid="6830980399865683324">"বাতিল করুন"</string> + <string name="go_to_settings" msgid="3876892339342569259">"সেটিংস"</string> + <string name="install_dict" msgid="180852772562189365">"ইনস্টল করুন"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"বাতিল করুন"</string> + <string name="delete_dict" msgid="756853268088330054">"মুছুন"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"আপনার মোবাইল ডিভাইসে নির্বাচিত ভাষায় একটি অভিধান উপলব্ধ আছে।<br/> আমরা আপনার টাইপিং অভিজ্ঞতা উন্নত করতে <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> অভিধানটি<b>ডাউনলোড</b> করার পরামর্শ দিচ্ছি।<br/> <br/> 3G মাধ্যমে ডাউনলোড হতে এক বা দুই মিনিট সময় লাগতে পারে। আপনার কোনো <b>সীমাহীন ডেটা প্ল্যান</b>.<br/> না থাকলে আপনাকে মূল্য পরিশোধ করতে হতে পারে। আপনি যদি নিশ্চিত না হোন যে আপনি কোন ডেটা প্ল্যান ব্যবহার করছেন, তাহলে স্বয়ংক্রিয়ভাবে ডাউনলোড শুরু করার জন্য আমরা আপনাকে একটি Wi-Fi সংযোগ ব্যবহার করার পরামর্শ দিচ্ছি।<br/> <br/> টিপ: আপনার মোবাইল ডিভাইসের <b>সেটিংস</b> মেনুতে <b>ভাষা& ইনপুট</b> এ গিয়ে অভিধান ডাউনলোড ও সরাতে পারবেন।"</string> + <string name="download_over_metered" msgid="1643065851159409546">"এখন ডাউনলোড করুন (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>মেবা)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi মাধ্যমে ডাউনলোড করুন"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ভাষার জন্য একটি অভিধান উপলব্ধ"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"পর্যালোচনা ও ডাউনলোড করতে টিপুন"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ডাউনলোড হচ্ছে: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> এর জন্য পরামর্শগুলি দ্রুত প্রস্তুত হবে।"</string> + <string name="version_text" msgid="2715354215568469385">"সংস্করণ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"জুড়ুন"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"অভিধানে জুড়ুন"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"শব্দবন্ধ"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"আরো বিকল্প"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"কম বিকল্প"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ঠিক আছে"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"শব্দ:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"শর্টকাট:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ভাষা:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"একটি শব্দ টাইপ করুন"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ঐচ্ছিক শর্টকাট"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"শব্দ সম্পাদনা করুন"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"সম্পাদনা করুন"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"মুছুন"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ব্যবহারকারী অভিধানে কোনো শব্দ নেই। যোগ করুন (+) বোতাম স্পর্শ করে একটি শব্দ যোগ করুন।"</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"সব ভাষার জন্য"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"আরো ভাষা..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"মুছুন"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings-action-keys.xml b/java/res/values-bn-rWB/strings-action-keys.xml new file mode 100644 index 000000000..ca2e0eb43 --- /dev/null +++ b/java/res/values-bn-rWB/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"যান"</string> + <string name="label_next_key" msgid="5586407279258592635">"পরবর্তী"</string> + <string name="label_previous_key" msgid="1421141755779895275">"পূর্ববর্তী"</string> + <string name="label_done_key" msgid="7564866296502630852">"সম্পন্ন"</string> + <string name="label_send_key" msgid="482252074224462163">"পাঠান"</string> + <string name="label_search_key" msgid="7965186050435796642">"সন্ধান"</string> + <string name="label_pause_key" msgid="2225922926459730642">"বিরাম"</string> + <string name="label_wait_key" msgid="5891247853595466039">"অপেক্ষা করুন"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings-appname.xml b/java/res/values-bn-rWB/strings-appname.xml new file mode 100644 index 000000000..8efa51e65 --- /dev/null +++ b/java/res/values-bn-rWB/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android কীবোর্ড (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android বানান পরীক্ষক (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android কীবোর্ড সেটিংস (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android বানান পরীক্ষক সেটিংস (AOSP)"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings-config-important-notice.xml b/java/res/values-bn-rWB/strings-config-important-notice.xml new file mode 100644 index 000000000..9bc815c0d --- /dev/null +++ b/java/res/values-bn-rWB/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"পরামর্শ উন্নত করতে আপনার যোগাযোগসমূহ এবং টাইপ করা তথ্য থেকে শিখুন"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings-letter-descriptions.xml b/java/res/values-bn-rWB/strings-letter-descriptions.xml new file mode 100644 index 000000000..37879f302 --- /dev/null +++ b/java/res/values-bn-rWB/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"স্ত্রীলিঙ্গাত্মক অর্ডিন্যাল সূচক"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"মাইক্রো চিহ্ন"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"পুংলিঙ্গবাচক অর্ডিন্যাল সূচক"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"শার্প S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, গ্রেভ"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, টিল্ডাা"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, উপরের রিং"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, লিগেচার"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, গ্রেভ"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, গ্রেভ"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ইথ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, টিল্ডাা"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, গ্রেভ"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, টিল্ডাা"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, স্ট্রোক"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, গ্রেভ"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, অ্যাকুইট"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"থর্ণ"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ডায়ারেসিস"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, ম্যাকরন"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ব্রীভ"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, অগোনিক"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, কারোন"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, কারোন"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, স্ট্রোক"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, ম্যাকরন"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ব্রীভ"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, অগোনিক"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, কারোন"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ব্রীভ"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, স্ট্রোক"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, টিল্ডাা"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, ম্যাকরন"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ব্রীভ"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, অগোনিক"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"বিন্দু বিহীন I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, লিগেচার"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ক্রা"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, অ্যাকুইট"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, কারোন"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, মধ্যম বিন্দু"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, স্ট্রোক"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, কারোন"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, পূর্বে ঊর্ধকমা দিয়ে"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ইং"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, ম্যাকরন"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ব্রীভ"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, যুগ্ম অ্যাকুইট"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, লিগেচার"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, অ্যাকুইট"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, কারোন"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, অ্যাকুইট"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, কারোন"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, চিহ্নবিশেষ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, কারোন"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, স্ট্রোক"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, টিল্ডাা"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, ম্যাকরন"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ব্রীভ"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, উপরে রিং"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, যুগ্ম অ্যাকুইট"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, অগোনিক"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, সারকামফ্লেক্স"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, অ্যাকুইট"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, উপরে বিন্দু"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, কারোন"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"দীর্ঘ S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, শিং"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, শিং"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, নীচে কমা"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, নীচে কমা"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"শোহয়া"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, উপরে হুক"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A,সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ব্রীভ এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ব্রীভ এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ব্রীভ এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ব্রীভ এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ব্রীভ এবং নীচে ডট"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, উপরে হুক"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, টিল্ডাা"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, উপরে হুক"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, উপরে হুক"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, সারকামফ্লেক্স এবং অ্যাকুইট"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, সারকামফ্লেক্স এবং গ্রেভ"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, সারকামফ্লেক্স এবং উপরে হুক"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, সারকামফ্লেক্স এবং টিল্ডা"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, সারকামফ্লেক্স এবং নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, শিং ও অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, শিং ও গ্রেভ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, শিং ও উপরে হুক"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, শিং ও টিল্ডা"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, শিং ও নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, উপরে হুক"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, হর্ন ও অ্যাকুইট"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, হর্ন ও গ্রেভ"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, হর্ন ও উপরে হুক"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, হর্ন ও টিল্ডা"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, হর্ন ও নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, গ্রেভ"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, নীচে বিন্দু"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, উপরে হুক"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, টিল্ডা"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"উল্টানো বিস্ময়বোধক চিহ্ন"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"বামদিকে-নির্দেশিত যুগ্ম কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"মধ্যম বিন্দু"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ঊর্ধ্বলিপি এক"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ডানদিকে-নির্দেশিত যুগ্ম কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"উল্টানো প্রশ্ন চিহ্ন"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"বাম একক উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"ডান একক উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"একটি, নিচু স্থানে লেখা-৯ এর মতো উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"বাম যুগ্ম উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ডান যুগ্ম উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ছুরি"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"জোড়া ছুরি"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"প্রতি মাইলের চিহ্ন"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"প্রাইম"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"যুগ্ম প্রাইম"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"বামদিকে-নির্দেশিত একক কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ডানদিকে-নির্দেশিত একক কোণ সমেত উদ্ধৃতি চিহ্ন"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ঊর্ধ্বলিপি চার"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ঊর্ধ্বলিপিতে ল্যাটিন ছোট অক্ষর n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"পেসো চিহ্ন"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"প্রযত্নে"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ডানদিকে নির্দেশিত তীর"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"নিম্নাভিমুখী তীর"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ফাঁকা সেট"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"বর্ধিত"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"তুলনায় কম বা সমান"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"তুলনায় বড় বা সমান"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"কালো তারকা"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings-talkback-descriptions.xml b/java/res/values-bn-rWB/strings-talkback-descriptions.xml new file mode 100644 index 000000000..7cf17a1fb --- /dev/null +++ b/java/res/values-bn-rWB/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"সশব্দে উচ্চারিত পাসওয়ার্ডের কীগুলি শোনার জন্য একটি হেডসেট সংযুক্ত করুন।"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"বর্তমান পাঠ্য %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"কোনো পাঠ্য লেখা হয়নি"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> কী <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> কে <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> এ সংশোধন করছে"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> স্বত:সংশোধন করে"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"অজানা অক্ষর"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"শিফ্ট"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"আরো প্রতীক"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"শিফ্ট"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"প্রতীকগুলি"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"শিফ্ট"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"মুছুন"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"প্রতীকসমূহ"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"অক্ষরসমূহ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"নম্বরগুলি"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"সেটিংস"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ট্যাব"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"স্পেস"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ভয়েস ইনপুট"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ইমোজি"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ফেরত যান"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"অনুসন্ধান"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ডট"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ভাষা স্যুইচ করুন"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"পরবর্তী"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"পূর্ববর্তী"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"শিফ্ট সক্ষম করা হয়েছে"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"বড় হাতের অক্ষর সক্ষম করা হয়েছে"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"প্রতীক মোড"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"আরো প্রতীক মোড"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"অক্ষর মোড"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ফোন মোড"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ফোন প্রতীক মোড"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"কীবোর্ড লুকানো রয়েছে"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> কীবোর্ড দেখানো হচ্ছে"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"তারিখ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"তারিখ ও সময়"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ইমেল"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"বার্তাপ্রেরণ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"সংখ্যা"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ফোন"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"পাঠ্য"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"সময়"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"সাম্প্রতিকগুলি"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ব্যক্তিগণ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"বিষয়বস্তুগুলি"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"প্রকৃতি"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"স্থানসমূহ"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"প্রতীকসমূহ"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ইমোটিকনগুলি"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"বড় হাতের <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"বড় হাতের I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"বড় হাতের I, উপরে বিন্দু"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"অজানা প্রতীক"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"অজানা ইমোজি"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"বিকল্প অক্ষরগুলি উপলব্ধ রয়েছে"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"বিকল্প অক্ষরগুলি সরিয়ে দেওয়া হয়"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"বিকল্প প্রস্তাবনাগুলি উপলব্ধ রয়েছে"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"বিকল্প প্রস্তাবনাগুলি সরিয়ে দেওয়া হয়"</string> +</resources> diff --git a/java/res/values-bn-rWB/strings.xml b/java/res/values-bn-rWB/strings.xml new file mode 100644 index 000000000..21cfe5f44 --- /dev/null +++ b/java/res/values-bn-rWB/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ইনপুট বিকল্পগুলি"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"পরিচিতি নাম খুঁজুন"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"বানান পরীক্ষক আপনার পরিচিতি তালিকা থেকে এন্ট্রি ব্যবহার করে"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"কীপ্রেস এর সময় কম্পন"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"কীপ্রেস এর সময়ের শব্দ"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"কীপ্রেস এর ফলে পপআপ"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"অন্য ইনপুট পদ্ধতিতে স্যুইচ করুন"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ভাষা স্যুইচ কীতে অন্যান্য ইনপুট পদ্ধতি পাওয়া যায়"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ভাষা স্যুইচ কী"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"যখন একাধিক ইনপুট ভাষা সক্ষম থাকে তখন দেখান"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"স্লাইড সূচক দেখান"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"শিফ্ট বা সাংকেতিক চিহ্ন থেকে স্লাইড করার সময় চাক্ষুষ ইঙ্গিত প্রদর্শন"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"কী পপআপ বিলম্ব খারিজ"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"কোনো বিলম্ব হয়নি"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ডিফল্ট"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>মিলি.সে."</string> + <string name="settings_system_default" msgid="6268225104743331821">"সিস্টেম ডিফল্ট"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"পরিচিতি নাম প্রস্তাব করুন"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"পরামর্শ ও সংশোধনীর জন্য পরিচিতি থেকে নাম ব্যবহার করুন"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ব্যক্তিগতকৃত পরামর্শ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"উন্নত <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ডাবল-স্পেস পিরিয়ড"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"স্পেসবার দুবার টিপলে একটি স্পেস এর পর একটি পিরিয়ড লেখা হয়"</string> + <string name="auto_cap" msgid="1719746674854628252">"স্বতঃ-ক্যাপিটালাইজেশন"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"প্রতিটি বাক্যের প্রথম শব্দ বড় হাতের করুন"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"ব্যক্তিগত অভিধান"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"অ্যাড-অন অভিধানগুলি"</string> + <string name="main_dictionary" msgid="4798763781818361168">"মূল অভিধান"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"সংশোধনের পরামর্শগুলি দেখান"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"লেখার সময় প্রস্তাবিত শব্দের প্রদর্শন"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"সবসময় দেখান"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"প্রতিকৃতি মোডে দেখান"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"সর্বদা লুকান"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"আপত্তিজনক শব্দ অবরোধ করুন"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"সম্ভাব্য অশোভন শব্দ সুপারিশ করবেন না"</string> + <string name="auto_correction" msgid="7630720885194996950">"স্বত:সংশোধন"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"স্পেসবার ও যতিচিহ্ন ভুলভাবে টাইপ করা শব্দ স্বয়ংক্রিয়ভাবে সংশোধন করে"</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_aggressive" msgid="7319007299148899623">"আক্রমণাত্মক"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"খুব আক্রমণাত্মক"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"পরবর্তী-শব্দের জন্য পরামর্শগুলি"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"পরামর্শ দিতে পূর্ববর্তী শব্দ ব্যবহার করুন"</string> + <string name="gesture_input" msgid="826951152254563827">"অঙ্গভঙ্গির মাধ্যমে লেখা সক্ষম করুন"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"অক্ষরগুলোর মাঝে স্লাইড করে একটি শব্দ ইনপুট করুন"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"অঙ্গভঙ্গির ট্রেল দেখান"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ডায়নামিক ভাসমান পূর্বরূপ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"অঙ্গভঙ্গির সময় প্রস্তাবিত শব্দ দেখুন"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"শব্দবন্ধ অঙ্গভঙ্গি"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"অঙ্গভঙ্গির সময় ব্যবধান ইনপুট করতে স্পেস কীতে যান"</string> + <string name="voice_input" msgid="3583258583521397548">"ভয়েস ইনপুট কী"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"কোনো ভয়েস ইনপুট পদ্ধতি সক্ষম নয়। ভাষা & ইনপুট সেটিংস পরীক্ষা করুন।"</string> + <string name="configure_input_method" msgid="373356270290742459">"ইনপুট পদ্ধতি কনফিগার করুন"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ইনপুট ভাষাগুলি"</string> + <string name="send_feedback" msgid="1780431884109392046">"প্রতিক্রিয়া পাঠান"</string> + <string name="select_language" msgid="3693815588777926848">"ইনপুট ভাষাগুলি"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"সংরক্ষণ করতে আবার ছোঁন"</string> + <string name="has_dictionary" msgid="6071847973466625007">"অভিধান উপলব্ধ"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"কীবোর্ড থিম"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ইংরেজি (UK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ইংরেজি (US)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"স্প্যানিশ (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ইংরেজি (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ইংরেজি (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"স্প্যানিশ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ঐতিহ্যবাহি)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (সিরিলিক)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ল্যাটিন)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"কোনো ভাষা নয় (বর্ণমালা)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"বর্ণমালা (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"বর্ণমালা (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"বর্ণমালা (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"বর্ণমালা (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"বর্ণমালা (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"বর্ণমালা (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ইমোজি"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"কাস্টম ইনপুট শৈলীগুলি"</string> + <string name="add_style" msgid="6163126614514489951">"শৈলী জুড়ুন"</string> + <string name="add" msgid="8299699805688017798">"জুড়ুন"</string> + <string name="remove" msgid="4486081658752944606">"সরান"</string> + <string name="save" msgid="7646738597196767214">"সংরক্ষণ করুন"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ভাষা"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"লেআউট"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"আপনার কাস্টম ইনপুট শৈলী ব্যবহার শুরু করার আগে এটি সক্ষম করা প্রয়োজন। আপনি কি এখন এটি সক্ষম করতে চান?"</string> + <string name="enable" msgid="5031294444630523247">"সক্ষম করুন"</string> + <string name="not_now" msgid="6172462888202790482">"এখন নয়"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"একই ইনপুট শৈলী ইতোমধ্যে বিদ্যমান: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"কী প্রেসে দীর্ঘ বিলম্ব"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"কীপ্রেস কম্পন সময়কাল"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"কীপ্রেস সাউন্ড ভলিউম"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"বহিরাগত অভিধান ফাইলটি পড়ুন"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ডাউনলোডস ফোল্ডারে কোনো অভিধান ফাইল নেই"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ইনস্টল করার জন্য একটি অভিধান ফাইল নির্বাচন করুন"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"সত্যিই কি <xliff:g id="LANGUAGE_NAME">%s</xliff:g> এর জন্য এই ফাইলটি ইনস্টল করবেন?"</string> + <string name="error" msgid="8940763624668513648">"একটি ত্রুটি ছিল"</string> + <string name="button_default" msgid="3988017840431881491">"ডিফল্ট"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এ স্বাগতম"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"অঙ্গভঙ্গি টাইপিং এর মাধ্যমে"</string> + <string name="setup_start_action" msgid="8936036460897347708">"শুরু করুন"</string> + <string name="setup_next_action" msgid="371821437915144603">"পরবর্তী পদক্ষেপ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> সেট আপ হচ্ছে"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> সক্ষম করুন"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"দয়া করে আপনার ভাষা ও ইনপুট সেটিংস <xliff:g id="APPLICATION_NAME">%s</xliff:g> পরীক্ষা করুন। এর ফলে এটি আপনার ডিভাইসে চলার জন্য অনুমোদন পাবে।"</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"আপনার ভাষা ও ইনপুট সেটিংসে ইতোমধ্যে <xliff:g id="APPLICATION_NAME">%s</xliff:g> সক্ষম করা হয়েছে, তাই এই পদক্ষেপটি সমাপ্ত। পরবর্তীটিতে এগোন!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"সেটিংসে সক্ষম করুন"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এ স্যুইচ করুন"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"এখন, সক্রিয় পাঠ্য-ইনপুট পদ্ধতি হিসেবে \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" নির্বাচন করুন।"</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ইনপুট পদ্ধতি স্যুইচ করুন"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"অভিনন্দন, আপনি পুরোপুরি প্রস্তুত!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"এখন <xliff:g id="APPLICATION_NAME">%s</xliff:g> এর সাহায্যে আপনার সব পছন্দসই অ্যাপ্লিকেশানে লিখতে পারবেন।"</string> + <string name="setup_step3_action" msgid="600879797256942259">"অতিরিক্ত ভাষাগুলি কনফিগার করুন"</string> + <string name="setup_finish_action" msgid="276559243409465389">"শেষ হয়েছে"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"অ্যাপ্লিকেশান আইকন দেখান"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"লঞ্চারে অ্যাপ্লিকেশান আইকন প্রদর্শন"</string> + <string name="app_name" msgid="6320102637491234792">"অভিধান প্রদানকারী"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"অভিধান প্রদানকারী"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"অভিধান পরিষেবা"</string> + <string name="download_description" msgid="6014835283119198591">"অভিধান আপডেট বিষয়ক তথ্য"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"অ্যাড-অন অভিধানগুলি"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"অভিধান উপলব্ধ"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"অভিধানের জন্য সেটিংস"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ব্যবহারকারী অভিধানগুলি"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ব্যবহারকারী অভিধান"</string> + <string name="dictionary_available" msgid="4728975345815214218">"অভিধান উপলব্ধ"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"বর্তমানে ডাউনলোড হচ্ছে"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ইনস্টল হয়েছে"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ইন্সটল হয়েছে, অক্ষম করা হয়েছে"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"অভিধান পরিষেবার সঙ্গে সংযুক্ত হতে সমস্যা"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"কোন অভিধান উপলব্ধ নয়"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"রিফ্রেশ"</string> + <string name="last_update" msgid="730467549913588780">"শেষ বার আপডেট হয়েছে"</string> + <string name="message_updating" msgid="4457761393932375219">"আপডেটের জন্য পরীক্ষা করছে"</string> + <string name="message_loading" msgid="5638680861387748936">"লোড হচ্ছে..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"মূল অভিধান"</string> + <string name="cancel" msgid="6830980399865683324">"বাতিল করুন"</string> + <string name="go_to_settings" msgid="3876892339342569259">"সেটিংস"</string> + <string name="install_dict" msgid="180852772562189365">"ইনস্টল করুন"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"বাতিল করুন"</string> + <string name="delete_dict" msgid="756853268088330054">"মুছুন"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"আপনার মোবাইল ডিভাইসে নির্বাচিত ভাষায় একটি অভিধান উপলব্ধ আছে।<br/> আমরা আপনার টাইপিং অভিজ্ঞতা উন্নত করতে <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> অভিধানটি<b>ডাউনলোড</b> করার পরামর্শ দিচ্ছি।<br/> <br/> 3G মাধ্যমে ডাউনলোড হতে এক বা দুই মিনিট সময় লাগতে পারে। আপনার কোনো <b>সীমাহীন ডেটা প্ল্যান</b>.<br/> না থাকলে আপনাকে মূল্য পরিশোধ করতে হতে পারে। আপনি যদি নিশ্চিত না হোন যে আপনি কোন ডেটা প্ল্যান ব্যবহার করছেন, তাহলে স্বয়ংক্রিয়ভাবে ডাউনলোড শুরু করার জন্য আমরা আপনাকে একটি Wi-Fi সংযোগ ব্যবহার করার পরামর্শ দিচ্ছি।<br/> <br/> টিপ: আপনার মোবাইল ডিভাইসের <b>সেটিংস</b> মেনুতে <b>ভাষা& ইনপুট</b> এ গিয়ে অভিধান ডাউনলোড ও সরাতে পারবেন।"</string> + <string name="download_over_metered" msgid="1643065851159409546">"এখন ডাউনলোড করুন (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>মেবা)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi মাধ্যমে ডাউনলোড করুন"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ভাষার জন্য একটি অভিধান উপলব্ধ"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"পর্যালোচনা ও ডাউনলোড করতে টিপুন"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ডাউনলোড হচ্ছে: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> এর জন্য পরামর্শগুলি দ্রুত প্রস্তুত হবে।"</string> + <string name="version_text" msgid="2715354215568469385">"সংস্করণ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"জুড়ুন"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"অভিধানে জুড়ুন"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"শব্দবন্ধ"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"আরো বিকল্প"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"কম বিকল্প"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ঠিক আছে"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"শব্দ:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"শর্টকাট:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ভাষা:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"একটি শব্দ টাইপ করুন"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ঐচ্ছিক শর্টকাট"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"শব্দ সম্পাদনা করুন"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"সম্পাদনা করুন"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"মুছুন"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ব্যবহারকারী অভিধানে কোনো শব্দ নেই। যোগ করুন (+) বোতাম স্পর্শ করে একটি শব্দ যোগ করুন।"</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"সব ভাষার জন্য"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"আরো ভাষা..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"মুছুন"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-ca/strings-action-keys.xml b/java/res/values-ca/strings-action-keys.xml index 9dcf219cc..2760fb076 100644 --- a/java/res/values-ca/strings-action-keys.xml +++ b/java/res/values-ca/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string> <string name="label_done_key" msgid="7564866296502630852">"Fet"</string> <string name="label_send_key" msgid="482252074224462163">"Envia"</string> + <string name="label_search_key" msgid="7965186050435796642">"Cerca"</string> <string name="label_pause_key" msgid="2225922926459730642">"Atura"</string> <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string> </resources> diff --git a/java/res/values-ca/strings-config-important-notice.xml b/java/res/values-ca/strings-config-important-notice.xml new file mode 100644 index 000000000..279314571 --- /dev/null +++ b/java/res/values-ca/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Considera comunicacions i dades introd. per millorar suggeriments"</string> +</resources> diff --git a/java/res/values-ca/strings-letter-descriptions.xml b/java/res/values-ca/strings-letter-descriptions.xml new file mode 100644 index 000000000..a6569ec94 --- /dev/null +++ b/java/res/values-ca/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal femení"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signe de micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculí"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S sonora"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent obert"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent tancat"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, titlla"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dièresi"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anell"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, lligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, ce trencada"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent obert"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent tancat"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dièresi"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent obert"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent tancat"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dièresi"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, titlla"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent obert"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent tancat"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, titlla"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dièresi"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, conjunt buit"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent obert"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent tancat"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"O, dièresi"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent tancat"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dièresi"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, màcron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breu"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, croc polonès"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent tancat"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punt superior"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, anticircumflex"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, anticircumflex"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, barra"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, anticircumflex"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breu"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punt superior"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, croc polonès"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, anticircumflex"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breu"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punt superior"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, vírgula"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, barra"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, titlla"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, màcron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breu"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, croc polonès"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sense punt"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, lligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, vírgula"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent tancat"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, vírgula"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, anticircumflex"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punt volat"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, barra"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent tancat"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, vírgula"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, anticircumflex"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida d\'apòstrof"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, màcron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breu"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent tancat doble"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, lligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent tancat"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, vírgula"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, anticircumflex"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent tancat"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, vírgula"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, anticircumflex"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, vírgula"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, anticircumflex"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, barra"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, titlla"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, màcron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breu"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anell"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent tancat doble"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, croc polonès"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent tancat"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punt superior"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, anticircumflex"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S llarga"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, banya"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, banya"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Neutra"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punt inferior"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, vírgula superior"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex i accent tancat"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex i accent obert"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex i vírgula superior"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex i titlla"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex i punt inferior"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breu i accent tancat"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breu i accent obert"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breu i vírgula superior"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breu i titlla"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breu i punt inferior"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punt inferior"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, vírgula superior"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, titlla"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex i accent tancat"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex i accent obert"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex i vírgula superior"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex i titlla"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex i punt inferior"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, vírgula superior"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punt inferior"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punt inferior"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, vírgula superior"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex i accent tancat"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex i accent obert"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex i vírgula superior"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex i titlla"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex i punt inferior"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, banya i accent tancat"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, banya i accent obert"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, banya i vírgula superior"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, banya i titlla"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, banya i punt inferior"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punt inferior"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, vírgula superior"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, banya i accent tancat"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, banya i accent obert"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, banya i vírgula superior"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, banya i titlla"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, banya i punt inferior"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent obert"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punt inferior"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, vírgula superior"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, titlla"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Signe d\'exclamació invertit"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Doble cometa angular d\'obertura"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"punt volat"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndex d\'u"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Doble cometa angular de tancament"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Signe d\'interrogació invertit"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Cometes simples d\'obertura"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Cometes simples de tancament"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Cometes alemanyes simples d\'obertura"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Cometes dobles d\'obertura"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Cometes dobles de tancament"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obelisc"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Doble obelisc"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signe per mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Cometa"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Cometa doble"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Cometes angulars simples d\'obertura"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Cometes angulars simples de tancament"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndex de quatre"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndex de lletra minúscula llatina n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signe del peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Percentatge"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Fletxa cap a la dreta"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Fletxa cap avall"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunt buit"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Més petit o igual que"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Més gran o igual que"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrella negra"</string> +</resources> diff --git a/java/res/values-ca/strings-talkback-descriptions.xml b/java/res/values-ca/strings-talkback-descriptions.xml new file mode 100644 index 000000000..9b01c75ed --- /dev/null +++ b/java/res/values-ca/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Connecta uns auriculars per sentir les tecles que s\'utilitzen per introduir la contrasenya en veu alta."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"El text actual és %s."</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"No s\'ha introduït cap text."</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregeix <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> per <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa la correcció automàtica."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caràcter desconegut"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Maj"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Més símbols"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maj"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Símbols"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Maj"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Suprimeix"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Símbols"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Lletres"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Números"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Configuració"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulador"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espai"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrada de veu"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Retorn"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Cerca"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Canvia l\'idioma"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Següent"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Anterior"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Maj activat"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Bloq Maj activat"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Mode de símbols"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Mode de més símbols"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Mode de lletres"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Mode de telèfon"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Mode de símbols de telèfon"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"S\'ha amagat el teclat."</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Es mostra el teclat per a <xliff:g id="KEYBOARD_MODE">%s</xliff:g>."</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data i hora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"correu electrònic"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"missatgeria"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"número"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telèfon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"hora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recents"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Persones"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objectes"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natura"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Llocs"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbols"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticones"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> majúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I majúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I majúscula, punt superior"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbol desconegut"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconegut"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Hi ha caràcters alternatius disponibles."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Els caràcters alternatius s\'ignoren."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Hi ha suggeriments alternatius disponibles."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Els suggeriments alternatius s\'ignoren."</string> +</resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index 0b9ee037e..80d298703 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcions d\'entrada"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Recerca d\'ordres de reg."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cerca noms de contactes"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"El corrector ortogràfic utilitza entrades de la llista de contactes"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prémer tecles"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"So en prémer tecles"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Amplia en prémer tecles"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Correcció de text"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Escriptura gestual"</string> - <string name="misc_category" msgid="6894192814868233453">"Altres opcions"</string> - <string name="advanced_settings" msgid="362895144495591463">"Configuració avançada"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opcions per a experts"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Altres mètodes d\'introducció"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"La tecla de canvi d\'idioma serveix també per a altres mètodes d\'entrada"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla de canvi d\'idioma"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Predeterm. del sist."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Suggereix noms de contactes"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilitza els noms de contactes per fer suggeriments i correccions"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggeriments personalitz."</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Millora <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punt amb doble espai"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Picar dues vegades la barra d\'espai insereix punt i espai blanc"</string> <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostra el recorregut del gest"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visualitz. prèvia dinàmica flotant"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Consulta la paraula suggerida mentre fas el gest"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: desada"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Connecta un auricular per escoltar les claus de la contrasenya en veu alta."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"El text actual és %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"No s\'ha introduït cap text"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corregeix <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> per <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> aplica correccions automàtiques"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Clau de codi %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Maj"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Maj activat (pica per desactivar)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Bloq Maj activat (pica per desactivar)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Supr"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbols"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Lletres"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Configuració"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Pestanya"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espai"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de veu"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Cara somrient"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Retorn"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Cerca"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Canvia l\'idioma"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Següent"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Anterior"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Maj activat"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Bloq Maj activat"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Maj desactivat"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mode de símbols"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode de lletres"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode de telèfon"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode de símbols de telèfon"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclat amagat"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Es mostra el teclat <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i hora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"correu electrònic"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"missatgeria"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telèfon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Formula el gest"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Per afegir espais als gestos, apropa el dit a la tecla d\'espai."</string> <string name="voice_input" msgid="3583258583521397548">"Tecla d\'entrada de veu"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Al teclat principal"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Al teclat de símbols"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Desactivada"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micròfon al teclat principal"</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 veu desactivada"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"No hi ha cap mètode d\'introducció activat. Comprova la configuració d\'Idioma i introducció de text."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura mètodes d\'entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomes"</string> <string name="send_feedback" msgid="1780431884109392046">"Envia comentaris"</string> <string name="select_language" msgid="3693815588777926848">"Idiomes d\'introducció"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Torna a tocar per desar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ajuda a millorar aquest editor de mètode d\'introducció de text mitjançant l\'enviament d\'estadístiques d\'ús i d\'informes d\'error."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema del teclat"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglès (Regne Unit)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglès (EUA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Espanyol (EUA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Anglès (Regne Unit) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Anglès (Estats Units) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Espanyol (EUA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Anglès (Regne Unit) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Anglès (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Espanyol (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ciríl·lic)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (llatí)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Cap idioma (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Combinació de colors"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Blanc"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blau"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Estils d\'entrada personalitzats"</string> <string name="add_style" msgid="6163126614514489951">"Afeg. estil"</string> <string name="add" msgid="8299699805688017798">"Afegeix"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Activa"</string> <string name="not_now" msgid="6172462888202790482">"Ara no"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ja existeix aquest estil d\'entrada: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'estudi d\'usabilitat"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Retard en mantenir premut"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durada vibració en prémer"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volum del so en prémer tecles"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lectura d\'un fitxer de diccionari extern"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hi ha cap fitxer de diccionari a la carpeta Baixades"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecció d\'un fitxer de diccionari per instal·lar"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Realment vols instal·lar aquest fitxer per a <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Realment vols instal·lar aquest fitxer per a <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"S\'ha produït un error"</string> <string name="button_default" msgid="3988017840431881491">"Predeterminat"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Et donem la benvinguda a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualitza"</string> <string name="last_update" msgid="730467549913588780">"Última actualització"</string> <string name="message_updating" msgid="4457761393932375219">"S\'està comprovant si hi ha actualitzacions"</string> - <string name="message_loading" msgid="8689096636874758814">"S\'està carregant..."</string> + <string name="message_loading" msgid="5638680861387748936">"S\'està carregant..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Diccionari principal"</string> <string name="cancel" msgid="6830980399865683324">"Cancel·la"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Configuració"</string> <string name="install_dict" msgid="180852772562189365">"Instal·la"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel·la"</string> <string name="delete_dict" msgid="756853268088330054">"Suprimeix"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hi ha un diccionari disponible per a l\'idioma seleccionat al teu dispositiu mòbil.<br/> Et recomanem que <b>baixis</b> el diccionari de <xliff:g id="LANGUAGE">%1$s</xliff:g> per millorar la teva experiència d\'escriptura.<br/> <br/> La baixada pot trigar un parell de minuts en xarxes 3G. Si no tens un <b>pla de dades il·limitat</b>.<br/&gt, és possible que s\'apliquin càrrecs. Si no estàs segur de les característiques del teu pla de dades, et recomanem que cerquis una connexió Wi-Fi per iniciar la baixada automàticament.<br/> <br/> Consell: Pots baixar i suprimir diccionaris a la secció <b>Idioma i introducció de text</b> del menú <b>Configuració</b> del dispositiu mòbil."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hi ha un diccionari disponible per a l\'idioma seleccionat al teu dispositiu mòbil.<br/> Et recomanem que <b>baixis</b> el diccionari per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> per millorar la teva experiència d\'escriptura.<br/> <br/> La baixada pot trigar un parell de minuts en xarxes 3G. Si no tens un <b>pla de dades il·limitat</b>,<br/> és possible que s\'apliquin càrrecs. Si no estàs segur de les característiques del teu pla de dades, et recomanem que cerquis una connexió Wi-Fi per iniciar la baixada automàticament.<br/> <br/>Consell: Pots baixar i suprimir diccionaris a la secció <b>Idioma i introducció de text</b> del menú <b>Configuració</b> del dispositiu mòbil."</string> <string name="download_over_metered" msgid="1643065851159409546">"Baixa ara (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Baixa mitjançant Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Hi ha un diccionari disponible per a l\'idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hi ha disponible un diccionari per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Prem per revisar-lo i per baixar-lo"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Baixada: els suggeriments per a <xliff:g id="LANGUAGE">%1$s</xliff:g> estaran disponibles ben aviat."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Baixada: els suggeriments per a <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estaran disponibles ben aviat."</string> <string name="version_text" msgid="2715354215568469385">"Versió <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Afegeix"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Afegeix al diccionari"</string> diff --git a/java/res/values-cs/strings-action-keys.xml b/java/res/values-cs/strings-action-keys.xml index e9545feca..c39803234 100644 --- a/java/res/values-cs/strings-action-keys.xml +++ b/java/res/values-cs/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Před."</string> <string name="label_done_key" msgid="7564866296502630852">"Hot."</string> <string name="label_send_key" msgid="482252074224462163">"Odes."</string> + <string name="label_search_key" msgid="7965186050435796642">"Hledat"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string> <string name="label_wait_key" msgid="5891247853595466039">"Čekat"</string> </resources> diff --git a/java/res/values-cs/strings-config-important-notice.xml b/java/res/values-cs/strings-config-important-notice.xml new file mode 100644 index 000000000..8de51cc58 --- /dev/null +++ b/java/res/values-cs/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Zlepšovat návrhy na základě vaší komunikace a zadaných dat"</string> +</resources> diff --git a/java/res/values-cs/strings-letter-descriptions.xml b/java/res/values-cs/strings-letter-descriptions.xml new file mode 100644 index 000000000..7b3e1c5f5 --- /dev/null +++ b/java/res/values-cs/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Ženský indikátor rodu"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Mužský indikátor rodu"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostré S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A s vokáněm"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A s tildou"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A s dvěma tečkami"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A s kroužkem nad"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Písmeno Ae"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C s cedillou"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E s vokáněm"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E s dvěma tečkami"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I s vokáněm"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I s dvěma tečkami"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N s tildou"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O s vokáněm"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O s tildou"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O s dvěma tečkami"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O přeškrtnuté"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U s vokáněm"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U s dvěma tečkami"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y s dvěma tečkami"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A s pomlčkou nad"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A s kulatým háčkem"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A s ocáskem vpravo"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C s vokáněm"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C s tečkou nad"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C s háčkem"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D s háčkem"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D přeškrtnuté"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E s pomlčkou nad"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E s kulatým háčkem"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E s tečkou nad"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E s ocáskem vpravo"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E s háčkem"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G s vokáněm"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G s kulatým háčkem"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G s tečkou nad"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G s cedillou"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H s vokáněm"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H přeškrtnuté"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I s tildou"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I s pomlčkou nad"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I s kulatým háčkem"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I s ocáskem vpravo"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez tečky"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatura IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J s vokáněm"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K s cedillou"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L s cedillou"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L s háčkem"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L s tečkou uprostřed"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L přeškrtnuté"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N s cedillou"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N s háčkem"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N s apostrofem před"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O s pomlčkou nad"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O s kulatým háčkem"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O s dvojitou čárkou nad vpravo"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatura OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R s cedillou"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R s háčkem"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S s vokáněm"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S s cedillou"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S s háčkem"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T s cedillou"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T s háčkem"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T přeškrtnuté"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U s tildou"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U s pomlčkou nad"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U s kulatým háčkem"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U s kroužkem nad"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U s dvojitou čárkou nad vpravo"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U s ocáskem vpravo"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W s vokáněm"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y s vokáněm"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z s čárkou nad vpravo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z s tečkou nad"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z s háčkem"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dlouhé s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O s růžkem"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U s růžkem"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S s čárkou pod"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T s čárkou pod"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Šva"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A s tečkou pod"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A s háčkem"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A s vokáněm a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A s vokáněm a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A s vokáněm a háčkem nad"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A s vokáněm a tildou"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A s vokáněm a tečkou pod"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A s kulatým háčkem a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A s kulatým háčkem a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A s kulatým háčkem a háčkem nad"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A s kulatým háčkem a tildou"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A s kulatým háčkem a tečkou pod"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E s tečkou pod"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E s háčkem nad"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E s tildou"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E s vokáněm a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E s vokáněm a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E s vokáněm a háčkem nad"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E s vokáněm a tildou"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E s vokáněm a tečkou pod"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I s háčkem nad"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I s tečkou pod"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O s tečkou pod"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O s háčkem nad"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O s vokáněm a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O s vokáněm a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O s vokáněm a háčkem nad"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O s vokáněm a tildou"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O s vokáněm a tečkou pod"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O s růžkem a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O s růžkem a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O s růžkem a háčkem nad"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O s růžkem a tildou"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O s růžkem a tečkou pod"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U s tečkou pod"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U s háčkem nad"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U s růžkem a čárkou nad vpravo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U s růžkem a čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U s růžkem a háčkem nad"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U s růžkem a tildou"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U s růžkem a tečkou pod"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y s čárkou nad vlevo"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y s tečkou pod"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y s háčkem nad"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y s tildou"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrácený vykřičník"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dvojité lomené uvozovky vlevo"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Tečka uprostřed"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Číslice jedna jako horní index"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dvojité lomené uvozovky vpravo"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrácený otazník"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Koncová uvozovka jednoduchá"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Horní 9 uvozovka jednoduchá"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Počáteční uvozovka jednoduchá"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Koncová uvozovka dvojitá"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Horní 9 uvozovka dvojitá"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Křížek"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvojitý křížek"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promile"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Horní čárka"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvojitá horní čárka"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ostrá závorka levá"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Ostrá závorka pravá"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Číslice čtyři jako horní index"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Malé písmeno latinky n jako horní index"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso – znak"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Znak c/o"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Šipka vpravo"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Šipka dolů"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prázdná množina"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Zvýšení"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menší nebo rovno"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Větší nebo rovno"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Černá hvězdička"</string> +</resources> diff --git a/java/res/values-cs/strings-talkback-descriptions.xml b/java/res/values-cs/strings-talkback-descriptions.xml new file mode 100644 index 000000000..6c9c8001a --- /dev/null +++ b/java/res/values-cs/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Chcete-li slyšet, které klávesy jste při zadávání hesla stiskli, připojte sluchátka."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Aktuální text je %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Není zadán žádný text"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Klávesou <xliff:g id="KEY_NAME">%1$s</xliff:g> opravíte <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Klávesou <xliff:g id="KEY_NAME">%1$s</xliff:g> provedete automatickou opravu"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Neznámý znak"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Další symboly"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboly"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Smazat"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboly"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Písmena"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Čísla"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Nastavení"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Karta"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Mezerník"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Hlasový vstup"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emodži"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Vyhledávání"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Tečka"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Přepnout jazyk"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Další"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Předchozí"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Klávesa Shift je aktivní"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Klávesa Caps Lock je aktivní"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Režim symbolů"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Režim dalších symbolů"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Režim písmen"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Režim telefonu"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Režim telefonních symbolů"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klávesnice je skrytá"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Je zobrazena klávesnice <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum a čas"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"zprávy"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"čísla"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"čas"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"adresy URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Poslední"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Lidé"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Předměty"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Příroda"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Místa"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboly"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikony"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Velký znak <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Velké I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Velké I s tečkou nad"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Neznámý znak"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Neznámý smajlík emodži"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternativní znaky jsou k dispozici"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternativní znaky jsou ignorovány"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternativní návrhy jsou k dispozici"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternativní návrhy jsou ignorovány"</string> +</resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index c73e8ab1c..d5c479c81 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávání textu a dat"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Příkazy vývoj. protokolu"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Vyhledat kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kontrola pravopisu používá záznamy z vašeho seznamu kontaktů."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Při stisku klávesy vibrovat"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvuk při stisku klávesy"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Detail znaku při stisku klávesy"</string> - <string name="general_category" msgid="1859088467017573195">"Obecné"</string> - <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Psaní gesty"</string> - <string name="misc_category" msgid="6894192814868233453">"Další možnosti"</string> - <string name="advanced_settings" msgid="362895144495591463">"Pokročilá nastavení"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Možnosti pro odborníky"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Přepínat metody zadávání"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Klávesa pro přepínání jazyka ovládá i další metody zadávání"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Klávesa přepínání jazyka"</string> @@ -46,11 +51,13 @@ <string name="settings_system_default" msgid="6268225104743331821">"Výchozí nastavení"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Navrhovat jména kontaktů"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Použít jména ze seznamu kontaktů k návrhům a opravám"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalizované návrhy"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Pomoci vylepšovat aplikaci <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Tečka dvojitým mezerníkem"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojím klepnutím na mezerník vložíte tečku následovanou mezerou."</string> <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string> <string name="auto_cap_summary" msgid="7934452761022946874">"Kapitalizace prvního slova každé věty"</string> - <string name="edit_personal_dictionary" msgid="3996910038952940420">"Osobní slovník"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Vlastní slovník"</string> <string name="configure_dictionaries_title" msgid="4238652338556902049">"Doplňkové slovníky"</string> <string name="main_dictionary" msgid="4798763781818361168">"Hlavní slovník"</string> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Zobrazovat stopu gesta"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamický plovoucí náhled"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Zobrazení navrhovaného slova při psaní gesty"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Chcete-li slyšet, které klávesy jste při zadávání hesla stiskli, připojte sluchátka."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktuální text je %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Není zadán žádný text"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Klávesou <xliff:g id="KEY">%1$s</xliff:g> opravíte <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Klávesa <xliff:g id="KEY">%1$s</xliff:g> provádí automatickou opravu"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kód klávesy %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Klávesa Shift je zapnutá (vypnete ji klepnutím)."</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Klávesa Caps Lock je zapnutá (vypnete ji klepnutím)."</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboly"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Písmena"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Čísla"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Nastavení"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulátor"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Mezerník"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Hlasový vstup"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smajlík"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"vyhledávací tlačítko"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Tečka"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Přepnout jazyk"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Další"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Předchozí"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Klávesa Shift je aktivní"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Klávesa Caps Lock je aktivní"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Klávesa Shift je neaktivní"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Režim symbolů"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Režim písmen"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Režim telefonu"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Režim telefonních symbolů"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klávesnice je skrytá"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Zobrazení klávesnice: <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum a čas"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"zprávy"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"čísla"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"čas"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"adresy URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frázové gesto"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Mezery mezi gesty zadáte přejetím po klávese mezerníku."</string> <string name="voice_input" msgid="3583258583521397548">"Klávesa hlasového vstupu"</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 symboly"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Vypnuto"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na hlavní klávesnici"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon na klávesnici se symboly"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nejsou povoleny žádné metody hlasového vstupu. Zkontrolujte nastavení Jazyk a vstup."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurace metod zadávání"</string> <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string> <string name="send_feedback" msgid="1780431884109392046">"Odeslat zpětnou vazbu"</string> <string name="select_language" msgid="3693815588777926848">"Vstupní jazyky"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opětovným dotykem provedete uložení"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovník k dispozici"</string> - <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="7525225584555429211">"Pomozte nám vylepšit tento editor pro zadávání dat automatickým zasíláním statistik využití a zpráv o selhání do Googlu."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Motiv klávesnice"</string> <string name="subtype_en_GB" msgid="88170601942311355">"angličtina (Velká Británie)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"angličtina (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"španělština (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"angličtina (VB) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"angličtina (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"španělština (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradiční)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angličtina (VB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angličtina (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španělština (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradiční)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cyrilice)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinka)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Žádný jazyk (latinka)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Latinka (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Latinka (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Latinka (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Latinka (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emodži"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Barevné schéma"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Bílá"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Modrá"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Vlastní styl zadávání"</string> <string name="add_style" msgid="6163126614514489951">"Přidat styl"</string> <string name="add" msgid="8299699805688017798">"Přidat"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Povolit"</string> <string name="not_now" msgid="6172462888202790482">"Teď ne"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Tento styl zadávání již existuje: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Režim studie použitelnosti"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Prodleva dlouhého stisknutí"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Délka vibrace u stisku klávesy"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Hlasitost stisknutí klávesy"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Číst soubor externího slovníku"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ve složce Stažené nejsou žádné soubory slovníků."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte soubor slovníku k instalaci"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Chcete nainstalovat tento soubor pro jazyk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Chcete nainstalovat tento soubor pro jazyk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Došlo k chybě"</string> <string name="button_default" msgid="3988017840431881491">"Výchozí"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Vítá vás <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualizovat"</string> <string name="last_update" msgid="730467549913588780">"Poslední aktualizace"</string> <string name="message_updating" msgid="4457761393932375219">"Kontrola aktualizací"</string> - <string name="message_loading" msgid="8689096636874758814">"Načítání..."</string> + <string name="message_loading" msgid="5638680861387748936">"Načítání…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Hlavní slovník"</string> <string name="cancel" msgid="6830980399865683324">"Zrušit"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Nastavení"</string> <string name="install_dict" msgid="180852772562189365">"Instalovat"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Zrušit"</string> <string name="delete_dict" msgid="756853268088330054">"Smazat"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Pro vybraný jazyk mobilního zařízení je k dispozici slovník.<br/> Doporučujeme slovník pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> <b>stáhnout</b>. Usnadníte si tím zadávání textu.<br/> <br/> V síti 3G bude stahování chvíli trvat. Pokud nemáte <b>neomezený datový tarif</b>, mohou vám být účtovány poplatky.<br/> Jestliže si nejste jisti, jaký datový tarif máte, doporučujeme vám najít připojení Wi-Fi. Stahování se pak zahájí automaticky.<br/> <br/> Tip: Slovníky můžete stahovat a odstraňovat v nabídce mobilního zařízení <b>Jazyk a vstup</b> v <b>Nastavení</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Pro jazyk vybraný na vašem mobilním zařízení je k dispozici slovník.<br/> Doporučujeme slovník pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> <b>stáhnout</b>. Usnadníte si tím zadávání textu. <br/> <br/> V síti 3G bude stahování trvat minutu až dvě. Pokud nemáte <b>neomezený datový tarif</b>, mohou vám být účtovány poplatky.<br/> Jestliže si nejste jisti, jaký datový tarif máte, doporučujeme vám najít připojení Wi-Fi. Stahování se pak zahájí automaticky.<br/> <br/> Tip: Slovníky můžete stahovat a odstraňovat v nabídce mobilního zařízení <b>Jazyk a zadávání</b> v <b>Nastavení</b>."</string> <string name="download_over_metered" msgid="1643065851159409546">"Stáhnout ihned (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Stáhnout pouze přes Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Je k dispozici slovník pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Je k dispozici slovník pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Stisknutím zkontrolujete a stáhnete"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Stahování: návrhy pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> budou brzy k dispozici."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Stahování: návrhy pro jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> budou brzy k dispozici."</string> <string name="version_text" msgid="2715354215568469385">"Verze <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Přidat"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Přidat do slovníku"</string> diff --git a/java/res/values-da/strings-action-keys.xml b/java/res/values-da/strings-action-keys.xml index 757dc00d4..cef26fbd2 100644 --- a/java/res/values-da/strings-action-keys.xml +++ b/java/res/values-da/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Forr."</string> <string name="label_done_key" msgid="7564866296502630852">"Udfør"</string> <string name="label_send_key" msgid="482252074224462163">"Send"</string> + <string name="label_search_key" msgid="7965186050435796642">"Søg"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Vent"</string> </resources> diff --git a/java/res/drawable/transparent.xml b/java/res/values-da/strings-config-important-notice.xml index 855cf2ad5..1c0c63e2c 100644 --- a/java/res/drawable/transparent.xml +++ b/java/res/values-da/strings-config-important-notice.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="UTF-8"?> +<!-- /* ** -** Copyright 2011, The Android Open Source Project +** Copyright 2014, 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. @@ -16,15 +16,9 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ ---> + --> -<shape - xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle" -> - <solid - android:color="@android:color/transparent" /> - <size - android:width="50dp" - android:height="40dp" /> -</shape> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Giv bedre forslag ud fra tidligere kommunikation og data"</string> +</resources> diff --git a/java/res/values-da/strings-letter-descriptions.xml b/java/res/values-da/strings-letter-descriptions.xml new file mode 100644 index 000000000..f12cdca53 --- /dev/null +++ b/java/res/values-da/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminin ordinal"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikrotegn"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Maskulin ordinal"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Dobbelt s"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Lille a med accent grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Lille a med accent aigu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Lille a med cirkumfleks"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Lille a med tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"Lille a med omlyd"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Lille å"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Lille æ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Lille c med cedille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Lille e med accent grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Lille e med accent aigu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Lille e med cirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Lille e med omlyd"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Lille i med accent grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Lille i med accent aigu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Lille i med cirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Lille i med omlyd"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Lille islandsk eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Lille n med tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Lille o med accent grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Lille o med accent aigu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Lille o med cirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Lille o med tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Lille o med omlyd"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Lille ø"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Lille u med accent grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Lille u med accent aigu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Lille u med cirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Lille u med omlyd"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Lille y med accent aigu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Lille islandsk thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Lille y med omlyd"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Lille a med makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Lille a med breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"Lille a med højrekrog"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Lille c med accent aigu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Lille c med cirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Lille c med prik over"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Lille c med hacek"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Lille d med hacek"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Lille d med gennemstregning"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Lille e med makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Lille e med breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Lille e med prik over"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Lille e med højrekrog"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Lille e med hacek"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Lille g med cirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Lille g med breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Lille g med prik over"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Lille g med cedille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Lille h med cirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Lille h med gennemstregning"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Lille i med tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Lille i med makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Lille i med breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Lille i med højrekrog"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Lille i uden prik"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Sammenskrevet I og J"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Lille j med cirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Lille k med cedille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Lille l med accent aigu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Lille l med cedille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Lille l med hacek"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"Lille l med prik midt på linjen"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Lille l med gennemstregning"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Lille n med accent aigu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Lille n med cedille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Lille n med hacek"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Lille n med apostrof foran"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Lille o med makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Lille o med breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Lille o med dobbelt accent aigu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Sammenskrevet O og E"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Lille r med accent aigu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Lille r med cedille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Lille r med hacek"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Lille s med accent aigu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Lille s med cirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Lille s med cedille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Lille s med hacek"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Lille t med cedille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Lille t med hacek"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Lille t med gennemstregning"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Lille u med tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Lille u med makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Lille u med breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"Lille u med bolle over"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Lille u med dobbelt accent aigu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Lille u med højrekrog"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Lille w med cirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Lille y med cirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Lille z med accent aigu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Lille z med prik over"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Lille z med hacek"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Langt s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Lille o med krog"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"Lille u med krog"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"Lille s med venstrekrog"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Lille t med venstrekrog"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Lille a med prik over"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"Lille a med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"Lille a med cirkumfleks og accent aigu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"Lille a med cirkumfleks og accent grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"Lille a med cirkumfleks og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"Lille a med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"Lille a med cirkumfleks og prik under"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Lille a med breve og accent aigu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"Lille a med breve og accent grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"Lille a med breve og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"Lille a med breve og tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"Lille a med breve og prik under"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Lille e med prik under"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Lille e med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Lille e med tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Lille e med cirkumfleks og accent aigu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Lille e med cirkumfleks og accent grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Lille e med cirkumfleks og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Lille e med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Lille e med cirkumfleks og prik under"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"Lille i med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"Lille i med prik under"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Lille o med prik under"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"Lille o med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Lille o med cirkumfleks og accent aigu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"Lille o med cirkumfleks og accent grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"Lille o med cirkumfleks og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"Lille o med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Lille o med cirkumfleks og prik under"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Lille o med krog og accent aigu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"Lille o med krog og accent grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"Lille o med krog og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"Lille o med krog og tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"Lille o med krog og prik under"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Lille u med prik under"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Lille u med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Lille u med krog og accent aigu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Lille u med krog og accent grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Lille u med krog og pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Lille u med krog og tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Lille u med krog og prik under"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Lille y med accent grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Lille y med prik under"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Lille y med pseudospørgsmålstegn over"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Lille y med tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Omvendt udråbstegn"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dobbelt venstrevendt vinkelcitationstegn"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Prik midt på linjen"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Hævet ettal"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dobbelt højrevendt vinkelcitationstegn"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Omvendt spørgsmålstegn"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Venstre enkelt citationstegn"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Højre enkelt citationstegn"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkelt citationstegn med 9-komma nederst"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Venstre dobbelt citationstegn"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Højre dobbelt citationstegn"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kors"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dobbelt kors"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promilletegn"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primtegn"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dobbelt primtegn"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkelt venstrevendt vinkelcitationstegn"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkelt højrevendt vinkelcitationstegn"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Hævet firtal"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Hævet lille n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Pesotegn"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"C/o"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Højrepil"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pil ned"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tom mængde"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Inkrement"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mindre end eller lig med"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Større end eller lig med"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Sort stjerne"</string> +</resources> diff --git a/java/res/values-da/strings-talkback-descriptions.xml b/java/res/values-da/strings-talkback-descriptions.xml new file mode 100644 index 000000000..5f5400478 --- /dev/null +++ b/java/res/values-da/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Tilslut et headset for at få læst taster højt, når du indtaster en adgangskode."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Nuværende tekst er %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Der er ingen indtastet tekst"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> udfører automatisk stavekontrol"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Ukendt tegn"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Flere symboler"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift-tast"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboler"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift-tast"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Slet"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboler"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Bogstaver"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Tal"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Indstillinger"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Fane"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Mellemrum"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Stemmeinput"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Søgning"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Prik"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Skift sprog"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Næste"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Forrige"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift er aktiveret"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock er aktiveret"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symboltilstand"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Tilstaden Flere symboler"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Bogstavtilstand"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefontilstand"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefonsymboltilstand"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastaturet er skjult"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Viser tastatur til <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"dato"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dato og klokkeslæt"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"beskeder"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"tal"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefonnummer"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"klokkeslæt"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"webadresse"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Seneste"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personer"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objekter"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Steder"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboler"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Humørikoner"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Stort <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Stort I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Stort I med prik over"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ukendt symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Ukendt emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative tegn er tilgængelige"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative tegn er deaktiveret"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative forslag er tilgængelige"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative forslag er deaktiveret"</string> +</resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 86bdad469..b33cacc64 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -21,21 +21,26 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Indstillinger for input"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Forskningslogkommandoer"</string> - <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Slå kontaktnavne op"</string> - <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruger poster fra listen over kontaktpersoner"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Anvend kontaktnavne"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruger ord fra dine kontaktpersondata"</string> <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">"Pop op ved tastetryk"</string> - <string name="general_category" msgid="1859088467017573195">"Generelt"</string> - <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Glidende indtastning"</string> - <string name="misc_category" msgid="6894192814868233453">"Andre valgmuligheder"</string> - <string name="advanced_settings" msgid="362895144495591463">"Avancerede indstillinger"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Indstillinger for øvede"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Skift inputmetode"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tasten til sprogskift gælder også for andre inputmetoder"</string> - <string name="show_language_switch_key" msgid="5915478828318774384">"Tast til sprogskift"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Knap til sprogskift"</string> <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Vis, når der er aktiveret flere inputsprog"</string> <string name="sliding_key_input_preview" msgid="6604262359510068370">"Vis indikator ved glidning"</string> <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Vis et visuelt tip, når du glider fra Shift eller symboltaster"</string> @@ -46,17 +51,19 @@ <string name="settings_system_default" msgid="6268225104743331821">"Systemstandard"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Foreslå navne på kontakter"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Brug navne fra Kontaktpersoner til forslag og rettelser"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Tilpassede forslag"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Gør <xliff:g id="APPLICATION_NAME">%s</xliff:g> bedre"</string> <string name="use_double_space_period" msgid="8781529969425082860">"To mellemrum for punktum"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"To tryk på mellemrumstasten indsætter et punktum og et mellemrum"</string> - <string name="auto_cap" msgid="1719746674854628252">"Skriv aut. med stort"</string> + <string name="auto_cap" msgid="1719746674854628252">"Skriv automatisk med stort"</string> <string name="auto_cap_summary" msgid="7934452761022946874">"Skriv det første ord i hver sætning med stort"</string> <string name="edit_personal_dictionary" msgid="3996910038952940420">"Personlig ordbog"</string> - <string name="configure_dictionaries_title" msgid="4238652338556902049">"Tillægsordbøger"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Ekstra ordbøger"</string> <string name="main_dictionary" msgid="4798763781818361168">"Hovedordbog"</string> <string name="prefs_show_suggestions" msgid="8026799663445531637">"Vis rettelsesforslag"</string> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Vis ordforslag under indtastning"</string> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Vis altid"</string> - <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Vis i portræt"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Vis i oprejst format"</string> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Skjul altid"</string> <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloker stødende ord"</string> <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Foreslå ikke potentielt stødende ord"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Vis glidende trykspor"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamiske ordeksempler"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Se ordforslag ved glidende indtastning"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Gemt"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Tilslut et headset for at høre indtastningen blive læst højt ved angivelse af adgangskode."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Nuværende tekst er %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Der er ingen indtastet tekst"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> udfører automatisk rettelse"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastekode %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift-tast"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Skift er slået til (tryk for at deaktivere)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock er slået til (tryk for at deaktivere)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Slet"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboler"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Bogstaver"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Tal"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Indstillinger"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulatortast"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Mellemrum"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Stemmeinput"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Tilbage"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Søg"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punktum"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Skift sprog"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Næste"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Forrige"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Skift er aktiveret"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock er aktiveret"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Skift er deaktiveret"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symboltilstand"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bogstavtilstand"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefontilstand"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymboltilstand"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Viser tastatur til <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"Dato og klokkeslæt"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"beskeder"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"tal"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonnummer"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"klokkeslæt"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"Webadresse"</string> - <string name="voice_input" msgid="3583258583521397548">"Nøgle til stemmeinput"</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="gesture_space_aware" msgid="2078291600664682496">"Bevægelse for udtryk"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Tilføj mellemrum ved at glide til mellemrumstasten"</string> + <string name="voice_input" msgid="3583258583521397548">"Knap til taleinput"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Der er ingen aktiverede stemmeinputmetoder. Kontrollér Indstillinger for sprog og input."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inputmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string> <string name="send_feedback" msgid="1780431884109392046">"Send feedback"</string> <string name="select_language" msgid="3693815588777926848">"Inputsprog"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tryk igen for at gemme"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivér brugerfeedback"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Vær med til at forbedre dette redigeringsværktøj til indtastningsmetode ved automatisk at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tastaturtema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannien)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spansk (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engelsk (Storbritannien) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engelsk (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spansk (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditionelt)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelsk (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelsk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spansk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionelt)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillisk)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Intet sprog (Alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Farver"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Hvid"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blå"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Tilpasset inputtypografi"</string> <string name="add_style" msgid="6163126614514489951">"Tilføj typografi"</string> <string name="add" msgid="8299699805688017798">"Tilføj"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktivér"</string> <string name="not_now" msgid="6172462888202790482">"Ikke nu"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Denne inputstil findes allerede: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tilstand for brugsstudie"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Forsinket langt tastetryk"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrationstid ved tastetryk"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Lydstyrke ved tastetryk"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Læs ekstern ordbogsfil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Der er ingen ordbogsfiler i mappen Downloads"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vælg den ordbog, som du vil installere"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Er du klar til at installere denne fil til <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vil du virkelig installere denne fil for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Der opstod en fejl"</string> <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Velkommen til <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -193,7 +160,7 @@ <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string> <string name="dictionary_service_name" msgid="6237472350693511448">"Ordbogstjeneste"</string> <string name="download_description" msgid="6014835283119198591">"Opdateringsoplysninger for ordbøger"</string> - <string name="dictionary_settings_title" msgid="8091417676045693313">"Tillægsordbøger"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Ekstra ordbøger"</string> <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Ordbog er tilgængelig"</string> <string name="dictionary_settings_summary" msgid="5305694987799824349">"Indstillinger for ordbøger"</string> <string name="user_dictionaries" msgid="3582332055892252845">"Brugerordbøger"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Opdater"</string> <string name="last_update" msgid="730467549913588780">"Sidst opdateret"</string> <string name="message_updating" msgid="4457761393932375219">"Søger efter opdateringer"</string> - <string name="message_loading" msgid="8689096636874758814">"Indlæser..."</string> + <string name="message_loading" msgid="5638680861387748936">"Indlæser…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Hovedordbog"</string> <string name="cancel" msgid="6830980399865683324">"Annuller"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Indstillinger"</string> <string name="install_dict" msgid="180852772562189365">"Installer"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Annuller"</string> <string name="delete_dict" msgid="756853268088330054">"Slet"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det valgte sprog på din mobilenhed har en tilgængelig ordbog.<br/> Vi anbefaler, at du <b>downloader</b> <xliff:g id="LANGUAGE">%1$s</xliff:g>-ordbogen for at forbedre din skriveoplevelse.<br/> <br/> Downloaden kan tage 1-2 minutter via 3G. Der bliver muligvis opkrævet et gebyr, hvis du ikke har et <b>ubegrænset dataabonnement</b>.<br/>. Hvis du ikke er sikker på, hvilket dataabonnement du har, anbefaler vi, at du finder en Wi-Fi-forbindelse for at starte automatisk download.<br/> <br/>Tip! Du kan downloade og fjerne ordbøger ved at gå til <b>Sprog og input </b> i menuen <b>Indstillinger</b> på din mobilenhed."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det valgte sprog på din mobilenhed har en tilgængelig ordbog.<br/> Vi anbefaler, at du <b>downloader</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-ordbogen for at forbedre din skriveoplevelse.<br/> <br/> Downloaden kan tage 1-2 minutter via 3G. Der bliver muligvis opkrævet et gebyr, hvis du ikke har et <b>ubegrænset dataabonnement</b>.<br/>. Hvis du ikke er sikker på, hvilket dataabonnement du har, anbefaler vi, at du finder en Wi-Fi-forbindelse for at starte automatisk download.<br/> <br/>Tip! Du kan downloade og fjerne ordbøger ved at gå til <b>Sprog og input </b> i menuen <b>Indstillinger</b> på din mobilenhed."</string> <string name="download_over_metered" msgid="1643065851159409546">"Download nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Der er en tilgængelig ordbog for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Der er en ordbog tilgængelig for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryk for at gennemgå og downloade"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloader: Der vil snart være forslag klar på <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloader: Der vil snart være forslag klar på <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Tilføj"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Føj til ordbog"</string> diff --git a/java/res/values-de/strings-action-keys.xml b/java/res/values-de/strings-action-keys.xml index 95d3d7119..57e75df60 100644 --- a/java/res/values-de/strings-action-keys.xml +++ b/java/res/values-de/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Zurück"</string> <string name="label_done_key" msgid="7564866296502630852">"Fertig"</string> <string name="label_send_key" msgid="482252074224462163">"Senden"</string> + <string name="label_search_key" msgid="7965186050435796642">"Suchen"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Warten"</string> </resources> diff --git a/java/res/values-de/strings-config-important-notice.xml b/java/res/values-de/strings-config-important-notice.xml new file mode 100644 index 000000000..a514364f9 --- /dev/null +++ b/java/res/values-de/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Vorschläge anhand bisheriger Nachrichten und Eingaben verbessern"</string> +</resources> diff --git a/java/res/values-de/strings-letter-descriptions.xml b/java/res/values-de/strings-letter-descriptions.xml new file mode 100644 index 000000000..78cf74230 --- /dev/null +++ b/java/res/values-de/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Ordnungszeichen weiblich"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikrozeichen"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Ordnungszeichen männlich"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Scharfes S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A mit Gravis"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A mit Akut"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A mit Zirkumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A mit Tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A mit Trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A mit Ring"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"AE-Ligatur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C mit Cédille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E mit Gravis"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E mit Akut"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E mit Zirkumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E mit Trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I mit Gravis"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I mit Akut"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I mit Zirkumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I mit Trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N mit Tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O mit Gravis"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O mit Akut"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O mit Zirkumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O mit Tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O mit Trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O mit Strich"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U mit Gravis"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U mit Akut"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U mit Zirkumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U mit Trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y mit Akut"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y mit Trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A mit Makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A mit Breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A mit Ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C mit Akut"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C mit Zirkumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C mit übergesetztem Punkt"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C mit Hatschek"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D mit Hatschek"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D mit Querstrich"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E mit Makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E mit Breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E mit übergesetztem Punkt"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E mit Ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E mit Hatschek"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G mit Zirkumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G mit Breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G mit übergesetztem Punkt"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G mit Cédille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H mit Zirkumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H mit Querstrich"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I mit Tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I mit Makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I mit Breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I mit Ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Punktloses I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatur IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J mit Zirkumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K mit Cédille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L mit Akut"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L mit Cédille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L mit Hatschek"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L mit Mittelpunkt"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L mit Schrägstrich"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N mit Akut"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N mit Cédille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N mit Hatschek"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N mit vorangehendem Apostroph"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O mit Makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O mit Breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O mit Doppelakut"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatur OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R mit Akut"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R mit Cédille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R mit Hatschek"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S mit Akut"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S mit Zirkumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S mit Cédille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S mit Hatschek"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T mit Cédille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T mit Hatschek"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T mit Querstrich"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U mit Tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U mit Makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U mit Breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U mit übergesetztem Ring"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U mit Doppelakut"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U mit Ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W mit Zirkumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y mit Zirkumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z mit Akut"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z mit übergesetztem Punkt"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z mit Hatschek"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Langes S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O mit Horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U mit Horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S mit Komma"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T mit Komma"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A mit Punkt unten"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A mit Haken oben"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A mit Zirkumflex und Akut"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A mit Zirkumflex und Gravis"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A mit Zirkumflex und Haken oben"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A mit Zirkumflex und Tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A mit Zirkumflex und Punkt unten"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A mit Breve und Akut"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A mit Breve und Gravis"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A mit Breve und Haken oben"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A mit Breve und Tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A mit Breve und Punkt unten"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E mit Punkt unten"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E mit Haken oben"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E mit Tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E mit Zirkumflex und Akut"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E mit Zirkumflex und Gravis"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E mit Zirkumflex und Haken oben"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E mit Zirkumflex und Tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E mit Zirkumflex und Punkt unten"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I mit Haken oben"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I mit Punkt unten"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O mit Punkt unten"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O mit Haken oben"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O mit Zirkumflex und Akut"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O mit Zirkumflex und Gravis"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O mit Zirkumflex und Haken oben"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O mit Zirkumflex und Tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O mit Zirkumflex und Punkt unten"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O mit Horn und Akut"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O mit Horn und Gravis"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O mit Horn und Haken oben"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O mit Horn und Tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O mit Horn und Punkt unten"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U mit Punkt unten"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U mit Haken oben"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U mit Horn und Akut"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U mit Horn und Gravis"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U mit Horn und Haken oben"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U mit Horn und Tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U mit Horn und Punkt unten"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y mit Gravis"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y mit Punkt unten"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y mit Haken oben"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y mit Tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Umgekehrtes Ausrufezeichen"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Nach links zeigendes doppeltes spitzes Anführungszeichen"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Mittelpunkt"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Hochgestellte Eins"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Nach rechts zeigendes doppeltes spitzes Anführungszeichen"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Umgekehrtes Fragezeichen"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Einfaches linkes Anführungszeichen"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Einfaches rechtes Anführungszeichen"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Einfaches Anführungszeichen unten"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Doppeltes linkes Anführungszeichen"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Doppeltes rechtes Anführungszeichen"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kreuz"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Zweibalkenkreuz"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promillezeichen"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Minutenzeichen"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Sekundenzeichen"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Einfaches nach links zeigendes spitzes Anführungszeichen"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Einfaches nach rechts zeigendes spitzes Anführungszeichen"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Hochgestellte Vier"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Hochgestellter Kleinbuchstabe n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso-Zeichen"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Per Adresse"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pfeil nach rechts"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pfeil nach unten"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Leere Menge"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Differenzzeichen"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kleiner/gleich"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Größer/gleich"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Schwarzer fünfzackiger Stern"</string> +</resources> diff --git a/java/res/values-de/strings-talkback-descriptions.xml b/java/res/values-de/strings-talkback-descriptions.xml new file mode 100644 index 000000000..27e9eccce --- /dev/null +++ b/java/res/values-de/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Aktueller Text lautet %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Kein Text eingegeben"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Mit <xliff:g id="KEY_NAME">%1$s</xliff:g> wird \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" in \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\" geändert."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Mit <xliff:g id="KEY_NAME">%1$s</xliff:g> erfolgt eine Autokorrektur."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Unbekanntes Zeichen"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Umschalttaste"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Weitere Symbole"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift-Taste"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbole"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift-Taste"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Löschen"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbole"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Buchstaben"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Zahlen"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Einstellungen"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulatortaste"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Leertaste"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Spracheingabe"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Eingabetaste"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Suchen"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Aufzählungspunkt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Sprache wechseln"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Weiter"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Zurück"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Umschalttaste aktiviert"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Feststelltaste aktiviert"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbolmodus"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modus \"Weitere Symbole\""</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Buchstabenmodus"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonmodus"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefon-Symbolmodus"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastatur ausgeblendet"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Tastatur für <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"Datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"Datum und Uhrzeit"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"E-Mail-Adresse"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"SMS/MMS"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"Zahl"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"Telefonnummer"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"Text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"Zeit"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Neueste"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Kontakte"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objekte"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Orte"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbole"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Großbuchstabe <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Großbuchstabe I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Großbuchstabe I mit übergesetztem Punkt"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unbekanntes Symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unbekanntes Emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Es sind Alternativzeichen verfügbar."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternativzeichen werden ausgeblendet."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Es sind Alternativvorschläge verfügbar."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternativvorschläge werden ausgeblendet."</string> +</resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index b65053465..ece1a203a 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -21,24 +21,29 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Eingabeoptionen"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Forschungsprotokollbefehle"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontaktnamen prüfen"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Rechtschreibprüfung kann Einträge aus meiner Kontaktliste verwenden"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Bei Tastendruck vibrieren"</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="general_category" msgid="1859088467017573195">"Allgemein"</string> - <string name="correction_category" msgid="2236750915056607613">"Textkorrektur"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Bewegungseingabe"</string> - <string name="misc_category" msgid="6894192814868233453">"Sonstige Optionen"</string> - <string name="advanced_settings" msgid="362895144495591463">"Erweiterte Einstellungen"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Optionen für Experten"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Eingabemethoden wechseln"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Sprachwechseltaste umfasst auch andere Eingabemethoden."</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Sprachwechsel"</string> <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Anzeigen, wenn mehrere Eingabesprachen aktiviert sind"</string> <string name="sliding_key_input_preview" msgid="6604262359510068370">"Ziehbewegung anzeigen"</string> - <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Ziehen mit gedrückter Shift- oder Symboltaste visuell darstellen"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Ziehen mit gedrückter Symboltaste oder Shift visuell darstellen"</string> <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Tasten-Pop-up"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Keine Verzögerung"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Standard"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Systemstandardeinstellung"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Kontakte vorschlagen"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Namen aus \"Kontakte\" als Vorschläge und Korrekturmöglichkeiten anzeigen"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalisierte Vorschläge"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> verbessern"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punkt plus Leerzeichen"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Für Punkt plus Leerzeichen zweimal auf die Leertaste tippen"</string> <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschreibung"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Spur der Bewegung anzeigen"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dyn. unverankerter Vorschlag"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Vorgeschlagenes Wort bei Bewegung anzeigen"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Schließen Sie ein Headset an, um das Passwort gesprochen zu hören."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktueller Text lautet %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Kein Text eingegeben"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Mit <xliff:g id="KEY">%1$s</xliff:g> wird <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> zu <xliff:g id="CORRECTED">%3$s</xliff:g> korrigiert."</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Mit <xliff:g id="KEY">%1$s</xliff:g> erfolgt eine Autokorrektur."</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastencode %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Umschalttaste"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Umschalttaste aktiviert (zum Deaktivieren berühren)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Feststelltaste aktiviert (zum Deaktivieren berühren)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Entf"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbole"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Buchstaben"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Zahlen"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Einstellungen"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulator"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Leerzeichen"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Spracheingabe"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Eingabe"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Suchen"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Aufzählungspunkt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Sprache wechseln"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Nächste"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Vorherige"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Umschalttaste aktiviert"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Feststelltaste aktiviert"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Umschalttaste deaktiviert"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbolmodus"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Buchstabenmodus"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonmodus"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefon-Symbolmodus"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatur ausgeblendet"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tastatur für <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"Datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"Datum & Uhrzeit"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"E-Mail-Adresse"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS/MMS"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"Zahl"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"Telefonnummer"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"Text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"Zeit"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Phrasenbewegung"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Leerzeichen durch Bewegung über die Leertaste einfügen"</string> <string name="voice_input" msgid="3583258583521397548">"Taste für Spracheingabe"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Auf Haupttastatur"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Auf Symboltastatur"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Aus"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikro auf Haupttastatur"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikro auf Symboltastatur"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Keine Spracheingabemethoden aktiviert. Rufen Sie die Einstellungen für \"Sprache & Eingabe\" auf."</string> <string name="configure_input_method" msgid="373356270290742459">"Eingabemethoden konfigurieren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string> <string name="send_feedback" msgid="1780431884109392046">"Feedback geben"</string> <string name="select_language" msgid="3693815588777926848">"Eingabesprachen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Zum Speichern erneut berühren"</string> <string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte senden."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tastaturdesign"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Englisch (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Englisch (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spanisch (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Englisch (GB) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Englisch (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spanisch (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditionell)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Englisch (GB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Englisch (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanisch (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionell)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillisch)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (lateinisch)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Keine Sprache (lat. Alphabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Lat. Alphabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Lat. Alphabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Lat. Alphabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Lat. Alphabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Farbschema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Weiß"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blau"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Benutzerdefinierte Eingabestile"</string> <string name="add_style" msgid="6163126614514489951">"Stil hinzufügen"</string> <string name="add" msgid="8299699805688017798">"Hinzufügen"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktivieren"</string> <string name="not_now" msgid="6172462888202790482">"Später"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Der gleiche Eingabestil ist bereits vorhanden: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Studie zur Benutzerfreundlichkeit"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Verzögerung für langes Drücken"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrationsdauer bei Tastendruck"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Tonlautstärke bei Tastendruck"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Externe Wörterbuchdatei lesen"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Keine Wörterbuchdateien im Ordner \"Downloads\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wörterbuchdatei zum Installieren auswählen"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Möchten Sie diese Datei für <xliff:g id="LOCALE_NAME">%s</xliff:g> installieren?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Möchten Sie diese Datei für <xliff:g id="LANGUAGE_NAME">%s</xliff:g> installieren?"</string> <string name="error" msgid="8940763624668513648">"Es ist ein Fehler aufgetreten"</string> <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Willkommen bei <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualisieren"</string> <string name="last_update" msgid="730467549913588780">"Zuletzt aktualisiert"</string> <string name="message_updating" msgid="4457761393932375219">"Suche nach Updates..."</string> - <string name="message_loading" msgid="8689096636874758814">"Wird geladen..."</string> + <string name="message_loading" msgid="5638680861387748936">"Wird geladen…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Allgemeines Wörterbuch"</string> <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Einstellungen"</string> <string name="install_dict" msgid="180852772562189365">"Installieren"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Abbrechen"</string> <string name="delete_dict" msgid="756853268088330054">"Löschen"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Für die auf dem Mobilgerät ausgewählte Sprache ist ein Wörterbuch verfügbar.<br/> <b>Laden Sie das <xliff:g id="LANGUAGE">%1$s</xliff:g>-Wörterbuch herunter</b> und verbessern Sie Ihre Eingabeerfahrung.<br/> <br/>Der Download über 3G kann ein bis zwei Minuten dauern. Falls Sie keine <b>Datenflatrate</b> haben, fallen eventuell Gebühren an.<br/> Sollten Sie sich nicht sicher sein, welchen Datentarif Sie haben, suchen Sie eine WLAN-Verbindung, um den Download automatisch zu starten.<br/> <br/>Tipp: Im Menü <b>Einstellungen</b> Ihres Mobilgeräts können Sie unter <b>Sprache & Eingabe</b> Wörterbücher herunterladen und entfernen."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Für die auf dem Mobilgerät ausgewählte Sprache ist ein Wörterbuch verfügbar.<br/> <b>Laden Sie das <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-Wörterbuch herunter</b> und verbessern Sie Ihre Eingabeerfahrung.<br/> <br/> Der Download über 3G kann ein bis zwei Minuten dauern. Falls Sie keine <b>Datenflatrate</b> haben, fallen eventuell Gebühren an.<br/> Sollten Sie sich nicht sicher sein, welchen Datentarif Sie haben, suchen Sie eine WLAN-Verbindung, um den Download automatisch zu starten.<br/> <br/> Tipp: Im Menü <b>Einstellungen</b> Ihres Mobilgeräts können Sie unter <b>Sprache & Eingabe</b> Wörterbücher herunterladen und entfernen."</string> <string name="download_over_metered" msgid="1643065851159409546">"Jetzt herunterladen (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Über WLAN herunterladen"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Es ist ein Wörterbuch für <xliff:g id="LANGUAGE">%1$s</xliff:g> verfügbar."</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Es ist ein Wörterbuch für <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> verfügbar."</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Zum Lesen und Herunterladen drücken"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download wurde gestartet: Vorschläge für <xliff:g id="LANGUAGE">%1$s</xliff:g> sind in Kürze bereit."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Download wurde gestartet: Vorschläge für <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sind in Kürze bereit."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Hinzufügen"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Zum Wörterbuch hinzufügen"</string> diff --git a/java/res/values-el/strings-action-keys.xml b/java/res/values-el/strings-action-keys.xml index a4093e3dc..2fd0fdb95 100644 --- a/java/res/values-el/strings-action-keys.xml +++ b/java/res/values-el/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Προηγούμενο"</string> <string name="label_done_key" msgid="7564866296502630852">"Τέλος"</string> <string name="label_send_key" msgid="482252074224462163">"Αποστολή"</string> + <string name="label_search_key" msgid="7965186050435796642">"Αναζήτηση"</string> <string name="label_pause_key" msgid="2225922926459730642">"Παύση"</string> <string name="label_wait_key" msgid="5891247853595466039">"Αναμονή"</string> </resources> diff --git a/java/res/values-el/strings-config-important-notice.xml b/java/res/values-el/strings-config-important-notice.xml new file mode 100644 index 000000000..926ec9b6b --- /dev/null +++ b/java/res/values-el/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Χρήση επικοινωνιών/δεδομένων πληκτρολόγησης για βελτίωση προτάσεων"</string> +</resources> diff --git a/java/res/values-el/strings-letter-descriptions.xml b/java/res/values-el/strings-letter-descriptions.xml new file mode 100644 index 000000000..10988d4a0 --- /dev/null +++ b/java/res/values-el/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Θετικός τακτικός δείκτης"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Σύμβολο Micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Αρνητικός τακτικός δείκτης"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Οξύ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, με βαρεία"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, με οξεία"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, με περισπωμένη"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, με διαλυτικά"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, με κύκλο από πάνω"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, δίψηφο"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, με υποδιαστολή"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, με βαρεία"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, με οξεία"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, με διαλυτικά"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, με βαρεία"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, με οξεία"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, με διαλυτικά"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, με περισπωμένη"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, με βαρεία"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, με οξεία"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, με περισπωμένη"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, με διαλυτικά"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, καλλιγραφικό"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, με βαρεία"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, με οξεία"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, με διαλυτικά"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, με οξεία"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, με διαλυτικά"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, με σημείο μακρού"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, με ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, με οξεία"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, με κουκκίδα από πάνω"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, με caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, με caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, καλλιγραφικό"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, με σημείο μακρού"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, με κουκκίδα από πάνω"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, με ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, με caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, με κουκκίδα από πάνω"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, καλλιγραφικό"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, με περισπωμένη"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, με σημείο μακρού"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, με ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I χωρίς κουκκίδα"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, δίψηφο"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, με οξεία"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, με υποδιαστολή"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, με caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, με άνω τελεία"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, καλλιγραφικό"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, με οξεία"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, με caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, με απόστροφο μπροστά"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, με σημείο μακρού"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, με διπλή οξεία"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, δίψηφο"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, με οξεία"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, με caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, με οξεία"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, με caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, με υποδιαστολή"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, με caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, καλλιγραφικό"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, με περισπωμένη"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, με σημείο μακρού"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, με σημείο βραχέος"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, με κύκλο από πάνω"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, με διπλή οξεία"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, με ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, με σιρκουμφλέξ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, με οξεία"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, με κουκκίδα από πάνω"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, με caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Μακρό S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, με καπελάκι"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, με καπελάκι"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, με κόμμα από κάτω"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, με κόμμα από κάτω"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, με σιρκουμφλέξ και οξεία"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, με σιρκουμφλέξ και βαρεία"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, με σιρκουμφλέξ και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, με σιρκουμφλέξ και περισπωμένη"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, με σιρκουμφλέξ και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, με σημείο βραχέος και οξεία"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, με σημείο βραχέος και βαρεία"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, με σημείο βραχέος και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, με σημείο βραχέος και περισπωμένη"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, με σημείο βραχέος και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, με περισπωμένη"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, με σιρκουμφλέξ και οξεία"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, με σιρκουμφλέξ και βαρεία"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, με σιρκουμφλέξ και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, με σιρκουμφλέξ και περισπωμένη"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, με σιρκουμφλέξ και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, με σιρκουμφλέξ και οξεία"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, με σιρκουμφλέξ και βαρεία"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, με σιρκουμφλέξ και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, με σιρκουμφλέξ και περισπωμένη"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, με σιρκουμφλέξ και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, με καπελάκι και οξεία"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, με καπελάκι και βαρεία"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, με καπελάκι και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, με καπελάκι και περισπωμένη"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, με καπελάκι και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, με καπελάκι και οξεία"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, με καπελάκι και βαρεία"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, με καπελάκι και κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, με καπελάκι και περισπωμένη"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, με καπελάκι και κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, με βαρεία"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, με κουκκίδα από κάτω"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, με κλείσιμο από πάνω"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, με οξεία"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Αντίστροφο θαυμαστικό"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Αριστερά διπλά εισαγωγικά"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Άνω τελεία"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Εκθέτης \"ένα\""</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Δεξιά διπλά εισαγωγικά"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Αντίστροφο ερωτηματικό"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Αριστερά μονά εισαγωγικά"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Δεξιά μονά εισαγωγικά"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Μονά εισαγωγικά σχήματος 9"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Αριστερά διπλά εισαγωγικά"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Δεξιά διπλά εισαγωγικά"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Σταυρός στίξης"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Διπλός σταυρός στίξης"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Σύμβολο \"επί χίλια\""</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Τόνος"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Διπλός τόνος"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Μονά εισαγωγικά προς τα αριστερά"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Μονά εισαγωγικά προς τα δεξιά"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Εκθέτης τέσσερα"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Εκθέτης \"λατινικό πεζό γράμμα N\""</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Σύμβολο νομίσματος \"πέσο\""</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Υπεύθυνος"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Βέλος προς τα δεξιά"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Βέλος προς τα κάτω"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Κενό σύνολο"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Τελεστής προσαύξησης"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Μικρότερο ή ίσο"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Μεγαλύτερο ή ίσο"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Μαύρο αστέρι"</string> +</resources> diff --git a/java/res/values-el/strings-talkback-descriptions.xml b/java/res/values-el/strings-talkback-descriptions.xml new file mode 100644 index 000000000..10df02f75 --- /dev/null +++ b/java/res/values-el/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Συνδέστε ένα σετ ακουστικών για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται δυνατά."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Το τρέχον κείμενο είναι %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Δεν υπάρχει κείμενο"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> διορθώνει το <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> σε <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> εκτελεί αυτόματη διόρθωση"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Άγνωστος χαρακτήρας"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Περισσότερα σύμβολα"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Σύμβολα"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Διαγραφή"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Σύμβολα"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Γράμματα"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Αριθμοί"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ρυθμίσεις"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Πλήκτρο διαστήματος"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Φωνητική είσοδος"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoticon"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Επιστροφή"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Αναζήτηση"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Κουκκίδα"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Εναλλαγή γλώσσας"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Επόμενο"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Προηγούμενο"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Το Shift είναι ενεργοποιημένο"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Το Caps lock είναι ενεργοποιημένο"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Λειτουργία συμβόλων"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Λειτουργία περισσότερων συμβόλων"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Λειτουργία γραμμάτων"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Λειτουργία τηλεφώνου"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Λειτουργία συμβόλων τηλεφώνου"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Απόκρυψη πληκτρολογίου"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Εμφάνιση πληκτρολογίου <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ημερομηνία"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ημερομηνία και ώρα"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"διεύθυνση ηλεκτρονικού ταχυδρομείου"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ανταλλαγή μηνυμάτων"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"αριθμός"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"τηλέφωνο"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"κείμενο"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ώρα"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"διεύθυνση URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Πρόσφατα"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Άτομα"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Αντικείμενα"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Φύση"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Μέρη"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Σύμβολα"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticon"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Κεφαλαίο <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Κεφαλαίο I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Κεφαλαίο I, κουκκίδα από πάνω"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Άγνωστο σύμβολο"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Άγνωστο emoticon"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Διατίθενται εναλλακτικοί χαρακτήρες"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Παράβλεψη εναλλακτικών χαρακτήρων"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Διατίθενται εναλλακτικές προτάσεις"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Παράβλεψη εναλλακτικών προτάσεων"</string> +</resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 79e83423c..5cf14b5eb 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Επιλογές εισόδου"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Έρευνα εντολών καταγραφής"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Αναζήτηση ονομάτων επαφών"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Ο ορθογρ. έλεγχος χρησιμοπ. καταχωρίσεις από τη λίστα επαφών σας"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Δόνηση κατά το πάτημα πλήκτρων"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Ήχος κατά το πάτημα πλήκτρων"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Εμφάνιση με το πάτημα πλήκτρου"</string> - <string name="general_category" msgid="1859088467017573195">"Γενικά"</string> - <string name="correction_category" msgid="2236750915056607613">"Διόρθωση κειμένου"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Πληκτρολόγηση με κινήσεις"</string> - <string name="misc_category" msgid="6894192814868233453">"Άλλες επιλογές"</string> - <string name="advanced_settings" msgid="362895144495591463">"Σύνθετες ρυθμίσεις"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Επιλογές για έμπειρους χρήστες"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Άλλη μέθοδος εισόδου"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Το κλειδί αλλαγής γλώσσας καλύπτει και άλλες μεθόδους εισόδου"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Πλήκτρο εναλλαγής γλώσσας"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Προεπιλογή"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Πρόταση ονομάτων επαφών"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Χρησιμοποιήστε ονόματα από τις Επαφές για προτάσεις και διορθ."</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Εξατομικευμένες προτάσεις"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Βελτίωση <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Τελεία με διπλό πάτημα πλήκτρ.διαστ."</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Το διπλό πάτημα του πλήκτρ.διαστ. εισάγει μια τελεία και ένα κενό"</string> <string name="auto_cap" msgid="1719746674854628252">"Αυτόματη χρήση κεφαλαίων"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Εμφάνιση διαδρομής χειρονομίας"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Προεπισκόπ. δυναμικής κίνησης"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Εμφάνιση της προτεινόμενης λέξης κατά την κίνηση"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Αποθηκεύτηκε"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Συνδέστε ένα σετ ακουστικών για να ακούσετε τα πλήκτρα του κωδικού πρόσβασης να εκφωνούνται δυνατά."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Το τρέχον κείμενο είναι %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Δεν υπάρχει κείμενο"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> διορθώνει το <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> σε <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> εκτελεί αυτόματη διόρθωση"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Κωδικός πλήκτρου %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Το Shift είναι ενεργοποιημένο (πατήστε για απενεργοποίηση)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Το Caps lock είναι ενεργοποιημένο (πατήστε για απενεργοποίηση)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Πλήκτρο Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Σύμβολα"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Γράμματα:"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Αριθμοί"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Ρυθμίσεις"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Πλήκτρο Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Πλήκτρο διαστήματος"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Μικρόφωνο"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Πλήκτρο Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Αναζήτηση"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Κουκκίδα"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Αλλαγή γλώσσας"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Επόμενο"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Προηγούμενο"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Το Shift ενεργοποιημένο"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Το Caps lock είναι ενεργοποιημένο"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Το Shift είναι απενεργοποιημένο"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Λειτουργία συμβόλων"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Λειτουργία γραμμάτων"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Λειτουργία τηλεφώνου"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Λειτουργία συμβόλων τηλεφώνου"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Πληκτρολόγιο είναι κρυμμένο"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Εμφάνιση πληκτρολογίου <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ημερομηνία"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ημερομηνία και ώρα"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"διεύθυνση ηλεκτρονικού ταχυδρομείου"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ανταλλαγή μηνυμάτων"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"αριθμός"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"τηλέφωνο"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"κείμενο"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ώρα"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"διεύθυνση URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Εισαγωγή φράσεων με κίνηση"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Εισαγάγετε κενά στις κινήσεις με ολίσθηση στο πλήκτρο διαστήματος"</string> <string name="voice_input" msgid="3583258583521397548">"Κλειδί φωνητικής εξόδου"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Δεν έχουν ενεργοποιηθεί μέθοδοι φωνητικής εισαγωγής. Ελέγξτε τις Ρυθμίσεις Γλώσσας και εισαγωγής."</string> <string name="configure_input_method" msgid="373356270290742459">"Διαμόρφωση μεθόδων εισαγωγής"</string> <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string> <string name="send_feedback" msgid="1780431884109392046">"Αποστολή σχολίων"</string> <string name="select_language" msgid="3693815588777926848">"Γλώσσες εισόδου"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Αγγίξτε ξανά για αποθήκευση"</string> <string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου, στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Θέμα πληκτρολογίου"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Αγγλικά (Η.Β.)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Αγγλικά (Η.Π.Α)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Ισπανικά (ΗΠΑ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Αγγλικά (ΗΒ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Αγγλικά (ΗΠΑ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Ισπανικά (ΗΠΑ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Παραδοσιακά)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Αγγλικά (Ηνωμένο Βασίλειο) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Αγγλικά (ΗΠΑ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Ισπανικά (ΗΠΑ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Παραδοσιακά)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Κυριλλικά)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Λατινικά)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Καμία γλώσσα (Αλφάβητο)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Αλφάβητο (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Αλφάβητο (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Αλφάβητο (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Αλφάβητο (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoticon"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Συνδυασμός χρωμάτων"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Λευκές"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Μπλε"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Προσαρμοσ. στυλ εισαγ."</string> <string name="add_style" msgid="6163126614514489951">"Προσθ. στυλ"</string> <string name="add" msgid="8299699805688017798">"Προσθήκη"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Ενεργοποίηση"</string> <string name="not_now" msgid="6172462888202790482">"Όχι τώρα"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Το ίδιο στυλ εισόδου υπάρχει ήδη: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Λειτουργία μελέτης χρηστικότητας"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Καθυστέρηση παρατεταμένου πατήματος πλήκτρου"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Διάρκεια δόνησης πατήμ. πλήκτ."</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Ένταση ήχου πατήματος πλήκτρου"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ανάγνωση εξωτερικού αρχείου λεξικού"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Δεν υπάρχουν αρχεία λεξικού στο φάκελο \"Λήψεις\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Επιλογή αρχείου λεξικού για εγκατάσταση"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Να εγκατασταθεί όντως αυτό το αρχείο για <xliff:g id="LOCALE_NAME">%s</xliff:g>;"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Εγκατάσταση αυτού του αρχείου για τα <xliff:g id="LANGUAGE_NAME">%s</xliff:g>;"</string> <string name="error" msgid="8940763624668513648">"Παρουσιάστηκε σφάλμα."</string> <string name="button_default" msgid="3988017840431881491">"Προεπιλογή"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Καλώς ορίσατε στο <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Ανανέωση"</string> <string name="last_update" msgid="730467549913588780">"Τελευταία ενημέρωση"</string> <string name="message_updating" msgid="4457761393932375219">"Έλεγχος για ενημερώσεις"</string> - <string name="message_loading" msgid="8689096636874758814">"Φόρτωση…"</string> + <string name="message_loading" msgid="5638680861387748936">"Φόρτωση…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Κύριο λεξικό"</string> <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ρυθμίσεις"</string> <string name="install_dict" msgid="180852772562189365">"Εγκατάσταση"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Ακύρωση"</string> <string name="delete_dict" msgid="756853268088330054">"Διαγραφή"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Η επιλ. γλώσσα στην κιν. συσκευή σας διαθέτει λεξικό.<br/> Προτείνουμε να <b>κάνετε λήψη</b> του λεξικού <xliff:g id="LANGUAGE">%1$s</xliff:g> για να βελτ. την πληκτρολόγηση.<br/> <br/> Για τη λήψη μπορεί να χρειαστούν 1 ή 2 λεπτά μέσω 3G. Ίσως ισχύουν χρεώσεις αν δεν έχετε <b>πρόγρ. απερ. δεδομ.</b>.<br/> Αν δεν γνωρίζετε ποιο πρόγ. δεδ. έχετε, προτείνουμε να βρείτε μια σύνδ. Wi-Fi για να ξεκιν. αυτόμ. η λήψη.<br/> <br/> Συμβουλή: Μπορείτε να λάβετε και να καταργ. λεξικά, από την περιοχή <b>Γλώσσα και εισαγωγή</b>, στο μενού <b>Ρυθμίσεις</b> της κιν. συσκ."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Η επιλεγμένη γλώσσα στην κινητή συσκευή σας διαθέτει λεξικό.<br/> Προτείνουμε να <b>κατεβάσετε</b> το λεξικό <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> για βελτίωση της πληκτρολόγησης.<br/> <br/> Για τη λήψη μπορεί να χρειαστούν 1 ή 2 λεπτά μέσω 3G. Ενδέχεται να ισχύουν χρεώσεις αν δεν έχετε διαθέτετε<b>πρόγραμμα απεριόριστων δεδομένων</b>.<br/> Αν δεν γνωρίζετε ποιο πρόγραμμα δεδομένων διαθέτετε, προτείνουμε να χρησιμοποιήσετε μια σύνδεση Wi-Fi για να ξεκινήσει αυτόματα η λήψη.<br/> <br/> Συμβουλή: Μπορείτε να κατεβάσετε και να καταργήσετε λεξικά, από την περιοχή <b>Γλώσσα και εισαγωγή</b>, στο μενού <b>Ρυθμίσεις</b> της κινητής συσκευής σας."</string> <string name="download_over_metered" msgid="1643065851159409546">"Άμεση λήψη (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Λήψη μέσω Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Υπάρχει διαθέσιμο λεξικό για τα <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Υπάρχει διαθέσιμο λεξικό για τα <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Πατήστε για έλεγχο και λήψη"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Λήψη: Οι προτάσεις για τα <xliff:g id="LANGUAGE">%1$s</xliff:g> θα είναι έτοιμες σύντομα."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Λήψη: οι προτάσεις για τα <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> θα είναι έτοιμες σύντομα."</string> <string name="version_text" msgid="2715354215568469385">"Έκδοση <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Προσθήκη"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Προσθήκη στο λεξικό"</string> diff --git a/java/res/values-en-rGB/strings-action-keys.xml b/java/res/values-en-rGB/strings-action-keys.xml index 366cf3cdf..6514e85f3 100644 --- a/java/res/values-en-rGB/strings-action-keys.xml +++ b/java/res/values-en-rGB/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string> <string name="label_done_key" msgid="7564866296502630852">"Finished"</string> <string name="label_send_key" msgid="482252074224462163">"Send"</string> + <string name="label_search_key" msgid="7965186050435796642">"Search"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string> </resources> diff --git a/java/res/values-en-rGB/strings-config-important-notice.xml b/java/res/values-en-rGB/strings-config-important-notice.xml new file mode 100644 index 000000000..80ddd3e4b --- /dev/null +++ b/java/res/values-en-rGB/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Learn from your communications and typed data to improve suggestions"</string> +</resources> diff --git a/java/res/values-en-rGB/strings-emoji-descriptions.xml b/java/res/values-en-rGB/strings-emoji-descriptions.xml new file mode 100644 index 000000000..2ac73fcbb --- /dev/null +++ b/java/res/values-en-rGB/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Copyright sign"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Registered sign"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Double exclamation mark"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Exclamation question mark"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Trade mark sign"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Information source"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Left right arrow"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Up down arrow"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"North west arrow"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"North east arrow"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"South east arrow"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"South west arrow"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Leftwards arrow with hook"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Rightwards arrow with hook"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Watch"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Hourglass"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Black right-pointing double triangle"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Black left-pointing double triangle"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Black up-pointing double triangle"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Black down-pointing double triangle"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Alarm clock"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Hourglass with flowing sand"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Circled latin capital letter m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Black small square"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"White small square"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Black right-pointing triangle"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Black left-pointing triangle"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"White medium square"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Black medium square"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"White medium small square"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Black medium small square"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Black sun with rays"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Cloud"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Black telephone"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Ballot box with tick"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Umbrella with rain drops"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Hot beverage"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"White up pointing index"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"White smiling face"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Aries"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Taurus"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gemini"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Cancer"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leo"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Virgo"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Libra"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Scorpio"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Sagittarius"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricorn"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquarius"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Pisces"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Black spade suit"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Black club suit"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Black heart suit"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Black diamond suit"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Hot springs"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Black universal recycling symbol"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Wheelchair symbol"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Anchor"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Warning sign"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"High voltage sign"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Medium white circle"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Medium black circle"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Football"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Baseball"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Snowman without snow"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Sun behind cloud"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"No entry"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Church"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fountain"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Flag in hole"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Sailing boat"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Tent"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Fuel pump"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Black scissors"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"White heavy tick"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Aeroplane"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Envelope"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Raised fist"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Raised hand"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Victory hand"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Pencil"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Black nib"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Heavy tick"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Heavy multiplication x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Sparkles"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Eight spoked asterisk"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Eight pointed black star"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Snowflake"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Sparkle"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Cross mark"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Negative squared cross mark"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Black question mark ornament"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"White question mark ornament"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"White exclamation mark ornament"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Heavy exclamation mark symbol"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Heavy black heart"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Heavy plus sign"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Heavy minus sign"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Heavy division sign"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Black rightwards arrow"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Curly loop"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Double curly loop"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Arrow pointing rightwards then curving upwards"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Arrow pointing rightwards then curving downwards"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Leftwards black arrow"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Upwards black arrow"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Downwards black arrow"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Black large square"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"White large square"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"White medium star"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Heavy large circle"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Wavy dash"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Part alternation mark"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Circled ideograph congratulation"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Circled ideograph secret"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahjong tile red dragon"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Playing card black joker"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Blood type A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Blood type B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Blood type O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Car park"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Blood type AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"Squared CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Squared cool"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Squared free"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Squared ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Squared new"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Squared N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Squared OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Squared SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Squared up with exclamation mark"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Squared vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Squared katakana here"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Squared katakana service"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Squared ideograph charge-free"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Squared ideograph reserved-seat"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Squared ideograph prohibitation"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Squared ideograph vacancy"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Squared ideograph acceptance"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Squared ideograph full occupancy"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Squared ideograph paid"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Squared ideograph monthly"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Squared ideograph application"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Squared ideograph discount"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Squared ideograph in business"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Circled ideograph advantage"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Circled ideograph accept"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Cyclone"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Foggy"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Closed umbrella"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Night with stars"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Sunrise over mountains"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sunrise"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Cityscape at dusk"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Sunset over buildings"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Rainbow"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Bridge at night"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Water wave"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Volcano"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Milky way"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Earth globe Europe-Africa"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Earth globe Americas"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Earth globe Asia-Australia"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Globe with meridians"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"New moon symbol"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Waxing crescent moon symbol"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"First quarter moon symbol"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Waxing gibbous moon symbol"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Full moon symbol"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Waning gibbous moon symbol"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Last quarter moon symbol"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Waning crescent moon symbol"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Crescent moon"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"New moon with face"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"First quarter moon with face"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Last quarter moon with face"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Full moon with face"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Sun with face"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Glowing star"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Shooting star"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Chestnut"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Seedling"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Evergreen tree"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Deciduous tree"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palm tree"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Cactus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Tulip"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Cherry blossom"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Rose"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Hibiscus"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Sunflower"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Blossom"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Ear of maize"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Ear of rice"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Herb"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Four leaf clover"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Maple leaf"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Fallen leaf"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Leaf fluttering in wind"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Mushroom"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tomato"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Aubergine"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Grapes"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Melon"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Watermelon"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Tangerine"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Lemon"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banana"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Pineapple"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Red apple"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Green apple"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pear"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Peach"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Cherries"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Strawberry"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamburger"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Slice of pizza"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Meat on bone"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Poultry leg"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Rice cracker"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Rice ball"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Cooked rice"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Curry and rice"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Steaming bowl"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spaghetti"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Bread"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"French fries"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Roasted sweet potato"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Fried shrimp"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Fish cake with swirl design"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Soft ice cream"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Shaved ice"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Ice cream"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Doughnut"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Cookie"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Chocolate bar"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Candy"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Lollipop"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Custard"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Honey pot"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Shortcake"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Bento box"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Pot of food"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Cooking"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Fork and knife"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Teacup without handle"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sake bottle and cup"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Wine glass"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Cocktail glass"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Tropical drink"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Beer mug"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Clinking beer mugs"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Baby bottle"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Ribbon"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Wrapped present"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Birthday cake"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack-o-lantern"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Christmas tree"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Father christmas"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Fireworks"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Firework sparkler"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Balloon"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Party popper"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Confetti ball"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Tanabata tree"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Crossed flags"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Pine decoration"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Japanese dolls"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Carp streamer"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Wind chime"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Moon viewing ceremony"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"School satchel"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Graduation cap"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Carousel horse"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Ferris wheel"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Roller coaster"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Fishing pole and fish"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Microphone"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Movie camera"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Cinema"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Headphone"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Artist palette"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Top hat"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Circus tent"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Ticket"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Clapper board"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Performing arts"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Video game"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Direct hit"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Slot machine"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Billiards"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Game die"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Bowling"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Flower playing cards"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Musical note"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Multiple musical notes"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saxophone"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Guitar"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Musical keyboard"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trumpet"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Violin"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Musical score"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Running shirt with sash"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Tennis racquet and ball"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Ski and ski boot"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Basketball and hoop"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Chequered flag"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Snowboarder"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Runner"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Surfer"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Trophy"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Horse racing"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"American football"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Rugby football"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Swimmer"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"House building"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"House with garden"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Office building"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Japanese post office"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"European post office"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Hospital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Bank"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Automated teller machine"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Love hotel"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Convenience store"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"School"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Department store"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Factory"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Izakaya lantern"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Japanese castle"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"European castle"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Rat"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Mouse"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Ox"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Water buffalo"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Cow"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopard"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Rabbit"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Cat"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Dragon"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Crocodile"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Whale"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Snail"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Snake"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Horse"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Ram"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Goat"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Sheep"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Monkey"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Rooster"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Chicken"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Dog"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Pig"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Boar"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Elephant"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Octopus"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Spiral shell"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Bug"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Ant"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Honeybee"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Lady beetle"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Fish"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Tropical fish"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Blowfish"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Turtle"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Hatching chick"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Baby chick"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Front-facing baby chick"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Bird"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Penguin"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Poodle"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Dromedary camel"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Bactrian camel"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Dolphin"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Mouse face"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Cow face"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Tiger face"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Rabbit face"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Cat face"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Dragon face"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Spouting whale"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Horse face"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Monkey face"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Dog face"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Pig face"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Frog face"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Hamster face"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Wolf face"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Bear face"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Panda face"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Pig nose"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Paw prints"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Eyes"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Ear"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nose"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Mouth"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Tongue"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"White up pointing backhand index"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"White down pointing backhand index"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"White left pointing backhand index"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"White right pointing backhand index"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Fisted hand sign"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Waving hand sign"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"OK hand sign"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Thumbs up sign"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Thumbs down sign"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Clapping hands sign"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Open hands sign"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Crown"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Womans hat"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Eyeglasses"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Necktie"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"T-shirt"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Jeans"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Dress"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikini"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Womans clothes"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Purse"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Handbag"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Pouch"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Mans shoe"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Athletic shoe"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"High-heeled shoe"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Womans sandal"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Womans boots"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Footprints"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Bust in silhouette"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Busts in silhouette"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Boy"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Girl"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Man"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Woman"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Family"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Man and woman holding hands"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Two men holding hands"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Two women holding hands"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Police officer"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Woman with bunny ears"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Bride with veil"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Person with blond hair"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Man with gua pi mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Man with turban"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Older man"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Older woman"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Baby"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Construction worker"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Princess"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Japanese ogre"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Japanese goblin"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Ghost"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Baby angel"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Extraterrestrial alien"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Alien monster"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Imp"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Skull"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Information desk person"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Guardsman"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Dancer"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Lipstick"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Nail polish"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Face massage"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Haircut"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Barber pole"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Syringe"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pill"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Kiss mark"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Love letter"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Ring"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Gem stone"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Kiss"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Bouquet"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Couple with heart"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Wedding"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Beating heart"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Broken heart"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Two hearts"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Sparkling heart"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Growing heart"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Heart with arrow"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Blue heart"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Green heart"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Yellow heart"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Purple heart"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Heart with ribbon"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Revolving hearts"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Heart decoration"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Diamond shape with a dot inside"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Electric light bulb"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Anger symbol"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bomb"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Sleeping symbol"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Collision symbol"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Splashing sweat symbol"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Droplet"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Dash symbol"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Pile of poo"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Flexed biceps"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Dizzy symbol"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Speech balloon"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Thought balloon"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"White flower"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Hundred points symbol"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Money bag"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Currency exchange"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Heavy pound sign"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Credit card"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Banknote with yen sign"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Banknote with pound sign"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Banknote with euro sign"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Banknote with pound sign"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Money with wings"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Chart with upwards trend and yen sign"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Seat"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Personal computer"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Briefcase"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisc"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Floppy disk"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Optical disc"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"File folder"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Open file folder"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Page with curl"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Page facing up"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Calendar"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Tear-off calendar"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Card index"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Chart with upwards trend"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Chart with downwards trend"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Bar chart"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Clipboard"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Pushpin"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Round pushpin"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Paperclip"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Straight ruler"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Triangular ruler"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Bookmark tabs"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Ledger"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Notebook"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Notebook with decorative cover"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Closed book"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Open book"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Green book"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Blue book"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Orange book"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Books"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Name badge"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Scroll"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memo"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Telephone receiver"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Pager"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Fax machine"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Satellite antenna"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Public address loudspeaker"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Cheering megaphone"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Outbox tray"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Inbox tray"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Package"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"E-mail symbol"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Incoming envelope"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Envelope with downwards arrow above"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Closed mailbox with lowered flag"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Closed mailbox with raised flag"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Open mailbox with raised flag"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Open mailbox with lowered flag"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Postbox"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Postal horn"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Newspaper"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Mobile phone"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Mobile phone with rightwards arrow at left"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Vibration mode"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Mobile phone off"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"No mobile phones"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antenna with bars"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Camera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Video camera"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Television"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videocassette"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Twisted rightwards arrows"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Clockwise rightwards and leftwards open circle arrows"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Clockwise rightwards and leftwards open circle arrows with circled one overlay"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Clockwise downwards and upwards open circle arrows"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Anticlockwise downwards and upwards open circle arrows"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Low brightness symbol"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"High brightness symbol"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Speaker with cancellation stroke"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Speaker"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Speaker with one sound wave"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Speaker with three sound waves"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Battery"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Electric plug"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Left-pointing magnifying glass"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Right-pointing magnifying glass"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lock with ink pen"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Closed lock with key"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Key"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Lock"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Open lock"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Bell"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Bell with cancellation stroke"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Bookmark"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Link symbol"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Radio button"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Back with leftwards arrow above"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"End with leftwards arrow above"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"On with exclamation mark with left right arrow above"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Soon with rightwards arrow above"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Top with upwards arrow above"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"No one under eighteen symbol"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Keycap ten"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Input symbol for latin capital letters"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Input symbol for latin small letters"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Input symbol for numbers"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Input symbol for symbols"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Input symbol for latin letters"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Fire"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Electric torch"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Wrench"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Hammer"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Nut and bolt"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hocho"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistol"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Microscope"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Telescope"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Crystal ball"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Six pointed star with middle dot"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Japanese symbol for beginner"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Trident emblem"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Black square button"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"White square button"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Large red circle"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Large blue circle"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Large orange diamond"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Large blue diamond"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Small orange diamond"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Small blue diamond"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Up-pointing red triangle"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Down-pointing red triangle"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Up-pointing small red triangle"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Down-pointing small red triangle"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Clock face one o\'clock"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Clock face two o\'clock"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Clock face three o\'clock"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Clock face four o\'clock"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Clock face five o\'clock"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Clock face six o\'clock"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Clock face seven o\'clock"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Clock face eight o\'clock"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Clock face nine o\'clock"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Clock face ten o\'clock"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Clock face eleven o\'clock"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Clock face twelve o\'clock"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Clock face one-thirty"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Clock face two-thirty"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Clock face three-thirty"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Clock face four-thirty"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Clock face five-thirty"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Clock face six-thirty"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Clock face seven-thirty"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Clock face eight-thirty"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Clock face nine-thirty"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Clock face ten-thirty"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Clock face eleven-thirty"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Clock face twelve-thirty"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Mount Fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tokyo tower"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Statue of Liberty"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Silhouette of Japan"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Grinning face"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Grinning face with smiling eyes"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Face with tears of joy"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Smiling face with open mouth"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Smiling face with open mouth and smiling eyes"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Smiling face with open mouth and cold sweat"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Smiling face with open mouth and tightly-closed eyes"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Smiling face with halo"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Smiling face with horns"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Winking face"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Smiling face with smiling eyes"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Face savouring delicious food"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Relieved face"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Smiling face with heart-shaped eyes"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Smiling face with sunglasses"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Smirking face"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Neutral face"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Expressionless face"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Unamused face"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Face with cold sweat"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Pensive face"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Confused face"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Confounded face"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Kissing face"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Face throwing a kiss"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Kissing face with smiling eyes"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Kissing face with closed eyes"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Face with stuck-out tongue"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Face with stuck-out tongue and winking eye"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Face with stuck-out tongue and tightly-closed eyes"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Disappointed face"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Worried face"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Angry face"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Pouting face"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Crying face"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Persevering face"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Face with look of triumph"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Disappointed but relieved face"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Frowning face with open mouth"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Anguished face"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Fearful face"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Weary face"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Sleepy face"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Tired face"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Grimacing face"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Loudly crying face"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Face with open mouth"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Hushed face"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Face with open mouth and cold sweat"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Face screaming in fear"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Astonished face"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Flushed face"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Sleeping face"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Dizzy face"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Face without mouth"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Face with medical mask"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Grinning cat face with smiling eyes"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Cat face with tears of joy"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Smiling cat face with open mouth"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Smiling cat face with heart-shaped eyes"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Cat face with wry smile"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kissing cat face with closed eyes"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Pouting cat face"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Crying cat face"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Weary cat face"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Face with no good gesture"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Face with OK gesture"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Person bowing deeply"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"See-no-evil monkey"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Hear-no-evil monkey"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Speak-no-evil monkey"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Happy person raising one hand"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Person raising both hands in celebration"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Person frowning"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Person with pouting face"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Person with folded hands"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Rocket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helicopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Steam locomotive"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Railway car"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"High-speed train"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"High-speed train with bullet nose"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Train"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Light rail"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Station"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tram"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Tram car"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Oncoming bus"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Tram"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Bus stop"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Minibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulance"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Fire engine"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Police car"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Oncoming police car"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Oncoming taxi"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automobile"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Oncoming automobile"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Recreational vehicle"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Delivery truck"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Articulated lorry"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Tractor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorail"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Mountain railway"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Suspension railway"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Mountain cableway"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Aerial tramway"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Ship"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Rowing boat"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Speedboat"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Horizontal traffic light"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Vertical traffic light"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Construction sign"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Police cars revolving light"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Triangular flag on post"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Door"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"No entry sign"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Smoking symbol"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"No smoking symbol"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Put litter in its place symbol"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Do not litter symbol"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Drinking water symbol"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Non-drinking water symbol"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicycle"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"No bicycles"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Cyclist"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Mountain cyclist"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pedestrian"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"No pedestrians"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Shower"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bath"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Bathtub"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Passport control"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Customs"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Baggage claim"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Left luggage"</string> +</resources> diff --git a/java/res/values-en-rGB/strings-letter-descriptions.xml b/java/res/values-en-rGB/strings-letter-descriptions.xml new file mode 100644 index 000000000..514bc6cbd --- /dev/null +++ b/java/res/values-en-rGB/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string> +</resources> diff --git a/java/res/values-en-rGB/strings-talkback-descriptions.xml b/java/res/values-en-rGB/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e209b5494 --- /dev/null +++ b/java/res/values-en-rGB/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Plug in a headset to hear password keys spoken aloud."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Current text is %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbols"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Delete"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbols"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letters"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Numbers"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Settings"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Voice input"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Search"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Full stop"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Switch language"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Next"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Previous"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift enabled"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock enabled"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbols mode"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"More symbols mode"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Letters mode"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Phone mode"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Phone symbols mode"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Keyboard hidden"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Showing <xliff:g id="KEYBOARD_MODE">%s</xliff:g> keyboard"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"date"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"date and time"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"messaging"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"number"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"phone"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"time"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recents"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"People"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objects"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Nature"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string> +</resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 4bc1b15cf..04056c230 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Input options"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Research Log Commands"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Look up contact names"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Spell checker uses entries from your contact list"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on keypress"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sound on keypress"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up on key press"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Text correction"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Gesture typing"</string> - <string name="misc_category" msgid="6894192814868233453">"Other options"</string> - <string name="advanced_settings" msgid="362895144495591463">"Advanced settings"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Options for experts"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Input preferences"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Appearance"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Multilingual options"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Gesture typing preferences"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Text correction"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Advanced"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Switch to other input methods"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Language switch key also covers other input methods"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Language switch key"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"System default"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Show gesture trail"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamic floating preview"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"See the suggested word while gesturing"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Plug in a headset to hear password keys spoken aloud."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Current text is %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"No text entered"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> performs auto-correction"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Key code %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift on (tap to disable)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock on (tap to disable)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbols"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letters"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numbers"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Settings"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Space"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Voice input"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley face"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Search"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Dot"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Switch language"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Next"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Previous"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift enabled"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock enabled"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift disabled"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbols mode"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Letters mode"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Phone mode"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Phone symbols mode"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard hidden"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Showing <xliff:g id="MODE">%s</xliff:g> keyboard"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"date and time"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"messaging"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"number"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"phone"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"time"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Phrase gesture"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Input spaces during gestures by gliding to the space key"</string> <string name="voice_input" msgid="3583258583521397548">"Voice input key"</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="voice_input_disabled_summary" msgid="8141750303464726129">"No voice input methods enabled. Check Language & input settings."</string> <string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string> <string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string> <string name="send_feedback" msgid="1780431884109392046">"Send feedback"</string> <string name="select_language" msgid="3693815588777926848">"Input languages"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Touch again to save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Help improve this input method editor by automatically sending usage statistics and crash reports"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Keyboard theme"</string> <string name="subtype_en_GB" msgid="88170601942311355">"English (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"English (US)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spanish (US)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"English (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"English (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spanish (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Traditional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"English (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"English (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Traditional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyrillic)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"No language (Alphabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alphabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alphabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Colour scheme"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"White"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blue"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Keyboard theme"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Holo White"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Holo Blue"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Material Dark"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Material Light"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Customised input styles"</string> <string name="add_style" msgid="6163126614514489951">"Add style"</string> <string name="add" msgid="8299699805688017798">"Add"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Enable"</string> <string name="not_now" msgid="6172462888202790482">"Not now"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"The same input style already exists: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Usability study mode"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Key long press delay"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Keypress vibration duration"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Keypress sound volume"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Read external dictionary file"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No dictionary files in the Downloads folder"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Really install this file for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Really install this file for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"There was an error"</string> <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Welcome to <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Refresh"</string> <string name="last_update" msgid="730467549913588780">"Last updated"</string> <string name="message_updating" msgid="4457761393932375219">"Checking for updates"</string> - <string name="message_loading" msgid="8689096636874758814">"Loading..."</string> + <string name="message_loading" msgid="5638680861387748936">"Loading…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Main dictionary"</string> <string name="cancel" msgid="6830980399865683324">"Cancel"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Settings"</string> <string name="install_dict" msgid="180852772562189365">"Install"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel"</string> <string name="delete_dict" msgid="756853268088330054">"Delete"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> <string name="download_over_metered" msgid="1643065851159409546">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download over Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"A dictionary is available for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"A dictionary is available for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Press to review and download"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloading: suggestions for <xliff:g id="LANGUAGE">%1$s</xliff:g> will be ready soon."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloading: suggestions for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> will be ready soon."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Add"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Add to dictionary"</string> diff --git a/java/res/values-en-rIN/strings-action-keys.xml b/java/res/values-en-rIN/strings-action-keys.xml index 366cf3cdf..6514e85f3 100644 --- a/java/res/values-en-rIN/strings-action-keys.xml +++ b/java/res/values-en-rIN/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string> <string name="label_done_key" msgid="7564866296502630852">"Finished"</string> <string name="label_send_key" msgid="482252074224462163">"Send"</string> + <string name="label_search_key" msgid="7965186050435796642">"Search"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string> </resources> diff --git a/java/res/values-en-rIN/strings-config-important-notice.xml b/java/res/values-en-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..80ddd3e4b --- /dev/null +++ b/java/res/values-en-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Learn from your communications and typed data to improve suggestions"</string> +</resources> diff --git a/java/res/values-en-rIN/strings-emoji-descriptions.xml b/java/res/values-en-rIN/strings-emoji-descriptions.xml new file mode 100644 index 000000000..2ac73fcbb --- /dev/null +++ b/java/res/values-en-rIN/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Copyright sign"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Registered sign"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Double exclamation mark"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Exclamation question mark"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Trade mark sign"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Information source"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Left right arrow"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Up down arrow"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"North west arrow"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"North east arrow"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"South east arrow"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"South west arrow"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Leftwards arrow with hook"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Rightwards arrow with hook"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Watch"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Hourglass"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Black right-pointing double triangle"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Black left-pointing double triangle"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Black up-pointing double triangle"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Black down-pointing double triangle"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Alarm clock"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Hourglass with flowing sand"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Circled latin capital letter m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Black small square"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"White small square"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Black right-pointing triangle"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Black left-pointing triangle"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"White medium square"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Black medium square"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"White medium small square"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Black medium small square"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Black sun with rays"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Cloud"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Black telephone"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Ballot box with tick"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Umbrella with rain drops"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Hot beverage"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"White up pointing index"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"White smiling face"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Aries"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Taurus"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gemini"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Cancer"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leo"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Virgo"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Libra"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Scorpio"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Sagittarius"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricorn"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquarius"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Pisces"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Black spade suit"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Black club suit"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Black heart suit"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Black diamond suit"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Hot springs"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Black universal recycling symbol"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Wheelchair symbol"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Anchor"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Warning sign"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"High voltage sign"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Medium white circle"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Medium black circle"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Football"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Baseball"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Snowman without snow"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Sun behind cloud"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"No entry"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Church"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fountain"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Flag in hole"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Sailing boat"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Tent"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Fuel pump"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Black scissors"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"White heavy tick"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Aeroplane"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Envelope"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Raised fist"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Raised hand"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Victory hand"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Pencil"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Black nib"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Heavy tick"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Heavy multiplication x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Sparkles"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Eight spoked asterisk"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Eight pointed black star"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Snowflake"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Sparkle"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Cross mark"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Negative squared cross mark"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Black question mark ornament"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"White question mark ornament"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"White exclamation mark ornament"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Heavy exclamation mark symbol"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Heavy black heart"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Heavy plus sign"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Heavy minus sign"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Heavy division sign"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Black rightwards arrow"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Curly loop"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Double curly loop"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Arrow pointing rightwards then curving upwards"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Arrow pointing rightwards then curving downwards"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Leftwards black arrow"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Upwards black arrow"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Downwards black arrow"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Black large square"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"White large square"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"White medium star"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Heavy large circle"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Wavy dash"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Part alternation mark"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Circled ideograph congratulation"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Circled ideograph secret"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahjong tile red dragon"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Playing card black joker"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Blood type A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Blood type B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Blood type O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Car park"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Blood type AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"Squared CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Squared cool"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Squared free"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Squared ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Squared new"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Squared N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Squared OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Squared SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Squared up with exclamation mark"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Squared vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Squared katakana here"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Squared katakana service"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Squared ideograph charge-free"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Squared ideograph reserved-seat"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Squared ideograph prohibitation"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Squared ideograph vacancy"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Squared ideograph acceptance"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Squared ideograph full occupancy"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Squared ideograph paid"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Squared ideograph monthly"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Squared ideograph application"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Squared ideograph discount"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Squared ideograph in business"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Circled ideograph advantage"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Circled ideograph accept"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Cyclone"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Foggy"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Closed umbrella"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Night with stars"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Sunrise over mountains"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sunrise"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Cityscape at dusk"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Sunset over buildings"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Rainbow"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Bridge at night"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Water wave"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Volcano"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Milky way"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Earth globe Europe-Africa"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Earth globe Americas"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Earth globe Asia-Australia"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Globe with meridians"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"New moon symbol"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Waxing crescent moon symbol"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"First quarter moon symbol"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Waxing gibbous moon symbol"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Full moon symbol"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Waning gibbous moon symbol"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Last quarter moon symbol"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Waning crescent moon symbol"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Crescent moon"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"New moon with face"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"First quarter moon with face"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Last quarter moon with face"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Full moon with face"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Sun with face"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Glowing star"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Shooting star"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Chestnut"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Seedling"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Evergreen tree"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Deciduous tree"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palm tree"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Cactus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Tulip"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Cherry blossom"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Rose"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Hibiscus"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Sunflower"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Blossom"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Ear of maize"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Ear of rice"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Herb"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Four leaf clover"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Maple leaf"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Fallen leaf"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Leaf fluttering in wind"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Mushroom"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tomato"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Aubergine"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Grapes"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Melon"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Watermelon"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Tangerine"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Lemon"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banana"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Pineapple"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Red apple"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Green apple"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pear"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Peach"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Cherries"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Strawberry"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamburger"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Slice of pizza"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Meat on bone"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Poultry leg"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Rice cracker"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Rice ball"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Cooked rice"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Curry and rice"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Steaming bowl"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spaghetti"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Bread"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"French fries"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Roasted sweet potato"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Fried shrimp"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Fish cake with swirl design"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Soft ice cream"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Shaved ice"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Ice cream"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Doughnut"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Cookie"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Chocolate bar"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Candy"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Lollipop"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Custard"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Honey pot"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Shortcake"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Bento box"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Pot of food"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Cooking"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Fork and knife"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Teacup without handle"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sake bottle and cup"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Wine glass"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Cocktail glass"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Tropical drink"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Beer mug"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Clinking beer mugs"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Baby bottle"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Ribbon"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Wrapped present"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Birthday cake"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack-o-lantern"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Christmas tree"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Father christmas"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Fireworks"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Firework sparkler"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Balloon"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Party popper"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Confetti ball"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Tanabata tree"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Crossed flags"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Pine decoration"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Japanese dolls"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Carp streamer"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Wind chime"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Moon viewing ceremony"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"School satchel"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Graduation cap"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Carousel horse"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Ferris wheel"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Roller coaster"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Fishing pole and fish"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Microphone"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Movie camera"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Cinema"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Headphone"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Artist palette"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Top hat"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Circus tent"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Ticket"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Clapper board"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Performing arts"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Video game"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Direct hit"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Slot machine"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Billiards"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Game die"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Bowling"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Flower playing cards"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Musical note"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Multiple musical notes"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saxophone"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Guitar"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Musical keyboard"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trumpet"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Violin"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Musical score"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Running shirt with sash"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Tennis racquet and ball"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Ski and ski boot"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Basketball and hoop"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Chequered flag"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Snowboarder"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Runner"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Surfer"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Trophy"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Horse racing"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"American football"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Rugby football"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Swimmer"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"House building"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"House with garden"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Office building"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Japanese post office"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"European post office"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Hospital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Bank"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Automated teller machine"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Love hotel"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Convenience store"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"School"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Department store"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Factory"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Izakaya lantern"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Japanese castle"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"European castle"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Rat"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Mouse"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Ox"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Water buffalo"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Cow"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopard"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Rabbit"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Cat"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Dragon"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Crocodile"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Whale"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Snail"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Snake"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Horse"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Ram"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Goat"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Sheep"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Monkey"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Rooster"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Chicken"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Dog"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Pig"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Boar"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Elephant"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Octopus"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Spiral shell"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Bug"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Ant"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Honeybee"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Lady beetle"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Fish"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Tropical fish"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Blowfish"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Turtle"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Hatching chick"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Baby chick"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Front-facing baby chick"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Bird"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Penguin"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Poodle"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Dromedary camel"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Bactrian camel"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Dolphin"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Mouse face"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Cow face"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Tiger face"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Rabbit face"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Cat face"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Dragon face"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Spouting whale"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Horse face"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Monkey face"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Dog face"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Pig face"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Frog face"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Hamster face"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Wolf face"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Bear face"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Panda face"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Pig nose"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Paw prints"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Eyes"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Ear"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nose"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Mouth"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Tongue"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"White up pointing backhand index"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"White down pointing backhand index"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"White left pointing backhand index"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"White right pointing backhand index"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Fisted hand sign"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Waving hand sign"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"OK hand sign"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Thumbs up sign"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Thumbs down sign"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Clapping hands sign"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Open hands sign"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Crown"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Womans hat"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Eyeglasses"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Necktie"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"T-shirt"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Jeans"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Dress"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikini"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Womans clothes"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Purse"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Handbag"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Pouch"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Mans shoe"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Athletic shoe"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"High-heeled shoe"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Womans sandal"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Womans boots"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Footprints"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Bust in silhouette"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Busts in silhouette"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Boy"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Girl"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Man"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Woman"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Family"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Man and woman holding hands"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Two men holding hands"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Two women holding hands"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Police officer"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Woman with bunny ears"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Bride with veil"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Person with blond hair"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Man with gua pi mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Man with turban"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Older man"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Older woman"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Baby"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Construction worker"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Princess"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Japanese ogre"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Japanese goblin"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Ghost"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Baby angel"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Extraterrestrial alien"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Alien monster"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Imp"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Skull"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Information desk person"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Guardsman"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Dancer"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Lipstick"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Nail polish"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Face massage"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Haircut"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Barber pole"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Syringe"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pill"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Kiss mark"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Love letter"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Ring"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Gem stone"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Kiss"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Bouquet"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Couple with heart"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Wedding"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Beating heart"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Broken heart"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Two hearts"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Sparkling heart"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Growing heart"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Heart with arrow"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Blue heart"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Green heart"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Yellow heart"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Purple heart"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Heart with ribbon"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Revolving hearts"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Heart decoration"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Diamond shape with a dot inside"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Electric light bulb"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Anger symbol"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bomb"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Sleeping symbol"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Collision symbol"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Splashing sweat symbol"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Droplet"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Dash symbol"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Pile of poo"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Flexed biceps"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Dizzy symbol"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Speech balloon"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Thought balloon"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"White flower"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Hundred points symbol"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Money bag"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Currency exchange"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Heavy pound sign"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Credit card"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Banknote with yen sign"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Banknote with pound sign"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Banknote with euro sign"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Banknote with pound sign"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Money with wings"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Chart with upwards trend and yen sign"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Seat"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Personal computer"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Briefcase"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisc"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Floppy disk"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Optical disc"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"File folder"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Open file folder"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Page with curl"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Page facing up"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Calendar"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Tear-off calendar"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Card index"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Chart with upwards trend"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Chart with downwards trend"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Bar chart"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Clipboard"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Pushpin"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Round pushpin"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Paperclip"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Straight ruler"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Triangular ruler"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Bookmark tabs"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Ledger"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Notebook"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Notebook with decorative cover"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Closed book"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Open book"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Green book"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Blue book"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Orange book"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Books"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Name badge"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Scroll"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memo"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Telephone receiver"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Pager"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Fax machine"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Satellite antenna"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Public address loudspeaker"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Cheering megaphone"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Outbox tray"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Inbox tray"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Package"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"E-mail symbol"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Incoming envelope"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Envelope with downwards arrow above"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Closed mailbox with lowered flag"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Closed mailbox with raised flag"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Open mailbox with raised flag"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Open mailbox with lowered flag"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Postbox"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Postal horn"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Newspaper"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Mobile phone"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Mobile phone with rightwards arrow at left"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Vibration mode"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Mobile phone off"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"No mobile phones"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antenna with bars"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Camera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Video camera"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Television"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videocassette"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Twisted rightwards arrows"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Clockwise rightwards and leftwards open circle arrows"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Clockwise rightwards and leftwards open circle arrows with circled one overlay"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Clockwise downwards and upwards open circle arrows"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Anticlockwise downwards and upwards open circle arrows"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Low brightness symbol"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"High brightness symbol"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Speaker with cancellation stroke"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Speaker"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Speaker with one sound wave"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Speaker with three sound waves"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Battery"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Electric plug"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Left-pointing magnifying glass"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Right-pointing magnifying glass"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lock with ink pen"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Closed lock with key"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Key"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Lock"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Open lock"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Bell"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Bell with cancellation stroke"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Bookmark"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Link symbol"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Radio button"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Back with leftwards arrow above"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"End with leftwards arrow above"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"On with exclamation mark with left right arrow above"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Soon with rightwards arrow above"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Top with upwards arrow above"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"No one under eighteen symbol"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Keycap ten"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Input symbol for latin capital letters"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Input symbol for latin small letters"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Input symbol for numbers"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Input symbol for symbols"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Input symbol for latin letters"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Fire"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Electric torch"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Wrench"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Hammer"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Nut and bolt"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hocho"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistol"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Microscope"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Telescope"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Crystal ball"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Six pointed star with middle dot"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Japanese symbol for beginner"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Trident emblem"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Black square button"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"White square button"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Large red circle"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Large blue circle"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Large orange diamond"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Large blue diamond"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Small orange diamond"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Small blue diamond"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Up-pointing red triangle"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Down-pointing red triangle"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Up-pointing small red triangle"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Down-pointing small red triangle"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Clock face one o\'clock"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Clock face two o\'clock"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Clock face three o\'clock"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Clock face four o\'clock"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Clock face five o\'clock"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Clock face six o\'clock"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Clock face seven o\'clock"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Clock face eight o\'clock"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Clock face nine o\'clock"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Clock face ten o\'clock"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Clock face eleven o\'clock"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Clock face twelve o\'clock"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Clock face one-thirty"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Clock face two-thirty"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Clock face three-thirty"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Clock face four-thirty"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Clock face five-thirty"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Clock face six-thirty"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Clock face seven-thirty"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Clock face eight-thirty"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Clock face nine-thirty"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Clock face ten-thirty"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Clock face eleven-thirty"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Clock face twelve-thirty"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Mount Fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tokyo tower"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Statue of Liberty"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Silhouette of Japan"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Grinning face"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Grinning face with smiling eyes"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Face with tears of joy"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Smiling face with open mouth"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Smiling face with open mouth and smiling eyes"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Smiling face with open mouth and cold sweat"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Smiling face with open mouth and tightly-closed eyes"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Smiling face with halo"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Smiling face with horns"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Winking face"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Smiling face with smiling eyes"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Face savouring delicious food"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Relieved face"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Smiling face with heart-shaped eyes"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Smiling face with sunglasses"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Smirking face"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Neutral face"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Expressionless face"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Unamused face"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Face with cold sweat"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Pensive face"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Confused face"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Confounded face"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Kissing face"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Face throwing a kiss"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Kissing face with smiling eyes"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Kissing face with closed eyes"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Face with stuck-out tongue"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Face with stuck-out tongue and winking eye"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Face with stuck-out tongue and tightly-closed eyes"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Disappointed face"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Worried face"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Angry face"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Pouting face"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Crying face"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Persevering face"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Face with look of triumph"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Disappointed but relieved face"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Frowning face with open mouth"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Anguished face"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Fearful face"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Weary face"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Sleepy face"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Tired face"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Grimacing face"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Loudly crying face"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Face with open mouth"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Hushed face"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Face with open mouth and cold sweat"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Face screaming in fear"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Astonished face"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Flushed face"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Sleeping face"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Dizzy face"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Face without mouth"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Face with medical mask"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Grinning cat face with smiling eyes"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Cat face with tears of joy"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Smiling cat face with open mouth"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Smiling cat face with heart-shaped eyes"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Cat face with wry smile"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kissing cat face with closed eyes"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Pouting cat face"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Crying cat face"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Weary cat face"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Face with no good gesture"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Face with OK gesture"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Person bowing deeply"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"See-no-evil monkey"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Hear-no-evil monkey"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Speak-no-evil monkey"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Happy person raising one hand"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Person raising both hands in celebration"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Person frowning"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Person with pouting face"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Person with folded hands"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Rocket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helicopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Steam locomotive"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Railway car"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"High-speed train"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"High-speed train with bullet nose"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Train"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Light rail"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Station"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tram"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Tram car"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Oncoming bus"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Tram"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Bus stop"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Minibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulance"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Fire engine"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Police car"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Oncoming police car"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Oncoming taxi"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automobile"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Oncoming automobile"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Recreational vehicle"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Delivery truck"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Articulated lorry"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Tractor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorail"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Mountain railway"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Suspension railway"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Mountain cableway"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Aerial tramway"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Ship"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Rowing boat"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Speedboat"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Horizontal traffic light"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Vertical traffic light"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Construction sign"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Police cars revolving light"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Triangular flag on post"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Door"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"No entry sign"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Smoking symbol"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"No smoking symbol"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Put litter in its place symbol"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Do not litter symbol"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Drinking water symbol"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Non-drinking water symbol"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicycle"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"No bicycles"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Cyclist"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Mountain cyclist"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pedestrian"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"No pedestrians"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Shower"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bath"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Bathtub"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Passport control"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Customs"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Baggage claim"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Left luggage"</string> +</resources> diff --git a/java/res/values-en-rIN/strings-letter-descriptions.xml b/java/res/values-en-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..514bc6cbd --- /dev/null +++ b/java/res/values-en-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string> +</resources> diff --git a/java/res/values-en-rIN/strings-talkback-descriptions.xml b/java/res/values-en-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e209b5494 --- /dev/null +++ b/java/res/values-en-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Plug in a headset to hear password keys spoken aloud."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Current text is %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbols"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Delete"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbols"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letters"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Numbers"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Settings"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Voice input"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Search"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Full stop"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Switch language"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Next"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Previous"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift enabled"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock enabled"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbols mode"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"More symbols mode"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Letters mode"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Phone mode"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Phone symbols mode"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Keyboard hidden"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Showing <xliff:g id="KEYBOARD_MODE">%s</xliff:g> keyboard"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"date"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"date and time"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"messaging"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"number"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"phone"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"time"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recents"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"People"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objects"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Nature"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string> +</resources> diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml index 4bc1b15cf..04056c230 100644 --- a/java/res/values-en-rIN/strings.xml +++ b/java/res/values-en-rIN/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Input options"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Research Log Commands"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Look up contact names"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Spell checker uses entries from your contact list"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on keypress"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sound on keypress"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up on key press"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Text correction"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Gesture typing"</string> - <string name="misc_category" msgid="6894192814868233453">"Other options"</string> - <string name="advanced_settings" msgid="362895144495591463">"Advanced settings"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Options for experts"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Input preferences"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Appearance"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Multilingual options"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Gesture typing preferences"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Text correction"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Advanced"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Switch to other input methods"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Language switch key also covers other input methods"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Language switch key"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"System default"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Show gesture trail"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamic floating preview"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"See the suggested word while gesturing"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Saved"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Plug in a headset to hear password keys spoken aloud."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Current text is %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"No text entered"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> performs auto-correction"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Key code %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift on (tap to disable)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock on (tap to disable)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbols"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letters"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numbers"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Settings"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Space"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Voice input"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley face"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Search"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Dot"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Switch language"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Next"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Previous"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift enabled"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock enabled"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift disabled"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbols mode"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Letters mode"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Phone mode"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Phone symbols mode"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard hidden"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Showing <xliff:g id="MODE">%s</xliff:g> keyboard"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"date and time"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"messaging"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"number"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"phone"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"time"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Phrase gesture"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Input spaces during gestures by gliding to the space key"</string> <string name="voice_input" msgid="3583258583521397548">"Voice input key"</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="voice_input_disabled_summary" msgid="8141750303464726129">"No voice input methods enabled. Check Language & input settings."</string> <string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string> <string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string> <string name="send_feedback" msgid="1780431884109392046">"Send feedback"</string> <string name="select_language" msgid="3693815588777926848">"Input languages"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Touch again to save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Help improve this input method editor by automatically sending usage statistics and crash reports"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Keyboard theme"</string> <string name="subtype_en_GB" msgid="88170601942311355">"English (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"English (US)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spanish (US)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"English (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"English (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spanish (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Traditional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"English (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"English (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Traditional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyrillic)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"No language (Alphabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alphabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alphabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Colour scheme"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"White"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blue"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Keyboard theme"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Holo White"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Holo Blue"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Material Dark"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Material Light"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Customised input styles"</string> <string name="add_style" msgid="6163126614514489951">"Add style"</string> <string name="add" msgid="8299699805688017798">"Add"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Enable"</string> <string name="not_now" msgid="6172462888202790482">"Not now"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"The same input style already exists: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Usability study mode"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Key long press delay"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Keypress vibration duration"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Keypress sound volume"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Read external dictionary file"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No dictionary files in the Downloads folder"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Really install this file for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Really install this file for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"There was an error"</string> <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Welcome to <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Refresh"</string> <string name="last_update" msgid="730467549913588780">"Last updated"</string> <string name="message_updating" msgid="4457761393932375219">"Checking for updates"</string> - <string name="message_loading" msgid="8689096636874758814">"Loading..."</string> + <string name="message_loading" msgid="5638680861387748936">"Loading…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Main dictionary"</string> <string name="cancel" msgid="6830980399865683324">"Cancel"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Settings"</string> <string name="install_dict" msgid="180852772562189365">"Install"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel"</string> <string name="delete_dict" msgid="756853268088330054">"Delete"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> <string name="download_over_metered" msgid="1643065851159409546">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download over Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"A dictionary is available for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"A dictionary is available for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Press to review and download"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloading: suggestions for <xliff:g id="LANGUAGE">%1$s</xliff:g> will be ready soon."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloading: suggestions for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> will be ready soon."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Add"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Add to dictionary"</string> diff --git a/java/res/values-es-rUS/strings-action-keys.xml b/java/res/values-es-rUS/strings-action-keys.xml index d375617f4..e1d37beed 100644 --- a/java/res/values-es-rUS/strings-action-keys.xml +++ b/java/res/values-es-rUS/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string> <string name="label_done_key" msgid="7564866296502630852">"Listo"</string> <string name="label_send_key" msgid="482252074224462163">"Env."</string> + <string name="label_search_key" msgid="7965186050435796642">"Buscar"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string> </resources> diff --git a/java/res/values-es-rUS/strings-config-important-notice.xml b/java/res/values-es-rUS/strings-config-important-notice.xml new file mode 100644 index 000000000..5b895fb4a --- /dev/null +++ b/java/res/values-es-rUS/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprende de mensajes y datos ingresados para mejorar las sugerencias."</string> +</resources> diff --git a/java/res/values-es-rUS/strings-letter-descriptions.xml b/java/res/values-es-rUS/strings-letter-descriptions.xml new file mode 100644 index 000000000..05418757d --- /dev/null +++ b/java/res/values-es-rUS/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Ordinal femenino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signo de micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S nítida"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, acento grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acento agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, acento circunflejo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde de la ñ"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diéresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anillo superior"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ligadura A, E"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, acento grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acento agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, acento circunflejo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diéresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, acento grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acento agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, acento circunflejo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diéresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde de la ñ"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, acento grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acento agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, acento circunflejo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde de la ñ"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diéresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O tachada"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, acento grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acento agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, acento circunflejo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diéresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acento agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diéresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, acento largo"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, acento breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acento agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, acento circunflejo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punto superior"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, acento anticircunflejo"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, acento anticircunflejo"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D tachada"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, acento largo"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punto superior"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, acento anticircunflejo"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, acento circunflejo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punto superior"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, acento circunflejo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H tachada"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde de la ñ"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, acento largo"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sin punto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"ligadura I, J"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, acento circunflejo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acento agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, acento anticircunflejo"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punto medio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L tachada"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acento agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, acento anticircunflejo"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida por apóstrofe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, acento largo"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, acento agudo doble"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ligadura O, E"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acento agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, acento anticircunflejo"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acento agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, acento circunflejo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, acento anticircunflejo"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, acento anticircunflejo"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T tachada"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde de la ñ"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, acento largo"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anillo superior"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"T, acento agudo doble"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, acento circunflejo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, acento circunflejo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acento agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punto superior"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, acento anticircunflejo"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S larga"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, con cuerno"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, con cuerno"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, con coma inferior"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, con coma inferior"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, con punto inferior"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, con gancho superior"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, acento circunflejo y agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, acento circunflejo y grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, acento circunflejo y con gancho superior"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, acento circunflejo y con tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, acento circunflejo y con punto inferior"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, con acento breve y agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, con acento breve y grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, con acento breve y gancho superior"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, con acento breve y tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, con acento breve y punto inferior"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, con punto inferior"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, con gancho superior"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, con tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, acento circunflejo y agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, acento circunflejo y grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, acento circunflejo y con gancho superior"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, acento circunflejo y con tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, acento circunflejo y con punto inferior"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, con gancho superior"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, con punto inferior"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, con punto inferior"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, con gancho superior"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, acento circunflejo y agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, acento circunflejo y grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, acento circunflejo y con gancho superior"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, acento circunflejo y con tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, acento circunflejo y con punto inferior"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, con cuerno y acento agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, con cuerno y acento grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, con cuerno y gancho superior"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, con cuerno y tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, con cuerno y punto inferior"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, con punto inferior"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, con gancho superior"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, con cuerno y acento agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, con cuerno y acento grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, con cuerno y gancho superior"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, con cuerno y tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, con cuerno y punto inferior"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, acento grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, con punto inferior"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, con gancho superior"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Exclamación de apertura"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Comillas angulares de apertura"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punto medio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndice uno"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Comillas angulares de cierre"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Interrogación de apertura"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Comilla simple de apertura"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Comilla simple de cierre"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Comilla en forma de 9 simple y baja"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Comillas dobles de apertura"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Comillas dobles de cierre"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruz"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruz doble"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signo de por mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prima"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prima doble"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Comilla simple angular de apertura"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Comilla simple angular de cierre"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndice cuatro"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndice letra latina minúscula n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signo de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Símbolo inglés care-of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Flecha derecha"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Flecha abajo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vacío"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor que o igual a"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Mayor que o igual a"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrella negra"</string> +</resources> diff --git a/java/res/values-es-rUS/strings-talkback-descriptions.xml b/java/res/values-es-rUS/strings-talkback-descriptions.xml new file mode 100644 index 000000000..0bde67e02 --- /dev/null +++ b/java/res/values-es-rUS/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Enchufa tus auriculares para escuchar en voz alta qué teclas presionas al ingresar una contraseña."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"El texto actual es %s."</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"No se ingresó texto."</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> por <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige automáticamente."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Carácter desconocido"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Mayúsculas"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Más símbolos"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Mayúscula"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Símbolos"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Mayúscula"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Eliminar"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Símbolos"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letras"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Números"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Configuración"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Pestaña"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espacio"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrada de voz"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Volver"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Búsqueda"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punto"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Cambiar idioma"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Siguiente"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Anterior"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Mayúsculas activado"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Bloqueo de mayúsculas activado"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modo Símbolos"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modo de más símbolos"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modo Letras"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modo Teléfono"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modo Símbolos del teléfono"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teclado oculto"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Mostrando teclado de <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"fecha"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"fecha y hora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"correo electrónico"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mensaje de texto"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"número"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"teléfono"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"hora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recientes"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Contactos"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objetos"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Naturaleza"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Lugares"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticones"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> mayúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I mayúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I mayúscula, con punto superior"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconocido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconocido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Hay caracteres alternativos disponibles."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Los caracteres alternativos se descartan."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Hay sugerencias alternativas disponibles."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Las sugerencias alternativas se descartan."</string> +</resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 1fd9cf8f0..99592783f 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones de entrada"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro invest."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nombres contactos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"El corrector ortográfico usa entradas de tu lista de contactos."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar teclas"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar las teclas"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Aviso emergente al pulsar tecla"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Corrección de texto"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Escritura gestual"</string> - <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string> - <string name="advanced_settings" msgid="362895144495591463">"Configuración avanzada"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opciones para expertos"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Otros métodos de entrada"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"La tecla de cambio de idioma abarca otros métodos de entrada."</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla de selección de idioma"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Valor predet. sist."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nombres de contacto"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Usar nombres de los contactos para sugerencias y correcciones"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugerenc. personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Mejorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punto y doble espacio"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocar dos veces la barra espaciadora inserta un punto y espacio."</string> <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar recorrido de gesto"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa dinámica flotante"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Mira la palabra sugerida mientras haces gestos"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Enchufa tus auriculares para escuchar en voz alta qué teclas presionas al ingresar una contraseña."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"El texto actual es %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"No se ingresó texto."</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"La tecla <xliff:g id="KEY">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> por <xliff:g id="CORRECTED">%3$s</xliff:g>."</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"La tecla <xliff:g id="KEY">%1$s</xliff:g> corrige automáticamente."</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Clave de código %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Mayús"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Se activó el modo Mayúscula (toca para desactivarlo)."</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Se activó el bloqueo de mayúsculas (toca para desactivarlo)."</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Borrar"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbolos"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letras"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Configuración"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Pestaña"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espacio"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de voz"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Carita sonriente"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Volver"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Buscar"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punto"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Cambiar idioma"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Siguiente"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Anterior"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Se activó el modo Mayúscula."</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Se activó el bloqueo de mayúsculas."</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Se desactivó el modo Mayúscula"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modo Símbolos"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo Letras"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo Teléfono"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo Símbolos del teléfono"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado para <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"correo"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mensaje de texto"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"teléfono"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frase gestual"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Desliza el dedo hasta la tecla de espacio para ingresar espacios."</string> <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada por voz"</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="voice_input_disabled_summary" msgid="8141750303464726129">"No hay métodos de entrada de voz habilitados. Comprueba la configuración de Teclado e idioma."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="send_feedback" msgid="1780431884109392046">"Enviar comentarios"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Vuelve a tocar para guardar."</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Activar los comentarios del usuario"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Envíanos automáticamente las estadísticas de uso y los informes sobre fallos para ayudarnos a mejorar este editor de método de entrada de texto."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema del teclado"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inglés (Reino Unido)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inglés (EE.UU.)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Español (EE.UU.)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglés (Reino Unido) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglés (EE.UU.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Español (EE.UU.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés, Reino Unido (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés, EE. UU. (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español, EE. UU. (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cirílico)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latinoamérica)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Combinación de colores"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Blanco"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Azul"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos de entrada personalizados"</string> <string name="add_style" msgid="6163126614514489951">"Agr. estilo"</string> <string name="add" msgid="8299699805688017798">"Agregar"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Activar"</string> <string name="not_now" msgid="6172462888202790482">"Ahora no"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ya existe el estilo de entrada <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>."</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudio de usabilidad"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Demora de presión prolongada"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durac. vibrac. al presionar"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Vol. sonido al presionar tecla"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleccionar archivo de diccionario para instalar"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"¿Realmente quieres instalar este archivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"¿Realmente quieres instalar este archivo para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Se produjo un error."</string> <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Te damos la bienvenida a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> <string name="last_update" msgid="730467549913588780">"Última actualización"</string> <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string> - <string name="message_loading" msgid="8689096636874758814">"Cargando..."</string> + <string name="message_loading" msgid="5638680861387748936">"Cargando…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string> <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Configuración"</string> <string name="install_dict" msgid="180852772562189365">"Instalar"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, es posible que se apliquen cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: Puedes descargar y eliminar diccionarios en la sección <b>Teclado e idioma</b> del menú <b>Configuración</b> del dispositivo móvil."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, es posible que se apliquen cargos.<br/> Si no sabes qué plan de datos tienes, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: Puedes descargar y eliminar diccionarios desde <b>Teclado e idioma</b> en el menú <b>Configuración</b> del dispositivo móvil."</string> <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar por Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hay un diccionario disponible de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsar para opinar y descargar"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Descargando: las sugerencias de <xliff:g id="LANGUAGE">%1$s</xliff:g> estarán disponibles en breve."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"La descarga de sugerencias para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estará lista en breve."</string> <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Agregar"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Agregar al diccionario"</string> diff --git a/java/res/values-es/strings-action-keys.xml b/java/res/values-es/strings-action-keys.xml index 2701146c8..17ea335d9 100644 --- a/java/res/values-es/strings-action-keys.xml +++ b/java/res/values-es/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Anterior"</string> <string name="label_done_key" msgid="7564866296502630852">"Listo"</string> <string name="label_send_key" msgid="482252074224462163">"Enviar"</string> + <string name="label_search_key" msgid="7965186050435796642">"Buscar"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausar"</string> <string name="label_wait_key" msgid="5891247853595466039">"Espera"</string> </resources> diff --git a/java/res/values-es/strings-config-important-notice.xml b/java/res/values-es/strings-config-important-notice.xml new file mode 100644 index 000000000..6771265c5 --- /dev/null +++ b/java/res/values-es/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprende de mensajes y datos escritos para mejorar sugerencias"</string> +</resources> diff --git a/java/res/values-es/strings-letter-descriptions.xml b/java/res/values-es/strings-letter-descriptions.xml new file mode 100644 index 000000000..0b418687d --- /dev/null +++ b/java/res/values-es/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Símbolo de la micra"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S sonora"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflejo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diéresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anillo superior"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflejo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diéresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflejo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diéresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflejo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diéresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, trazo"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflejo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diéresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diéresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macrón"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, colita"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflejo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punto superior"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, carón"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, carón"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, trazo"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macrón"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punto superior"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, colita"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, carón"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflejo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punto superior"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflejo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, trazo"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macrón"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, colita"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sin punto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflejo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, carón"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punto medio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, trazo"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, carón"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida por apóstrofo"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macrón"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, agudo doble"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, carón"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflejo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, carón"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, carón"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, trazo"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macrón"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anillo superior"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, agudo doble"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, colita"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflejo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflejo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punto superior"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, carón"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S larga"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, cuerno"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, cuerno"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punto inferior"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, garfio superior"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflejo y agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflejo y grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflejo y garfio superior"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflejo y tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflejo y punto inferior"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve y agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve y grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve y garfio superior"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve y tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve y punto inferior"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punto inferior"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, garfio superior"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflejo y agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflejo y grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflejo y garfio superior"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflejo y tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflejo y punto inferior"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, garfio superior"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punto inferior"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punto inferior"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, garfio superior"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflejo y agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflejo y grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflejo y garfio superior"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflejo y tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflejo y punto inferior"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, cuerno y agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, cuerno y grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, cuerno y garfio superior"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, cuerno y tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, cuerno y punto inferior"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punto inferior"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, garfio superior"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, cuerno y agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, cuerno y grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, cuerno y garfio superior"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, cuerno y tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, cuerno y punto inferior"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punto inferior"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, garfio superior"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Signo de exclamación de apertura"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Comillas angulares de apertura"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punto medio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Uno superíndice"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Comillas angulares de cierre"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Signo de interrogación de apertura"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Comilla simple de apertura"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Comilla simple de cierre"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Comilla simple baja"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Comillas dobles de apertura"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Comillas dobles de cierre"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obelisco"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Obelisco doble"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signo por mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prima"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prima doble"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Comilla simple angular de apertura"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Comilla simple angular de cierre"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Cuatro superíndice"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Letra n minúscula superíndice"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signo de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Porcentaje"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Flecha hacia la derecha"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Flecha hacia abajo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vacío"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor o igual que"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Mayor o igual que"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrella negra"</string> +</resources> diff --git a/java/res/values-es/strings-talkback-descriptions.xml b/java/res/values-es/strings-talkback-descriptions.xml new file mode 100644 index 000000000..ef959013f --- /dev/null +++ b/java/res/values-es/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Conecta un auricular para escuchar las contraseñas en voz alta."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"El texto actual es %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"No se ha introducido texto"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> a <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregirá la palabra automáticamente"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Carácter desconocido"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Mayús"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Más símbolos"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Mayús"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Símbolos"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Mayús"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Eliminar"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Símbolos"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letras"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Números"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ajustes"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Pestaña"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espacio"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrada de voz"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emojis"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Intro"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Buscar"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punto"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Cambiar idioma"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Siguiente"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Anterior"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Mayúsculas habilitadas"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Bloq Mayús habilitado"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modo de símbolos"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modo de más símbolos"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modo de letras"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modo de teléfono"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modo de símbolos de teléfono"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teclado oculto"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Mostrando teclado de <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"fecha"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"fecha y hora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"correo electrónico"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mensajes"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"número"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"teléfono"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"hora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recientes"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personas"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objetos"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Naturaleza"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Sitios"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticonos"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> mayúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I mayúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maýuscula, punto superior"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconocido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconocido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Caracteres alternativos disponibles"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Los caracteres alternativos se descartarán"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sugerencias alternativas disponibles"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Las sugerencias alternativas se descartarán"</string> +</resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 39b45e0c4..a385f9e6c 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones entrada texto"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro investigación"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Nombres de contactos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Añadir nombres de tu lista de contactos al corrector"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sonar al pulsar tecla"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Ampliar al pulsar tecla"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Corrección ortográfica"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Escritura gestual"</string> - <string name="misc_category" msgid="6894192814868233453">"Otras opciones"</string> - <string name="advanced_settings" msgid="362895144495591463">"Ajustes avanzados"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opciones para expertos"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Otros métodos de introducción"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"La tecla de cambio de idioma sirve también para otros métodos"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla para cambiar de idioma"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Predeterminado"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir contactos"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nombres de contactos para sugerencias y correcciones"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugerencias personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Mejorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punto y espacio"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Si tocas dos veces el espacio, se inserta un punto seguido de un espacio"</string> <string name="auto_cap" msgid="1719746674854628252">"Mayúsculas automáticas"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar recorrido del gesto"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa dinámica flotante"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver palabra sugerida al hacer gestos"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Conecta un auricular para escuchar las contraseñas en voz alta."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"El texto actual es %s."</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"No se ha introducido texto."</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"La tecla <xliff:g id="KEY">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> a <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"La tecla <xliff:g id="KEY">%1$s</xliff:g> corrige automáticamente"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Código del teclado: %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Mayús"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Mayúsculas activadas (tocar para inhabilitar)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Bloqueo de mayúsculas activado (tocar para inhabilitar)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Eliminar"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbolos"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letras"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Ajustes"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulador"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Barra espaciadora"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de voz"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Emoticono"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Tecla Intro"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Buscar"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punto"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Cambiar idioma"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Siguiente"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Anterior"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Mayúsculas habilitadas"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Bloqueo de mayúsculas habilitado"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Mayúsculas inhabilitadas"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modo de símbolos"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de letras"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de teléfono"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de teléfono"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"fecha"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"fecha y hora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"correo electrónico"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mensajes"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"teléfono"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gestos con tecla Espacio"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Desliza el dedo a Espacio para introducir espacios durante gestos"</string> <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada de voz"</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 de símbolos"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"No"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micrófono en teclado principal"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micrófono en teclado de símbolos"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Sin métodos de introducción de voz habilitados. Comprueba ajustes de Idioma e introducción de texto."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string> <string name="send_feedback" msgid="1780431884109392046">"Danos tu opinión"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de introducción"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca otra vez para guardar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar comentarios de usuarios"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ayuda a mejorar este editor de método de introducción de texto enviando estadísticas de uso e informes de error."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema de teclado"</string> <string name="subtype_en_GB" msgid="88170601942311355">"inglés (Reino Unido)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"inglés (EE.UU.)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Español (EE.UU.)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglés (Reino Unido) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglés (EE.UU.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Español (EE.UU.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés (Reino Unido) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés (EE.UU.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español (EE.UU.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cirílico)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latinoamérica)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Patrón de color"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Blanco"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Azul"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos de entrada personalizados"</string> <string name="add_style" msgid="6163126614514489951">"Añadir estilo"</string> <string name="add" msgid="8299699805688017798">"Añadir"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Habilitar"</string> <string name="not_now" msgid="6172462888202790482">"Ahora no"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ya existe el estilo de entrada <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>."</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo estudio de usabilidad"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Retraso de pulsación prolongada"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duración vibración al pulsar"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volumen sonido al pulsar tecla"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un archivo de diccionario para instalar"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"¿Seguro que quieres instalar este archivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"¿Seguro que quieres instalar este archivo para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Se ha producido un error"</string> <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Te damos la bienvenida a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> <string name="last_update" msgid="730467549913588780">"Última actualización"</string> <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string> - <string name="message_loading" msgid="8689096636874758814">"Cargando..."</string> + <string name="message_loading" msgid="5638680861387748936">"Cargando…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string> <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ajustes"</string> <string name="install_dict" msgid="180852772562189365">"Instalar"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, se pueden aplicar cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: puedes descargar y eliminar diccionarios en la sección <b>Idioma e introducción de texto</b> del menú <b>Ajustes</b> del dispositivo móvil."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mejorar la experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Es posible que se apliquen cargos si no tienes un <b>plan de datos ilimitado</b>.<br/> Si no sabes con certeza cuál es tu plan de datos, te recomendamos que te conectes a una red Wi-Fi para que la descarga empiece automáticamente.<br/> <br/> Consejo: Puedes descargar y eliminar diccionarios en la sección <b>Idioma e introducción de texto</b> en el menú <b>Ajustes</b> de tu dispositivo móvil."</string> <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar mediante Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hay disponible un diccionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsa para comprobar y descargar"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Descargando: las sugerencias de <xliff:g id="LANGUAGE">%1$s</xliff:g> estarán disponibles en breve."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"La descarga de sugerencias para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estará disponible próximamente."</string> <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Añadir"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Añadir al diccionario"</string> diff --git a/java/res/values-et-rEE/strings-action-keys.xml b/java/res/values-et-rEE/strings-action-keys.xml index 64ba6d6d7..12cd77a5d 100644 --- a/java/res/values-et-rEE/strings-action-keys.xml +++ b/java/res/values-et-rEE/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Eelm."</string> <string name="label_done_key" msgid="7564866296502630852">"Valmis"</string> <string name="label_send_key" msgid="482252074224462163">"Saada"</string> + <string name="label_search_key" msgid="7965186050435796642">"Otsing"</string> <string name="label_pause_key" msgid="2225922926459730642">"Peata"</string> <string name="label_wait_key" msgid="5891247853595466039">"Oota"</string> </resources> diff --git a/java/res/values-et-rEE/strings-config-important-notice.xml b/java/res/values-et-rEE/strings-config-important-notice.xml new file mode 100644 index 000000000..1c363d697 --- /dev/null +++ b/java/res/values-et-rEE/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Kommunikats. ja sisestatud andmetest õppimine soovit. täiustamiseks"</string> +</resources> diff --git a/java/res/values-et-rEE/strings-letter-descriptions.xml b/java/res/values-et-rEE/strings-letter-descriptions.xml new file mode 100644 index 000000000..ef37c0ce6 --- /dev/null +++ b/java/res/values-et-rEE/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Järgarvu naissoost tähis"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro tähis"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Järgarvu meessoost tähis"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Terav S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, graavis"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akuut"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, tsirkumfleks"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, treema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ülasõõr"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatuur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedii"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, graavis"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akuut"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, tsirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, treema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, graavis"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akuut"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, tsirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, treema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, graavis"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akuut"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, tsirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, treema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, kriips"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, graavis"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akuut"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, tsirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, treema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akuut"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, treema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breevis"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, pöördsedii"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akuut"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, tsirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ülapunkt"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, haak"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, haak"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, kriips"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breevis"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ülapunkt"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, pöördsedii"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, haak"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, tsirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breevis"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ülapunkt"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedii"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, tsirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, kriips"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breevis"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, pöördsedii"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Punktita I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatuur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, tsirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedii"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akuut"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedii"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, haak"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punkt keskel"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, kriips"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akuut"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedii"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, haak"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, millele eelneb ülakoma"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breevis"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, topeltakuut"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatuur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akuut"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedii"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, haak"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akuut"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, tsirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedii"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, haak"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedii"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, haak"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, kriips"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breevis"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ülasõõr"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, topeltakuut"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, pöördsedii"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, tsirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, tsirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akuut"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ülapunkt"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, haak"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Pikk S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, sarv"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, sarv"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, alakoma"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, alakoma"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Švaa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, alapunkt"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ülakonks"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, tsirkumfleks ja akuut"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, tsirkumfleks ja graavis"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, tsirkumfleks ja ülakonks"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, tsirkumfleks ja tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, tsirkumfleks ja alapunkt"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breevis ja akuut"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breevis ja graavis"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breevis ja ülakonks"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breevis ja tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breevis ja alapunkt"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, alapunkt"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ülakonks"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, tsirkumfleks ja akuut"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, tsirkumfleks ja graavis"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, tsirkumfleks ja ülakonks"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, tsirkumfleks"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, tsirkumfleks ja alapunkt"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ülakonks"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, alapunkt"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, alapunkt"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ülakonks"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, tsirkumfleks ja akuut"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, tsirkumfleks ja graavis"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, tsirkumfleks ja ülakonks"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, tsirkumfleks ja tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, tsirkumfleks ja alapunkt"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, sarv ja akuut"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, sarv ja graavis"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, sarv ja ülakonks"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, sarv ja tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, sarv ja alapunkt"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, alapunkt"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ülakonks"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, sarv ja akuut"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, sarv ja graavis"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, sarv ja ülakonks"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, sarv ja tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, sarv ja alapunkt"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, graavis"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, alapunkt"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ülakonks"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Pöördhüüumärk"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Vasakule suunatud kahekordne nurkjutumärk"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Keskmine punkt"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Ülaindeks"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Paremale suunatud kahekordne nurkjutumärk"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Pöördküsimärk"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Vasak ühekordne jutumärk"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Parem ühekordne jutumärk"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ühekordne alumine üheksakujuline jutumärk"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Vasak kahekordne jutumärk"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Parem kahekordne jutumärk"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Rist"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Topeltrist"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promillimärk"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Priim"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Topeltpriim"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ühekordne vasakule suunatud nurkjutumärk"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Ühekordne paremale suunatud nurkjutumärk"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Ülaindeks neli"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Ülaindeks ladina väiketäht n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peesomärk"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Vahendusel"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Nool paremale"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Nool alla"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tühi hulk"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Samm"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Väiksem kui või võrdne"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Suurem kui või võrdne"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Must tärn"</string> +</resources> diff --git a/java/res/values-et-rEE/strings-talkback-descriptions.xml b/java/res/values-et-rEE/strings-talkback-descriptions.xml new file mode 100644 index 000000000..b47df1b1e --- /dev/null +++ b/java/res/values-et-rEE/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Parooliklahvide kuulamiseks ühendage peakomplekt."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Praegune tekst on %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Teksti ei ole sisestatud"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> parandab sõna <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> järgmiselt: <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> teeb automaatse paranduse"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Tundmatu tähemärk"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Tõstuklahv"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Rohkem sümboleid"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Tõstuklahv"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Sümbolid"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Tõstuklahv"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Kustutamine"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Sümbolid"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Tähed"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Numbrid"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Seaded"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulaator"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Tühik"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Häälsisend"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emotikon"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Tagasi"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Otsing"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punkt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Keele vahetamine"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Järgmine"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Eelmine"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Tõstuklahv on lubatud"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Suurtähelukk on lubatud"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Sümbolite režiim"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Režiim Rohkem sümboleid"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Tähtede režiim"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonirežiim"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefoni sümbolite režiim"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klaviatuur on peidetud"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Näitab klaviatuuri režiimil <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"kuupäev"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"kuupäev ja kellaaeg"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-post"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"sõnumiside"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"number"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"aeg"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Hiljutised"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Inimesed"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objektid"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Loodus"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Kohad"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Sümbolid"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikonid"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Suurtäht <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Suurtäht I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Suurtäht I, ülapunkt"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Tundmatu sümbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Tundmatu emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatiivsed tähemärgid on saadaval"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatiivsed tähemärgid eemaldatakse"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatiivsed soovitused on saadaval"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatiivsed soovitused eemaldatakse"</string> +</resources> diff --git a/java/res/values-et-rEE/strings.xml b/java/res/values-et-rEE/strings.xml index e0f992c0d..d57126d2d 100644 --- a/java/res/values-et-rEE/strings.xml +++ b/java/res/values-et-rEE/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Sisestusvalikud"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Uuringulogi käsud"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontakti nimede kontroll."</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Õigekirjakontroll kasutab teie kontaktisikute loendi sissekandeid"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibreeri klahvivajutusel"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Heli klahvivajutusel"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Klahvivajutusel kuva hüpik"</string> - <string name="general_category" msgid="1859088467017573195">"Üldine"</string> - <string name="correction_category" msgid="2236750915056607613">"Teksti parandamine"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Joonistusega sisestamine"</string> - <string name="misc_category" msgid="6894192814868233453">"Muud valikud"</string> - <string name="advanced_settings" msgid="362895144495591463">"Täpsemad seaded"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Valikud ekspertidele"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Vaheta sisestusmeetodit"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Keelevahetuse võti hõlmab ka muid sisestusmeetodeid"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Keelevahetuse nupp"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Süsteemi vaikeväärt."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Soovita kontaktkirjeid"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Kasuta soovitusteks ja parandusteks nimesid kontaktiloendist"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Isikupärast. soovitused"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Aita rakendust <xliff:g id="APPLICATION_NAME">%s</xliff:g> täiustada"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punkt tühikuklahviga"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tühikuklahvi kaks korda puudutades sisestatakse punkt ja tühik"</string> <string name="auto_cap" msgid="1719746674854628252">"Automaatne suurtähtede kasutamine"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Näita liigutuse jälge"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dünaamiline ujuv eelvaade"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Soovitatud sõna vaatamine joonistusega sisestamise ajal"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : salvestatud"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Ühendage peakomplekt, et kuulata paroole."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Praegune tekst on %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Teksti ei ole sisestatud"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Klahvi <xliff:g id="KEY">%1$s</xliff:g> vajutamisel parandatakse sõna <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> sõnaks <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Klahvi <xliff:g id="KEY">%1$s</xliff:g> vajutamisel tehakse automaatne parandus"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Klahvi kood: %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Tõstuklahv"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Tõstuklahv sees (puudutage keelamiseks)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Suurtähelukk on sees (puudutage keelamiseks)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Kustuta"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Sümbolid"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Tähed"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numbrid"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Seaded"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulaator"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Tühik"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Kõnesisend"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Naerunägu"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Tagasi"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Otsing"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punkt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Keele vahetamine"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Järgmine"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Eelmine"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Tõstuklahv on lubatud"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Suurtähelukk on lubatud"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Tõstuklahv on keelatud"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Sümbolite režiim"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Tähtede režiim"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonirežiim"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefoni sümbolite režiim"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klaviatuur on peidetud"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Näitab klaviatuuri režiimil <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"kuupäev"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"kuupäev ja kellaaeg"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"sõnumiside"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"number"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"aeg"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Fraasi liigutus"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sisestage liigutuste kasutamisel tühikuid, libistades tühikuklahvile"</string> <string name="voice_input" msgid="3583258583521397548">"Häälesisendi klahv"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Peamisel klaviatuuril"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sümbolite klaviatuuril"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Väljas"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon peamisel klaviatuuril"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikr. sümb. klaviat."</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Kõnesisend on keelatud"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Ühtegi häälsisendmeetodit pole lubatud. Kontrollige keele- ja sisendiseadeid."</string> <string name="configure_input_method" msgid="373356270290742459">"Sisestusmeetodite seadistamine"</string> <string name="language_selection_title" msgid="1651299598555326750">"Sisestuskeeled"</string> <string name="send_feedback" msgid="1780431884109392046">"Saatke tagasisidet"</string> <string name="select_language" msgid="3693815588777926848">"Sisestuskeeled"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Salvestamiseks puudutage uuesti"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sõnastik saadaval"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Luba kasutaja tagasiside"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Aidake seda sisestusmeetodi redigeerijat parandada, saates automaatselt kasutusstatistikat ja krahhiaruandeid."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Klaviatuuri teema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inglise (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inglise (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"hispaania (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglise (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglise (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"hispaania (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditsiooniline)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglise (Ühendk.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglise (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Hispaania (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditsiooniline)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kirillitsa)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ladina)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Keel puudub (tähestik)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Tähestik (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Tähestik (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Tähestik (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Tähestik (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emotikon"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Värviskeem"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Valge"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Sinine"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Kohandage sisendlaadid"</string> <string name="add_style" msgid="6163126614514489951">"Lisage laad"</string> <string name="add" msgid="8299699805688017798">"Lisa"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Luba"</string> <string name="not_now" msgid="6172462888202790482">"Mitte kohe"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Sama sisendstiil on juba olemas: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Kasutatavuse uurimisrežiim"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Pika klahvivajutuse viide"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Klahvivajutuse vibreerimise kestus"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Klahvivajutuse helitugevus"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Välise sõnastikufaili lugemine"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Kaustas Allalaadimised pole ühtegi sõnastikufaili"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Installitava sõnastikufaili valimine"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Kas soovite tõesti installida faili lokaadile <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Kas soovite tõesti installida faili <xliff:g id="LANGUAGE_NAME">%s</xliff:g> keele jaoks?"</string> <string name="error" msgid="8940763624668513648">"Ilmnes viga"</string> <string name="button_default" msgid="3988017840431881491">"Vaikeväärtus"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Tere tulemast rakendusse <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Värskenda"</string> <string name="last_update" msgid="730467549913588780">"Viimati värskendatud"</string> <string name="message_updating" msgid="4457761393932375219">"Värskenduste otsimine"</string> - <string name="message_loading" msgid="8689096636874758814">"Laadimine ..."</string> + <string name="message_loading" msgid="5638680861387748936">"Laadimine …"</string> <string name="main_dict_description" msgid="3072821352793492143">"Peamine sõnastik"</string> <string name="cancel" msgid="6830980399865683324">"Tühista"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Seaded"</string> <string name="install_dict" msgid="180852772562189365">"Installi"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Tühista"</string> <string name="delete_dict" msgid="756853268088330054">"Kustuta"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobiilseadmes valitud keelele on saadaval sõnastik.<br/> Teksti mugavamaks sisestamiseks soovitame <b>alla laadida</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> keele sõnastiku.<br/> <br/> 3G kaudu allalaadimisele võib kuluda minut või paar. Kehtida võivad tasud, kui te ei kasuta <b>piiramatut andmepaketti</b>.<br/> Kui te ei tea, millist andmepaketti kasutate, soovitame allalaadimise automaatseks käivitamiseks leida WiFi-ühenduse.<br/> <br/> Nõuanne: sõnastikke saate alla laadida ja eemaldada, tehes valiku <b>Keel ja sisestamine</b> mobiilseadme menüüs <b>Seaded</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Mobiilseadmes valitud keelele on saadaval sõnastik.<br/> Teksti mugavamaks sisestamiseks soovitame <b>alla laadida</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> keele sõnastiku.<br/> <br/> 3G kaudu allalaadimisele võib kuluda minut või paar. Kui te ei kasuta <b>piiramatut andmepaketti</b>, võivad rakenduda tasud.<br/> Kui te ei tea, millist andmepaketti kasutate, soovitame allalaadimise automaatseks käivitamiseks leida WiFi-ühenduse.<br/> <br/> Nõuanne: sõnastikke saate alla laadida ja eemaldada, tehes mobiilseadme menüüs <b>Seaded</b> valiku <b>Keel ja sisend</b>."</string> <string name="download_over_metered" msgid="1643065851159409546">"Laadi kohe alla (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Laadi alla WiFi kaudu"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Sõnastik on <xliff:g id="LANGUAGE">%1$s</xliff:g> keele jaoks saadaval"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Sõnastik on saadaval <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> keeles"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Vajutage ülevaatamiseks ja allalaadimiseks"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Allalaadimine: <xliff:g id="LANGUAGE">%1$s</xliff:g> keele soovitused on varsti saadaval."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Allalaadimine: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> keele soovitused on peagi saadaval."</string> <string name="version_text" msgid="2715354215568469385">"Versioon <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Lisa"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Sõnaraamatusse lisamine"</string> diff --git a/java/res/values-eu-rES/strings-action-keys.xml b/java/res/values-eu-rES/strings-action-keys.xml new file mode 100644 index 000000000..1fba5504a --- /dev/null +++ b/java/res/values-eu-rES/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Joan"</string> + <string name="label_next_key" msgid="5586407279258592635">"Aurrera"</string> + <string name="label_previous_key" msgid="1421141755779895275">"Atzera"</string> + <string name="label_done_key" msgid="7564866296502630852">"Eginda"</string> + <string name="label_send_key" msgid="482252074224462163">"Bidali"</string> + <string name="label_search_key" msgid="7965186050435796642">"Bilatu"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Pausatu"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Itxaron"</string> +</resources> diff --git a/java/res/values-eu-rES/strings-appname.xml b/java/res/values-eu-rES/strings-appname.xml new file mode 100644 index 000000000..41ec09baf --- /dev/null +++ b/java/res/values-eu-rES/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android teklatua (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android zuzentzaile ortografikoa (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android teklatuaren ezarpenak (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android zuzentzaile ortografikoaren ezarpenak (AOSP)"</string> +</resources> diff --git a/java/res/values-eu-rES/strings-config-important-notice.xml b/java/res/values-eu-rES/strings-config-important-notice.xml new file mode 100644 index 000000000..83d8fe5e5 --- /dev/null +++ b/java/res/values-eu-rES/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Iradokizunak hobetzeko, ikasi komunikazioetatik eta idazten duzunetik"</string> +</resources> diff --git a/java/res/values-eu-rES/strings-letter-descriptions.xml b/java/res/values-eu-rES/strings-letter-descriptions.xml new file mode 100644 index 000000000..11636cc42 --- /dev/null +++ b/java/res/values-eu-rES/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Adierazle ordinal femeninoa"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro ikurra"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Adierazle ordinal maskulinoa"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ahostuna"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A paroxitonoa"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A oxitonoa"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A zirkunflexua"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A tiletaduna"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A dieresiduna"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A goiko eraztunarekin"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A eta E ligatuak"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C hautsia"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E paroxitonoa"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E oxitonoa"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E zirkunflexua"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E dieresiduna"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I paroxitonoa"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I oxitonoa"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I zirkunflexua"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I dieresiduna"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N tiletaduna"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O paroxitonoa"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O oxitonoa"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O zirkunflexua"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O tiletaduna"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O dieresiduna"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O barraduna"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U paroxitonoa"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U oxitonoa"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U zirkunflexua"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U dieresiduna"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y paroxitonoa"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y dieresiduna"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A goi-marraduna"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A hautsia"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C oxitonoa"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C zirkunflexua"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C goi-puntuduna"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D barraduna"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E goi-marraduna"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E goi-puntuduna"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E hautsia"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G zirkunflexua"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G goi-puntuduna"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G hautsia"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H zirkunflexua"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H barraduna"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I tiletaduna"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I goi-marraduna"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I hautsia"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Punturik gabeko I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I eta J ligatuta"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J zirkunflexua"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K hautsia"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L oxitonoa"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L hautsia"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L erdiko puntuarekin"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L barraduna"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N oxitonoa"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N hautsia"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N aurreko apostrofoarekin"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O goi-marraduna"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O oxitono bikoitza"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O eta E ligatuta"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R oxitonoa"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R hautsia"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S oxitonoa"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S zirkunflexua"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S hautsia"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T hautsia"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T barraduna"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U tiletaduna"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U goi-marraduna"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U goi-eraztunarekin"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U oxitono bikoitza"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U hautsia"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W zirkunflexua"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y zirkunflexua"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z oxitonoa"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z goi-puntuduna"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S luzea"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O adarduna"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U adarduna"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S beheko komarekin"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T beheko komarekin"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A goi-puntuduna"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A goi-gakoduna"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A zirkunflexu eta oxitonoa"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A zirkunflexu eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A zirkunflexu eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A zirkunflexu eta tiletaduna"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A zirkunflexu eta goi-puntuduna"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A hautsi eta oxitonoa"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A hautsi eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A hautsi eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A hautsi eta tiletaduna"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A hautsi eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E behe-puntuduna"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E goi-gakoduna"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E tiletaduna"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E zirkunflexua eta oxitonoa"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E zirkunflexua eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E zirkunflexua eta goi-puntuduna"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E zirkunflexua eta tiletaduna"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E zirkunflexua eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I goi-gakoduna"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I behe-puntuduna"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O behe-puntuduna"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O goi-gakoduna"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O zirkunflexua eta oxitonoa"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O zirkunflexua eta paroxitonoa"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O zirkunflexua eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O zirkunflexua eta tiletaduna"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O zirkunflexua eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O adardun oxitonoa"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O adardun paroxitonoa"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O adardun goi-gakoduna"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O adardun tiletaduna"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O adardun behe-puntuduna"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U behe-puntuduna"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U goi-gakoduna"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U adardun oxitonoa"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U adardun paroxitonoa"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U adardun goi-gakoduna"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U adardun tiletaduna"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U adardun behe-puntuduna"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y paroxitonoa"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y behe-puntuduna"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y goi-gakoduna"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y tiletaduna"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Harridura-marka alderantzikatua"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ezkerreranzko bi angeludun komatxoa"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Erdiko puntua"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Bat goi-indizea"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Eskuineranzko bi angeludun komatxoa"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Galdera ikur alderantzikatua"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ezker-komatxo bakarra"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Eskuin-komatxo bakarra"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Akotazio baxuko komatxo bakarra"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ezker-komatxo bikoitza"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Eskuin-komatxo bikoitza"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obeliskoa"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Obelisko bikoitza"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Milakoen ikurra"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Komatxo soila"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Komatxo soil bikoitza"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ezkerreranzko angeludun komatxo bakarra"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Eskuineranzko angeludun komatxo bakarra"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Lau goi-indizea"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latindar txikia goi-indizea"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso ikurra"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"\"Care of\" ikurra"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Eskuineranzko gezia"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Beheranzko gezia"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Multzo hutsa"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Igoera"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"\"Baino gutxiago edo berdin\" ikurra"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"\"Baino gehiago edo berdin\" ikurra"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Izar beltza"</string> +</resources> diff --git a/java/res/values-eu-rES/strings-talkback-descriptions.xml b/java/res/values-eu-rES/strings-talkback-descriptions.xml new file mode 100644 index 000000000..949195d4c --- /dev/null +++ b/java/res/values-eu-rES/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Pasahitzak idazteko sakatzen dituzun teklak ozen entzuteko, konektatu entzungailuak."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Oraingo testua %s da"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ez da testurik idatzi"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> teklak \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" hitza \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\" bihurtzen du"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> teklak zuzenketa automatikoa egiten du"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Karaktere ezezaguna"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Maius"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Ikur gehiago"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maius"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Ikurrak"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Maius"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ezabatu"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Ikurrak"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Hizkiak"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Zenbakiak"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ezarpenak"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabuladorea"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Zuriunea"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Ahots bidezko idazketa"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emotikonoak"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Itzuli"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Bilatu"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Puntua"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Aldatu hizkuntza"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Hurrengoa"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Aurrekoa"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Maiuskulak aktibatuta"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Maiuskulak aktibatuta"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Ikurrak"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Ikur gehiagoren modua"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Hizkiak"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonoa"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefono-ikurrak"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teklatua ezkutatu da"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> teklatua erakusten"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data eta ordua"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"helbide elektronikoak"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mezuak"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"zenbakiak"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefono-zenbakiak"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"testua"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ordua"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URLak"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Azkenak"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Jendea"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objektuak"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natura"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tokiak"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Ikurrak"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikonoak 2"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiuskula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiuskula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiuskula goi-puntuduna"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ikur ezezaguna"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emotikono ezezaguna"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ordezko karaktereak erabilgarri daude"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ordezko karaktereak baztertu dira"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ordezko iradokizunak erabilgarri daude"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Ordezko iradokizunak baztertu dira"</string> +</resources> diff --git a/java/res/values-eu-rES/strings.xml b/java/res/values-eu-rES/strings.xml new file mode 100644 index 000000000..5db18a993 --- /dev/null +++ b/java/res/values-eu-rES/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Idazketa-aukerak"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Bilatu kontaktu-izenak"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Zuzentzaile ortografikoak kontaktuak erabiltzen ditu"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Egin dar-dar sakatzean"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Egin soinua tekla sakatzean"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Handitu teklak, sakatzean"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Aldatu idazketa-metodoa"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Hizkuntza aldatzeko teklak beste idazketa-metodoetarako ere balio du"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Hizkuntza aldatzeko tekla"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Erakutsi hainbat sarrera-hizkuntza gaituta daudenean"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Erakutsi lerratze-adierazlea"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Bistaratu ikusizko seinalea Maius edo Ikur tekletatik lerratzean"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Desagertzeko atzerapena"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Atzerapenik gabe"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Lehenetsia"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Sistemaren lehenespena"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Iradoki kontaktu-izenak"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Erabili kontaktuetako izenak iradokizunak eta zuzenketak egiteko"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Iradokizun pertsonalizatuak"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Hobetu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Zuriune bikoitzarekin puntu"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Zuriune-tekla bi aldiz sakatuta, puntua eta zuriunea txertatzen dira"</string> + <string name="auto_cap" msgid="1719746674854628252">"Maiuskula automatikoak"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Ezarri esaldi bakoitzaren lehenengo hizkia maiuskulaz"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Hiztegi pertsonala"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Hiztegi gehigarriak"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Hiztegi nagusia"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Erakutsi zuzenketa-iradokizunak"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Bistaratu iradokitako hitzak idatzi bitartean"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Erakutsi beti"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Erakutsi bertikalean"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ezkutatu beti"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Blokeatu hitz iraingarriak"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Ez iradoki iraingarria izan daitekeen hitzik"</string> + <string name="auto_correction" msgid="7630720885194996950">"Zuzenketa automatikoa"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Zuzendu auto. zuriuneak eta puntuazioa gaizki idatzitako hitzetan"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desaktibatu"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zuhurra"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Neurriz gainekoa"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Oso neurriz gainekoa"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Hurrengo hitza iradokitzea"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Erabili aurreko hitza iradokizunak egiteko"</string> + <string name="gesture_input" msgid="826951152254563827">"Gaitu keinu bidezko idazketa"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Idatzi hitzak hizki batetik bestera hatza lerratuta"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Erakutsi keinuaren bidea"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Flotatze dinamikodun aurrebista"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ikusi iradokitako hitza keinua egin bitartean"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Esaldi-keinua"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sartu zuriuneak keinuak egin bitartean zuriune-teklara lerratuta"</string> + <string name="voice_input" msgid="3583258583521397548">"Ahots bidezko idazketaren tekla"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Ez da ahots bidezko idazketa-metodorik gaitu. Egiaztatu Hizkuntza eta idazketa ataleko ezarpenak."</string> + <string name="configure_input_method" msgid="373356270290742459">"Konfiguratu idazketa-metodoak"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Idazketa-hizkuntzak"</string> + <string name="send_feedback" msgid="1780431884109392046">"Bidali oharrak"</string> + <string name="select_language" msgid="3693815588777926848">"Idazketa-hizkuntzak"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Gordetzeko, ukitu berriro"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Hiztegia erabilgarri"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Teklatuaren gaia"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"Ingelesa (Erresuma Batua)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"Ingelesa (AEB)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Gaztelania (AEB)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Ingelesa (Erresuma Batua) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Ingelesa (AEB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Gaztelania (AEB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradizionala)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (zirilikoa)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latindarra)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"Ez dago hizkuntzarik (alfabetoa)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabetoa (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabetoa (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Alfabetoa (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Alfabetoa (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabetoa (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabetoa (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emotikonoak"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Idazketa-estilo pertsonalizatuak"</string> + <string name="add_style" msgid="6163126614514489951">"Gehitu estiloa"</string> + <string name="add" msgid="8299699805688017798">"Gehitu"</string> + <string name="remove" msgid="4486081658752944606">"Kendu"</string> + <string name="save" msgid="7646738597196767214">"Gorde"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Hizkuntza"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Diseinua"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Idazketa-estilo pertsonalizatua gaitu behar duzu erabiltzen hasi aurretik. Estiloa gaitu nahi duzu?"</string> + <string name="enable" msgid="5031294444630523247">"Gaitu"</string> + <string name="not_now" msgid="6172462888202790482">"Orain ez"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Idazketa-estilo hori badago lehendik ere: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Tekla luze sakatzearen atzerapena"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Tekla sakatzearen dardararen iraupena"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Tekla sakatzearen bolumena"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Irakurri kanpoko hiztegi-fitxategia"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ez dago hiztegi-fitxategirik Deskargak karpetan"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Hautatu hiztegi-fitxategi bat instalatzeko"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Fitxategi hau <xliff:g id="LANGUAGE_NAME">%s</xliff:g> hizkuntzarako instalatu nahi duzu?"</string> + <string name="error" msgid="8940763624668513648">"Errore bat gertatu da"</string> + <string name="button_default" msgid="3988017840431881491">"Lehenetsia"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"Ongi etorri <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikaziora"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"Keinu bidezko idazketarekin"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Lehen urratsak"</string> + <string name="setup_next_action" msgid="371821437915144603">"Hurrengo urratsa"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> konfiguratzen"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"Gaitu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Egiaztatu \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" aplikazioa Hizkuntza eta idazketa-ezarpenetan. Horrek gailuan exekutatzea baimenduko dio."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikazioa gaituta duzu Hizkuntza eta idazketa-ezarpenetan eta, beraz, urratsa eginda dago. Ekin hurrengoari!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Gaitu Ezarpenak atalean"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"Aldatu <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikaziora"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Ondoren, hautatu \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" idazketa-metodo aktibo gisa."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Aldatu idazketa-metodoak"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Dena prest duzu!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Gogokoen dituzun aplikazioetan idatz dezakezu dagoeneko <xliff:g id="APPLICATION_NAME">%s</xliff:g> erabilita."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Konfiguratu hizkuntza gehigarriak"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Amaituta"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Erakutsi aplikazioaren ikonoa"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Bistaratu aplikazioaren ikonoa abiarazlean"</string> + <string name="app_name" msgid="6320102637491234792">"Hiztegi-hornitzailea"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Hiztegi-hornitzailea"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Hiztegi-zerbitzua"</string> + <string name="download_description" msgid="6014835283119198591">"Hiztegia eguneratzeko informazioa"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Hiztegi gehigarriak"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Hiztegia erabilgarri"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Hiztegien ezarpenak"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Erabiltzailearen hiztegiak"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Erabiltzailearen hiztegia"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Hiztegia erabilgarri"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Une honetan deskargatzen"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalatuta"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalatuta, desgaituta"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Arazoa gertatu da hiztegi-zerbitzuarekin konektatzean"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Ez dago hiztegirik erabilgarri"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Freskatu"</string> + <string name="last_update" msgid="730467549913588780">"Azken eguneratzea"</string> + <string name="message_updating" msgid="4457761393932375219">"Eguneratzeak bilatzen"</string> + <string name="message_loading" msgid="5638680861387748936">"Kargatzen…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hiztegi nagusia"</string> + <string name="cancel" msgid="6830980399865683324">"Utzi"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ezarpenak"</string> + <string name="install_dict" msgid="180852772562189365">"Instalatu"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Utzi"</string> + <string name="delete_dict" msgid="756853268088330054">"Ezabatu"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Gailu mugikorrerako hautatu duzun hizkuntzak hiztegi bat du erabilgarri.<br/> Idazketa-esperientzia hobetzeko, <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hiztegia <b>deskargatzea</b> gomendatzen dizugu.<br/> <br/> 3G bidez, deskargak minutu bat edo bi har ditzake. Baliteke gastu gehigarriak kobratzea <b>datu-plan mugagabea</b> ez baduzu.<br/> Ez badakizu ziur nolako datu-plana duzun, deskarga automatikoki hasteko, Wi-Fi konexio bat bilatzea gomendatzen dizugu.<br/> <br/> Aholkua: hiztegiak deskarga eta ken ditzakezu <b>Hizkuntza eta idazketa</b> atalera joanda, gailu mugikorreko <b>Ezarpenak</b> menuan."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Deskargatu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Deskargatu Wi-Fi bidez"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hizkuntzaren hiztegi bat erabilgarri dago"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Berrikusteko eta deskargatzeko, sakatu hau"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Deskargatzen: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hizkuntzaren iradokizunak laster egongo dira prest."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> bertsioa"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Gehitu"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Gehitu hiztegian"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Esaldia"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Aukera gehiago"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Aukera gutxiago"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Ados"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Hitza:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Lasterbidea:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Hizkuntza:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Idatzi hitz bat"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Aukerako lasterbidea"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Editatu hitza"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Editatu"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Ezabatu"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Ez duzu hitzik erabiltzailearen hiztegian. Hitzak gehitzeko, ukitu Gehitu (+) botoia."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Hizkuntza guztietan"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Hizkuntza gehiago…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Ezabatu"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings-action-keys.xml b/java/res/values-eu-rPV/strings-action-keys.xml new file mode 100644 index 000000000..1fba5504a --- /dev/null +++ b/java/res/values-eu-rPV/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Joan"</string> + <string name="label_next_key" msgid="5586407279258592635">"Aurrera"</string> + <string name="label_previous_key" msgid="1421141755779895275">"Atzera"</string> + <string name="label_done_key" msgid="7564866296502630852">"Eginda"</string> + <string name="label_send_key" msgid="482252074224462163">"Bidali"</string> + <string name="label_search_key" msgid="7965186050435796642">"Bilatu"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Pausatu"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Itxaron"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings-appname.xml b/java/res/values-eu-rPV/strings-appname.xml new file mode 100644 index 000000000..41ec09baf --- /dev/null +++ b/java/res/values-eu-rPV/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android teklatua (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android zuzentzaile ortografikoa (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android teklatuaren ezarpenak (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android zuzentzaile ortografikoaren ezarpenak (AOSP)"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings-config-important-notice.xml b/java/res/values-eu-rPV/strings-config-important-notice.xml new file mode 100644 index 000000000..83d8fe5e5 --- /dev/null +++ b/java/res/values-eu-rPV/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Iradokizunak hobetzeko, ikasi komunikazioetatik eta idazten duzunetik"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings-letter-descriptions.xml b/java/res/values-eu-rPV/strings-letter-descriptions.xml new file mode 100644 index 000000000..11636cc42 --- /dev/null +++ b/java/res/values-eu-rPV/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Adierazle ordinal femeninoa"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro ikurra"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Adierazle ordinal maskulinoa"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ahostuna"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A paroxitonoa"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A oxitonoa"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A zirkunflexua"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A tiletaduna"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A dieresiduna"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A goiko eraztunarekin"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A eta E ligatuak"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C hautsia"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E paroxitonoa"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E oxitonoa"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E zirkunflexua"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E dieresiduna"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I paroxitonoa"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I oxitonoa"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I zirkunflexua"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I dieresiduna"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N tiletaduna"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O paroxitonoa"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O oxitonoa"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O zirkunflexua"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O tiletaduna"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O dieresiduna"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O barraduna"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U paroxitonoa"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U oxitonoa"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U zirkunflexua"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U dieresiduna"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y paroxitonoa"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y dieresiduna"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A goi-marraduna"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A hautsia"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C oxitonoa"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C zirkunflexua"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C goi-puntuduna"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D barraduna"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E goi-marraduna"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E goi-puntuduna"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E hautsia"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G zirkunflexua"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G goi-puntuduna"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G hautsia"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H zirkunflexua"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H barraduna"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I tiletaduna"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I goi-marraduna"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I hautsia"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Punturik gabeko I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I eta J ligatuta"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J zirkunflexua"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K hautsia"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L oxitonoa"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L hautsia"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L erdiko puntuarekin"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L barraduna"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N oxitonoa"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N hautsia"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N aurreko apostrofoarekin"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O goi-marraduna"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O oxitono bikoitza"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O eta E ligatuta"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R oxitonoa"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R hautsia"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S oxitonoa"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S zirkunflexua"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S hautsia"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T hautsia"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T barraduna"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U tiletaduna"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U goi-marraduna"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U goi-eraztunarekin"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U oxitono bikoitza"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U hautsia"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W zirkunflexua"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y zirkunflexua"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z oxitonoa"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z goi-puntuduna"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z alderantzizko zirkunflexuarekin"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S luzea"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O adarduna"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U adarduna"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S beheko komarekin"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T beheko komarekin"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A goi-puntuduna"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A goi-gakoduna"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A zirkunflexu eta oxitonoa"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A zirkunflexu eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A zirkunflexu eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A zirkunflexu eta tiletaduna"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A zirkunflexu eta goi-puntuduna"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A hautsi eta oxitonoa"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A hautsi eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A hautsi eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A hautsi eta tiletaduna"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A hautsi eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E behe-puntuduna"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E goi-gakoduna"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E tiletaduna"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E zirkunflexua eta oxitonoa"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E zirkunflexua eta paroxitonoa"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E zirkunflexua eta goi-puntuduna"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E zirkunflexua eta tiletaduna"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E zirkunflexua eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I goi-gakoduna"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I behe-puntuduna"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O behe-puntuduna"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O goi-gakoduna"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O zirkunflexua eta oxitonoa"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O zirkunflexua eta paroxitonoa"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O zirkunflexua eta goi-gakoduna"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O zirkunflexua eta tiletaduna"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O zirkunflexua eta behe-puntuduna"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O adardun oxitonoa"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O adardun paroxitonoa"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O adardun goi-gakoduna"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O adardun tiletaduna"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O adardun behe-puntuduna"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U behe-puntuduna"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U goi-gakoduna"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U adardun oxitonoa"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U adardun paroxitonoa"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U adardun goi-gakoduna"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U adardun tiletaduna"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U adardun behe-puntuduna"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y paroxitonoa"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y behe-puntuduna"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y goi-gakoduna"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y tiletaduna"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Harridura-marka alderantzikatua"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ezkerreranzko bi angeludun komatxoa"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Erdiko puntua"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Bat goi-indizea"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Eskuineranzko bi angeludun komatxoa"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Galdera ikur alderantzikatua"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ezker-komatxo bakarra"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Eskuin-komatxo bakarra"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Akotazio baxuko komatxo bakarra"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ezker-komatxo bikoitza"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Eskuin-komatxo bikoitza"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obeliskoa"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Obelisko bikoitza"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Milakoen ikurra"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Komatxo soila"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Komatxo soil bikoitza"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ezkerreranzko angeludun komatxo bakarra"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Eskuineranzko angeludun komatxo bakarra"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Lau goi-indizea"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latindar txikia goi-indizea"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso ikurra"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"\"Care of\" ikurra"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Eskuineranzko gezia"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Beheranzko gezia"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Multzo hutsa"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Igoera"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"\"Baino gutxiago edo berdin\" ikurra"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"\"Baino gehiago edo berdin\" ikurra"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Izar beltza"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings-talkback-descriptions.xml b/java/res/values-eu-rPV/strings-talkback-descriptions.xml new file mode 100644 index 000000000..949195d4c --- /dev/null +++ b/java/res/values-eu-rPV/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Pasahitzak idazteko sakatzen dituzun teklak ozen entzuteko, konektatu entzungailuak."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Oraingo testua %s da"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ez da testurik idatzi"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> teklak \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" hitza \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\" bihurtzen du"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> teklak zuzenketa automatikoa egiten du"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Karaktere ezezaguna"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Maius"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Ikur gehiago"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maius"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Ikurrak"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Maius"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ezabatu"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Ikurrak"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Hizkiak"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Zenbakiak"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ezarpenak"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabuladorea"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Zuriunea"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Ahots bidezko idazketa"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emotikonoak"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Itzuli"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Bilatu"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Puntua"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Aldatu hizkuntza"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Hurrengoa"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Aurrekoa"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Maiuskulak aktibatuta"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Maiuskulak aktibatuta"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Ikurrak"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Ikur gehiagoren modua"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Hizkiak"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonoa"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefono-ikurrak"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teklatua ezkutatu da"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> teklatua erakusten"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data eta ordua"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"helbide elektronikoak"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mezuak"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"zenbakiak"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefono-zenbakiak"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"testua"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ordua"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URLak"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Azkenak"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Jendea"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objektuak"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natura"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tokiak"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Ikurrak"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikonoak 2"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiuskula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiuskula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiuskula goi-puntuduna"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ikur ezezaguna"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emotikono ezezaguna"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ordezko karaktereak erabilgarri daude"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ordezko karaktereak baztertu dira"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ordezko iradokizunak erabilgarri daude"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Ordezko iradokizunak baztertu dira"</string> +</resources> diff --git a/java/res/values-eu-rPV/strings.xml b/java/res/values-eu-rPV/strings.xml new file mode 100644 index 000000000..5db18a993 --- /dev/null +++ b/java/res/values-eu-rPV/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Idazketa-aukerak"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Bilatu kontaktu-izenak"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Zuzentzaile ortografikoak kontaktuak erabiltzen ditu"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Egin dar-dar sakatzean"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Egin soinua tekla sakatzean"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Handitu teklak, sakatzean"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Aldatu idazketa-metodoa"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Hizkuntza aldatzeko teklak beste idazketa-metodoetarako ere balio du"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Hizkuntza aldatzeko tekla"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Erakutsi hainbat sarrera-hizkuntza gaituta daudenean"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Erakutsi lerratze-adierazlea"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Bistaratu ikusizko seinalea Maius edo Ikur tekletatik lerratzean"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Desagertzeko atzerapena"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Atzerapenik gabe"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Lehenetsia"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Sistemaren lehenespena"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Iradoki kontaktu-izenak"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Erabili kontaktuetako izenak iradokizunak eta zuzenketak egiteko"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Iradokizun pertsonalizatuak"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Hobetu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Zuriune bikoitzarekin puntu"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Zuriune-tekla bi aldiz sakatuta, puntua eta zuriunea txertatzen dira"</string> + <string name="auto_cap" msgid="1719746674854628252">"Maiuskula automatikoak"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Ezarri esaldi bakoitzaren lehenengo hizkia maiuskulaz"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Hiztegi pertsonala"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Hiztegi gehigarriak"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Hiztegi nagusia"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Erakutsi zuzenketa-iradokizunak"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Bistaratu iradokitako hitzak idatzi bitartean"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Erakutsi beti"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Erakutsi bertikalean"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ezkutatu beti"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Blokeatu hitz iraingarriak"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Ez iradoki iraingarria izan daitekeen hitzik"</string> + <string name="auto_correction" msgid="7630720885194996950">"Zuzenketa automatikoa"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Zuzendu auto. zuriuneak eta puntuazioa gaizki idatzitako hitzetan"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desaktibatu"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Zuhurra"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Neurriz gainekoa"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Oso neurriz gainekoa"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Hurrengo hitza iradokitzea"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Erabili aurreko hitza iradokizunak egiteko"</string> + <string name="gesture_input" msgid="826951152254563827">"Gaitu keinu bidezko idazketa"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Idatzi hitzak hizki batetik bestera hatza lerratuta"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Erakutsi keinuaren bidea"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Flotatze dinamikodun aurrebista"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ikusi iradokitako hitza keinua egin bitartean"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Esaldi-keinua"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sartu zuriuneak keinuak egin bitartean zuriune-teklara lerratuta"</string> + <string name="voice_input" msgid="3583258583521397548">"Ahots bidezko idazketaren tekla"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Ez da ahots bidezko idazketa-metodorik gaitu. Egiaztatu Hizkuntza eta idazketa ataleko ezarpenak."</string> + <string name="configure_input_method" msgid="373356270290742459">"Konfiguratu idazketa-metodoak"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Idazketa-hizkuntzak"</string> + <string name="send_feedback" msgid="1780431884109392046">"Bidali oharrak"</string> + <string name="select_language" msgid="3693815588777926848">"Idazketa-hizkuntzak"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Gordetzeko, ukitu berriro"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Hiztegia erabilgarri"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Teklatuaren gaia"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"Ingelesa (Erresuma Batua)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"Ingelesa (AEB)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Gaztelania (AEB)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Ingelesa (Erresuma Batua) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Ingelesa (AEB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Gaztelania (AEB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradizionala)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (zirilikoa)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latindarra)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"Ez dago hizkuntzarik (alfabetoa)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabetoa (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabetoa (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Alfabetoa (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Alfabetoa (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabetoa (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabetoa (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emotikonoak"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Idazketa-estilo pertsonalizatuak"</string> + <string name="add_style" msgid="6163126614514489951">"Gehitu estiloa"</string> + <string name="add" msgid="8299699805688017798">"Gehitu"</string> + <string name="remove" msgid="4486081658752944606">"Kendu"</string> + <string name="save" msgid="7646738597196767214">"Gorde"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Hizkuntza"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Diseinua"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Idazketa-estilo pertsonalizatua gaitu behar duzu erabiltzen hasi aurretik. Estiloa gaitu nahi duzu?"</string> + <string name="enable" msgid="5031294444630523247">"Gaitu"</string> + <string name="not_now" msgid="6172462888202790482">"Orain ez"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Idazketa-estilo hori badago lehendik ere: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Tekla luze sakatzearen atzerapena"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Tekla sakatzearen dardararen iraupena"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Tekla sakatzearen bolumena"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Irakurri kanpoko hiztegi-fitxategia"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ez dago hiztegi-fitxategirik Deskargak karpetan"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Hautatu hiztegi-fitxategi bat instalatzeko"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Fitxategi hau <xliff:g id="LANGUAGE_NAME">%s</xliff:g> hizkuntzarako instalatu nahi duzu?"</string> + <string name="error" msgid="8940763624668513648">"Errore bat gertatu da"</string> + <string name="button_default" msgid="3988017840431881491">"Lehenetsia"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"Ongi etorri <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikaziora"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"Keinu bidezko idazketarekin"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Lehen urratsak"</string> + <string name="setup_next_action" msgid="371821437915144603">"Hurrengo urratsa"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> konfiguratzen"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"Gaitu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Egiaztatu \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" aplikazioa Hizkuntza eta idazketa-ezarpenetan. Horrek gailuan exekutatzea baimenduko dio."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikazioa gaituta duzu Hizkuntza eta idazketa-ezarpenetan eta, beraz, urratsa eginda dago. Ekin hurrengoari!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Gaitu Ezarpenak atalean"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"Aldatu <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikaziora"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Ondoren, hautatu \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" idazketa-metodo aktibo gisa."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Aldatu idazketa-metodoak"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Dena prest duzu!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Gogokoen dituzun aplikazioetan idatz dezakezu dagoeneko <xliff:g id="APPLICATION_NAME">%s</xliff:g> erabilita."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Konfiguratu hizkuntza gehigarriak"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Amaituta"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Erakutsi aplikazioaren ikonoa"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Bistaratu aplikazioaren ikonoa abiarazlean"</string> + <string name="app_name" msgid="6320102637491234792">"Hiztegi-hornitzailea"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Hiztegi-hornitzailea"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Hiztegi-zerbitzua"</string> + <string name="download_description" msgid="6014835283119198591">"Hiztegia eguneratzeko informazioa"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Hiztegi gehigarriak"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Hiztegia erabilgarri"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Hiztegien ezarpenak"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Erabiltzailearen hiztegiak"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Erabiltzailearen hiztegia"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Hiztegia erabilgarri"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Une honetan deskargatzen"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalatuta"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalatuta, desgaituta"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Arazoa gertatu da hiztegi-zerbitzuarekin konektatzean"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Ez dago hiztegirik erabilgarri"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Freskatu"</string> + <string name="last_update" msgid="730467549913588780">"Azken eguneratzea"</string> + <string name="message_updating" msgid="4457761393932375219">"Eguneratzeak bilatzen"</string> + <string name="message_loading" msgid="5638680861387748936">"Kargatzen…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hiztegi nagusia"</string> + <string name="cancel" msgid="6830980399865683324">"Utzi"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ezarpenak"</string> + <string name="install_dict" msgid="180852772562189365">"Instalatu"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Utzi"</string> + <string name="delete_dict" msgid="756853268088330054">"Ezabatu"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Gailu mugikorrerako hautatu duzun hizkuntzak hiztegi bat du erabilgarri.<br/> Idazketa-esperientzia hobetzeko, <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hiztegia <b>deskargatzea</b> gomendatzen dizugu.<br/> <br/> 3G bidez, deskargak minutu bat edo bi har ditzake. Baliteke gastu gehigarriak kobratzea <b>datu-plan mugagabea</b> ez baduzu.<br/> Ez badakizu ziur nolako datu-plana duzun, deskarga automatikoki hasteko, Wi-Fi konexio bat bilatzea gomendatzen dizugu.<br/> <br/> Aholkua: hiztegiak deskarga eta ken ditzakezu <b>Hizkuntza eta idazketa</b> atalera joanda, gailu mugikorreko <b>Ezarpenak</b> menuan."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Deskargatu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Deskargatu Wi-Fi bidez"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hizkuntzaren hiztegi bat erabilgarri dago"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Berrikusteko eta deskargatzeko, sakatu hau"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Deskargatzen: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> hizkuntzaren iradokizunak laster egongo dira prest."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> bertsioa"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Gehitu"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Gehitu hiztegian"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Esaldia"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Aukera gehiago"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Aukera gutxiago"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Ados"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Hitza:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Lasterbidea:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Hizkuntza:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Idatzi hitz bat"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Aukerako lasterbidea"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Editatu hitza"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Editatu"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Ezabatu"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Ez duzu hitzik erabiltzailearen hiztegian. Hitzak gehitzeko, ukitu Gehitu (+) botoia."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Hizkuntza guztietan"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Hizkuntza gehiago…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Ezabatu"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-fa-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/res/values-fa-sw600dp/donottranslate-config-spacing-and-punctuations.xml new file mode 100644 index 000000000..d7aca6fb4 --- /dev/null +++ b/java/res/values-fa-sw600dp/donottranslate-config-spacing-and-punctuations.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- The all letters need to be mirrored are found at + http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt --> + <!-- Symbols that are suggested between words --> + <!-- U+061F: "؟" ARABIC QUESTION MARK + U+061B: "؛" ARABIC SEMICOLON --> + <string name="suggested_punctuations">!,؟,:,؛,\",\',(|),)|(,-,/,@,_</string> +</resources> diff --git a/java/res/values-fa/donottranslate-config-spacing-and-punctuations.xml b/java/res/values-fa/donottranslate-config-spacing-and-punctuations.xml new file mode 100644 index 000000000..21bb3318f --- /dev/null +++ b/java/res/values-fa/donottranslate-config-spacing-and-punctuations.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- The all letters need to be mirrored are found at + http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt --> + <!-- Symbols that are suggested between words --> + <!-- U+061F: "؟" ARABIC QUESTION MARK + U+060C: "،" ARABIC COMMA + U+061B: "؛" ARABIC SEMICOLON --> + <string name="suggested_punctuations">!,؟,،,:,؛,\",(|),)|(,\',-,/,@,_</string> +</resources> diff --git a/java/res/values-fa/strings-action-keys.xml b/java/res/values-fa/strings-action-keys.xml index 78faa8c0b..859877c89 100644 --- a/java/res/values-fa/strings-action-keys.xml +++ b/java/res/values-fa/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"قبلی"</string> <string name="label_done_key" msgid="7564866296502630852">"اتمام"</string> <string name="label_send_key" msgid="482252074224462163">"ارسال"</string> + <string name="label_search_key" msgid="7965186050435796642">"جستجو"</string> <string name="label_pause_key" msgid="2225922926459730642">"مکث"</string> <string name="label_wait_key" msgid="5891247853595466039">"انتظار"</string> </resources> diff --git a/java/res/values-fa/strings-config-important-notice.xml b/java/res/values-fa/strings-config-important-notice.xml new file mode 100644 index 000000000..22a50cd4a --- /dev/null +++ b/java/res/values-fa/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"یادگیری از ارتباطات و اطلاعات تایپ شده شما برای بهبود پیشنهادات"</string> +</resources> diff --git a/java/res/values-fa/strings-letter-descriptions.xml b/java/res/values-fa/strings-letter-descriptions.xml new file mode 100644 index 000000000..4687f1be0 --- /dev/null +++ b/java/res/values-fa/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"نشانگر ترتیبی زنانه"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"علامت میکرو"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"نشانگر ترتیبی مردانه"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"شارپ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A با اکسان گراو"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A با اکسان اگو"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A با هشتک"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A با مدک"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A با دو نقطه"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A با حلقه"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A، E متصل به هم"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C با سدیلا"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E با اکسان گراو"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E با اکسان اگو"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E با هشتک"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E با دو نقطه"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I با اکسان گراو"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I با اکسان اگو"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I با هشتک"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I با دونقطه"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N با مدک"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O با اکسان گراو"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O با اکسان اگو"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O با هشتک"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O با مدک"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O با دونقطه"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O با خط مورب"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U با اکسان گراو"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U با اکسان اگو"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U با هشتک"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U با دو نقطه"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y با اکسان اگو"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y با دو نقطه"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A با ماکرون"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A کوتاه"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A با اگنک"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C با اکسان اگو"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C با هشتک"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C با نقطه"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C با هفتک"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D با هفتک"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D با خط مورب"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E با ماکرون"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E کوتاه"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E با نقطه"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E با اگنک"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E با هفتک"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G با هشتک"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G کوتاه"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G با نقطه"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G با سدیلا"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H با هشتک"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H با خط مورب"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I با مدک"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I با ماکرون"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I کوتاه"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I با اگنک"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I بینقطه"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I، J متصل به هم"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"I با هشتک"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K با سدیلا"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L با اکسان اگو"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L با سدیلا"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L با هفتک"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L با نقطه وسط"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L با خط مورب"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N با اکسان اگو"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N با سدیلا"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N با هفتک"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N بعد از آپاستراف"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O با ماکرون"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O کوتاه"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O با اکسان اگوی دوتایی"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O، E متصل به هم"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R با اکسان اگو"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R با سدیلا"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R با هفتک"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S با اکسان اگو"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S با هشتک"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S با سدیلا"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S با هفتک"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T با سدیلا"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T با کارون"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T با خط مورب"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U با مدک"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U با ماکرون"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U کوتاه"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U با حلقه"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U با اکسان اگو دوتایی"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U با اگنک"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W با هشتک"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y با هشتک"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z با اکسان اگو"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z با دو نقطه"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z با هفتک"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S طولانی"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O با شاخ"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U با شاخ"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S با کامای زیرین"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T با کامای زیرین"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"واکه بیرنگ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A با نقطه زیرین"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A با کروشه بالایی"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A با هشتک و اکسان اگو"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A با هشتک و اکسان گراو"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A با هشتک و کروشه بالایی"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A با هشتک و مدک"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A با هشتک و نقطه زیرین"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A کوتاه با اکسان اگو"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A کوتاه با اکسان گراو"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A کوتاه با کروشه بالایی"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A کوتاه با مدک"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A کوتاه با نقطه زیرین"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E با نقطه زیرین"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E با کروشه بالایی"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E با مدک"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E با هشتک و اکسان اگو"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E با هشتک و اکسان گراو"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E با هشتک و کروشه بالایی"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E با هشتک و مدک"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E با هشتک و نقطه زیرین"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I با کروشه بالایی"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I با نقطه زیرین"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O با نقطه زیرین"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O با کروشه بالایی"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O با هشتک و اکسان اگو"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O با هشتک و اکسان گراو"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O با هشتک و کروشه بالایی"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O با هشتک و مدک"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O با هشتک و نقطه زیرین"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O با شاخ و اکسان اگو"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O با شاخ و اکسان گراو"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O با شاخ و کروشه بالایی"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O با شاخ و مدک"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O با شاخ و نقطه زیرین"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U با نقطه زیرین"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U با کروشه بالایی"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U با شاخ و اکسان اگو"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U با شاخ و اکسان گراو"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U با شاخ و کروشه بالایی"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U با شاخ و مدک"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U با شاخ و نقطه زیرین"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y اکسان گراو"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y با نقطه زیرین"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y با کروشه بالایی"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y با مدک"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"علامت تعجب وارونه"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"گیومه رو به چپ"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"نقطه وسط"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"بالانویس یک"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"گیومه رو به راست"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"علامت سؤال وارونه"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"علامت نقل قول تکی سمت چپ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"علامت نقل قول تکی سمت راست"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"علامت نقل قول تکی ۹ پایین"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"علامت نقل قول دوتایی سمت چپ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"علامت نقل قول دوتایی سمت راست"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"نماد خنجر"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"نماد خنجر دوتایی"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"علامت در هزار"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"پریم"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"پریم دوتایی"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"گیومه تکی رو به چپ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"گیومه تکی رو به راست"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"بالانویس چهار"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"بالانویس حرف n کوچک لاتین"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"علامت پسو"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"توسط"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"پیکان سمت راست"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"پیکان رو به پایین"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"مجموعه تهی"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"افزایش"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"کمتر یا مساوی"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"بزرگتر یا مساوی"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ستاره سیاه"</string> +</resources> diff --git a/java/res/values-fa/strings-talkback-descriptions.xml b/java/res/values-fa/strings-talkback-descriptions.xml new file mode 100644 index 000000000..988dd5cd1 --- /dev/null +++ b/java/res/values-fa/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده میشوند، از هدست استفاده کنید."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"نوشتار کنونی %s است"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"نوشتاری وارد نشده است"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>، <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> را به <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> تصحیح میکند"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> تصحیح خودکار را انجام میدهد"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"نویسه نامشخص"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"نمادهای بیشتر"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"تبدیل"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"نمادها"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"تبدیل"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"حذف"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"نمادها"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"حروف"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"اعداد"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"تنظیمات"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"فاصله"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ورودی صدا"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"شکلک Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"بازگشت"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"جستجو"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"نقطه"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"تغییر زبان"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"بعدی"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"قبلی"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift فعال شد"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock فعال شد"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"حالت نمادها"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"حالت نمادهای بیشتر"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"حالت حروف"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"حالت تلفن"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"حالت نمادهای تلفن"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"صفحهکلید پنهان است"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"در حال نمایش صفحهکلید <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"تاریخ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"تاریخ و زمان"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ایمیل"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"پیامرسانی"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"عدد"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"تلفن"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"نوشتار"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"زمان"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"نشانی اینترنتی"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"موارد اخیر"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"افراد"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"اشیاء"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"طبیعت"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"مکانها"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"نمادها"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"شکلکها"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"حرف بزرگ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I بزرگ"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I بزرگ با نقطه بالایی"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"نماد نامشخص"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"شکلک emoji نامشخص"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"نویسههای جایگزین در دسترس هستند"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"از نویسههای جایگزین صرفنظر میشود"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"پیشنهادهای جایگزین در دسترس هستند"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"از پیشنهادهای جایگزین صرفنظر میشود"</string> +</resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index af886ef8c..1ce5ad220 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"گزینههای ورودی"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"فرمانهای گزارشگیری پژوهش"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"جستجوی نام مخاطبین"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"غلطگیر املا از ورودیهای لیست مخاطبین شما استفاده میکند"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"لرزش با فشار کلید"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"صدا با فشار کلید"</string> <string name="popup_on_keypress" msgid="123894815723512944">"بازشدن با فشار کلید"</string> - <string name="general_category" msgid="1859088467017573195">"کلی"</string> - <string name="correction_category" msgid="2236750915056607613">"تصحیح متن"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"تایپ حرکتی"</string> - <string name="misc_category" msgid="6894192814868233453">"سایر گزینهها"</string> - <string name="advanced_settings" msgid="362895144495591463">"تنظیمات پیشرفته"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"گزینههایی برای حرفهایها"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"تغییر به دیگر روشهای ورودی"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"کلید تغییر زبان، سایر ورودیهای زبان را نیز پوشش میدهد"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"کلید تغییر زبان"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"پیشفرض سیستم"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"پیشنهاد نامهای مخاطب"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"پیشنهادات شخصی شده"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"بهبود <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"نقطه با دو فاصله"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"با دوبار ضربه روی دکمه فاصله نقطه با یک فاصله بعد آن درج میشود"</string> <string name="auto_cap" msgid="1719746674854628252">"بزرگکردن خودکار حروف"</string> @@ -73,76 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"نمایش نسخه آزمایشی حرکت"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"پیشنمایش متحرک پویا"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"مشاهده کلمه پیشنهادی در حین انجام حرکات"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ذخیره شد"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"برای شنیدن کلیدهای گذرواژه که با صدای بلند خوانده میشوند، از هدست استفاده کنید."</string> - <!-- String.format failed for translation --> - <!-- no translation found for spoken_current_text_is (2485723011272583845) --> - <skip /> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"متنی وارد نشده است"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g>، <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> را به <xliff:g id="CORRECTED">%3$s</xliff:g> تصحیح میکند"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> تصحیح خودکار را انجام میدهد"</string> - <!-- String.format failed for translation --> - <!-- no translation found for spoken_description_unknown (3197434010402179157) --> - <skip /> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift فعال است (برای غیرفعال کردن ضربه بزنید)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock روشن است (برای غیرفعال کردن ضربه بزنید)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"نمادها"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"حروف"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"اعداد"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"تنظیمات"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"فاصله"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"ورودی صدا"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"صورت متبسم"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"جستجو"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"نقطه"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"تغییر زبان"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"بعدی"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"قبلی"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift فعال است"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock فعال شد"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift غیرفعال است"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"حالت نمادها"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"حالت حروف"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"حالت تلفن"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"حالت نمادهای تلفن"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"صفحه کلید پنهان شد"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"نمایش صفحه کلید <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"تاریخ"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"تاریخ و زمان"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"ایمیل"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"پیامرسانی"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"عدد"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"تلفن"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"نوشتار"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"زمان"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"نشانی اینترنتی"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ورود عبارت با حرکت اشارهای"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"با سراندن انگشت به کلید فاصله در زمان اشارهها، فاصله را وارد کنید"</string> <string name="voice_input" msgid="3583258583521397548">"کلید ورودی صدا"</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="voice_input_disabled_summary" msgid="8141750303464726129">"هیچ روش ورودی صوتی فعال نشده است. تنظیمات زبان و ورودی را بررسی کنید."</string> <string name="configure_input_method" msgid="373356270290742459">"پیکربندی روشهای ورودی"</string> <string name="language_selection_title" msgid="1651299598555326750">"زبانهای ورودی"</string> <string name="send_feedback" msgid="1780431884109392046">"ارسال بازخورد"</string> <string name="select_language" msgid="3693815588777926848">"زبانهای ورودی"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"برای ذخیره دوباره لمس کنید"</string> <string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"با ارسال خودکار آمار استفاده و گزارشهای خرابی، به بهبود این ویرایشگر روش ورودی کمک کنید"</string> <string name="keyboard_layout" msgid="8451164783510487501">"طرح زمینه صفحهکلید"</string> <string name="subtype_en_GB" msgid="88170601942311355">"انگلیسی (بریتانیا)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"انگلیسی (امریکا)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"اسپانیایی (آمریکا)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"انگلیسی (انگلستان) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"انگلیسی (ایالات متحده) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"اسپانیایی (آمریکا) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (سنتی)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"انگلیسی (بریتانیا) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"انگلیسی (آمریکا) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"اسپانیایی (آمریکا) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (سنتی)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (سیریلیک)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (لاتین)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"بدون زبان (حروف الفبا)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"حروف الفبا (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"حروف الفبا (QWERTZ)"</string> @@ -151,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"حروف الفبا (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"حروف الفبا (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"رنگبندی"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"سفید"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"آبی"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"سبکهای ورودی سفارشی"</string> <string name="add_style" msgid="6163126614514489951">"افزودن سبک"</string> <string name="add" msgid="8299699805688017798">"افزودن"</string> @@ -165,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"فعال کردن"</string> <string name="not_now" msgid="6172462888202790482">"الآن نه"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"سبک ورودی مشابهی در حال حاضر وجود دارد: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"حالت بررسی قابلیت استفاده"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"تأخیر فشار طولانی کلید"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"طول مدت لرزش در اثر فشردن کلید"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"میزان صدای فشردن کلید"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"خواندن فایل فرهنگ لغت خارجی"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"فایل فرهنگ لغتی در پوشه دانلودها وجود ندارد"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"یک فایل فرهنگ لغت برای نصب انتخاب کنید"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"این فایل واقعاً برای <xliff:g id="LOCALE_NAME">%s</xliff:g> نصب شود؟"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"این فایل واقعاً برای <xliff:g id="LANGUAGE_NAME">%s</xliff:g> نصب شود؟"</string> <string name="error" msgid="8940763624668513648">"خطایی روی داد"</string> <string name="button_default" msgid="3988017840431881491">"پیشفرض"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"به <xliff:g id="APPLICATION_NAME">%s</xliff:g> خوش آمدید"</string> @@ -211,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"بازخوانی"</string> <string name="last_update" msgid="730467549913588780">"آخرین بهروزرسانی"</string> <string name="message_updating" msgid="4457761393932375219">"در حال بررسی بهروزرسانیها"</string> - <string name="message_loading" msgid="8689096636874758814">"در حال بارگیری…"</string> + <string name="message_loading" msgid="5638680861387748936">"در حال بارگیری…"</string> <string name="main_dict_description" msgid="3072821352793492143">"فرهنگ لغت اصلی"</string> <string name="cancel" msgid="6830980399865683324">"لغو"</string> + <string name="go_to_settings" msgid="3876892339342569259">"تنظیمات"</string> <string name="install_dict" msgid="180852772562189365">"نصب"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"لغو"</string> <string name="delete_dict" msgid="756853268088330054">"حذف"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"برای زبان انتخاب شده در دستگاه همراه شما فرهنگ لغتی موجود است.<br/> توصیه میکنیم فرهنگ لغت <xliff:g id="LANGUAGE">%1$s</xliff:g> را <b>دانلود کنید</b> تا بهتر تایپ کنید.<br/> <br/> دانلود از طریق 3G ممکن است چند لحظه طول بکشد. اگر <b>طرح داده نامحدود</b> نداشته باشید ممکن است برایتان هزینه داشته باشد.<br/> اگر مطمئن نیستید طرح داده شما چیست٬ توصیه میکنیم یک اتصال Wi-Fi پیدا کنید تا دانلود بطور خودکار شروع شود.<br/> <br/> نکته: میتوانید فرهنگ لغت را با رفتن به منوی <b>زبان و ورودی</b> در <b>تنظیمات</b> در دستگاه همراه خود دانلود و حذف کنید."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"برای زبان انتخاب شده در دستگاه همراه شما فرهنگ لغتی در دسترس است.<br/> توصیه میکنیم برای بهبود بخشیدن به تجربه تایپ کردنتان، فرهنگ لغت <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> را <b>دانلود کنید</b>.<br/> <br/> دانلود از طریق 3G ممکن است یک یا دو دقیقه طول بکشد. اگر <b>طرح داده نامحدود</b> نداشته باشید، ممکن است هزینههایی برای شما اعمال شوند.<br/> اگر مطمئن نیستید چه طرح دادهای دارید٬ توصیه میکنیم یک اتصال Wi-Fi بیابید تا دانلود به طور خودکار شروع شود.<br/> <br/> نکته: با رفتن به بخش <b>زبان و ورودی</b> در منوی <b>تنظیمات</b> دستگاهتان، فرهنگهای لغت را دانلود یا حذف کنید."</string> <string name="download_over_metered" msgid="1643065851159409546">"هماکنون بارگیری شود (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> مگابایت)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"دانلود ازطریق Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"یک فرهنگ لغت برای <xliff:g id="LANGUAGE">%1$s</xliff:g> موجود است"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"یک فرهنگ لغت برای <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> در دسترس است"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"برای مرور و دانلود فشار دهید"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"دانلود لغات پیشنهادی برای <xliff:g id="LANGUAGE">%1$s</xliff:g> به زودی شروع میشود."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"دانلود کردن پیشنهادات برای <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> به زودی شروع میشود."</string> <string name="version_text" msgid="2715354215568469385">"نسخه <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"افرودن"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"افزودن به فرهنگ لغت"</string> diff --git a/java/res/values-fi/strings-action-keys.xml b/java/res/values-fi/strings-action-keys.xml index da7f11197..b1146b607 100644 --- a/java/res/values-fi/strings-action-keys.xml +++ b/java/res/values-fi/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Edel."</string> <string name="label_done_key" msgid="7564866296502630852">"Valm."</string> <string name="label_send_key" msgid="482252074224462163">"Läh."</string> + <string name="label_search_key" msgid="7965186050435796642">"Haku"</string> <string name="label_pause_key" msgid="2225922926459730642">"Tauko"</string> <string name="label_wait_key" msgid="5891247853595466039">"Odota"</string> </resources> diff --git a/java/res/values-fi/strings-config-important-notice.xml b/java/res/values-fi/strings-config-important-notice.xml new file mode 100644 index 000000000..ad064c0a7 --- /dev/null +++ b/java/res/values-fi/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Ehdotusten parannus viestinnän ja kirjoitettujen tietojen avulla"</string> +</resources> diff --git a/java/res/values-fi/strings-emoji-descriptions.xml b/java/res/values-fi/strings-emoji-descriptions.xml new file mode 100644 index 000000000..ad08bbda2 --- /dev/null +++ b/java/res/values-fi/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Copyright-merkki"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Rekisteröidyn tavaramerkin merkki"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Kaksi huutomerkkiä"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Huutomerkki ja kysymysmerkki"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Tavaramerkin merkki"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Tietolähde"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Nuoli vasemmalle ja oikealle"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Nuoli ylös ja alas"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Nuoli vasemmalle ylös"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Nuoli oikealle ylös"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Nuoli oikealle alas"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Nuoli vasemmalle alas"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Koukkunuoli vasemmalle"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Koukkunuoli oikealle"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Katso"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Tiimalasi"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Musta oikealle osoittava kaksoiskolmio"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Musta vasemmalle osoittava kaksoiskolmio"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Musta ylös osoittava kaksoiskolmio"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Musta alas osoittava kaksoiskolmio"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Herätyskello"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Tiimalasi ja hiekka"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Ympyröity iso M-kirjain"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Pieni musta neliö"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Pieni valkoinen neliö"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Musta oikealle osoittava kolmio"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Musta vasemmalle osoittava kolmio"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Suuri valkoinen neliö"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Suuri musta neliö"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Valkoinen neliö"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Musta neliö"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Musta aurinko"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Pilvi"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Musta puhelin"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Valittu kyselyruutu"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Sateenvarjo ja sadepisarat"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Kuuma juoma"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Valkoinen käsi, ylös osoittava etusormi"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Valkoinen hymyilevä naama"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Oinas"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Härkä"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Kaksoset"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Rapu"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leijona"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Neitsyt"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Vaaka"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Skorpioni"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Jousimies"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Kauris"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Vesimies"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Kalat"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Musta patasymboli"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Musta ristisymboli"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Musta herttasymboli"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Musta ruutusymboli"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Kuuma lähde"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Musta kierrätysmerkki"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Pyörätuolin symboli"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Ankkuri"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Varoitusmerkki"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Korkean jännitteen symboli"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Valkoinen ympyrä"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Musta ympyrä"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Jalkapallo"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Pesäpallo"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Lumiukko ilman lunta"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Aurinko pilven takana"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Käärmeenkantaja"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Kielletty ajosuunta"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Kirkko"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Suihkulähde"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Lippu reiässä"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Purjevene"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Teltta"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Polttoainepumppu"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Mustat sakset"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Valkoinen valintamerkki"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Lentokone"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Kirjekuori"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Nyrkki"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Pystyssä oleva kämmen"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Voitonmerkki"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Lyijykynä"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Musta kynänkärki"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Paksu valintamerkki"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Paksu kertomerkki"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Tuikkivat tähdet"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Kahdeksansakarainen tähti"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Kahdeksansakarainen musta tähti"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Lumihiutale"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Kipinä"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Ristimerkki"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Valkoinen ristimerkki mustalla taustalla"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Musta koristeellinen kysymysmerkki"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Valkoinen koristeellinen kysymysmerkki"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Valkoinen koristeellinen huutomerkki"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Paksu huutomerkki"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Väritetty sydän"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Paksu plusmerkki"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Paksu miinusmerkki"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Paksu jakomerkki"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Musta nuoli oikealle"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Silmukka"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Kaksoissilmukka"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Oikealle ja ylös osoittava nuoli"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Oikealle ja alas osoittava nuoli"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Musta nuoli vasemmalle"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Musta nuoli ylös"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Musta nuoli alas"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Suuri musta neliö"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Suuri valkoinen neliö"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Valkoinen tähti"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Paksu suuri ympyrä"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Aaltoviiva"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Vuorottelumerkki"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Ideogrammi onnittelu ympyrän sisällä"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Ideogrammi salaisuus ympyrän sisällä"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahjong-laatta, punainen lohikäärme"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Pelikortti, musta jokeri"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Veriryhmä A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Veriryhmä B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Veriryhmä O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Pysäköintialue"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Veriryhmä AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"CL neliön sisällä"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Sana COOL neliön sisällä"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Sana FREE neliön sisällä"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ID neliön sisällä"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Sana NEW neliön sisällä"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"NG neliön sisällä"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"OK neliön sisällä"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"SOS neliön sisällä"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Sana UP ja huutomerkki neliön sisällä"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"VS neliön sisällä"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Katakana täällä neliön sisällä"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Katakana palvelu neliön sisällä"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Ideogrammi maksuton neliön sisällä"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Ideogrammi varattu paikka neliön sisällä"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Ideogrammi kielto neliön sisällä"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Ideogrammi vapaita paikkoja neliön sisällä"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Ideogrammi hyväksyntä neliön sisällä"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Ideogrammi täynnä neliön sisällä"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Ideogrammi maksettu neliön sisällä"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Ideogrammi kuukausittain neliön sisällä"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Ideogrammi tilaus neliön sisällä"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Ideogrammi alennus neliön sisällä"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Ideogrammi liiketoiminta neliön sisällä"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Ideogrammi etu neliön sisällä"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Ideogrammi hyväksy ympyrän sisällä"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Pyörremyrsky"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Sumu"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Suljettu sateenvarjo"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Yömaisema"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Auringonnousu vuorilla"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Auringonnousu"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Kaupunkimaisema hämärässä"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Auringonlasku rakennusten taakse"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Sateenkaari"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Silta yöllä"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Vaahtopää"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Tulivuori"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Linnunrata"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Maapallo, Eurooppa – Afrikka"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Maapallo, Amerikat"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Maapallo Aasia – Australia"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Maapallo ja pituuspiirit"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Uudenkuun symboli"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Kasvavan kuunsirpin symboli"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Kuun ensimmäisen neljänneksen symboli"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Kasvavan puolikuun symboli"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Täysikuun symboli"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Vähenevän kuun symboli"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Kuun viimeisen neljänneksen symboli"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Vähenevän kuunsirpin symboli"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Kuunsirppi"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Uusikuu, jolla kasvot"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Ensimmäisen neljänneksen kuu, jolla kasvot"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Viimeisen neljänneksen kuu, jolla kasvot"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Täysikuu, jolla kasvot"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Aurinko, jolla kasvot"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Loistava tähti"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Tähdenlento"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Kastanja"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Taimi"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Havupuu"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Lehtipuu"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palmu"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Kaktus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Tulppaani"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Kirsikankukka"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Ruusu"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Kiinanruusu"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Auringonkukka"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Kukka"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Maissintähkä"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Riisintähkä"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Yrtti"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Neliapila"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Vaahteranlehti"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Pudonnut lehti"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Tuulessa leijaileva lehti"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Sieni"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tomaatti"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Munakoiso"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Viinirypäleet"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Meloni"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Vesimeloni"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Mandariini"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Sitruuna"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banaani"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Ananas"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Punainen omena"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Vihreä omena"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Päärynä"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Persikka"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Kirsikat"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Mansikka"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hampurilainen"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Pitsapala"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Lihainen luu"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Kanankoipi"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Riisikeksi"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Riisipallo"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Keitetty riisi"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Curry ja riisi"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Höyryävä kulho"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spagetti"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Leipä"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Ranskalaiset perunat"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Jamssi"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Friteeratut katkaravut"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Surimiviipale, jossa pyörrekuvio"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Pehmytjäätelö"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Murskattu jää"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Jäätelö"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Donitsi"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Pikkuleipä"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Suklaapatukka"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Karamelli"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Tikkukaramelli"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Vanukas"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Hunajapurkki"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Kakkuviipale"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Bento-lounaslaatikko"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Ruokapata"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Ruoanlaitto"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Haarukka ja veitsi"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Teekuppi ilman korvaa"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sake-pullo ja kuppi"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Viinilasi"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Cocktail-lasi"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Trooppinen drinkki"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Oluttuoppi"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Kippistävät olutmukit"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Tuttipullo"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Rusetti"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Lahjapaketti"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Syntymäpäiväkakku"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Kurpitsalyhty"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Joulukuusi"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Joulupukki"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Ilotulitus"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Tähtisadetikku"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Ilmapallo"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Konfettipommi"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Konfettipallo"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Tanabata-puu"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Liput ristikkäin"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Japanilainen mäntykoriste"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Japanilaiset nuket"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Kalanmuotoiset tuulipussit"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Tuulikello"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Kuujuhla"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Koululaukku"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Valmistujaislakki"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Karusellihevonen"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Maailmanpyörä"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Vuoristorata"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Onki ja kala"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Mikrofoni"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Elokuvakamera"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Elokuvateatteri"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Kuulokkeet"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Taiteilijan paletti"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Silinterihattu"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Sirkusteltta"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Lippu"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Klaffi"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Näyttämötaide"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Videopeli"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Napakymppi"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Peliautomaatti"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Biljardi"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Arpakuutio"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Keilailu"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Hanafuda-pelikortit"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Nuotti"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Nuotteja"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saksofoni"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Kitara"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Koskettimet"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trumpetti"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Viulu"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Nuottiviivasto"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Juoksupaita"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Tennismaila ja pallo"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Suksi ja mono"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Koripallo ja kori"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Ruutulippu"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Lumilautailija"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Juoksija"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Lainelautailija"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Palkintopokaali"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Laukkakilpailut"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Amerikkalainen jalkapallo"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Rugby-pallo"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Uimari"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Talo"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Talo ja puutarha"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Toimistorakennus"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Japanilainen postitoimisto"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Eurooppalainen postitoimisto"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Sairaala"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Pankki"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Pankkiautomaatti"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotelli"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Japanilainen love-hotelli"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Päivittäistavarakauppa"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Koulu"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Tavaratalo"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Tehdas"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Izakaya-ravintolan lyhty"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Japanilainen linna"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Eurooppalainen linna"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Rotta"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Hiiri"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Härkä"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Vesipuhveli"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Lehmä"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopardi"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Jänis"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Kissa"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Lohikäärme"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Krokotiili"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Valas"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Etana"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Käärme"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Hevonen"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Pässi"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Vuohi"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Lammas"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Apina"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Kukko"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Kana"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Koira"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Sika"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Villisika"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Norsu"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Mustekala"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Simpukankuori"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Hyönteinen"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Muurahainen"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Mehiläinen"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Leppäkerttu"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Kala"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Trooppinen kala"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Pallokala"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Kilpikonna"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Kuoriutuva kananpoika"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Kananpoika"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Eteenpäin katsova kananpoika"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Lintu"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Pingviini"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Villakoira"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Yksikyttyräinen kameli"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Kaksikyttyräinen kameli"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Delfiini"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Hiiren pää"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Lehmän pää"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Tiikerin pää"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Jäniksen pää"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Kissan pää"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Lohikäärmeen pää"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Valas ja vesisuihku"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Hevosen pää"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Apinan pää"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Koiran pää"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Sian pää"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Sammakon pää"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Hamsterin pää"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Suden pää"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Karhun pää"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Pandan pää"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Sian kärsä"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Tassunjäljet"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Silmät"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Korva"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nenä"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Suu"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Kieli"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Valkoinen käsi, ylös osoittava etusormi"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Valkoinen käsi, alas osoittava etusormi"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Valkoinen käsi, vasemmalle osoittava etusormi"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Valkoinen käsi, oikealle osoittava etusormi"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Käsi nyrkissä"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Vilkuttava käsi"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"OK-merkki"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Peukalo pystyssä"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Peukalo alaspäin"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Taputtavat kädet"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Avoimet kämmenet"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Kruunu"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Naisen hattu"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Silmälasit"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Kravatti"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"T-paita"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Farkut"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Leninki"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikinit"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Naisen paita"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Kukkaro"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Käsilaukku"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Pussukka"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Miesten kenkä"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Urheilujalkine"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Korkokenkä"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Naisen sandaali"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Naisen saappaat"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Jalanjäljet"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Rintakuvan ääriviivat"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Rintakuvien ääriviivat"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Poika"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Tyttö"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Mies"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Nainen"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Perhe"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Mies ja nainen käsi kädessä"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Kaksi miestä käsi kädessä"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Kaksi naista käsi kädessä"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Poliisi"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Nainen, jolla on pupun korvat"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Morsian hunnussa"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Vaaleahiuksinen henkilö"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Mies, jolla aasialainen päähine"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Mies, jolla turbaani"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Vanha mies"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Vanha nainen"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Vauva"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Rakennustyöläinen"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Prinsessa"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Japanilainen hirviö"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Japanilainen menninkäinen"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Kummitus"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Enkelivauva"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Ulkoavaruuden olento"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Avaruusolio"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Pikkupiru"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Kallo"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Asiakaspalvelija"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Vartija"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Tanssija"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Huulipuna"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Kynsilakka"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Kasvohieronta"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Hiusten leikkaus"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Parturin pylväs"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Ruisku"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pilleri"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Huulet"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Rakkauskirje"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Sormus"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Jalokivi"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Suudelma"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Kukkakimppu"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Pariskunta ja sydän"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Häät"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Sykkivä sydän"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Särkynyt sydän"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Kaksi sydäntä"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Säihkyvä sydän"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Kasvava sydän"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Sydän ja nuoli"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Sininen sydän"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Vihreä sydän"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Keltainen sydän"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Violetti sydän"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Sydän ja rusetti"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Pyörivät sydämet"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Sydänkoriste"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Vinoneliö, jossa on sisällä piste"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Hehkulamppu"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Vihan symboli"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Pommi"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Unen symboli"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Törmäyksen symboli"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Hikipisarat"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Pisara"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Liikkeen symboli"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Kakkakasa"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Hauis"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Huimauksen symboli"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Puhekupla"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Ajatuskupla"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Valkoinen kukka"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Sadan pisteen symboli"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Rahasäkki"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Valuutanvaihto"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Paksu dollarin symboli"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Luottokortti"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Seteli, jossa jenin symboli"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Seteli, jossa dollarin symboli"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Seteli, jossa euron symboli"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Seteli, jossa punnan symboli"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Setelinippu, jolla siivet"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Noususuuntainen kaavio, jossa jenin symboli"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Paikka"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Tietokone"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Salkku"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minilevy"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Levyke"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Optinen levy"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD-levy"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Tiedostokansio"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Avaa tiedostokansio"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Alhaalta käpristynyt sivu"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Sivu edestä"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Kalenteri"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Kalenteri, irtirevittävät sivut"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Kortihakemisto"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Noususuuntainen kaavio"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Laskusuuntainen kaavio"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Pylväskaavio"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Leikepöytä"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Nasta"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Pyöreäpäinen nasta"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Paperiliitin"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Suora viivain"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Kolmioviivain"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Kirjanmerkit"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Kierreselkäinen vihko"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Muistikirja"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Muistikirja, jossa koristekansi"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Suljettu kirja"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Avoin kirja"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Vihreä kirja"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Sininen kirja"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Oranssi kirja"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Kirjat"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Nimilappu"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Rulla"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Muistio"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Puhelimen kuuloke"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Hakulaite"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Faksi"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Satelliittiantenni"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Julkisen tilan kovaääninen"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Megafoni"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Lähtevien lokero"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Saapuvien lokero"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Paketti"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Sähköpostin symboli"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Saapuva kirjekuori"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Kirjekuori alaspäin osoittavan nuolen alla"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Suljettu postilaatikko lippu alhaalla"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Suljettu postilaatikko lippu ylhäällä"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Avattu postilaatikko lippu ylhäällä"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Avattu postilaatikko lippu alhaalla"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Postilaatikko"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Postitorvi"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Sanomalehti"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Matkapuhelin"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Matkapuhelin, jonka vasemmalla puolella on sitä osoittava nuoli"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Värinätila"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Matkapuhelin pois käytöstä"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Ei matkapuhelimia"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antennisymboli ja palkit"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Kamera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Videokamera"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Televisio"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videokasetti"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Kaksi ristikkäistä oikealle osoittavaa nuolta"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Ympyrä, jossa myötäpäivään oikealle ja vasemmalle osoittavat nuolet"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Ympyrä, jossa myötäpäivään oikealle ja vasemmalle osoittavat nuolet ja jonka päällä ympyröity numero yksi"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Ympyrä, jossa myötäpäivään ylös ja alas osoittavat nuolet"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Ympyrä, jossa vastapäivään ylös ja alas osoittavat nuolet"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Alhaisen kirkkauden symboli"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Suuren kirkkauden symboli"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Yliviivattu kaiutin"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Kaiutin"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Kaiutin ja yksi ääniaalto"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Kaiutin ja kolme ääniaaltoa"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Akku"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Pistoke"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Vasemmalle osoittava suurennuslasi"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Oikealle osoittava suurennuslasi"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lukko ja mustekynä"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Suljettu lukko ja avain"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Avain"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Lukko"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Avoin lukko"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Soittokello"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Yliviivattu soittokello"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Kirjanmerkki"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Linkin symboli"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Valintanappi"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Sana BACK, jonka yläpuolella vasemmalle osoittava nuoli"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Sana END, jonka yläpuolella vasemmalle osoittava nuoli"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Sana ON ja huutomerkki, yläpuolella vasemmalle ja oikealle osoittava nuoli"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Sana SOON, jonka yläpuolella oikealle osoittava nuoli"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Sana TOP, jonka yläpuolella ylös osoittava nuoli"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Ikäraja 18 vuotta"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Näppäin 10"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Latinalaisten isojen kirjainten symboli"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Latinalaisten pienten kirjainten symboli"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Numeroiden symboli"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Symbolien symboli"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Latinalaisten kirjainten symboli"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Tuli"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Taskulamppu"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Jakoavain"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Vasara"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Mutteri ja pultti"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hochoveitsi"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistooli"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Mikroskooppi"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Kaukoputki"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Kristallipallo"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Kuusisakarainen tähti, jossa keskellä piste"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Japanilainen aloittelijan merkki"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Trident-symboli"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Musta neliönmuotoinen painike"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Valkoinen neliönmuotoinen painike"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Suuri punainen ympyrä"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Suuri sininen ympyrä"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Suuri oranssi vinoneliö"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Suuri sininen vinoneliö"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Pieni oranssi vinoneliö"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Pieni sininen vinoneliö"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Ylöspäin osoittava punainen kolmio"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Alaspäin osoittava punainen kolmio"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Ylöspäin osoittava pieni punainen kolmio"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Alaspäin osoittava pieni punainen kolmio"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Kellotaulu, kello yksi"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Kellotaulu, kello kaksi"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Kellotaulu, kello kolme"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Kellotaulu, kello neljä"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Kellotaulu, kello viisi"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Kellotaulu, kello kuusi"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Kellotaulu, kello seitsemän"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Kellotaulu, kello kahdeksan"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Kellotaulu, kello yhdeksän"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Kellotaulu, kello kymmenen"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Kellotaulu, kello yksitoista"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Kellotaulu, kello kaksitoista"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Kellotaulu, kello puoli kaksi"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Kellotaulu, kello puoli kolme"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Kellotaulu, kello puoli neljä"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Kellotaulu, kello puoli viisi"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Kellotaulu, kello puoli kuusi"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Kellotaulu, kello puoli seitsemän"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Kellotaulu, kello puoli kahdeksan"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Kellotaulu, kello puoli yhdeksän"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Kellotaulu, kello puoli kymmenen"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Kellotaulu, kello puoli yksitoista"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Kellotaulu, kello puoli kaksitoista"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Kellotaulu, kello puoli yksi"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Fuji-vuori"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tokio-torni"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Vapaudenpatsas"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Japanin kartta"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moai-kivipatsas"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Virnistävä naama"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Virnistävä naama silmät sirrillään"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Naama ja ilon kyyneleet"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Hymyilevä naama, suu auki"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Hymyilevä naama, suu auki ja silmät sirrillään"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Hymyilevä naama, suu auki ja kylmä hiki"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Hymyilevä naama, suu auki ja silmät kiinni"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Hymyilevä naama ja sädekehä"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Hymyilevä naama ja sarvet"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Silmää iskevä naama"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Hymyilevä naama, silmät sirrillään"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Naama ja huulia lipova kieli"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Helpottunut naama"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Hymyilevä naama ja sydämenmuotoiset silmät"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Hymyilevä naama ja aurinkolasit"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Virnistävä naama"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Naamalla perusilme"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Ilmeetön naama"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Kyllästynyt naama"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Naama ja kylmä hiki"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Mietteliäs naama"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Ymmällä oleva naama"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Hämmentynyt naama"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Naama ja pusuhuulet"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Lentosuukko ja silmänisku"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Naama ja pusuhuulet, silmät sirrillään"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Naama ja pusuhuulet, silmät kiinni"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Kieltä näyttävä naama"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Silmää iskevä ja kieltä näyttävä naama"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Kieltä näyttävä naama, silmät kiinni"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Pettynyt naama"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Huolestunut naama"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Vihainen naama"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Mököttävä naama"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Itkevä naama"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Sinnikäs naama"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Voitokas naama"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Pettynyt mutta huojentunut naama"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Surullinen naama, suu auki"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Tuskainen naama"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Pelokas naama"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Uupunut naama"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Uninen naama"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Väsynyt naama"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Irvistävä naama"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Rajusti itkevä naama"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Naama, suu auki"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Pelokas naama"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Naama, suu auki ja kylmä hiki"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Pelosta kirkuva naama"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Hämmästynyt naama"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Punastunut naama"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Nukkuva naama"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Naama taju kankaalla"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Naama ilman suuta"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Naama ja suumaski"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Virnistävä kissan naama, silmät sirrillään"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Kissan naama ja ilon kyyneleet"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Hymyilevä kissan naama, suu auki"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Hymyilevä kissan naama, sydämen muotoiset silmät"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Kissan naama, kuivakka hymy"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kissan naama, pusuhuulet ja silmät kiinni"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Mököttävä kissan naama"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Itkevä kissan naama"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Uupunut kissan naama"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Naama ja epäonnistumisen ele"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Naama, OK-ele"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Syvään kumartava henkilö"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Silmänsä peittänyt apina"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Korvansa peittänyt apina"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Suunsa peittänyt apina"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Iloinen henkilö yksi käsi pystyssä"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Juhliva henkilö molemmat kädet pystyssä"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Henkilö otsa kurtussa"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Henkilö ja mököttävä ilme"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Henkilö, jolla kämmenet yhdessä"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Raketti"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helikopteri"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Höyryveturi"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Junanvaunu"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Pikajuna"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Luotijuna"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Juna"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Kevyt raideliikenne"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Asema"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Raitiovaunu"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Raitiovaunun vaunu"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bussi"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Bussi edestä"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Johdinauto"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Bussipysäkki"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Pikkubussi"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulanssi"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Paloauto"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Poliisiauto"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Poliisiauto edestä"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taksi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Taksi edestä"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Auto"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Auto edestä"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Maastoauto"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Kuorma-auto"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Kuorma-auto"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Traktori"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Yksiraiteinen rautatie"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Vuoristojuna"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Riippuva rautatie"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Köysirata"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Köysirata"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Laiva"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Soutuvene"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Pikavene"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Vaakasuuntaiset liikennevalot"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Pystysuuntaiset liikennevalot"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Rakennustyömaan merkki"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Poliisiauton hälytysvalo"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Kolmiolippu"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Ovi"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Kulku kielletty -merkki"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Tupakointisymboli"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Tupakointi kielletty"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Roskat roskakoriin -symboli"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Älä roskaa -symboli"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Juomaveden symboli"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Juomakelvottoman veden symboli"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Polkupyörä"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Pyöräily kielletty"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Pyöräilijä"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Maastopyöräilijä"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Jalankulkija"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Jalankulku kieletty"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Lapsia-varoitusmerkki"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Miehen symboli"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Naisen symboli"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"WC"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Vauvan symboli"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"WC"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"WC"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Suihku"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Kylpy"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Kylpyamme"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Passintarkastus"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Tulli"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Matkatavaroiden nouto"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Matkatavaroiden säilytys"</string> +</resources> diff --git a/java/res/values-fi/strings-letter-descriptions.xml b/java/res/values-fi/strings-letter-descriptions.xml new file mode 100644 index 000000000..76daf476f --- /dev/null +++ b/java/res/values-fi/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminiinisen järjestysluvun merkki"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro-merkki"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Maskuliinisen järjestysluvun merkki"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Kaksois-s"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A ja gravis"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A ja akuutti"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A ja sirkumfleksi"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A ja tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A ja treema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A ja yläpuolinen ympyrä"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Ligatuuri ae"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C ja sedilji"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E ja gravis"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E ja akuutti"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E ja sirkumfleksi"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E ja treema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I ja gravis"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I ja akuutti"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I ja sirkumfleksi"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I ja treema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N ja tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O ja gravis"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O ja akuutti"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O ja sirkumfleksi"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O ja tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O ja treema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O ja vinoviiva yli"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U ja gravis"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U ja akuutti"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U ja sirkumfleksi"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U ja treema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y ja akuutti"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y ja treema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A ja pituusmerkki"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A ja ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C ja akuutti"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C ja sirkumfleksi"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C ja yläpuolinen piste"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C ja hattu"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D ja hattu"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D ja poikkiviiva"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E ja pituusmerkki"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E ja yläpuolinen piste"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E ja ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E ja hattu"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G ja sirkumfleksi"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G ja yläpuolinen piste"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G ja sedilji"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H ja sirkumfleksi"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H ja poikkiviiva"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I ja tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I ja pituusmerkki"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I ja ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Pisteetön I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatuuri ij"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J ja sirkumfleksi"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K ja sedilji"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L ja akuutti"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L ja sedilji"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L ja hattu"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L ja piste keskellä"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L ja vino poikkiviiva"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N ja akuutti"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N ja sedilji"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N ja hattu"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, jota edeltää heittomerkki"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Äng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O ja pituusmerkki"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O ja kaksoisakuutti"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatuuri oe"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R ja akuutti"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R ja sedilji"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R ja hattu"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S ja akuutti"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S ja sirkumfleksi"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S ja sedilji"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S ja hattu"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T ja sedilji"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T ja hattu"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T ja poikkiviiva"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U ja tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U ja pituusmerkki"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U ja lyhyysmerkki"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U ja yläpuolinen ympyrä"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U ja kaksoisakuutti"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U ja ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W ja sirkumfleksi"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y ja sirkumfleksi"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z ja akuutti"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z ja yläpuolinen piste"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z ja hattu"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Pitkä s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O ja sarvi"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U ja sarvi"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S ja alapuolinen pilkku"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T ja alapuolinen pilkku"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Švaa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A sekä sirkumfleksi ja akuutti"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A sekä sirkumfleksi ja gravis"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A sekä sirkumfleksi ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A sekä sirkumfleksi ja tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A sekä sirkumfleksi ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A sekä lyhyysmerkki ja akuutti"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A sekä lyhyysmerkki ja gravis"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A sekä lyhyysmerkki ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A sekä lyhyysmerkki ja tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A sekä lyhyysmerkki ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E ja tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E sekä sirkumfleksi ja akuutti"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E sekä sirkumfleksi ja gravis"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E sekä sirkumfleksi ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E sekä sirkumfleksi ja tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E sekä sirkumfleksi ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O sekä sirkumfleksi ja akuutti"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O sekä sirkumfleksi ja gravis"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O sekä sirkumfleksi ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O sekä sirkumfleksi ja tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O sekä sirkumfleksi ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O sekä sarvi ja akuutti"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O sekä sarvi ja gravis"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O sekä sarvi ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O sekä sarvi ja tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O sekä sarvi ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U sekä sarvi ja akuutti"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U sekä sarvi ja gravis"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U sekä sarvi ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U sekä sarvi ja tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U sekä sarvi ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y ja gravis"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y ja alapuolinen piste"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y ja yläpuolinen koukku"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y ja tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ylösalainen huutomerkki"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Vasemmalle osoittava kaksinkertainen kulmalainausmerkki"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Rivinkeskinen piste"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Yläindeksi yksi"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Oikealle osoittava kaksinkertainen kulmalainausmerkki"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ylösalainen kysymysmerkki"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ylösalainen puolilainausmerkki"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Puolilainausmerkki"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Rivinalinen puolilainausmerkki"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ylösalainen kokolainausmerkki"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Kokolainausmerkki"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Risti"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Kaksoisristi"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promillemerkki"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Yläpuolinen indeksointipilkku"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Kaksinkertainen yläpuolinen indeksointipilkku"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Vasemmalle osoittava kulmapuolilainausmerkki"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Oikealle osoittava kulmapuolilainausmerkki"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Yläindeksi neljä"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Yläindeksi latinalainen pienaakkonen n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peson merkki"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of -merkki"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Nuoli oikealle"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Nuoli alas"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tyhjä joukko"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Delta"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Pienempi tai yhtä suuri kuin -merkki"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Suurempi tai yhtä suuri kuin -merkki"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Musta tähti"</string> +</resources> diff --git a/java/res/values-fi/strings-talkback-descriptions.xml b/java/res/values-fi/strings-talkback-descriptions.xml new file mode 100644 index 000000000..bec46cafd --- /dev/null +++ b/java/res/values-fi/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Liitä kuulokkeet, niin kuulet mitä näppäimiä painat kirjoittaessasi salasanaa."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Nykyinen teksti on %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ei kirjoitettua tekstiä"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> korjaa sanan <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> sanaksi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> suorittaa automaattisen korjauksen"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Tuntematon merkki"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Vaihto"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Lisää symboleita"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Vaihto"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbolit"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Vaihto"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Delete"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbolit"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Kirjaimet"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Numerot"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Asetukset"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Sarkain"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Välilyönti"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Äänisyöte"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Haku"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Piste"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Vaihda kieli"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Seuraava"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Edellinen"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Vaihto päällä"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock päällä"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbolit-tila"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Lisää symboleita -tila"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Näppäimistötila"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Puhelintila"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Puhelinsymbolit-tila"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Näppäimistö on piilotettu"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Näytetään näppäimistö <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"päivämäärä"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"päivämäärä ja aika"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"sähköposti"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"viestit"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"numero"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"puhelin"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teksti"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"aika"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL-osoite"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Viimeisimmät"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Ihmiset"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Esineet"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Luonto"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Paikat"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbolit"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Hymiöt"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Suuraakkonen <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Suuraakkonen I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Suuraakkonen I ja yläpuolinen piste"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Tuntematon symboli"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Tuntematon emoji-merkki"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Vaihtoehtoisia merkkejä on saatavilla"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Vaihtoehtoiset merkit hylättiin"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Vaihtoehtoisia ehdotuksia on saatavilla"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Vaihtoehtoiset ehdotukset hylättiin"</string> +</resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index a58bfac3e..5f2ef6ad9 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Syöttövalinnat"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Tutkimuslokin komennot"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Hae yht.tietojen nimiä"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Oikeinkirjoituksen tarkistus käyttää yhteystietojasi."</string> <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="general_category" msgid="1859088467017573195">"Yleiset"</string> - <string name="correction_category" msgid="2236750915056607613">"Tekstin korjaus"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Piirtokirjoitus"</string> - <string name="misc_category" msgid="6894192814868233453">"Muut vaihtoehdot"</string> - <string name="advanced_settings" msgid="362895144495591463">"Lisäasetukset"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Valinnat asiantuntijoille"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Syöttöasetukset"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Ulkonäkö"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Kieliasetukset"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Piirtokirjoitusasetukset"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Tekstin korjaus"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Lisäasetukset"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Käytä toista syöttötapaa"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Kielenvaihtonäppäin kattaa myös muut syöttötavat"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Kielenvaihtonäppäin"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Järjestelmän oletusarvo"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Ehdota yht.tietojen nimiä"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Käytä yhteystietojen nimiä ehdotuksissa ja korjauksissa"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Räätälöidyt ehdotukset"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Paranna sovellusta <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Kaksoisvälilyönti = piste"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Välilyönnin kaksoisnapautus lisää tekstiin pisteen ja välilyönnin"</string> <string name="auto_cap" msgid="1719746674854628252">"Automaattiset isot kirjaimet"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Näytä eleen jälki"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynaaminen kelluva esikatselu"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Näytä ehdotettu sana piirron aikana"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: tallennettu"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Liitä kuulokkeet, niin kuulet mitä näppäimiä painat kirjoittaessasi salasanaa."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Nykyinen teksti on %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ei kirjoitettua tekstiä"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> korjaa sanan <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> sanaksi <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> suorittaa automaattisen korjauksen"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Näppäimen koodi %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Vaihto"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Vaihto päällä (poista käytöstä napauttamalla)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock päällä (poista käytöstä napauttamalla)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Poista"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbolit"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Kirjaimet"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numerot"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Asetukset"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Sarkain"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Välilyönti"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Äänisyöte"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Hymiö"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Takaisin"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Haku"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Piste"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Vaihda kieli"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Seuraava"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Edellinen"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Vaihto päällä"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock päällä"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Vaihto pois käytöstä"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbolit-tila"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Näppäimistötila"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Puhelintila"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Puhelinsymbolit-tila"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Näppäimistö on piilotettu"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Näytetään <xliff:g id="MODE">%s</xliff:g>-näppäimistö"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"päivämäärä"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"päivämäärä ja aika"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"sähköposti"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"viestit"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"puhelin"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teksti"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"aika"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL-osoite"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Ilmausele"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Lisää välilyöntejä eleiden aikana liukumalla välilyöntinäppäim."</string> <string name="voice_input" msgid="3583258583521397548">"Äänisyöteavain"</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äim."</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Ei käytössä"</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."</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Äänisyöte ei käyt."</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Äänen syöttötapoja ei ole otettu käyttöön. Tarkista Kieli ja syöttötapa -asetukset."</string> <string name="configure_input_method" msgid="373356270290742459">"Määritä syöttötavat"</string> <string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string> <string name="send_feedback" msgid="1780431884109392046">"Lähetä palautetta"</string> <string name="select_language" msgid="3693815588777926848">"Syöttökielet"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tallenna koskettamalla uudelleen"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Auta parantamaan tätä syöttötavan muokkausohjelmaa lähettämällä automaattisesti käyttötietoja ja kaatumisraportteja."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Näppäimistöteema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"englanti (Iso-Britannia)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"englanti (Yhdysvallat)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"espanja (Yhdysvallat)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"englanti (Iso-Br.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"englanti (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"espanja (Yhdysvallat) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (perinteinen)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"englanti (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"englanti (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"espanja (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (perinteinen)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillinen)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinalainen)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Ei kieltä (aakkoset)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Aakkoset (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Aakkoset (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Aakkoset (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Aakkoset (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Väriteema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Valkoinen"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Sininen"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Näppäimistöteema"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Valkoinen"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Sininen"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Tumma"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Vaalea"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Muokatut syöttötyylit"</string> <string name="add_style" msgid="6163126614514489951">"Lisää tyyli"</string> <string name="add" msgid="8299699805688017798">"Lisää"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Ota käyttöön"</string> <string name="not_now" msgid="6172462888202790482">"Ei nyt"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Syöttötyyli on jo olemassa: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Käytettävyystutkimustila"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Pitkän painalluksen viive"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Painalluksen värinän kesto"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Näppäinpainalluksen äänenvoim."</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lue ulkoista sanakirjatiedostoa"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Lataukset-kansiossa ei ole sanakirjatiedostoja"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Valitse asennettava sanakirjatiedosto"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Haluatko asentaa tämä tiedoston kielelle <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Haluatko asentaa tämän tiedoston kielelle <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Tapahtui virhe"</string> <string name="button_default" msgid="3988017840431881491">"Oletusarvot"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Tervetuloa käyttämään sovellusta <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Päivitä"</string> <string name="last_update" msgid="730467549913588780">"Päivitetty viimeksi"</string> <string name="message_updating" msgid="4457761393932375219">"Tarkistetaan päivityksiä"</string> - <string name="message_loading" msgid="8689096636874758814">"Ladataan…"</string> + <string name="message_loading" msgid="5638680861387748936">"Ladataan…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Pääsanakirja"</string> <string name="cancel" msgid="6830980399865683324">"Peruuta"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Asetukset"</string> <string name="install_dict" msgid="180852772562189365">"Asenna"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Peruuta"</string> <string name="delete_dict" msgid="756853268088330054">"Poista"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Laitteesi käyttökielelle on saatavilla sanakirja.<br/> Suosittelemme <xliff:g id="LANGUAGE">%1$s</xliff:g>-sanakirjan <b>lataamista</b>, sillä se helpottaa laitteella kirjoittamista.<br/> <br/> Lataus kestää useimmiten muutaman minuutin 3G-yhteydellä. Latauksesta saatetaan periä maksu, ellei käytössäsi ole <b>rajoittamatonta tiedonsiirtopakettia</b>.<br/> Jos et ole varma tiedonsiirtosopimuksesi tyypistä, etsi käyttöösi wifi-yhteys, niin lataus alkaa automaattisesti.<br/> <br/> Vinkki: voit ladata ja poistaa sanakirjoja mobiililaitteesi <b>Asetukset</b>-valikon <b>Kieli ja syöttötapa</b> -osiossa."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Laitteesi käyttökielelle on saatavilla sanakirja.<br/> Suosittelemme <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-sanakirjan <b>lataamista</b>, sillä se helpottaa laitteella kirjoittamista.<br/> <br/> Lataus kestää useimmiten muutaman minuutin 3G-yhteydellä. Latauksesta saatetaan periä maksu, ellei käytössäsi ole <b>rajoittamatonta tiedonsiirtopakettia</b>.<br/> Jos et ole varma tiedonsiirtosopimuksesi tyypistä, etsi käyttöösi wifi-yhteys, niin lataus alkaa automaattisesti.<br/> <br/> Vinkki: voit ladata ja poistaa sanakirjoja mobiililaitteesi <b>Asetukset</b>-valikon <b>Kieli ja syöttötapa</b> -osiossa."</string> <string name="download_over_metered" msgid="1643065851159409546">"Lataa nyt (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mt)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Lataa wifi-yhteydellä"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Kielen <xliff:g id="LANGUAGE">%1$s</xliff:g> sanakirja on saatavilla"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Sanakirja on saatavilla kielelle <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Paina tätä, jos haluat tarkastella kohdetta ja ladata sen"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Ladataan: ehdotuksia näytetään pian kielellä <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Ladataan: kielen <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ehdotukset ovat pian käytettävissä."</string> <string name="version_text" msgid="2715354215568469385">"Versio <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Lisää"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Lisää sanakirjaan"</string> diff --git a/java/res/values-fr-rCA/donottranslate.xml b/java/res/values-fr-rCA/donottranslate-config-spacing-and-punctuations.xml index 21f18d852..e4c30c4d7 100644 --- a/java/res/values-fr-rCA/donottranslate.xml +++ b/java/res/values-fr-rCA/donottranslate-config-spacing-and-punctuations.xml @@ -25,7 +25,7 @@ <string name="symbols_followed_by_space">.,;:!?)]}&</string> <!-- Symbols that separate words --> <!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) --> - <string name="symbols_word_separators">"	 \n"()[]{}*&<>+=|.,;:!?/_\"</string> + <string name="symbols_word_separators">"	 
 "()[]{}*&<>+=|.,;:!?/_\"</string> <!-- Word connectors --> <string name="symbols_word_connectors">\'-</string> </resources> diff --git a/java/res/values-fr-rCA/strings-action-keys.xml b/java/res/values-fr-rCA/strings-action-keys.xml index bb5568e79..1823416ac 100644 --- a/java/res/values-fr-rCA/strings-action-keys.xml +++ b/java/res/values-fr-rCA/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Préc."</string> <string name="label_done_key" msgid="7564866296502630852">"Term."</string> <string name="label_send_key" msgid="482252074224462163">"Env."</string> + <string name="label_search_key" msgid="7965186050435796642">"Rech."</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Att."</string> </resources> diff --git a/java/res/values-fr-rCA/strings-config-important-notice.xml b/java/res/values-fr-rCA/strings-config-important-notice.xml new file mode 100644 index 000000000..2247ec6cc --- /dev/null +++ b/java/res/values-fr-rCA/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Apprendre de vos communic. et données entrées pour amél. suggestions"</string> +</resources> diff --git a/java/res/values-fr-rCA/strings-letter-descriptions.xml b/java/res/values-fr-rCA/strings-letter-descriptions.xml new file mode 100644 index 000000000..1c1f62e0f --- /dev/null +++ b/java/res/values-fr-rCA/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicateur ordinal féminin"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Symbole micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicateur ordinal masculin"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"a, accent grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"a, accent aigu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"a, accent circonflexe"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"a, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"a, tréma"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"a, rond en chef"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"e dans l\'a"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"c, cédille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"e, accent grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"e, accent aigu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"e, accent circonflexe"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"e, tréma"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"i, accent grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"i, accent aigu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"i, accent circonflexe"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"i, tréma"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ed"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"n, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"o, accent grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"o, accent aigu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"o, accent circonflexe"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"o, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"o, tréma"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"o, barré"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"u, accent grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"u, accent aigu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"u, accent circonflexe"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"u, tréma"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"y, accent aigu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"y, tréma"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"a, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"a, brève"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"a, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"c, accent aigu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"c, accent circonflexe"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"c, point en chef"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"c, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"d, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"d, barré"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"e, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"e, brève"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"e, point en chef"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"e, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"e, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"g, accent circonflexe"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"g, brève"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"g, point en chef"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"g, cédille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"h, accent circonflexe"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"h, barré"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"i, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"i, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"i, bref"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"i, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"i, sans point"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"i, j, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"j, accent circonflexe"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"k, cédille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"l, accent aigu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"l, cédille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"l, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"l, point médian"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"l, barré"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"n, accent aigu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"n, cédille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"n, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"n, précédé d\'une apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"o, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"o, brève"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double accent aigu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"e dans l\'o"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"r, accent aigu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"r, cédille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"r, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"s, accent aigu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"s, accent circonflexe"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"s, cédille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"s, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"t, cédille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"t, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"t, barré"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"u, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"u, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"u, brève"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"u, rond en chef"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"u, double accent aigu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"u, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"w, accent circonflexe"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"y, accent circonflexe"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"z, accent aigu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"z, point en chef"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"o, cornu"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"u, cornu"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"s, virgule souscrite"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"t, virgule souscrite"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"a, point souscrit"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"a, crochet en chef"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"a, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"a, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"a, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"a, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"a, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"a, brève et accent aigu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"a, brève et accent grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"a, brève et crochet en chef"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"a, brève et tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"a, brève et point souscrit"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"e, point souscrit"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"e, crochet en chef"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"e, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"e, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"e, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"e, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"e, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"e, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"i, crochet en chef"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"i, point souscrit"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"o, point souscrit"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"o, crochet en chef"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"o, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"o, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"o, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"o, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"o, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"o, cornu et accent aigu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"o, cornu et accent grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"l, cornu et crochet en chef"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"o, cornu et tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"o, cornu et point souscrit"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"u, point souscrit"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"u, crochet en chef"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"u, cornu et accent aigu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"u, cornu et accent grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"u, cornu et crochet en chef"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"u, cornu et tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"u, cornu et point souscrit"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"y, accent grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"y, point souscrit"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"y, crochet en chef"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Point d\'exclamation inversé"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Chevron double ouvrant"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Point médian"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"un, exposant"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Chevron double fermant"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Point d\'interrogation inversé"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Guillemet simple ouvrant"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Guillemet simple fermant"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Guillemet simple fermant bas"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Guillemet double ouvrant"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Guillemet double fermant"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obèle"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double obèle"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Symbole pour mille"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Chevron simple ouvrant"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Chevron simple fermant"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"quatre, exposant"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Lettre minuscule latine N, exposant"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Symbole du peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"À l\'attention de"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Flèche vers la droite"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Flèche vers le bas"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Ensemble vide"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incrément"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Inférieur ou égal"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Supérieur ou égal"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Étoile noire"</string> +</resources> diff --git a/java/res/values-fr-rCA/strings-talkback-descriptions.xml b/java/res/values-fr-rCA/strings-talkback-descriptions.xml new file mode 100644 index 000000000..df644c0ee --- /dev/null +++ b/java/res/values-fr-rCA/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de l\'entrée du mot de passe."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Le texte actuel est %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Aucun texte entré"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"La touche <xliff:g id="KEY_NAME">%1$s</xliff:g> permet de remplacer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> par <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"La touche <xliff:g id="KEY_NAME">%1$s</xliff:g> permet d\'effectuer une correction automatique"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caractère inconnu"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Majuscule"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Autres symboles"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Majuscule"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboles"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Majuscule"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Supprimer"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboles"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Lettres"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Chiffres"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Paramètres"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulation"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espace"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrée vocale"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Retour"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Recherche"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Point"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Changer de langue"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Suivante"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Précédente"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Touche Maj activée"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Verrouillage des majuscules activé"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Mode Symboles"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Mode Autres symboles"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Mode Lettres"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Mode Téléphone"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Mode Symboles du téléphone"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Clavier masqué"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Affichage du clavier <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"date"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"date et heure"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"courriel"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"messagerie"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"numérique"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"téléphone"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texte"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"heure"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Récents"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personnes"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objets"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Nature"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Lieux"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboles"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Émoticônes"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> majuscule"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I majuscule"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I majuscule, point en chef"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Symbole inconnu"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji inconnu"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Des caractères supplémentaires sont proposés"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Les caractères supplémentaires sont ignorés"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Des suggestions supplémentaires sont proposées"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Les suggestions supplémentaires sont ignorées"</string> +</resources> diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml index 2551ce9f8..fd34ba924 100644 --- a/java/res/values-fr-rCA/strings.xml +++ b/java/res/values-fr-rCA/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Options de saisie"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Commandes journaux rech."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Rechercher noms contacts"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Correcteur orthographique utilise entrées de liste de contacts."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères"</string> - <string name="general_category" msgid="1859088467017573195">"Général"</string> - <string name="correction_category" msgid="2236750915056607613">"Correction du texte"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Saisie gestuelle"</string> - <string name="misc_category" msgid="6894192814868233453">"Autres options"</string> - <string name="advanced_settings" msgid="362895144495591463">"Paramètres avancés"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Options destinées aux experts"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Autres modes de saisie"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"La touche de sélection de langue couvre d\'autres modes de saisie"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Touche de sélection de langue"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Paramètres par défaut"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Proposer noms de contacts"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utiliser des noms de contacts pour les suggestions et corrections"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggestions personnalisées"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Améliorer l\'application <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Point et espace"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Appuyez deux fois sur la barre d\'espace pour insérer un point et une espace"</string> <string name="auto_cap" msgid="1719746674854628252">"Majuscules automatiques"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Afficher le tracé du geste"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Aperçu flottant dynamique"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afficher le mot suggéré lors des gestes"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Le texte actuel est %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Aucun texte saisi"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"La touche <xliff:g id="KEY">%1$s</xliff:g> permet de corriger « <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> » par « <xliff:g id="CORRECTED">%3$s</xliff:g> »"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"La touche <xliff:g id="KEY">%1$s</xliff:g> permet d\'activer la correction automatique"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Code touche %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Maj"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Touche Maj activée (appuyer pour désactiver)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Verrouillage des majuscules activé (appuyer pour désactiver)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Supprimer"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboles"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Lettres"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Nombres"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Paramètres"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Onglet"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espace"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Saisie vocale"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Émoticône"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Renvoyer"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Rechercher"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Point"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Changer de langue"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Suivant"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Précédent"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Touche Maj activée"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Verrouillage des majuscules activé"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Touche Maj désactivée"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mode Symboles"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode Lettres"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode Téléphone"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode Symboles du téléphone"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Clavier masqué"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Affichage du clavier <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"Date"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"Date et heure"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"Courriel"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS/MMS"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"Nombre"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"Numéro de téléphone"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"Texte"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"Heure"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Geste multiterme"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Insérer une espace avec barre d\'espace lors de l\'entrée gestuelle"</string> <string name="voice_input" msgid="3583258583521397548">"Touche de saisie vocale"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sur le clavier principal"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sur clavier symboles"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Désactiver"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro sur le clavier principal"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro sur le clavier des symboles"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Aucun mode d\'entrée vocale n\'a été activé. Vérifiez les paramètres de langues et d\'entrée de texte."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> <string name="send_feedback" msgid="1780431884109392046">"Envoyer des commentaires"</string> <string name="select_language" msgid="3693815588777926848">"Langues de saisie"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Appuyer de nouveau pour enregistrer"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'erreur"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Thème du clavier"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglais (britannique)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglais (États-Unis)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Espagnol (États-Unis)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Anglais (Royaume-Uni) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Anglais (États-Unis) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Espagnol, États-Unis (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditionnel)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"anglais (Royaume-Uni) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"anglais (États-Unis) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"espagnol (États-Unis) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionnel)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cyrillique)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Aucune langue (alphabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet latin (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet latin (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alphabet latin (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alphabet latin (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Modèle de couleurs"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Blanc"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Bleu"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Styles saisie personnalisés"</string> <string name="add_style" msgid="6163126614514489951">"Ajouter style"</string> <string name="add" msgid="8299699805688017798">"Ajouter"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Activer"</string> <string name="not_now" msgid="6172462888202790482">"Pas maintenant"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Le style de saisie suivant existe déjà : <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>."</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'étude de l\'utilisabilité"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Délai appui prolongé sur touche"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durée vibration press. touche"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume pression de touche"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lire un fichier de dictionnaire externe"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Aucun fichier de dictionnaire dans le dossier \"Téléchargements\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Sélectionner un fichier de dictionnaire à installer"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installer ce fichier pour la langue \"<xliff:g id="LOCALE_NAME">%s</xliff:g>\" ?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Installer ce fichier pour la langue « <xliff:g id="LANGUAGE_NAME">%s</xliff:g> »?"</string> <string name="error" msgid="8940763624668513648">"Une erreur s\'est produite"</string> <string name="button_default" msgid="3988017840431881491">"Par défaut"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Bienvenue dans <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualiser"</string> <string name="last_update" msgid="730467549913588780">"Dernière mise à jour"</string> <string name="message_updating" msgid="4457761393932375219">"Recherche de mises à jour en cours…"</string> - <string name="message_loading" msgid="8689096636874758814">"Chargement en cours..."</string> + <string name="message_loading" msgid="5638680861387748936">"Chargement en cours…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Dictionnaire principal"</string> <string name="cancel" msgid="6830980399865683324">"Annuler"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Paramètres"</string> <string name="install_dict" msgid="180852772562189365">"Installer"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Annuler"</string> <string name="delete_dict" msgid="756853268088330054">"Supprimer"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Un dictionnaire est disponible pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire <xliff:g id="LANGUAGE">%1$s</xliff:g> pour faciliter votre saisie.<br/> <br/> Le téléchargement peut prendre une à deux minutes via une connexion 3G. Des frais peuvent s\'appliquer si vous ne disposez pas d\'un <b>forfait Internet illimité</b>.<br/> Si vous n\'êtes pas sûr de votre forfait, nous vous conseillons d\'utiliser une connexion Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires dans la section <b>Langue et saisie</b> du menu <b>Paramètres</b> de votre appareil mobile."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Un dictionnaire est offert pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire pour la langue <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> pour faciliter votre réaction de texte.<br/> <br/> Le téléchargement peut prendre une à deux minutes par connexion 3G. Des frais peuvent s\'appliquer si vous ne disposez pas d\'un <b>forfait Internet illimité</b>.<br/> Si vous n\'êtes pas sûr de votre forfait, nous vous conseillons d\'utiliser une connexion Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires dans la section <b>Langue et entrée</b> du menu <b>Paramètres</b> de votre appareil mobile."</string> <string name="download_over_metered" msgid="1643065851159409546">"Télécharger (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mo)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Télécharger via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Un dictionnaire est disponible en <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Un dictionnaire est offert pour la langue suivante : <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Appuyez ici pour consulter et télécharger le dictionnaire."</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"En cours de téléchargement. Des suggestions pour la langue suivante seront bientôt disponibles : <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Téléchargement en cours… Les suggestions seront bientôt offertes pour la langue suivante : <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ajouter"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ajouter au dictionnaire"</string> diff --git a/java/res/values-fr/donottranslate.xml b/java/res/values-fr/donottranslate-config-spacing-and-punctuations.xml index f0644118a..5a4914245 100644 --- a/java/res/values-fr/donottranslate.xml +++ b/java/res/values-fr/donottranslate-config-spacing-and-punctuations.xml @@ -22,9 +22,11 @@ <string name="symbols_preceded_by_space">([{&;:!?</string> <!-- Symbols that are normally followed by a space (used to add an auto-space after these) --> <string name="symbols_followed_by_space">.,;:!?)]}&</string> + <!-- Symbols that behave like a single punctuation when typed next to each other --> + <string name="symbols_clustering_together">!?</string> <!-- Symbols that separate words --> <!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) --> - <string name="symbols_word_separators">"	 \n"()[]{}*&<>+=|.,;:!?/_\"</string> + <string name="symbols_word_separators">"	 
 "()[]{}*&<>+=|.,;:!?/_\"</string> <!-- Word connectors --> <string name="symbols_word_connectors">\'-</string> </resources> diff --git a/java/res/values-fr/strings-action-keys.xml b/java/res/values-fr/strings-action-keys.xml index 1c36552d4..3dcdf757d 100644 --- a/java/res/values-fr/strings-action-keys.xml +++ b/java/res/values-fr/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Préc."</string> <string name="label_done_key" msgid="7564866296502630852">"OK"</string> <string name="label_send_key" msgid="482252074224462163">"Envoyer"</string> + <string name="label_search_key" msgid="7965186050435796642">"Rech."</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Attente"</string> </resources> diff --git a/java/res/values-fr/strings-config-important-notice.xml b/java/res/values-fr/strings-config-important-notice.xml new file mode 100644 index 000000000..82bdcf5b0 --- /dev/null +++ b/java/res/values-fr/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Améliorer suggestions en fonction des messages et données saisies"</string> +</resources> diff --git a/java/res/values-fr/strings-letter-descriptions.xml b/java/res/values-fr/strings-letter-descriptions.xml new file mode 100644 index 000000000..edbe9fd20 --- /dev/null +++ b/java/res/values-fr/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicateur ordinal féminin"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Symbole micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicateur ordinal masculin"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent aigu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accent circonflexe"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, tréma"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, rond en chef"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"E dans l\'A"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cédille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent aigu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accent circonflexe"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, tréma"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent aigu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accent circonflexe"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, tréma"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent aigu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accent circonflexe"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, tréma"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, barré"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent aigu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accent circonflexe"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, tréma"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent aigu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, tréma"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brève"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent aigu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accent circonflexe"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, point en chef"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, barré"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brève"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, point en chef"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accent circonflexe"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brève"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, point en chef"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cédille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accent circonflexe"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, barré"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, bref"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I, sans point"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accent circonflexe"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cédille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent aigu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cédille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, point médian"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, barré"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent aigu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cédille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, précédé par une apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brève"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double accent aigu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"E dans l\'O"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent aigu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cédille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent aigu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accent circonflexe"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cédille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cédille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, barré"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brève"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, rond en chef"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double accent aigu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accent circonflexe"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accent circonflexe"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent aigu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, point en chef"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S long"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, cornu"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, cornu"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, virgule souscrite"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, virgule souscrite"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, point souscrit"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, crochet en chef"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brève et accent aigu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brève et accent grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brève et crochet en chef"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brève et tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brève et point souscrit"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, point souscrit"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, crochet en chef"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, crochet en chef"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, point souscrit"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, point souscrit"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, crochet en chef"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accent circonflexe et accent aigu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accent circonflexe et accent grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accent circonflexe et crochet en chef"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accent circonflexe et tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accent circonflexe et point souscrit"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, cornu et accent aigu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, cornu et accent grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, cornu et crochet en chef"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, cornu et tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, cornu et point souscrit"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, point souscrit"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, crochet en chef"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, cornu et accent aigu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, cornu et accent grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, cornu et crochet en chef"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, cornu et tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, cornu et point souscrit"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, point souscrit"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, crochet en chef"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Point d\'exclamation inversé"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Chevron double ouvrant"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Point médian"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Exposant un"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Chevron double fermant"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Point d\'interrogation inversé"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Guillemet simple ouvrant"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Guillemet simple fermant"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Guillemet simple fermant bas"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Guillemet double ouvrant"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Guillemet double fermant"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obèle"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double obèle"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Symbole pour mille"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Chevron simple ouvrant"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Chevron simple fermant"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Exposant quatre"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Exposant lettre minuscule latine N"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Symbole du peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"À l\'attention de"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Flèche vers la droite"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Flèche vers le bas"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Ensemble vide"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incrément"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Inférieur ou égal"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Supérieur ou égal"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Étoile noire"</string> +</resources> diff --git a/java/res/values-fr/strings-talkback-descriptions.xml b/java/res/values-fr/strings-talkback-descriptions.xml new file mode 100644 index 000000000..7ae20568d --- /dev/null +++ b/java/res/values-fr/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Le texte actuel est \"%s\"."</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Aucun texte saisi"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"La touche <xliff:g id="KEY_NAME">%1$s</xliff:g> permet de remplacer \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" par \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\"."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"La touche <xliff:g id="KEY_NAME">%1$s</xliff:g> permet d\'effectuer une correction automatique."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caractère inconnu."</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Maj"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Autres symboles"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maj"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboles"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Maj"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Supprimer"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboles"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Lettres"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Chiffres"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Paramètres"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulation"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espace"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Saisie vocale"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Entrée"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Recherche"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Point"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Changer de langue"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Suivant"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Précédent"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"La touche Maj a bien été activée."</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Le verrouillage des majuscules a bien été activé."</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Mode Symboles"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Mode Autres symboles"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Mode Lettres"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Mode Téléphone"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Mode Symboles du téléphone"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Clavier masqué"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Affichage du clavier <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"Date"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"Date et heure"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"Adresse e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"SMS/MMS"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"Chiffre"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"Numéro de téléphone"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"Texte"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"Heure"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Récents"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personnes"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objets"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Nature"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Lieux"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboles"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Émoticônes"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> majuscule"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I majuscule"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I majuscule, point en chef"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Symbole inconnu."</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji inconnu."</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Des caractères supplémentaires sont disponibles."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Les caractères supplémentaires sont ignorés."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Des suggestions supplémentaires sont disponibles."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Les suggestions supplémentaires sont ignorées."</string> +</resources> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index b877db014..9cefdad39 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Options de saisie"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Commandes journaux rech."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Rechercher noms contacts"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Correcteur orthographique utilise entrées de liste de contacts."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer à chaque touche"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Son à chaque touche"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Agrandir les caractères"</string> - <string name="general_category" msgid="1859088467017573195">"Général"</string> - <string name="correction_category" msgid="2236750915056607613">"Correction du texte"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Saisie gestuelle"</string> - <string name="misc_category" msgid="6894192814868233453">"Autres options"</string> - <string name="advanced_settings" msgid="362895144495591463">"Paramètres avancés"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Options destinées aux experts"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Autres modes de saisie"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"La touche de sélection de langue couvre d\'autres modes de saisie."</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Touche de sélection de langue"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Paramètres par défaut"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Proposer noms de contacts"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utiliser des noms de contacts pour les suggestions et corrections"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggestions personnalisées"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Améliorer l\'application <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Point et espace"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Appuyez deux fois sur la barre d\'espace pour insérer un point et un espace."</string> <string name="auto_cap" msgid="1719746674854628252">"Majuscules auto"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Afficher le tracé du geste"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Aperçu flottant dynamique"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afficher le mot suggéré lors des gestes"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : enregistré"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Branchez des écouteurs pour entendre l\'énoncé à haute voix des touches lors de la saisie du mot de passe."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Le texte actuel est %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Aucun texte saisi"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"La touche <xliff:g id="KEY">%1$s</xliff:g> permet de remplacer \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" par \"<xliff:g id="CORRECTED">%3$s</xliff:g>\"."</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"La touche <xliff:g id="KEY">%1$s</xliff:g> permet d\'activer la correction automatique."</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Code touche %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Maj"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Touche Maj activée (appuyer pour désactiver)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Verrouillage des majuscules activé (appuyer pour désactiver)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Supprimer"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboles"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Lettres"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Chiffres"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Paramètres"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulation"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espace"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Saisie vocale"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Émoticône"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Entrée"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Rechercher"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Point"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Changer de langue"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Touche suivante"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Touche précédente"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Touche Maj activée"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Verrouillage des majuscules activé"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Touche Maj désactivée"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mode Symboles"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode Lettres"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode Téléphone"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode Symboles du téléphone"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Clavier masqué"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Affichage du clavier <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"Date"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"Date et heure"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"Adresse e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS/MMS"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"Chiffre"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"Numéro de téléphone"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"Texte"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"Heure"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Geste multiterme"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Insérer un espace avec barre d\'espace lors de la saisie gestuelle"</string> <string name="voice_input" msgid="3583258583521397548">"Touche de saisie vocale"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Sur clavier principal"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Sur clavier symboles"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Désactiver"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Micro sur le clavier principal"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Micro sur clavier symboles"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Aucun mode de saisie vocale activé. Vérifiez les paramètres de langue et de saisie."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> <string name="send_feedback" msgid="1780431884109392046">"Envoyer des commentaires"</string> <string name="select_language" msgid="3693815588777926848">"Langues de saisie"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Appuyer de nouveau pour enregistrer"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'erreur"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Thème du clavier"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglais (Royaume-Uni)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglais (États-Unis)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Espagnol (États-Unis)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Anglais (Royaume-Uni) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Anglais (États-Unis) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Espagnol (États-Unis) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditionnel)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"anglais (Royaume-Uni) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"anglais (États-Unis) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"espagnol (États-Unis) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionnel)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cyrillique)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Aucune langue (latin)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alphabet latin (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alphabet latin (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alphabet latin (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alphabet latin (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Jeu de couleurs"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Blanc"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Bleu"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Styles saisie personnalisés"</string> <string name="add_style" msgid="6163126614514489951">"Ajouter style"</string> <string name="add" msgid="8299699805688017798">"Ajouter"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Activer"</string> <string name="not_now" msgid="6172462888202790482">"Pas maintenant"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Le style de saisie suivant existe déjà : <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>."</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode d\'étude de l\'utilisabilité"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Délai appui prolongé sur touche"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durée vibration press. touche"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume son pression de touche"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lire un fichier de dictionnaire externe"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Aucun fichier de dictionnaire dans le dossier \"Téléchargements\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Sélectionner un fichier de dictionnaire à installer"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installer ce fichier pour la langue \"<xliff:g id="LOCALE_NAME">%s</xliff:g>\" ?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Installer ce fichier pour la langue \"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>\" ?"</string> <string name="error" msgid="8940763624668513648">"Une erreur s\'est produite"</string> <string name="button_default" msgid="3988017840431881491">"Par défaut"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Bienvenue dans <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualiser"</string> <string name="last_update" msgid="730467549913588780">"Dernière mise à jour"</string> <string name="message_updating" msgid="4457761393932375219">"Recherche de mises à jour en cours…"</string> - <string name="message_loading" msgid="8689096636874758814">"Chargement en cours..."</string> + <string name="message_loading" msgid="5638680861387748936">"Chargement en cours…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Dictionnaire principal"</string> <string name="cancel" msgid="6830980399865683324">"Annuler"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Paramètres"</string> <string name="install_dict" msgid="180852772562189365">"Installer"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Annuler"</string> <string name="delete_dict" msgid="756853268088330054">"Supprimer"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Un dictionnaire est disponible pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire <xliff:g id="LANGUAGE">%1$s</xliff:g> pour faciliter votre saisie.<br/> <br/> Le téléchargement peut prendre une à deux minutes via une connexion 3G. Des frais peuvent s\'appliquer si vous ne disposez pas d\'un <b>forfait Internet illimité</b>.<br/> Si vous n\'êtes pas sûr de votre forfait, nous vous conseillons d\'utiliser une connexion Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires dans la section <b>Langue et saisie</b> du menu <b>Paramètres</b> de votre appareil mobile."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Un dictionnaire est disponible pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire pour cette langue : <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>. Cela facilitera votre saisie.<br/> <br/> Le téléchargement peut prendre une à deux minutes via une connexion 3G. Des frais peuvent s\'appliquer si vous n\'avez pas un <b>forfait Internet illimité</b>.<br/> Si vous avez un doute concernant le type de forfait dont vous disposez, nous vous conseillons d\'utiliser le Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires sous <b>Langue et saisie</b>, dans le menu <b>Paramètres</b> de votre appareil mobile."</string> <string name="download_over_metered" msgid="1643065851159409546">"Télécharger (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mo)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Télécharger via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Un dictionnaire est disponible en <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Un dictionnaire est disponible pour la langue suivante : <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Appuyez ici pour consulter et télécharger le dictionnaire."</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"En cours de téléchargement. Des suggestions pour la langue suivante seront bientôt disponibles : <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Téléchargement en cours… Les suggestions seront bientôt disponibles pour la langue suivante : <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ajouter"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ajouter au dictionnaire"</string> diff --git a/java/res/values-gl-rES/strings-action-keys.xml b/java/res/values-gl-rES/strings-action-keys.xml new file mode 100644 index 000000000..5ce96e63c --- /dev/null +++ b/java/res/values-gl-rES/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Ir"</string> + <string name="label_next_key" msgid="5586407279258592635">"Seg."</string> + <string name="label_previous_key" msgid="1421141755779895275">"Ant"</string> + <string name="label_done_key" msgid="7564866296502630852">"Feito"</string> + <string name="label_send_key" msgid="482252074224462163">"Enviar"</string> + <string name="label_search_key" msgid="7965186050435796642">"Buscar"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Espera"</string> +</resources> diff --git a/java/res/values-gl-rES/strings-appname.xml b/java/res/values-gl-rES/strings-appname.xml new file mode 100644 index 000000000..df9e1f439 --- /dev/null +++ b/java/res/values-gl-rES/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Teclado Android (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Corrector ortográfico Android (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Configuración do teclado Android (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Configuración do corrector ortográfico Android (AOSP)"</string> +</resources> diff --git a/java/res/values-gl-rES/strings-config-important-notice.xml b/java/res/values-gl-rES/strings-config-important-notice.xml new file mode 100644 index 000000000..11f697da3 --- /dev/null +++ b/java/res/values-gl-rES/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprende das comunicacións e dos datos para mellorar as suxestións"</string> +</resources> diff --git a/java/res/values-gl-rES/strings-letter-descriptions.xml b/java/res/values-gl-rES/strings-letter-descriptions.xml new file mode 100644 index 000000000..d09e5c93c --- /dev/null +++ b/java/res/values-gl-rES/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signo de micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ẞ"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diérese"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anel superior"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diérese"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diérese"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diérese"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, trazo"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diérese"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diérese"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, acento breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punto superior"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, acento anticircunflexo"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, trazo"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punto superior"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punto superior"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, trazo"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sen punto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punto medio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, trazo"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedido de apóstrofo"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, agudo dobre"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, trazo"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anel superior"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, agudo dobre"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punto superior"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corno"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corno"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punto inferior"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho superior"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancho superior"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e til"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e punto inferior"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punto inferior"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho superior"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho superior"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punto inferior"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punto inferior"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho superior"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corno e agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corno e grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corno e gancho superior"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corno e til"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corno e punto inferior"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punto inferior"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho superior"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corno e agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corno e grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corno e gancho superior"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corno e til"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corno e punto inferior"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punto inferior"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho superior"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Exclamación de apertura"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Comiñas angulares de apertura"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punto medio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndice un"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Comiñas angulares de peche"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Interrogación de apertura"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Comiña tipográfica de apertura"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Comiña tipográfica de peche"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Comiña tipográfica en forma de 9 simple e baixa"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Comiñas tipográficas de apertura"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Comiñas tipográficas de peche"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruz"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruz dobre"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signo de por mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primo"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Primo dobre"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Comiña tipográfica simple angular de apertura"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Comiña tipográfica simple angular de peche"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndice catro"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndice letra latina minúscula n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signo de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Símbolo inglés care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Frecha dereita"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Frecha abaixo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conxunto baleiro"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor ou igual que"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior ou igual que"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela negra"</string> +</resources> diff --git a/java/res/values-gl-rES/strings-talkback-descriptions.xml b/java/res/values-gl-rES/strings-talkback-descriptions.xml new file mode 100644 index 000000000..d253d349c --- /dev/null +++ b/java/res/values-gl-rES/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Carácter descoñecido"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúscula, punto superior"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo descoñecido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji descoñecido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Os caracteres alternativos están dispoñibles"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Descártanse os caracteres alternativos"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"As suxestións alternativas están dispoñibles"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Descártanse as suxestións alternativas"</string> +</resources> diff --git a/java/res/values-gl-rES/strings.xml b/java/res/values-gl-rES/strings.xml new file mode 100644 index 000000000..a02e38364 --- /dev/null +++ b/java/res/values-gl-rES/strings.xml @@ -0,0 +1,213 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Opcións de entrada"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nomes de contactos"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corrector ortográfico utiliza entradas da lista de contactos"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar as teclas"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Son ao premer as teclas"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Ventás emerxentes ao premer as teclas"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Outros métodos de entrada"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"A tecla de cambio de idioma inclúe outros métodos de entrada"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla de cambio de idioma"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Mostra cando hai varios idiomas de entrada activados"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Mostrar indicador movemento"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Indicación visual ao pasar o dedo nas teclas Maiús ou de símbolos"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retraso ao ampliar tecla"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sen retraso"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminado"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Predeterminado do sistema"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Suxerir nomes contactos"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utiliza nomes de contactos para as suxestións e correccións"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suxestións personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Mellorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Dobre espazo e punto"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ao tocar dúas veces a barra de espazo insire un punto e un espazo"</string> + <string name="auto_cap" msgid="1719746674854628252">"Maiúsculas automáticas"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Pon en maiúscula a primeira palabra de cada frase"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Dicionario persoal"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Dicionarios complementarios"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Dicionario principal"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar suxestións de corrección"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostra palabras suxeridas mentres escribes"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Mostrar en modo vertical"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar sempre"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloquear palabras ofensivas"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Non suxerir palabras potencialmente ofensivas"</string> + <string name="auto_correction" msgid="7630720885194996950">"Autocorrección"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Premer a barra espazo e teclas de puntuación para corrixir erros"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modesta"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Agresiva"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Moi agresiva"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Suxerir palabra seguinte"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utiliza a palabra anterior para facer suxestións"</string> + <string name="gesture_input" msgid="826951152254563827">"Activar escritura con xestos"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Pasa o dedo entre as letras para introducir unha palabra"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percorrido dos xestos"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa flotante dinámica"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Mostra a palabra suxerida mentres se fan xestos"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Xesto de frase"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Para introducir espazos nos xestos, pasa o dedo cara a tecla de espazo"</string> + <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada de voz"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Non hai ningún método de entrada de voz activado. Comproba a configuración de Idioma e entrada de texto."</string> + <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Enviar comentarios"</string> + <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca de novo para gardar"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Dicionario dispoñible"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"Inglés (Reino Unido)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"Inglés (EUA)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Español (EUA)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés (Reino Unido) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Alfabeto (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Alfabeto (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos de entrada personalizados"</string> + <string name="add_style" msgid="6163126614514489951">"Engadir estilo"</string> + <string name="add" msgid="8299699805688017798">"Engadir"</string> + <string name="remove" msgid="4486081658752944606">"Eliminar"</string> + <string name="save" msgid="7646738597196767214">"Gardar"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Idioma"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Deseño"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"É necesario activar o estilo de entrada personalizado para poder comezar a utilizalo. Queres activalo agora?"</string> + <string name="enable" msgid="5031294444630523247">"Activar"</string> + <string name="not_now" msgid="6172462888202790482">"Agora non"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Xa existe o mesmo estilo de entrada: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Retraso de pulsación prolongada"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duración vibración ao premer teclas"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume do son ao premer teclas"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler ficheiro de dicionario externo"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Non hai ningún ficheiro de dicionario no cartafol de descargas"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un ficheiro de dicionario para instalar"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Realmente queres instalar este ficheiro para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> + <string name="error" msgid="8940763624668513648">"Produciuse un erro"</string> + <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"Benvido a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"con escritura xestual"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Comezar"</string> + <string name="setup_next_action" msgid="371821437915144603">"Seguinte paso"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"Configurando <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"Activar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Comproba \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" na túa configuración de idioma e entrada de texto para que se poida executar no teu dispositivo."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"A aplicación <xliff:g id="APPLICATION_NAME">%s</xliff:g> xa está activada na configuración de idioma e entrada de texto. Podes pasar ao seguinte paso."</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Activar en Configuración"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"Cambiar a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"A continuación, selecciona \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" como o método de entrada de texto activo."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Cambiar métodos de entrada"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Parabéns, está todo listo!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Agora podes escribir en todas as túas aplicacións favoritas con <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Configurar idiomas adicionais"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Finalizado"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Mostrar icona da aplicación"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra a icona da aplicación no menú de aplicacións"</string> + <string name="app_name" msgid="6320102637491234792">"Fornecedor do dicionario"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Fornecedor do dicionario"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servizo de dicionario"</string> + <string name="download_description" msgid="6014835283119198591">"Información de actualización do dicionario"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dicionarios complementarios"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dicionario dispoñible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Configuración dos dicionarios"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dicionarios de usuario"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dicionario de usuario"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dicionario dispoñible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Descarga en curso"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado (desactivado)"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Erro ao conectar"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Non hai dicionarios"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última actualización"</string> + <string name="message_updating" msgid="4457761393932375219">"Comprobando se hai actualizacións"</string> + <string name="message_loading" msgid="5638680861387748936">"Cargando..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dicionario principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Configuración"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"O idioma seleccionado no teu dispositivo móbil ten un dicionario dispoñible.<br/> É recomendable <b>descargar</b> o dicionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mellorar a experiencia de escritura.<br/> <br/> A descarga pode tardar un ou dous minutos en redes 3G. É posible que se apliquen tarifas se non tes un <b>plan de datos ilimitado</b>.<br/> Se non estás seguro de que plan de datos tes, é recomendable buscar unha conexión wifi para iniciar a descarga automaticamente.<br/> <br/> Consello: podes descargar e eliminar dicionarios en <b>Idioma e entrada de texto</b> no menú <b>Configuración</b> do teu dispositivo móbil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Descargar agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar a través da wifi"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hai un dicionario dispoñible para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Preme aquí para revisar e descargar"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Descargando: as suxestións para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estarán listas proximamente."</string> + <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Engadir"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Engadir ao dicionario"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Frase"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Máis opcións"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Menos opcións"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Aceptar"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Palabra:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Atallo:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Idioma:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Escribe unha palabra"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Atallo opcional"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Editar palabra"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Editar"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Eliminar"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Non tes ningunha palabra no dicionario do usuario. Toca o botón Engadir (+) para engadir unha palabra."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Para todos os idiomas"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Máis idiomas..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Eliminar"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings-action-keys.xml b/java/res/values-gl-rGA/strings-action-keys.xml new file mode 100644 index 000000000..5ce96e63c --- /dev/null +++ b/java/res/values-gl-rGA/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Ir"</string> + <string name="label_next_key" msgid="5586407279258592635">"Seg."</string> + <string name="label_previous_key" msgid="1421141755779895275">"Ant"</string> + <string name="label_done_key" msgid="7564866296502630852">"Feito"</string> + <string name="label_send_key" msgid="482252074224462163">"Enviar"</string> + <string name="label_search_key" msgid="7965186050435796642">"Buscar"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Espera"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings-appname.xml b/java/res/values-gl-rGA/strings-appname.xml new file mode 100644 index 000000000..df9e1f439 --- /dev/null +++ b/java/res/values-gl-rGA/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Teclado Android (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Corrector ortográfico Android (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Configuración do teclado Android (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Configuración do corrector ortográfico Android (AOSP)"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings-config-important-notice.xml b/java/res/values-gl-rGA/strings-config-important-notice.xml new file mode 100644 index 000000000..11f697da3 --- /dev/null +++ b/java/res/values-gl-rGA/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprende das comunicacións e dos datos para mellorar as suxestións"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings-letter-descriptions.xml b/java/res/values-gl-rGA/strings-letter-descriptions.xml new file mode 100644 index 000000000..d09e5c93c --- /dev/null +++ b/java/res/values-gl-rGA/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signo de micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ẞ"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diérese"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anel superior"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diérese"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diérese"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diérese"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, trazo"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diérese"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diérese"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, acento breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punto superior"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, acento anticircunflexo"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, trazo"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punto superior"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punto superior"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, trazo"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sen punto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punto medio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, trazo"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedido de apóstrofo"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, agudo dobre"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, trazo"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anel superior"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, agudo dobre"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punto superior"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corno"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corno"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punto inferior"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho superior"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancho superior"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e til"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e punto inferior"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punto inferior"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho superior"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho superior"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punto inferior"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punto inferior"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho superior"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho superior"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e punto inferior"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corno e agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corno e grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corno e gancho superior"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corno e til"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corno e punto inferior"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punto inferior"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho superior"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corno e agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corno e grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corno e gancho superior"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corno e til"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corno e punto inferior"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punto inferior"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho superior"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Exclamación de apertura"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Comiñas angulares de apertura"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punto medio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndice un"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Comiñas angulares de peche"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Interrogación de apertura"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Comiña tipográfica de apertura"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Comiña tipográfica de peche"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Comiña tipográfica en forma de 9 simple e baixa"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Comiñas tipográficas de apertura"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Comiñas tipográficas de peche"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruz"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruz dobre"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signo de por mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primo"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Primo dobre"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Comiña tipográfica simple angular de apertura"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Comiña tipográfica simple angular de peche"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndice catro"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndice letra latina minúscula n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signo de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Símbolo inglés care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Frecha dereita"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Frecha abaixo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conxunto baleiro"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor ou igual que"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior ou igual que"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela negra"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings-talkback-descriptions.xml b/java/res/values-gl-rGA/strings-talkback-descriptions.xml new file mode 100644 index 000000000..d253d349c --- /dev/null +++ b/java/res/values-gl-rGA/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Carácter descoñecido"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúscula, punto superior"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo descoñecido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji descoñecido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Os caracteres alternativos están dispoñibles"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Descártanse os caracteres alternativos"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"As suxestións alternativas están dispoñibles"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Descártanse as suxestións alternativas"</string> +</resources> diff --git a/java/res/values-gl-rGA/strings.xml b/java/res/values-gl-rGA/strings.xml new file mode 100644 index 000000000..5ae06c306 --- /dev/null +++ b/java/res/values-gl-rGA/strings.xml @@ -0,0 +1,213 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Opcións de entrada"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nomes de contactos"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corrector ortográfico utiliza entradas da lista de contactos"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar as teclas"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Son ao premer as teclas"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Ventás emerxentes ao premer as teclas"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Outros métodos de entrada"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"A tecla de cambio de idioma inclúe outros métodos de entrada"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla de cambio de idioma"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Mostra cando hai varios idiomas de entrada activados"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Mostrar indicador movemento"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Indicación visual ao pasar o dedo nas teclas Maiús ou de símbolos"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Retraso ao ampliar tecla"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sen retraso"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Predeterminado"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Predeterminado do sistema"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Suxerir nomes contactos"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utiliza nomes de contactos para as suxestións e correccións"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suxestións personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Mellorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Dobre espazo e punto"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ao tocar dúas veces a barra de espazo insire un punto e un espazo"</string> + <string name="auto_cap" msgid="1719746674854628252">"Maiúsculas automáticas"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Pon en maiúscula a primeira palabra de cada frase"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Dicionario persoal"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Dicionarios complementarios"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Dicionario principal"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar suxestións de corrección"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostra palabras suxeridas mentres escribes"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Mostrar en modo vertical"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar sempre"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloquear palabras ofensivas"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Non suxerir palabras potencialmente ofensivas"</string> + <string name="auto_correction" msgid="7630720885194996950">"Autocorrección"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Premer a barra espazo e teclas de puntuación para corrixir erros"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Desactivada"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Modesta"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Agresiva"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Moi agresiva"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Suxerir palabra seguinte"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utiliza a palabra anterior para facer suxestións"</string> + <string name="gesture_input" msgid="826951152254563827">"Activar escritura con xestos"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Pasa o dedo entre as letras para introducir unha palabra"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percorrido dos xestos"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa flotante dinámica"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Mostra a palabra suxerida mentres se fan xestos"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Xesto de frase"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Para introducir espazos nos xestos, pasa o dedo cara a tecla de espazo"</string> + <string name="voice_input" msgid="3583258583521397548">"Tecla de entrada de voz"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Non hai ningún método de entrada de voz activado. Comproba a configuración de Idioma e entrada."</string> + <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Enviar comentarios"</string> + <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca de novo para gardar"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Dicionario dispoñible"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"Inglés (Reino Unido)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"Inglés (EUA)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Español (EUA)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglés (Reino Unido) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglés (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Español (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <string name="subtype_no_language" msgid="7137390094240139495">"Ningún idioma (alfabeto)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Alfabeto (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Alfabeto (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos de entrada personalizados"</string> + <string name="add_style" msgid="6163126614514489951">"Engadir estilo"</string> + <string name="add" msgid="8299699805688017798">"Engadir"</string> + <string name="remove" msgid="4486081658752944606">"Eliminar"</string> + <string name="save" msgid="7646738597196767214">"Gardar"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Idioma"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Deseño"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"É necesario activar o estilo de entrada personalizado para poder comezar a utilizalo. Queres activalo agora?"</string> + <string name="enable" msgid="5031294444630523247">"Activar"</string> + <string name="not_now" msgid="6172462888202790482">"Agora non"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Xa existe o mesmo estilo de entrada: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Retraso de pulsación prolongada"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duración vibración ao premer teclas"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume do son ao premer teclas"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler ficheiro de dicionario externo"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Non hai ningún ficheiro de dicionario no cartafol de descargas"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un ficheiro de dicionario para instalar"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Realmente queres instalar este ficheiro para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> + <string name="error" msgid="8940763624668513648">"Produciuse un erro"</string> + <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"Benvido a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"con escritura xestual"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Comezar"</string> + <string name="setup_next_action" msgid="371821437915144603">"Seguinte paso"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"Configurando <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"Activar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Comproba \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" na túa configuración de idioma e entrada para que se poida executar no teu dispositivo."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"A aplicación <xliff:g id="APPLICATION_NAME">%s</xliff:g> xa está activada na configuración de idioma e entrada de texto. Podes pasar ao seguinte paso."</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Activar en Configuración"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"Cambiar a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"A continuación, selecciona \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" como o método de entrada de texto activo."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Cambiar métodos de entrada"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Parabéns, está todo listo!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Agora podes escribir en todas as túas aplicacións favoritas con <xliff:g id="APPLICATION_NAME">%s</xliff:g>."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Configurar idiomas adicionais"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Finalizado"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Mostrar icona da aplicación"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Mostra a icona da aplicación no menú de aplicacións"</string> + <string name="app_name" msgid="6320102637491234792">"Fornecedor do dicionario"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Fornecedor do dicionario"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servizo de dicionario"</string> + <string name="download_description" msgid="6014835283119198591">"Información de actualización do dicionario"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dicionarios complementarios"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dicionario dispoñible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Configuración dos dicionarios"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dicionarios de usuario"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dicionario de usuario"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dicionario dispoñible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Descarga en curso"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado (desactivado)"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Erro ao conectar"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Non hai dicionarios"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última actualización"</string> + <string name="message_updating" msgid="4457761393932375219">"Comprobando se hai actualizacións"</string> + <string name="message_loading" msgid="5638680861387748936">"Cargando..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dicionario principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Configuración"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"O idioma seleccionado no teu dispositivo móbil ten un dicionario dispoñible.<br/> É recomendable <b>descargar</b> o dicionario de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para mellorar a experiencia de escritura.<br/> <br/> A descarga pode tardar un ou dous minutos en redes 3G. É posible que se apliquen tarifas se non tes un <b>plan de datos ilimitado</b>.<br/> Se non estás seguro de que plan de datos tes, é recomendable buscar unha conexión wifi para iniciar a descarga automaticamente.<br/> <br/> Consello: podes descargar e eliminar dicionarios en <b>Idioma e entrada</b> no menú <b>Configuración</b> do teu dispositivo móbil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Descargar agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar a través da wifi"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hai un dicionario dispoñible para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Preme aquí para revisar e descargar"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Descargando: as suxestións para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estarán listas proximamente."</string> + <string name="version_text" msgid="2715354215568469385">"Versión <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Engadir"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Engadir ao dicionario"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Frase"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Máis opcións"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Menos opcións"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Aceptar"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Palabra:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Atallo:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Idioma:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Escribe unha palabra"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Atallo opcional"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Editar palabra"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Editar"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Eliminar"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Non tes ningunha palabra no dicionario do usuario. Toca o botón Engadir (+) para engadir unha palabra."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Para todos os idiomas"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Máis idiomas..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Eliminar"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml index bc7928d6a..adc3e35a9 100644 --- a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml +++ b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">38sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">24sp</dimen> <dimen name="setup_step_instruction_text_size">18sp</dimen> <dimen name="setup_step_action_text_size">20sp</dimen> diff --git a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml index aebf6d2f3..1ff43ff9f 100644 --- a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml +++ b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">22sp</dimen> <dimen name="setup_step_bullet_text_size">22sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">20sp</dimen> <dimen name="setup_step_instruction_text_size">16sp</dimen> <dimen name="setup_step_action_text_size">18sp</dimen> diff --git a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml index aedf79fb2..a0e30cd37 100644 --- a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml +++ b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">32sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">24sp</dimen> <dimen name="setup_step_instruction_text_size">18sp</dimen> <dimen name="setup_step_action_text_size">20sp</dimen> diff --git a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml index 6d66f46eb..cf2a10a9e 100644 --- a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml +++ b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">26sp</dimen> <dimen name="setup_step_bullet_text_size">22sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">20sp</dimen> <dimen name="setup_step_instruction_text_size">16sp</dimen> <dimen name="setup_step_action_text_size">18sp</dimen> diff --git a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml index e22b741fb..a782ef8f4 100644 --- a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml +++ b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">38sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">24sp</dimen> <dimen name="setup_step_instruction_text_size">18sp</dimen> <dimen name="setup_step_action_text_size">20sp</dimen> diff --git a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml index 86cf3a04a..9ac0f115f 100644 --- a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml +++ b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">36sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> - <dimen name="setup_step_indicator_height">24dp</dimen> <dimen name="setup_step_title_text_size">24sp</dimen> <dimen name="setup_step_instruction_text_size">18sp</dimen> <dimen name="setup_step_action_text_size">20sp</dimen> diff --git a/java/res/values-hi/strings-action-keys.xml b/java/res/values-hi/strings-action-keys.xml index 92cb194ea..7237c24bb 100644 --- a/java/res/values-hi/strings-action-keys.xml +++ b/java/res/values-hi/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"पिछला"</string> <string name="label_done_key" msgid="7564866296502630852">"पूर्ण"</string> <string name="label_send_key" msgid="482252074224462163">"भेजें"</string> + <string name="label_search_key" msgid="7965186050435796642">"खोजें"</string> <string name="label_pause_key" msgid="2225922926459730642">"रोकें"</string> <string name="label_wait_key" msgid="5891247853595466039">"प्रतीक्षा करें"</string> </resources> diff --git a/java/res/values-hi/strings-config-important-notice.xml b/java/res/values-hi/strings-config-important-notice.xml new file mode 100644 index 000000000..3f22541eb --- /dev/null +++ b/java/res/values-hi/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"सुझावों में सुधार हेतु अपने संचार और लिखे गए डेटा से जानकारी पाएं"</string> +</resources> diff --git a/java/res/values-hi/strings-letter-descriptions.xml b/java/res/values-hi/strings-letter-descriptions.xml new file mode 100644 index 000000000..ecf589ab7 --- /dev/null +++ b/java/res/values-hi/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"स्त्रीलिंग क्रमसूचक संकेतक"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"माइक्रो चिह्न"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"पुल्लिंग क्रमसूचक संकेतक"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"शार्प एस"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ए, ग्रेव"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ए, एक्यूट"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ए, स्वरित"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ए, लहरिल"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ए, डाएरेसिस"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ए, रिंग ऊपर"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ए, ई, संयुक्ताक्षर"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"सी, सेडिला"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ई, ग्रेव"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ई, एक्यूट"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ई, स्वरित"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ई, डाएरेसिस"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"आई, ग्रेव"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"आई, एक्यूट"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"आई, स्वरित"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"आई, डाएरेसिस"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ईथ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"एन, लहरिल"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ओ, ग्रेव"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ओ, एक्यूट"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ओ, स्वरित"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ओ, लहरिल"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ओ, डाएरेसिस"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ओ, स्ट्रोक"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"यू, ग्रेव"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"यू, एक्यूट"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"यू, स्वरित"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"यू, डाएरेसिस"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"वाय, एक्यूट"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"थॉर्न"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"वाय, डाएरेसिस"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ए, मैक्रॉन"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ए, ब्रीव"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ए, ओजोनेक"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"सी, एक्यूट"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"सी, स्वरित"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"सी, बिंदु ऊपर"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"सी, कैरन"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"डी, कैरन"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"डी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ई, मैक्रॉन"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ई, ब्रीव"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ई, बिंदु ऊपर"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ई, ओजोनेक"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ई, कैरन"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"जी, स्वरित"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"जी, ब्रीव"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"जी, बिंदु ऊपर"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"जी, सेडिला"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"एच, स्वरित"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"एच, स्ट्रोक"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"आई, लहरिल"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"आई, मैक्रोन"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"आई, ब्रीव"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"आई, ओजोनेक"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"बिंदुरहित आई"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"आई, जे, संयुक्ताक्षर"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"जे, स्वरित"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"के, सेडिला"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"क्रा"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"एल, एक्यूट"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"एल, सेडिला"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"एल, कैरन"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"एल, मध्य बिंदु"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"एल, स्ट्रोक"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"एन, एक्यूट"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"एन, सेडिला"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"एन, कैरन"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"एपॉस्ट्रॉफ़ी से पहले एन"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"एन्ग्मा"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ओ, मैक्रॉन"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ओ, ब्रीव"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ओ, दोहरा एक्यूट"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ओ, ई, संयुक्ताक्षर"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"आर, एक्यूट"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"आर, सेडिला"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"आर, कैरन"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"एस, एक्यूट"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"एस, स्वरित"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"एस, सेडिला"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"एस, कैरन"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"टी, सेडिला"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"टी, कैरन"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"टी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"यू, लहरिल"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"यू, मैक्रॉन"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"यू, ब्रीव"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"यू, रिंग ऊपर"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"यू, दोहरा एक्यूट"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"यू, ओजोनेक"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"डबल्यू स्वरित"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"वाय, स्वरित"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"ज़ेड, एक्यूट"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"ज़ेड, बिंदु ऊपर"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"ज़ेड, कैरन"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"लंबा एस"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ओ, हॉर्न"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"यू, हॉर्न"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"एस, नीचे अल्पविराम"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"टी, नीचे अल्पविराम"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"स्च्वा"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ए, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ए, ऊपर हुक"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ए, स्वरित और एक्यूट"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ए, स्वरित और ग्रेव"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ए, स्वरित और हुक ऊपर"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ए, स्वरित और लहरिल"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ए, स्वरित और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ए, ब्रीव और एक्यूट"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ए, ब्रीव और ग्रेव"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ए, ब्रीव और हुक ऊपर"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ए, ब्रीव और लहरिल"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ए, ब्रीव और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ई, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ई, हुक ऊपर"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ई, लहरिल"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ई, स्वरित और एक्यूट"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ई, स्वरित और ग्रेव"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ई, स्वरित और हुक ऊपर"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ई, स्वरित और लहरिल"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ई, स्वरित और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"आई, हुक ऊपर"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"आई, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ओ, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ओ, हुक ऊपर"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ओ, स्वरित और एक्यूट"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ओ, स्वरित और ग्रेव"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ओ, स्वरित और हुक ऊपर"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ओ, स्वरित और लहरिल"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ओ, स्वरित और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ओ, हॉर्न और एक्यूट"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ओ, हॉर्न और ग्रेव"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ओ, हॉर्न और हुक ऊपर"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ओ, हॉर्न और लहरिल"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ओ, हॉर्न और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"यू, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"यू, हुक ऊपर"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"यू, हॉर्न और एक्यूट"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"यू, हॉर्न और ग्रेव"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"यू, हॉर्न और हुक ऊपर"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"यू, हॉर्न और लहरिल"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"यू, हॉर्न और बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"वाय, ग्रेव"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"वाय, बिंदु नीचे"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"वाय, हुक ऊपर"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"वाय, लहरिल"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"उलटा विस्मयादिबोधक चिह्न"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"बाईं ओर इंगित दोहरे कोण वाला उद्धरण चिह्न"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"मध्य बिंदु"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"सुपरस्क्रिप्ट एक"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"दाईं ओर इंगित दोहरे कोण वाला उद्धरण चिह्न"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"उलटा प्रश्नवाचक चिह्न"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"बायां एकल उद्धरण चिह्न"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"दायां एकल उद्धरण चिह्न"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"एकल नीचे-9 उद्धरण चिह्न"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"बायां दोहरा उद्धरण चिह्न"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"दायां दोहरा उद्धरण चिह्न"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"डैगर"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"दोहरा डैगर"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"प्रति सहस्र चिह्न"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"प्राइम"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"दोहरा प्राइम"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"एकल बाईं ओर इंगित उद्धरण चिह्न"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"एकल दाईं ओर इंगित उद्धरण चिह्न"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"सुपरस्क्रिप्ट चार"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"सुपरस्क्रिप्ट लेटिन छोटा अक्षर एन"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"पेसो चिह्न"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"द्वारा"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"दायां तीर"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"नीचे तीर"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"रिक्त सेट"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"वृद्धि"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"इससे कम या इसके बराबर"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"इससे अधिक या इसके बराबर"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"काला तारा"</string> +</resources> diff --git a/java/res/values-hi/strings-talkback-descriptions.xml b/java/res/values-hi/strings-talkback-descriptions.xml new file mode 100644 index 000000000..aba2592b8 --- /dev/null +++ b/java/res/values-hi/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"जोर से बोली जाने वाली पासवर्ड कुंजियां सुनने के लिए हैडसेट प्लग करें."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"वर्तमान पाठ %s है"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"कोई पाठ नहीं डाला गया"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> को सुधार कर <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> करता है"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> स्वत: सुधार करता है"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"अज्ञात वर्ण"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"शिफ़्ट"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"और प्रतीक"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"शिफ़्ट"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"प्रतीक"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"शिफ़्ट"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"डिलीट"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"प्रतीक"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"अक्षर"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"संख्याएं"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"सेटिंग"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"टैब"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"स्पेस"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ध्वनि इनपुट"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ईमोजी"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"रिटर्न"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"खोजें"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"डॉट"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"भाषा स्विच करें"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"अगला"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"पिछला"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"शिफ़्ट सक्षम किया गया"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"कैप्स लॉक सक्षम किया गया"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"प्रतीक मोड"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"और प्रतीक मोड"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"अक्षर मोड"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"फ़ोन मोड"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"फ़ोन प्रतीक मोड"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"कीबोर्ड छिपा हुआ है"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> कीबोर्ड दिखाया जा रहा है"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"दिनांक"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"दिनांक और समय"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ईमेल"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"संदेश सेवा"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"संख्या"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"फ़ोन"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"पाठ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"समय"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"हाल ही के"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"लोग"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ऑब्जेक्ट"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"प्रकृति"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"स्थान"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"प्रतीक"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"इमोटिकॉन्स"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"बड़ा <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"बड़ा आई"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"बड़ा आई, बिंदु ऊपर"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"अज्ञात प्रतीक"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"अज्ञात इमोजी"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"वैकल्पिक वर्ण उपलब्ध हैं"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"वैकल्पिक वर्ण ख़ारिज कर दिए जाते हैं"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"वैकल्पिक सुझाव उपलब्ध हैं"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"वैकल्पिक सुझाव ख़ारिज कर दिए जाते हैं"</string> +</resources> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index d7735433d..5abbecda4 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट विकल्प"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"लॉग आदेशों का शोध करें"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"संपर्क नामों को खोजें"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"वर्तनी परीक्षक आपकी संपर्क सूची की प्रविष्टियों का उपयोग करता है"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"कुंजी दबाने पर कंपन करता है"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"कुंजी दबाने पर आवाज"</string> <string name="popup_on_keypress" msgid="123894815723512944">"कुंजी दबाने पर पॉपअप दिखाएं"</string> - <string name="general_category" msgid="1859088467017573195">"सामान्य"</string> - <string name="correction_category" msgid="2236750915056607613">"पाठ सुधार"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"जेस्चर लिखना"</string> - <string name="misc_category" msgid="6894192814868233453">"अन्य विकल्प"</string> - <string name="advanced_settings" msgid="362895144495591463">"अतिरिक्त सेटिंग"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"विशेषज्ञों के लिए विकल्प"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"अन्य इनपुट पद्धतियों पर जाएं"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"भाषा स्विच कुंजी में अन्य इनपुट पद्धतियां भी शामिल हैं"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"भाषा स्विच कुंजी"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"सिस्टम डिफ़ॉल्ट"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नाम सुझाएं"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"वैयक्तिकृत सुझाव"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> को बेहतर बनाएं"</string> <string name="use_double_space_period" msgid="8781529969425082860">"दोहरे स्पेस वाला पीरियड"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबार पर डबल टैप करने से पीरियड शामिल हो जाता है जिसके बाद एक रिक्ति होती है"</string> <string name="auto_cap" msgid="1719746674854628252">"स्वत: अक्षर बड़े करना"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"जेस्चर ट्रेल दिखाएं"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"गतिशील फ़्लोटिंग पूर्वावलोकन"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"जेस्चर बनाते समय सुझाया गया शब्द देखें"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: सहेजा गया"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"ज़ोर से बोली गई पासवर्ड कुंजियां सुनने के लिए हेडसेट प्लग इन करें."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"वर्तमान पाठ %s है"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"कोई पाठ दर्ज नहीं किया गया"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> को सुधार कर <xliff:g id="CORRECTED">%3$s</xliff:g> करता है"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> स्वत: सुधार करता है"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"कुंजी कोड %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"शिफ़्ट"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift चालू (अक्षम करने के लिए टैप करें)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock चालू (अक्षम करने के लिए टैप करें)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"डिलीट"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"प्रतीक"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"अक्षर"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"संख्याएं"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"सेटिंग"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"टैब"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"स्पेस"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"ध्वनि इनपुट"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"मुस्कुराता चेहरा"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"रिटर्न"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"खोजें"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"बिंदु"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"भाषा स्विच करें"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"अगला"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"पिछला"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift सक्षम किया गया"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock सक्षम किया गया"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift अक्षम किया गया"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"प्रतीक मोड"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"अक्षर मोड"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"फ़ोन मोड"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"फ़ोन प्रतीक मोड"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"कीबोर्ड छिपा हुआ है"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> कीबोर्ड दिखाया जा रहा है"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"दिनांक"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"दिनांक और समय"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"ईमेल"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"संदेश सेवा"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"संख्या"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"फ़ोन"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"पाठ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"समय"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश जेस्चर"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"स्पेस कुंजी तक ग्लाइड करके जेस्चर के दौरान रिक्तियां इनपुट करें"</string> <string name="voice_input" msgid="3583258583521397548">"ध्वनि इनपुट कुंजी"</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="voice_input_disabled_summary" msgid="8141750303464726129">"कोई ध्वनि इनपुट पद्धति सक्षम नहीं है. भाषा और इनपुट सेटिंग जांचें."</string> <string name="configure_input_method" msgid="373356270290742459">"इनपुट पद्धति कॉन्फ़िगर करें"</string> <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषा"</string> <string name="send_feedback" msgid="1780431884109392046">"सुझाव भेजें"</string> <string name="select_language" msgid="3693815588777926848">"इनपुट भाषाएं"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"सहेजने के लिए पुन: स्पर्श करें"</string> <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध है"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"उपयोगकर्ता फ़ीडबैक सक्षम करें"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"उपयोग के आंकड़े और क्रैश रिपोर्ट अपने आप भेजकर इस इनपुट पद्धति संपादक को बेहतर बनाने में सहायता करें."</string> <string name="keyboard_layout" msgid="8451164783510487501">"कीबोर्ड थीम"</string> <string name="subtype_en_GB" msgid="88170601942311355">"अंग्रेज़ी (यूके)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"अंग्रेज़ी (यूएस)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"स्पेनिश (यूएस)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"अंग्रेज़ी (यूके) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"अंग्रेज़ी (यूएस) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"स्पेनिश (यूएस) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (पारंपरिक)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"अंग्रेज़ी (यूके) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"अंग्रेज़ी (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"स्पेनिश (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (पारंपरिक)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (सिरिलिक)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (लैटिन)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"भाषा उपलब्ध नहीं है (लैटिन वर्णाक्षर)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"वर्णाक्षर (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"वर्णाक्षर (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"वर्णाक्षर (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णाक्षर (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"रंग संयोजन"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"सफ़ेद"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"नीला"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"कस्टम इनपुट शैलियां"</string> <string name="add_style" msgid="6163126614514489951">"शैली जोड़ें"</string> <string name="add" msgid="8299699805688017798">"जोड़ें"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"सक्षम करें"</string> <string name="not_now" msgid="6172462888202790482">"अभी नहीं"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ऐसी ही इनपुट शैली पहले से मौजूद है: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"उपयोगिता अध्ययन मोड"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"कुंजी को देर तक दबाने का विलंब"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"कुंजी-स्पर्श कंपन अवधि"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"कुंजी-स्पर्श ध्वनि आवाज़"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाहरी शब्दकोश फ़ाइल पढ़ें"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फ़ोल्डर में कोई शब्दकोश फ़ाइल नहीं है"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"इंस्टॉल करने के लिए कोई शब्दकोश फ़ाइल चुनें"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g> के लिए वास्तव में यह फ़ाइल इंस्टॉल करें?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"क्या वाकई <xliff:g id="LANGUAGE_NAME">%s</xliff:g> के लिए यह फ़ाइल इंस्टॉल करें?"</string> <string name="error" msgid="8940763624668513648">"कोई त्रुटि हुई थी"</string> <string name="button_default" msgid="3988017840431881491">"सामान्य"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> में आपका स्वागत है"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"रीफ़्रेश करें"</string> <string name="last_update" msgid="730467549913588780">"अंतिम बार का नई जानकारी"</string> <string name="message_updating" msgid="4457761393932375219">"नई जानकारी देखा जा रहा हैं"</string> - <string name="message_loading" msgid="8689096636874758814">"लोड हो रही है..."</string> + <string name="message_loading" msgid="5638680861387748936">"लोड हो रहा है…"</string> <string name="main_dict_description" msgid="3072821352793492143">"मुख्य डिक्शनरी"</string> <string name="cancel" msgid="6830980399865683324">"रद्द करें"</string> + <string name="go_to_settings" msgid="3876892339342569259">"सेटिंग"</string> <string name="install_dict" msgid="180852772562189365">"इंस्टॉल करें"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द करें"</string> <string name="delete_dict" msgid="756853268088330054">"हटाएं"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"आपके मोबाइल उपकरण पर चयनित भाषा में डिक्शनरी उपलब्ध है.<br/> आपके लेखन अनुभव को बेहतर बनाने के लिए हम <xliff:g id="LANGUAGE">%1$s</xliff:g> डिक्शनरी को <b>डाउनलोड करने</b> की अनुशंसा करते हैं.<br/> <br/> 3G पर डाउनलोड होने में एक या दो मिनट लग सकते हैं. यदि आपके पास <b>असीमित डेटा प्लान</b> नहीं है, तो शुल्क लग सकते हैं.<br/> यदि आप अपने डेटा प्लान के बारे में सुनिश्चित नहीं हैं, तो हम अपने आप डाउनलोड प्रारंभ करने के लिए Wi-Fi कनेक्शन ढूंढने की अनुशंसा करते हैं.<br/> <br/> युक्ति: आप अपने मोबाइल उपकरण पर <b>सेटिंग</b> मेनू में <b>भाषा और अक्षर</b> पर जाकर डिक्शनरी डाउनलोड कर सकते हैं और निकाल सकते हैं."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"आपके मोबाइल पर चयनित भाषा के लिए शब्दकोश उपलब्ध है.<br/> हम आपके लेखन अनुभव को बेहतर बनाने के लिए <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> शब्दकोश <b>डाउनलोड करने</b> की अनुशंसा करते हैं.<br/> <br/> 3G में डाउनलोड करने पर एक या दो मिनट लगेंगे. यदि आपके पास <b>असीमित डेटा योजना</b> नहीं है, तो शुल्क लागू हो सकते हैं.<br/> यदि आप अपनी डेटा योजना के बारे में सुनिश्चित नहीं हैं, तो हम अपने आप डाउनलोड प्रारंभ करने के लिए Wi-Fi कनेक्शन ढूंढने की अनुशंसा करते हैं.<br/> <br/> युक्ति: आप अपने मोबाइल उपकरण के <b>सेटिंग</b> मेनू में <b>भाषा और इनपुट</b> पर जाकर शब्दकोशों को डाउनलोड कर सकते हैं और निकाल सकते हैं."</string> <string name="download_over_metered" msgid="1643065851159409546">"अभी डाउनलोड करें (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi से डाउनलोड करें"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> के लिए डिक्शनरी उपलब्ध है"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> के लिए एक शब्दकोश उपलब्ध है"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"समीक्षा करने और डाउनलोड करने के लिए दबाएं"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"डाउनलोड हो रहा है: <xliff:g id="LANGUAGE">%1$s</xliff:g> के लिए सुझाव जल्दी ही तैयार हो जाएंगे."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"डाउनलोड प्रारंभ हो रहा है: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> के लिए सुझाव जल्दी ही उपलब्ध होंगे."</string> <string name="version_text" msgid="2715354215568469385">"संस्करण <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"जोड़ें"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"शब्दकोश में जोड़ें"</string> diff --git a/java/res/values-hr/strings-action-keys.xml b/java/res/values-hr/strings-action-keys.xml index 564f70363..23c7872e1 100644 --- a/java/res/values-hr/strings-action-keys.xml +++ b/java/res/values-hr/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Pret."</string> <string name="label_done_key" msgid="7564866296502630852">"Got."</string> <string name="label_send_key" msgid="482252074224462163">"Poš."</string> + <string name="label_search_key" msgid="7965186050435796642">"Traži"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauz."</string> <string name="label_wait_key" msgid="5891247853595466039">"Čekaj"</string> </resources> diff --git a/java/res/values-hr/strings-config-important-notice.xml b/java/res/values-hr/strings-config-important-notice.xml new file mode 100644 index 000000000..9d4b18db1 --- /dev/null +++ b/java/res/values-hr/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Upotrijebi poruke i upisane podatke za poboljšanje prijedloga"</string> +</resources> diff --git a/java/res/values-hr/strings-letter-descriptions.xml b/java/res/values-hr/strings-letter-descriptions.xml new file mode 100644 index 000000000..9c0055f99 --- /dev/null +++ b/java/res/values-hr/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Znak za redni broj ženskog roda"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Znak za redni broj muškog roda"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Oštro S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, s gravisom"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, s akutom"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, s circumfleksom"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, s tildom"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, s dijarezom"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, s kružićem iznad"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, s ligaturom"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sa sedijom"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, s gravisom"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, s akutom"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, s cirkumfleksom"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, s dijarezom"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, s gravisom"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, s akutom"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, s cirkumfleksom"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, s dijarezom"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, s tildom"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, s gravisom"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, s akutom"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, s cirkumfleksom"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, s tildom"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, s dijarezom"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, precrtano"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, s gravisom"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, s akutom"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, s cirkumfleksom"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, s dijarezom"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, s akutom"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, s dijarezom"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, s crtom iznad"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, s brevisom"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, s ogonekom"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, s akutom"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, s circumfleksom"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, s točkicom iznad"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, s kvačicom"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, s kvačicom"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, precrtano"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, s crtom iznad"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, s brevisom"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, s točkicom iznad"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, s ogonekom"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, s kvačicom"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, s cirkumfleksom"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, s brevisom"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, s točkicom iznad"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sa sedijom"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, s cirkumfleksom"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, precrtano"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, s tildom"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, s crtom iznad"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, s brevisom"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, s ogonekom"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez točke"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, s ligaturom"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, s cirkumfleksom"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sa sedijom"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, s akutom"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sa sedijom"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, s kvačicom"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, sa srednjom točkicom"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, precrtano"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, s akutom"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sa sedijom"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, s kvačicom"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, s apostrofom ispred"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, s crtom iznad"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, s brevisom"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, s dvostrukim akutom"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, s ligaturom"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, s akutom"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sa sedijom"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, s kvačicom"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, s akutom"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, s cirkumfleksom"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sa sedijom"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, s kvačicom"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sa sedijom"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, s kvačicom"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, precrtano"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, s tildom"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, s crtom iznad"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, s brevisom"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, s kružićem iznad"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, s dvostrukim akutom"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, s ogonekom"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, s cirkumfleksom"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, s cirkumfleksom"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, s akutom"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, s točkicom iznad"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, s kvačicom"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dugo S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, s roščićem"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, s roščićem"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, sa zarezom ispod"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, sa zarezom ispod"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, s točkicom ispod"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, s kukicom iznad"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, s cirkumfleksom i akutom"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, s cirkumfleksom i gravisom"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, s cirkumfleksom i kukicom iznad"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, s cirkumfleksom i tildom"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, s cirkumfleksom i točkicom ispod"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, s brevisom i akutom"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, s brevisom i gravisom"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, s brevisom i kukicom iznad"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, s brevisom i tildom"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, s brevisom i točkicom ispod"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, s točkicom ispod"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, s kukicom iznad"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, s tildom"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, s cirkumfleksom i akutom"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, s cirkumfleksom i gravisom"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, s cirkumfleksom i kukicom iznad"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, s cirkumfleksom i tildom"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, s cirkumfleksom i točkicom ispod"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, s kukicom iznad"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, s točkicom ispod"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, s točkicom ispod"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, s kukicom iznad"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, s cirkumfleksom i akutom"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, s cirkumfleksom i gravisom"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, s cirkumfleksom i kukicom iznad"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, s cirkumfleksom i tildom"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, s cirkumfleksom i točkicom ispod"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, s roščićem i akutom"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, s roščićem i gravisom"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, s roščićem i kukicom iznad"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, s roščićem i tildom"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, s roščićem i točkicom ispod"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, s točkicom ispod"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, s kukicom iznad"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, roščićem i akutom"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, s roščićem i gravisom"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, s roščićem i kukicom iznad"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, s roščićem i tildom"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, s roščićem i točkicom ispod"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, s gravisom"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, s točkicom ispod"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, s kukicom iznad"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, s tildom"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrnuti uskličnik"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Lijevi dvostruki šiljati navodnik"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Srednja točkica"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Eksponent jedan"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Desni dvostruki šiljati navodnik"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrnuti upitnik"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Lijevi jednostruki navodnik"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Desni jednostruki navodnik"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Donji jednostruki navodnik (jednostruka devetka)"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Lijevi dvostruki navodnik"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Desni dvostruki navodnik"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Križ"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvostruki križ"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Znak promila"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Znak za minute"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Znak za sekunde"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Lijevi jednostruki šiljati navodnik"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Desni jednostruki šiljati navodnik"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Eksponent četiri"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Eksponent u obliku latiničnog malog slova n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak peza"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"U ruke"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Strelica udesno"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Strelica prema dolje"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prazan skup"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Povećanje"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Manje ili jednako"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Veće ili jednako"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Crna zvjezdica"</string> +</resources> diff --git a/java/res/values-hr/strings-talkback-descriptions.xml b/java/res/values-hr/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e86db075c --- /dev/null +++ b/java/res/values-hr/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Priključite slušalice da biste čuli naglas izgovorene tipke dok upisujete zaporku."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Trenutačni tekst glasi %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nije unesen tekst"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ispravlja <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> u <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> vrši samoispravljanje"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Nepoznati znak"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Više simbola"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboli"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Brisanje"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simboli"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Slova"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Brojevi"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Postavke"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulator"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Razmaknica"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Glasovni ulaz"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Pretraživanje"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Točka"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Promjena jezika"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Sljedeća"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Prethodna"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Omogućena je tipka Shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Omogućen je Caps Lock"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Način unosa simbola"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Način s više simbola"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Način unosa slova"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonski način rada"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Način unosa telefonskih simbola"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tipkovnica je skrivena"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Prikaz tipkovnice: <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum i vrijeme"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-pošta"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"slanje poruka"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"brojevi"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"vrijeme"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Najnoviji"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Osobe"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objekti"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Priroda"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Mjesta"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboli"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikoni"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Veliko slovo <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Veliko slovo I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Veliko slovo I, s točkicom iznad"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Nepoznati simbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Nepoznati emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Dostupni su zamjenski znakovi"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Zamjenski su znakovi isključeni"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Dostupni su zamjenski prijedlozi"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Zamjenski su prijedlozi isključeni"</string> +</resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index b9cfef384..0cdc74a5a 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcije ulaza"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Istraživanje naredbi dnevnika"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Potražite imena kontakata"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Provjera pravopisa upotrebljava unose iz vašeg popisa kontakata"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibracija pri pritisku na tipku"</string> <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="general_category" msgid="1859088467017573195">"Općenito"</string> - <string name="correction_category" msgid="2236750915056607613">"Ispravak teksta"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Pisanje kretnjama"</string> - <string name="misc_category" msgid="6894192814868233453">"Ostale opcije"</string> - <string name="advanced_settings" msgid="362895144495591463">"Napredne postavke"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opcije za stručnjake"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Prebaci na druge unose"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tipka za prebacivanje jezika pokriva i druge načine unosa"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tipka za izmjenjivanje jezika"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Zadano sustavom"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Predlaži imena kontakata"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Upotreba imena iz Kontakata za prijedloge i ispravke"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Prilagođeni prijedlozi"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Poboljšaj aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Točka s dva razmaka"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvostrukim dodirivanjem razmaknice umeću se točka i razmak"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Prikaži trag pokreta"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamički plutajući pregled"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Vidi predloženu riječ tijekom pokreta"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Spremljeno"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalice da biste čuli tipke zaporke izgovorene naglas."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Trenutačni tekst je %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nije unesen tekst"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> ispravlja <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> u <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> vrši samoispravljanje"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kôd tipke %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Uključena tipka Shift (dotaknite da onemogućite)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Uključeno je pisanje velikim slovima (Caps Lock) (dotaknite da onemogućite)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboli"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Slova"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Brojevi"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Postavke"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Kartica"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Razmaknica"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Glasovni unos"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smješko"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Pretraživanje"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Točka"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Promijeni jezik"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Sljedeće"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Prethodno"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Omogućena tipka Shift"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Omogućeno pisanje velikih slova"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Onemogućena tipka Shift"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Način unosa simbola"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Način pisanja slova"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonski način rada"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način unosa telefonskih simbola"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrivena"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Način prikazane tipkovnice: <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum i vrijeme"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"slanje poruka"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"brojevi"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"vrijeme"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Pokret fraze"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Umećite razmake tijekom izvođenja pokreta klizeći do razmaknice"</string> <string name="voice_input" msgid="3583258583521397548">"Tipka za glasovni unos"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Na glavnoj tipkovnici"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Na tipkovnici simb."</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Isključeno"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na gl. tipkovnici"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mik. na tipk. simb."</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nije omogućen nijedan način glasovnog unosa. Provjerite postavke jezika i unosa."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine ulaza"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string> <string name="send_feedback" msgid="1780431884109392046">"Slanje povratnih informacija"</string> <string name="select_language" msgid="3693815588777926848">"Jezici unosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dodirnite ponovo za spremanje"</string> <string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Pomozite u poboljšanju ovog uređivača načina unosa automatskim slanjem statistike upotrebe i izvješća o padu programa"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema tipkovnice"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engleski (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engleski (SAD)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"španjolski (SAD)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"engleski (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"engleski (SAD) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"španjolski (SAD) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicionalni)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"engleska (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"engleska (SAD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španjolska (SAD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicionalni)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ćirilica)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinica)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nema jezika (abeceda)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abeceda (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abeceda (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Abeceda (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Abeceda (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Shema boja"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Bijela"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Plava"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Prilagođeni stilovi unosa"</string> <string name="add_style" msgid="6163126614514489951">"Dodaj stil"</string> <string name="add" msgid="8299699805688017798">"Dodaj"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Omogući"</string> <string name="not_now" msgid="6172462888202790482">"Ne sada"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Već postoji isti stil unosa: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Način studije upotrebljivosti"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Odgoda dugog pritiska tipke"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Trajanje vibracije pritiska"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Glasnoća pritiska tipke"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Čitanje datoteke vanjskog rječnika"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"U mapi Preuzimanja nema datoteka rječnika"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Odabir datoteke rječnika za instaliranje"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Želite li doista instalirati ovu datoteku za <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Želite li zaista instalirati tu datoteku za <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Došlo je do pogreške"</string> <string name="button_default" msgid="3988017840431881491">"Zadano"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Dobro došli u aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Osvježavanje"</string> <string name="last_update" msgid="730467549913588780">"Zadnje ažuriranje"</string> <string name="message_updating" msgid="4457761393932375219">"Provjera ažuriranja"</string> - <string name="message_loading" msgid="8689096636874758814">"Učitavanje..."</string> + <string name="message_loading" msgid="5638680861387748936">"Učitavanje…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Glavni rječnik"</string> <string name="cancel" msgid="6830980399865683324">"Odustani"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Postavke"</string> <string name="install_dict" msgid="180852772562189365">"Instaliraj"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Odustani"</string> <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Dostupan je rječnik za odabrani jezik na vašem uređaju.<br/> Preporučujemo <b>preuzimanje</b> rječnika za <xliff:g id="LANGUAGE">%1$s</xliff:g> radi boljeg doživljaja unosa teksta.<br/> <br/> Na 3G mreži preuzimanje može potrajati minutu ili dvije. Može podlijegati naplati ako nemate <b>neograničenu podatkovnu tarifu</b>.<br/> Ako niste sigurni koju tarifu imate, preporučujemo da pronađete Wi-Fi mrežu i pokrenete automatsko preuzimanje.<br/> <br/> Savjet: rječnike možete preuzeti i ukloniti u odjeljku <b>Jezik i unos</b> na izborniku <b>Postavke</b> na mobilnom uređaju."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Dostupan je rječnik za odabrani jezik na vašem mobilnom uređaju.<br/> Preporučujemo da <b>preuzmete</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> rječnik radi lakšeg unosa teksta.<br/> <br/> Preuzimanje može potrajati jednu do dvije minute putem 3G-a. Možda se naplaćuje dodatna naknada ako nemate <b>neograničenu podatkovnu tarifu</b>.<br/> Ako niste sigurni koju tarifu imate, preporučujemo da pronađete Wi-Fi vezu kako bi se automatski pokrenulo preuzimanje.<br/> <br/> Savjet: rječnike možete preuzeti i ukloniti u odjeljku <b>Jezik i unos</b> u izborniku <b>Postavke</b> na mobilnom uređaju."</string> <string name="download_over_metered" msgid="1643065851159409546">"Preuzmi sada (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Preuzmi putem Wi-Fi mreže"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Dostupan je rječnik za <xliff:g id="LANGUAGE">%1$s</xliff:g> jezik"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Dostupan je rječnik za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> jezik"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled i preuzimanje"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Preuzimanje: prijedlozi za <xliff:g id="LANGUAGE">%1$s</xliff:g> bit će spremni uskoro."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Preuzimanje: prijedlozi za <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> bit će spremni uskoro."</string> <string name="version_text" msgid="2715354215568469385">"Verzija <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodavanje"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj u rječnik"</string> diff --git a/java/res/values-hu/strings-action-keys.xml b/java/res/values-hu/strings-action-keys.xml index 257f30f34..6de2d3095 100644 --- a/java/res/values-hu/strings-action-keys.xml +++ b/java/res/values-hu/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Előző"</string> <string name="label_done_key" msgid="7564866296502630852">"Kész"</string> <string name="label_send_key" msgid="482252074224462163">"Küld"</string> + <string name="label_search_key" msgid="7965186050435796642">"Keresés"</string> <string name="label_pause_key" msgid="2225922926459730642">"Állj"</string> <string name="label_wait_key" msgid="5891247853595466039">"Vár"</string> </resources> diff --git a/java/res/values-hu/strings-config-important-notice.xml b/java/res/values-hu/strings-config-important-notice.xml new file mode 100644 index 000000000..c023293e0 --- /dev/null +++ b/java/res/values-hu/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Javaslatok javítása a kommunikáció és begépelt adatok alapján"</string> +</resources> diff --git a/java/res/values-hu/strings-letter-descriptions.xml b/java/res/values-hu/strings-letter-descriptions.xml new file mode 100644 index 000000000..9087c6c9f --- /dev/null +++ b/java/res/values-hu/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Sorszámnévjelölő (nőnemű)"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"„mű” jel"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Sorszámnévjelölő (hímnemű)"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Scharfes S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, tompa ékezettel"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, éles ékezettel"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, kúpos ékezettel"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, hullámvonallal"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, trémával"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, felette körrel"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ikerbetű"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cédille-jel"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, tompa ékezettel"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, éles ékezettel"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, kúpos ékezettel"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, trémával"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, tompa ékezettel"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, éles ékezettel"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, kúpos ékezettel"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, trémával"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth betű"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, hullámvonallal"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, tompa ékezettel"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, éles ékezettel"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, kúpos ékezettel"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, hullámvonallal"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, trémával"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, áthúzva"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, tompa ékezettel"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, éles ékezettel"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, kúpos ékezettel"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, trémával"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, éles ékezettel"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn betű"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, trémával"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, hosszúsági jellel"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, rövidségi jellel"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, horoggal"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, éles ékezettel"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, kúpos ékezettel"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, felette ponttal"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, hacsekkel"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, hacsekkel"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, áthúzva"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, hosszúsági jellel"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, rövidségi jellel"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, felette ponttal"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, horoggal"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, hacsekkel"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, kúpos ékezettel"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, rövidségi jellel"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, felette ponttal"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cédille-jel"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, kúpos ékezettel"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, áthúzva"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, hullámvonallal"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, hosszúsági jellel"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, rövidségi jellel"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, horoggal"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Pont nélküli I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ikerbetű"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, kúpos ékezettel"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cédille-jel"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra betű"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, éles ékezettel"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cédille-jel"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, hacsekkel"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, középen ponttal"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, áthúzva"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, éles ékezettel"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cédille-jel"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, hacsekkel"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, előtte aposztróffal"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng betű"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, hosszúsági jellel"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, rövidségi jellel"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dupla éles ékezettel"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ikerbetű"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, éles ékezettel"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cédille-jel"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, hacsekkel"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, éles ékezettel"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, kúpos ékezettel"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cédille-jel"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, hacsekkel"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cédille-jel"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, hacsekkel"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, áthúzva"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, hullámvonallal"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, hosszúsági jellel"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, rövidségi jellel"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, felette körrel"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dupla éles ékezettel"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, horoggal"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, kúpos ékezettel"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, kúpos ékezettel"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, éles ékezettel"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, felette ponttal"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, hacsekkel"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Hosszú S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, szarvval"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, szarvval"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, alatta vesszővel"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, alatta vesszővel"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa betű"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, alatta ponttal"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, felette kampóval"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, kúpos ékezettel és éles ékezettel"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, kúpos ékezettel és tompa ékezettel"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, kúpos ékezettel és felette kampóval"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, kúpos ékezettel és hullámvonallal"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, kúpos ékezettel és alatta ponttal"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, rövidségi jellel és éles ékezettel"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, rövidségi jellel és tompa ékezettel"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, rövidségi jellel és felette kampóval"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, rövidségi jellel és hullámvonallal"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, rövidségi jellel és alatta ponttal"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, alatta ponttal"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, felette kampóval"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, hullámvonallal"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, kúpos ékezettel és éles ékezettel"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, kúpos ékezettel és tompa ékezettel"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, kúpos ékezettel és felette kampóval"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, kúpos ékezettel és hullámvonallal"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, kúpos ékezettel és alatta ponttal"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, felette kampóval"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, alatta ponttal"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, alatta ponttal"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, felette kampóval"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, kúpos ékezettel és éles ékezettel"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, kúpos ékezettel és tompa ékezettel"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, kúpos ékezettel és felette kampóval"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, kúpos ékezettel és hullámvonallal"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, kúpos ékezettel és alatta ponttal"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, szarvval és éles ékezettel"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, szarvval és tompa ékezettel"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, szarvval és felette kampóval"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, szarvval és hullámvonallal"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, szarvval és alatta ponttal"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, alatta ponttal"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, felette kampóval"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, szarvval és éles ékezettel"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, szarvval és tompa ékezettel"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, szarvval és felette kampóval"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, szarvval és hullámvonallal"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, szarvval és alatta ponttal"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, tompa ékezettel"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, alatta ponttal"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, felette kampóval"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, hullámvonallal"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Fordított felkiáltójel"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Balra mutató francia csúcsos dupla idézőjel"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Középső pont"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Felső indexszám egy"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Jobbra mutató francia csúcsos dupla idézőjel"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Fordított kérdőjel"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Bal angol szimpla idézőjel"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Jobb angol szimpla idézőjel"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Bal német szimpla idézőjel"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Bal dupla idézőjel"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Jobb dupla idézőjel"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kereszt"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Kettős kereszt"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Ezrelékjel"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Percjel"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Másodpercjel"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Balra mutató francia csúcsos szimpla idézőjel"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Jobbra mutató francia csúcsos szimpla idézőjel"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Felső indexszám négy"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Felső index latin kisbetűs n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso jel"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Százalék"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Jobbra mutató nyíl"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Lefelé mutató nyíl"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Üres halmaz"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Növekmény"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Egyenlő vagy kisebb mint"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Egyenlő vagy nagyobb mint"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Fekete csillag"</string> +</resources> diff --git a/java/res/values-hu/strings-talkback-descriptions.xml b/java/res/values-hu/strings-talkback-descriptions.xml new file mode 100644 index 000000000..ae0c0473c --- /dev/null +++ b/java/res/values-hu/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Csatlakoztasson egy headsetet, ha hallani szeretné a jelszót felolvasva."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"A jelenlegi szöveg: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nincs szöveg megadva"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> billentyű – <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> szóra javítja a következőt: <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> billentyű automatikus javítást végez"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Ismeretlen karakter"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"További szimbólumok"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Szimbólumok"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Törlés"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Szimbólumok"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Betűk"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Számok"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Beállítások"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Szóköz"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Hangbevitel"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Hangulatjel"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Keresés"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Pont"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Nyelvváltás"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Következő"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Előző"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift bekapcsolva"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock bekapcsolva"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"„Szimbólumok” mód"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"További szimbólumok mód"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"„Betű” mód"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"„Telefon” mód"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"„Telefonos szimbólumok” mód"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Billentyűzet elrejtve"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> billentyűzet megjelenítve"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"dátum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dátum és idő"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"üzenetváltás"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"szám"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"szöveg"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"idő"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Legutóbbiak"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Emberek"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objektumok"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Természet"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Helyek"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Szimbólumok"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Hangulatjelek"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Nagy <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Nagy I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Nagy I, felette ponttal"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ismeretlen szimbólum"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Ismeretlen hangulatjel"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Az alternatív karakterek elérhetők"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Az alternatív karakterek billentyűzete bezárva"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Az alternatív javaslatok elérhetők"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Az alternatív javaslatok panel bezárva"</string> +</resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index a61378fca..8e65921d5 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Beviteli beállítások"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Naplózási parancsok"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Névjegyek keresése"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"A helyesírás-ellenőrző használja a névjegyek bejegyzéseit"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rezgés gombnyomásra"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Hangjelzés gombnyomásra"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Nagyobb billentyű gombnyomásra"</string> - <string name="general_category" msgid="1859088467017573195">"Általános"</string> - <string name="correction_category" msgid="2236750915056607613">"Szövegjavítás"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Kézmozdulatokkal történő gépelés"</string> - <string name="misc_category" msgid="6894192814868233453">"Egyéb beállítások"</string> - <string name="advanced_settings" msgid="362895144495591463">"Speciális beállítások"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Beállítások gyakorlott felhasználóknak"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Váltás más beviteli módra"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"A nyelvkapcsoló gomb egyéb beviteli módokat is tartalmaz"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"A nyelvkapcsoló"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Alapértelmezett"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Javasolt névjegyek"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"A névjegyek használata a javaslatokhoz és javításokhoz"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Testreszabott javaslatok"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> javítása"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dupla szóköz: pont"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"A szóköz kétszeri megérintése beszúr egy pontot, majd egy szóközt"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatikusan nagy kezdőbetű"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mozdulat irányának mutatása"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamikus lebegő előnézet"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"A javasolt szó megtekintése kézmozdulat közben"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : mentve"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Csatlakoztasson egy headsetet, ha hallani szeretné a jelszót felolvasva."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"A jelenlegi szöveg: %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Szöveg nincs megadva"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> billentyű: <xliff:g id="CORRECTED">%3$s</xliff:g> szóra javítja a következőt: <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> billentyű automatikus javítást végez"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Billentyűkód: %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift be van kapcsolva (érintse meg a kikapcsoláshoz)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock be van kapcsolva (érintse meg a kikapcsoláshoz)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Törlés"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Szimbólumok"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Betűk"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Számok"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Beállítások"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Szóköz"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Hangbevitel"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Mosolygós arc"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Keresés"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Pont"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Nyelvek felcserélése"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Következő"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Előző"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift bekapcsolva"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock bekapcsolva"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift kikapcsolva"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"\"Szimbólumok\" mód"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"\"Betű\" mód"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"\"Telefon\" mód"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"\"Telefonos szimbólumok\" mód"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Billentyűzet elrejtve"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> billentyűzet megjelenítve"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"dátum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"dátum és idő"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"üzenetváltás"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"szám"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"szöveg"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"idő"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Kifejezés-kézmozdulat"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Szóköz írása kézmozdulatok során: húzza el ujját a szóköz felett"</string> <string name="voice_input" msgid="3583258583521397548">"Hangbeviteli gomb"</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">"Mikrofon 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="voice_input_disabled_summary" msgid="8141750303464726129">"Nincs engedélyezett hangbeviteli módszer. Nézze meg a Nyelvi és beviteli beállításokat."</string> <string name="configure_input_method" msgid="373356270290742459">"Beviteli módok beállítása"</string> <string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string> <string name="send_feedback" msgid="1780431884109392046">"Visszajelzés küldése"</string> <string name="select_language" msgid="3693815588777926848">"Beviteli nyelvek"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Érintse meg újból a mentéshez"</string> <string name="has_dictionary" msgid="6071847973466625007">"Van elérhető szótár"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Felhasználói visszajelzés engedélyezése"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Segíthet a beviteli módszer szerkesztőjének javításában, ha engedélyezi a használati statisztikák és a hibajelentések automatikus elküldését."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Billentyűzettéma"</string> <string name="subtype_en_GB" msgid="88170601942311355">"angol (brit)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"angol (amerikai)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"spanyol (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"angol (brit) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"angol (amerikai) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"spanyol (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (hagyományos)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angol (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angol (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"spanyol (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (hagyományos)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cirill)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nincs nyelv (ábécé)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Ábécé (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Ábécé (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Ábécé (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Ábécé (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Hangulatjel"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Színséma"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Fehér"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Kék"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Egyedi bevitelstílusok"</string> <string name="add_style" msgid="6163126614514489951">"Új stílus"</string> <string name="add" msgid="8299699805688017798">"Hozzáadás"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Engedélyezés"</string> <string name="not_now" msgid="6172462888202790482">"Most nem"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ugyanez a bemenetstílus már létezik: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Használhatósági teszt"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Hosszú nyomás késleltetése"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Gombnyomás rezgési időtartama"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Gombnyomás hangereje"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Külső szótárfájl olvasása"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nincs szótárfájl a Letöltések mappában."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Válasszon ki egy szótárfájlt a telepítéshez."</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Valóban telepíti ezt a fájlt <xliff:g id="LOCALE_NAME">%s</xliff:g> nyelvhez?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Valóban telepíti ezt a fájlt <xliff:g id="LANGUAGE_NAME">%s</xliff:g> nyelvhez?"</string> <string name="error" msgid="8940763624668513648">"Hiba történt."</string> <string name="button_default" msgid="3988017840431881491">"Alapértelmezett"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Üdvözli a(z) <xliff:g id="APPLICATION_NAME">%s</xliff:g>!"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Frissítés"</string> <string name="last_update" msgid="730467549913588780">"Legutóbb frissítve"</string> <string name="message_updating" msgid="4457761393932375219">"Frissítések keresése"</string> - <string name="message_loading" msgid="8689096636874758814">"Betöltés..."</string> + <string name="message_loading" msgid="5638680861387748936">"Betöltés…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Fő szótár"</string> <string name="cancel" msgid="6830980399865683324">"Mégse"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Beállítások"</string> <string name="install_dict" msgid="180852772562189365">"Telepítés"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Mégse"</string> <string name="delete_dict" msgid="756853268088330054">"Törlés"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"A mobileszközön kiválasztott nyelvhez szótár érhető el.<br/> A gépelési élmény javításához javasoljuk a(z) <xliff:g id="LANGUAGE">%1$s</xliff:g> szótár <b>letöltését.<br/> <br/> A letöltés 3G hálózaton keresztül néhány percig tart. Ha <b>előfizetése nem korlátlan</b>, a letöltés költségekkel járhat.<br/> Ha nem biztos abban, hogy milyen adatcsomagot használ, javasoljuk, hogy keressen egy Wi-Fi kapcsolatot a letöltés automatikus elindításához.<br/> <br/> Tipp: a szótárakat a mobileszköz <b>Beállítások</b> menüjében a <b>Nyelv és bevitel</b> részben töltheti le és távolíthatja el."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"A mobileszközön kiválasztott nyelvhez szótár érhető el.<br/> A gépelési élmény javításához javasoljuk a(z) <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> szótár <b>letöltését.<br/> <br/> A letöltés 3G hálózaton keresztül néhány percig tart. Ha <b>előfizetése nem korlátlan</b>, a letöltés költségekkel járhat.<br/> Ha nem biztos abban, hogy milyen adatcsomagot használ, javasoljuk, hogy keressen egy Wi-Fi-kapcsolatot a letöltés automatikus elindításához.<br/> <br/> Tipp: szótárakat a mobileszköz a <b>Beállítások</b> menü <b>Nyelv és bevitel</b> részében tölthet le és távolíthat el."</string> <string name="download_over_metered" msgid="1643065851159409546">"Töltse le most (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Letöltés Wi-Fivel"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvhez van rendelkezésre álló szótár"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> nyelvhez van rendelkezésre álló szótár"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Nyomja meg az áttekintéshez és letöltéshez"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Letöltés: a(z) <xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvvel kapcsolatos javaslatok hamarosan elérhetők lesznek."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Letöltés: a(z) <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> nyelvvel kapcsolatos javaslatok hamarosan elérhetők lesznek."</string> <string name="version_text" msgid="2715354215568469385">"Verzió: <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Hozzáadás"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Hozzáadás a szótárhoz"</string> diff --git a/java/res/values-hy-rAM/donottranslate.xml b/java/res/values-hy-rAM/donottranslate-config-spacing-and-punctuations.xml index 7b0c56655..ed35365a2 100644 --- a/java/res/values-hy-rAM/donottranslate.xml +++ b/java/res/values-hy-rAM/donottranslate-config-spacing-and-punctuations.xml @@ -25,7 +25,7 @@ <string name="symbols_followed_by_space">.,;:!?)]}&։՝</string> <!-- Symbols that separate words. Adding armenian period and comma. --> <!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) --> - <string name="symbols_word_separators">"	 \n"()[]{}*&<>+=|.,;:!?/_\"։՝</string> + <string name="symbols_word_separators">"	 
 "()[]{}*&<>+=|.,;:!?/_\"։՝</string> <!-- The sentence separator code point, for capitalization --> <!-- U+0589: "։" ARMENIAN FULL STOP ; 589h = 1417d --> <integer name="sentence_separator">1417</integer> diff --git a/java/res/values-hy-rAM/strings-action-keys.xml b/java/res/values-hy-rAM/strings-action-keys.xml index af9dd5d9d..9dd59b8f5 100644 --- a/java/res/values-hy-rAM/strings-action-keys.xml +++ b/java/res/values-hy-rAM/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Նախորդը"</string> <string name="label_done_key" msgid="7564866296502630852">"Պատրաստ է"</string> <string name="label_send_key" msgid="482252074224462163">"Ուղարկել"</string> + <string name="label_search_key" msgid="7965186050435796642">"Որոնում"</string> <string name="label_pause_key" msgid="2225922926459730642">"Դադարեցնել"</string> <string name="label_wait_key" msgid="5891247853595466039">"Սպասել"</string> </resources> diff --git a/java/res/values-hy-rAM/strings-config-important-notice.xml b/java/res/values-hy-rAM/strings-config-important-notice.xml new file mode 100644 index 000000000..9fac63197 --- /dev/null +++ b/java/res/values-hy-rAM/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Բարելավեք առաջարկները` ձեր նամակագրությունից և մուտքագրած տվյալներից"</string> +</resources> diff --git a/java/res/values-hy-rAM/strings-emoji-descriptions.xml b/java/res/values-hy-rAM/strings-emoji-descriptions.xml new file mode 100644 index 000000000..f41f2fc96 --- /dev/null +++ b/java/res/values-hy-rAM/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Հեղինակային իրավունքի նշան"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Գրանցված ապրանքանիշի նշան"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Կրկնակի բացականչական նշան"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Բացականչական հարցական նշան"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Ապրանքանշանի նշան"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Տեղեկատվական աղբյուր"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Ձախ-աջ սլաք"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Վեր-վար սլաք"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Սլաք դեպի հյուսիս-արևմուտք"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Սլաք դեպի հյուսիս-արևելք"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Սլաք դեպի հարավ-արևելք"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Սլաք դեպի հարավ-արևմուտք"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Կեռ ձախ սլաք"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Կեռ աջ սլաք"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Ժամացույց"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Ավազի ժամացույց"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Դեպի աջ ուղղված սև կրկնակի եռանկյուն"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Դեպի ձախ ուղղված սև կրկնակի եռանկյուն"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Դեպի վեր ուղղված սև կրկնակի եռանկյուն"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Դեպի վար ուղղված սև կրկնակի եռանկյուն"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Զարթուցիչ"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Հոսող ավազով ժամացույց"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Շրջանաձև լատիներեն մեծատառ m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Փոքր սև քառակուսի"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Փոքր սպիտակ քառակուսի"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Դեպի աջ ուղղված սև եռանկյուն"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Դեպի ձախ ուղղված սև եռանկյուն"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Միջին սպիտակ քառակուսի"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Միջին սև քառակուսի"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Միջին փոքր սպիտակ քառակուսի"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Միջին փոքր սև քառակուսի"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Սև արև` ճառագայթներով"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Ամպ"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Սև հեռախոս"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Քվեատուփ` նշանով"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Անձրևանոց` անձրևի կաթիլներով"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Տաք ըմպելիք"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Սպիտակ դեպի վեր ուղղված դասիչ"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Սպիտակ ժպտացող դեմք"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Խոյ"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Ցուլ"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Երկվորյակ"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Խեցգետին"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Առյուծ"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Կույս"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Կշեռք"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Կարիճ"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Աղեղնավոր"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Այծեղջյուր"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Ջրհոս"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Ձկներ"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Սև ագռավ"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Սև խաչ"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Սև սիրտ"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Սև աղյուս"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Տաք աղբյուրներ"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Սև վերամշակման նշան"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Սայլակի նշան"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Խարիսխ"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Զգուշացման նշան"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Բարձր լարման նշան"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Միջին սպիտակ շրջան"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Միջին սև շրջան"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Ֆուտբոլի գնդակ"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Բեյսբոլ"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Առանց ձյան ձնեմարդ"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Արևն ամպի ետևում"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Օձակալ"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Մուտք չկա"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Եկեղեցի"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Շատրվան"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Դրոշը փոսում"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Առագաստանավ"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Վրան"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Վառելիքի պոմպ"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Սև մկրատ"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Սպիտակ խոշոր ստուգանիշ"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Ինքնաթիռ"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Ծրար"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Բարձրացրած բռունցք"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Բարձրացրած ձեռք"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Հաղթանշան"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Մատիտ"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Սև գրչածայր"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Խոշոր ստուգանիշ"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Խոշոր բազմապատկում x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Կայծեր"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Ութանկյուն աստղանիշ"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Ութ կետով սև աստղ"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Ձյան փաթիլ"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Կայծ"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Խաչանշան"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Բացասական քառակուսի խաչանշան"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Սև հարցական նշաններով նախշազարդ"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Սպիտակ հարցական նշաններով նախշազարդ"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Սպիտակ բացականչական նշաններով նախշազարդ"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Խոշոր բացականչական նշան"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Սև սիրտ"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Խոշոր գումարման նշան"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Խոշոր հանման նշան"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Խոշոր բաժանման նշան"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Սև դեպի աջ սլաք"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Խուճուճ հանգույց"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Կրկնակի խուճուճ հանգույց"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Դեպի աջ ուղղված, ապա դեպի վեր ծռված սլաք"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Դեպի աջ ուղղված, ապա դեպի վար ծռված սլաք"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Դեպի ձախ սև սլաք"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Դեպի վեր սև սլաք"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Դեպի վար սև սլաք"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Մեծ սև քառակուսի"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Մեծ սպիտակ քառակուսի"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Միջին սպիտակ քառակուսի"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Խոշոր շրջան"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Ալիքաձև գծիկ"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Երաժշտական փոփոխականի նշան"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Շնորհավորանքի շրջանաձև խորհրդանշան"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Գաղտնիքի շրջանաձև խորհրդանշան"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Մահջոնգի սալիկ՝ կարմիր վիշապով"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Սև ջոկեր խաղաքարտ"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Արյան Ա խումբ"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Արյան Բ խումբ"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Արյան Օ խումբ"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Ավտոկայանատեղի"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Արյան ԱԲ խումբ"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"Քառակուսի CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Քառակուսի COOL"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Քառակուսի FREE"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Քառակուսի ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Քառակուսի NEW"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Քառակուսի NG"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Քառակուսի OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Քառակուսի SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Քառակուսի UP բացականչական նշանով"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Քառակուսի vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Քառակուսի Կատականա այստեղ"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Քառակուսի Կատականա ծառայություն"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Քառակուսի խորհրդանշան անվճար"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Քառակուսի խորհրդանշան պահված տեղ"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Քառակուսի խորհրդանշան արգելում"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Քառակուսի խորհրդանշան թափուր աշխատատեղ"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Քառակուսի խորհրդանշան ընդունված"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Քառակուսի խորհրդանշան լրիվ զբաղվածություն"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Քառակուսի խորհրդանշան վճարված"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Քառակուսի խորհրդանշան ամսական"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Քառակուսի խորհրդանշան դիմում"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Քառակուսի խորհրդանշան զեղչ"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Քառակուսի խորհրդանշան աշխատում է"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Շրջանաձև խորհրդանշան առավելություն"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Շրջանաձև խորհրդանշան ընդունում"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Ցիկլոն"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Մառախլապատ"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Փակ անձրևանոց"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Աստղազարդ գիշեր"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Արևածագը լեռներում"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Արևածագ"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Քաղաքը մթնշաղում"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Մայրամուտը շենքերի վրա"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Ծիածան"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Կամուրջը գիշերը"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Ծովի ալիք"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Հրաբուխ"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Ծիր կաթին"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Երկրագունդը՝ Եվրոպա-Աֆրիկա"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Երկրագունդը՝ Ամերիկաներ"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Երկրագունդը՝ Ավստրալիա"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Երկրագունդը միջօրեականներով"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Նորալուսնի նշան"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Աճող կիսալուսնի նշան"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Լուսնի առաջին քառորդի նշան"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Աճող ուռուցիկ լուսնի նշան"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Լիալուսնի նշան"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Փոքրացող ուռուցիկ լուսնի նշան"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Լուսնի վերջին քառորդի նշան"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Փոքրացող կիսալուսնի նշան"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Կիսալուսին"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Դեմքով նորալուսին"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Առաջին քառորդ լուսին՝ դեմքով"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Վերջին քառորդ լուսին՝ դեմքով"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Դեմքով լիալուսին"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Դեմքով արև"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Փայլուն աստղ"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Կրակող աստղ"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Շագանակ"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Սածիլ"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Մշտադալար ծառ"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Տերևաշատ ծառ"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Պալմա"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Կակտուս"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Կակաչ"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Բալենու ծաղիկ"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Վարդ"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Հիբիսկուս"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Արևածաղիկ"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Ծաղիկ"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Եգիպտացորեն"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Բրինձ"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Խոտաբույս"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Քառատերև երեքնուկ"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Թխկու տերև"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Թափված տերև"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Քամուց թռչող տերև"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Սունկ"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Լոլիկ"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Սմբուկ"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Խաղող"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Սեխ"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Ձմերուկ"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Մանդարին"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Կիտրոն"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Բանան"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Արքայախնձոր"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Կարմիր խնձոր"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Կանաչ խնձոր"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Տանձ"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Դեղձ"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Բալ"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Ելակ"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Համբուրգեր"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Պիցցայի կտոր"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Ոսկորով միս"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Հավի բուդ"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Բրնձի կրեկեր"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Բրնձի կլորակ"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Եփած բրինձ"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Քարի և բրինձ"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Գոլորշիացող բաժակ"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Սպագետտի"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Հաց"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Տապակած կարտոֆիլ"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Տապակած քաղցր կարտոֆիլ"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Դանգո"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Օդեն"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Սուշի"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Տապակած ծովախեցգետին"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Ձկան տորթ՝ օղակաձև ձևավորմամբ"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Լցնովի պաղպաղակ"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Սառցե դեսերտ"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Պաղպաղակ"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Դոնաթ"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Թխվածքաբլիթ"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Շոկոլադի սալիկ"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Կոնֆետ"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Սառնաշաքար կոնֆետ"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Եփովի կրեմ"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Մեղրանոթ"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Տորթի կտոր"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Բենտոյով տուփ"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Սնունդով լի ափսե"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Խոհարարություն"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Դանակ և պատառաքաղ"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Թեյի անպոչ բաժակ"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Սակեի շիշ և գավաթ"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Գինու գավաթ"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Կոկտեյլի բաժակ"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Արևադարձային խմիչք"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Գարեջրի բաժակ"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Զրնգացող գարեջրի բաժակներ"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Մանկական շիշ"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Ժապավեն"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Փաթեթավորված նվեր"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Ծննդյան տորթ"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Դդմի լապտեր"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Տոնածառ"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Ձմեռ պապ"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Հրավառություն"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Բենգալյան կրակ"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Փուչիկ"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Ճայթուկ"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Կոնֆետտի գնդակ"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Տանաբատա ծառ"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Հատվող դրոշներ"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Սոճու ձևավորում"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Ճապոնական տիկնիկներ"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Կարպ նավադրոշ"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Քամու երգ"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Լուսնի դիտման արարողություն"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Դպրոցական պայուսակ"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Ավարտական գլխարկ"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Ձի կարուսել"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Սատանայի անիվ"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Ուրախ սարեր"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Ձկնորսական կարթ և ձուկ"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Բարձրախոս"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Տեսախցիկ"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Կինոթատրոն"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Ականջակալ"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Ներկապնակ"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Ցիլինդր"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Կրկեսային վրան"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Տոմս"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Ծափափեղկ"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Կատարողական արվեստ"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Տեսախաղ"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Ուղղակի հարված"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Խաղասարք"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Բիլիարդ"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Խաղազառ"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Բոուլինգ"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Ծաղկով խաղաքարտեր"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Երաժշտական ձայնանիշ"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Մի քանի երաժշտական ձայնանիշ"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Սաքսոֆոն"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Կիթառ"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Երաժշտական ստեղնաշար"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Շեփոր"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Ջութակ"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Նոտագրում"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Վազքի վերնաշապիկ"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Թենիսի թիակ և գնդակ"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Դահուկ և դահուկի կոշիկ"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Բասկետբոլի գնդակ և զամբյուղ"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Վերջնակետի դրոշ"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Ձնատախտակորդ"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Վազորդ"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Ալեսահորդ"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Մրցանակ"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Ձիարշավ"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Ամերիկյան ֆուտբոլ"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Ռեգբի"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Լողորդ"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Բնակելի շենք"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Այգով տուն"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Գրասենյակային շենք"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Ճապոնական փոստատուն"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Եվրոպական փոստատուն"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Հիվանդանոց"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Բանկ"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Բանկոմատ"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Հյուրանոց"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Սիրո հյուրանոց"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Պարենային խանութ"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Դպրոց"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Հանրախանութ"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Գործարան"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Ճապոնական լապտեր"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Ճապոնական ամրոց"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Եվրոպական ամրոց"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Առնետ"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Մուկ"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Եզ"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Գոմեշ"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Կով"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Ընձառյուծ"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Ճագար"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Կատու"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Վիշապ"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Կոկորդիլոս"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Կետ"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Խխունջ"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Օձ"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Ձի"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Խոյ"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Այծ"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Ոչխար"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Կապիկ"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Աքաղաղ"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Հավ"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Շուն"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Խոզ"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Վարազ"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Փիղ"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Ութոտնուկ"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Պարուրաձև խեցի"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Բզեզ"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Մրջյուն"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Մեղու"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Զատիկ"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Ձուկ"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Արևադարձային ձուկ"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Գնդաձուկ"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Կրիա"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Թուխսի ճուտ"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Ճուտիկ"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Դիմահայաց ճուտիկ"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Թռչուն"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Պինգվին"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Կոալա"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Պուդել"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Դրոմադեր ուղտ"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Երկսապատանի ուղտ"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Դելֆին"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Մկան մռութ"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Կովի մռութ"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Վագրի մռութ"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Ճագարի մռութ"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Կատվի մռութ"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Վիշապի մռութ"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Թռչող կետ"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Ձիու մռութ"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Կապիկի մռութ"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Շան մռութ"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Խոզի մռութ"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Գորտի մռութ"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Գերմանամկան դեմք"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Գայլի մռութ"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Արջի մռութ"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Պանդայի մռութ"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Խոզի քիթ"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Թաթի հետքեր"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Աչքեր"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Ականջ"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Քիթ"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Բերան"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Լեզու"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Վեր ուղղված սպիտակ ցուցամատ"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Վար ուղղված սպիտակ ցուցամատ"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Ձախ ուղղված սպիտակ ցուցամատ"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Աջ ուղղված սպիտակ ցուցամատ"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Բռունցքի նշան"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Թափահարող ձեռքի նշան"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Ok-ի նշան"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Բութ մատները վեր նշան"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Բութ մատները վար նշան"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Ծափահարող ձեռքերի նշան"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Բաց ափերով ձեռքերի նշան"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Թագ"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Կնոջ գլխարկ"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Ակնոց"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Փողկապ"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Շապիկ"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Ջինս"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Զգեստ"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Կիմոնո"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Բիկինի"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Կնոջ հագուստ"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Դրամապանակ"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Պայուսակ"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Քսակ"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Տղամարդու կոշիկ"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Մարզակոշիկ"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Բարձրակրունկ կոշիկ"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Կնոջ սանդալներ"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Կնոջ երկարաճիտ կոշիկներ"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Ոտնահետքեր"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Կիսանդրու ուրվագիծ"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Կիսանդրիների ուրվագիծ"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Տղա"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Աղջիկ"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Տղամարդ"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Կին"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Ընտանիք"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Միացված ձեռքերով տղամարդ և կին"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Միացված ձեռքերով երկու տղամարդ"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Միացված ձեռքերով երկու կին"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Ոստիկան"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Նապաստակի ականջներով կին"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Քողով հարսնացու"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Շիկահեր մարդ"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Չինական գլխարկով տղամարդ"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Գլխաշորով տղամարդ"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Ծեր տղամարդ"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Ծեր կին"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Մանուկ"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Շինարար"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Արքայադուստր"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Ճապոնական օգր"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Ճապոնական գոբլին"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Ուրվական"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Մանուկ հրեշտակ"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Այլմոլորակային"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Այլմոլորակային հրեշ"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Սատանայի ճուտ"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Գանգ"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Տեղեկատու անձ"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Պահնորդ"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Պարող"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Շրթներկ"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Եղունգաներկ"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Դեմքի մերսում"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Սանրվածք"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Վարսավիրի նշան"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Ներարկիչ"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Հաբ"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Համբույրի նշան"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Սիրային նամակ"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Մատանի"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Թանկարժեք քար"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Համբույր"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Ծաղկեփունջ"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Զույգը սրտի մեջ"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Հարսանիք"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Բաբախող սիրտ"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Կոտրված սիրտ"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Երկու սրտեր"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Պսպղացող սիրտ"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Աճող սիրտ"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Խոցված սիրտ"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Կապույտ սիրտ"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Կանաչ սիրտ"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Դեղին սիրտ"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Մանուշակագույն սիրտ"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Ժապավենով սիրտ"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Միացող սրտեր"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Սրտիկներով ձևավորում"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Շեղանկյուն` կետիկով"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Էլեկտրական լամպ"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Ջղայնության նշան"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Ռումբ"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Քնի նշան"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Բախման նշան"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Հոսող քրտինքի նշան"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Կաթիլ"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Գծիկի նշան"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Կեղտի կույտ"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Լարված երկգլուխ մկան"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Գլխապտույտի նշան"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Խոսքի փուչիկ"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Մտքի փուչիկ"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Սպիտակ ծաղիկ"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Հարյուր միավորի նշան"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Փողի քսակ"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Արտարժույթի փոխանակում"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Խոշոր դոլարի նշան"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Վարկային քարտ"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Իենի նշանով թղթադրամ"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Դոլարի նշանով թղթադրամ"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Եվրոյի նշանով թղթադրամ"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Ֆունտի նշանով թղթադրամ"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Թևավոր թղթադրամ"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Աճման միտումով և իենի նշանով գրաֆիկ"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Նստատեղ"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Անհատական համակարգիչ"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Թղթապանակ"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Փոքր սկավառակ"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Ճկուն սկավառակ"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Օպտիկական սկավառակ"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Ֆայլերի թղթապանակ"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Ֆայլերի բաց թղթապանակ"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Ոլորված ծայրով էջ"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Թեքված էջ"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Օրացույց"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Պոկվող էջերով օրացույց"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Քարտային դասիչ"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Աճման միտումով գրաֆիկ"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Նվազման միտումով գրաֆիկ"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Ձողային գրաֆիկ"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Սեղմատախտակ"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Սևեռակ"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Կլոր սևեռակ"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Ամրակ"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Ուղիղ քանոն"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Եռանկյուն քանոն"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Էջանիշ"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Մատյան"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Նոթատետր"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Ձևավոր կազմով նոթատետր"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Փակ գիրք"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Բաց գիրք"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Կանաչ գիրք"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Կապույտ գիրք"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Նարնջագույն գիրք"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Գրքեր"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Անվանաքարտ"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Գալար"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Հիշեցում"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Լսափող"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Փեյջեր"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Հեռապատճենի սարք"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Արբանյակային ալեհավաք"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Հրապարակային բարձրախոս"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Ուրախ բարձրախոս"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Ելքային արկղ"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Մուտքային արկղ"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Փաթեթ"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Էլփոստի նշան"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Մուտքային ծրար"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Վերևից դեպի վար սլաքով ծրար"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Իջեցված դրոշով փակ փոստարկղ"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Բարձրացված դրոշով փակ փոստարկղ"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Բարձրացված դրոշով փակ փոստարկղ"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Իջեցված դրոշով բաց փոստարկղ"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Փոստարկղ"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Փոստային եղջյուր"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Թերթ"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Բջջային հեռախոս"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Բջջային հեռախոս՝ ձախ կողմում դեպի վեր սլաքով"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Թրթռոցի ռեժիմ"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Բջջային հեռախոսը` անջատած"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Բջջային հեռախոսներ չկան"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Ձողերով ալեհավաք"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Ֆոտոխցիկ"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Տեսախցիկ"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Հեռուստատեսություն"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Ռադիո"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Տեսաժապավեն"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Պտտված դեպի աջ սլաքներ"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Ժամացույցի սլաքի ուղղությամբ դեպի աջ և ձախ բաց շրջանաձև սլաքներ"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Ժամացույցի սլաքի ուղղությամբ դեպի աջ և ձախ բաց շրջանաձև սլաքներ՝ շրջանաձև մեկ վերադրումով"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Ժամացույցի սլաքի ուղղությամբ դեպի վար և վեր բաց շրջանաձև սլաքներ"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Ժամացույցի սլաքի հակառակ ուղղությամբ դեպի վար և վեր բաց շրջանաձև սլաքներ"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Ցածր պայծառության նշան"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Բարձր պայծառության նշան"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Չեղարկման գծով բարձրախոս"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Բարձրախոս"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Մեկ ձայնային ալիքով բարձրախոս"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Երեք ձայնային ալիքով բարձրախոս"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Մարտկոց"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Էլեկտրական խրոցակ"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Ձախ թեքված խոշորացույց"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Աջ թեքված խոշորացույց"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Կողպեք և թանաքի գրիչ"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Փակված կողպեք՝ բանալիով"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Բանալի"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Կողպեք"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Բաց կողպեք"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Զանգ"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Չեղարկման գծով զանգ"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Էջանիշ"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Հղման նշան"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Կետակոճակ"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Հետ՝ վերևում դեպի ձախ սլաքով"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Վերջ՝ վերևում դեպի ձախ սլաքով"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Միացված է՝ բացականչական նշանով և վերևում դեպի աջ ու ձախ սլաքով"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Շուտով՝ վերևում դեպի աջ սլաքով"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Վերև՝ վերևում դեպի վեր սլաքով"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Տասնութից ցածրի արգելման նշան"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Ստեղնատասնյակ"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Լատիներեն մեծատառերով մուտքագրման նշան"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Լատիներեն փոքրատառերով մուտքագրման նշան"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Թվային մուտքագրման նշան"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Նշանների ներածման նշան"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Լատինատառ մուտքագրման նշան"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Կրակ"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Էլեկտրական լապտեր"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Ոլորակ"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Մուրճ"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Մանեկ ու պտուտակ"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Ճապոնական դանակ"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Ատրճանակ"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Մանրադիտակ"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Հեռադիտակ"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Ապակե գնդակ"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Միջակետով վեցանկյուն աստղ"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Ճապոնական սկսնակի նշան"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Եռաժանու նշան"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Սև քառակուսի կոճակ"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Սպիտակ քառակուսի կոճակ"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Մեծ կարմիր շրջան"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Մեծ կապույտ շրջան"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Մեծ նարնջագույն շեղանկյուն"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Մեծ կապույտ շեղանկյուն"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Փոքր նարնջագույն շեղանկյուն"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Փոքր կապույտ շեղանկյուն"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Վեր ուղղված կարմիր եռանկյուն"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Վար ուղղված կարմիր եռանկյուն"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Վեր ուղղված փոքր կարմիր եռանկյուն"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Վար ուղղված փոքր կարմիր եռանկյուն"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Թվատախտակ՝ ժամը մեկով"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Թվատախտակ՝ ժամը երկուսով"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Թվատախտակ՝ ժամը երեքով"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Թվատախտակ՝ ժամը չորսով"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Թվատախտակ՝ ժամը հինգով"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Թվատախտակ՝ ժամը վեցով"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Թվատախտակ՝ ժամը յոթով"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Թվատախտակ՝ ժամը ութով"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Թվատախտակ՝ ժամը ինով"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Թվատախտակ՝ ժամը տասով"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Թվատախտակ՝ ժամը տասնմեկով"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Թվատախտակ՝ ժամը տասներկուսով"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Թվատախտակ՝ ժամը մեկն անց երեսուն"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Թվատախտակ՝ ժամը երկուսն անց երեսուն"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Թվատախտակ՝ ժամը երեքն անց երեսուն"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Թվատախտակ՝ ժամը չորսն անց երեսուն"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Թվատախտակ՝ ժամը հինգն անց երեսուն"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Թվատախտակ՝ ժամը վեցն անց երեսուն"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Թվատախտակ՝ ժամը յոթն անց երեսուն"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Թվատախտակ՝ ժամը ութն անց երեսուն"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Թվատախտակ՝ ժամը ինն անց երեսուն"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Թվատախտակ՝ ժամը տասն անց երեսուն"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Թվատախտակ՝ ժամը տասնմեկն անց երեսուն"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Թվատախտակ՝ ժամը տասներկուսն անց երեսուն"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Ֆուձի լեռ"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Տոկիոյի աշտարակ"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Ազատության արձան"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Ճապոնիայի ուրվագիծ"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Մայաների քարե արձան"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Քմծիծաղով դեմք"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Քմծիծաղով դեմք՝ ժպտացող աչքերով"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Ուրախության արցունքներով դեմք"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Ժպտացող դեմք՝ բաց բերանով"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Ժպտացող դեմք՝ բաց բերանով և ժպտացող աչքերով"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Ժպտացող դեմք՝ բաց բերանով և սառը քրտինքով"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Ժպտացող դեմք՝ բաց բերանով և պինդ փակված աչքերով"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Ժպտացող դեմք` լուսապսակով"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Ժպյտացող դեմք` պոզերով"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Աչքով անող դեմք"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Ժպտացող դեմք` ժպտացող աչքերով"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Համեղ ուտեստներ վայելող դեմք"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Հանգստացած դեմք"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Ժպտացող դեմք` սրտաձև աչքերով"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Ժպտացող դեմք` արևային ակնոցով"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Հեգնական ժպիտով դեմք"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Չեզոք դեմք"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Արտահայտությունից զուրկ դեմք"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Չհետաքրքրված դեմք"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Սառը քրտինքով դեմք"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Մտախոհ դեմք"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Շփոթված դեմք"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Մոլորված դեմք"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Համբուրող դեմք"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Օդային համբույր ուղարկող դեմք"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Համբուրող դեմք` ժպտացող աչքերով"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Համբուրող դեմք` փակ աչքերով"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Լեզուն հանած դեմք"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Լեզուն հանած և աչքով անող դեմք"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Լեզուն հանած և աչքերը փակած դեմք"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Հիասթափված դեմք"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Մտահոգ դեմք"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Ջղային դեմք"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Շրթունքներն ուռած դեմք"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Լացող դեմք"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Կամակոր դեմք"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Հաղթական արտահայտությամբ դեմք"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Հիասթափված, բայց հանգստացած դեմք"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Բաց բերանով խոժոռ դեմք"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Տանջված դեմք"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Վախեցած դեմք"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Հոգնած դեմք"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Քնաթաթախ դեմք"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Հոգնած դեմք"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Ծամածռված դեմք"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Բարձրաձայն լացող դեմք"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Բաց բերանով դեմք"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Լռող դեմք"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Բաց բերանով և սառը քրտինքով դեմք"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Վախից ճչացող դեմք"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Ապշած դեմք"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Շիկնած դեմք"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Քնած դեմք"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Գլխապտույտով դեմք"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Առանց բերանի դեմք"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Բժշկական դիմակով դեմք"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Քմծիծաղող կատվի դեմք՝ ժպտացող աչքերով"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Կատվի դեմք՝ երջանկության արցունքներով"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Ժպտացող կատվի դեմք՝ բաց բերանով"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Ժպտացող կատվի դեմք՝ սրտաձև աչքերով"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Կատվի դեմք՝ ծուռ ժպիտով"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Համբուրող կատվի դեմք՝ փակ աչքերով"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Շրթունքներն ուռած կատվի դեմք"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Լացող կատվի դեմք"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Հոգնած կատվի դեմք"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"«Ոչ լավ» արտահայտությամբ դեմք"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"«Լավ» արտահայտությամբ դեմք"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Կռացած դեմք"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Աչքերը ձեռքերով փակած կապիկ"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Ականջները ձեռքերով փակած կապիկ"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Բերանը ձեռքերով փակած կապիկ"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Երջանիկ մարդ` բարձրացրած ձեռքով"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Երկու ձեռքը ողջույնի համար բարձրացրած մարդ"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Դժգոհ մարդ"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Շրթունքներն ուռեցրած դեմքով մարդ"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Ծալված ձեռքերով մարդ"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Հրթիռ"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Ուղղաթիռ"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Շոգեքարշ"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Վագոն"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Ճեպընթաց գնացք"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Ճեպընթաց գնացք` փամփուշտաձև քթով"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Գնացք"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Մետրո"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Մոնոռելս"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Կայան"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Տրամվայ"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Տրամվայ"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Ավտոբուս"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Հանդիպակաց ավտոբուս"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Տրոլեյբուս"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Ավտոբուսի կանգառ"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Միկրոավտոբուս"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Շտապ օգնություն"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Հրշեջ մեքենա"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Ոստիկանական մեքենա"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Հանդիպակաց եկող ոստիկանական մեքենա"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Տաքսի"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Հանդիպակաց եկող տաքսի"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Ավտոմեքենա"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Հանդիպակաց եկող ավտոմեքենա"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Ավտոտնակ"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Առաքման մեքենա"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Ինքնագնաց"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Տրակտոր"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Մոնոռելս"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Լեռնային երկաթուղի"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Երկաթուղային կախոց"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Լեռնային ճոպանուղի"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Ճոպանուղի"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Նավ"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Լաստանավ"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Մոտորանավ"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Հորիզոնական լուսացույց"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Ուղղահայաց լուսացույց"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Շինարարության նշան"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Ոստիկականան մեքենայի ազդանշանային լույսեր"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Եռանկյուն դրոշ"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Դուռ"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Չմտնելու նշան"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Ծխելու նշան"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Չծխելու նշան"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Աղբը իր տեղում թափելու նշան"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Աղբ չթափելու նշան"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Խմելու ջրի նշան"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Ոչ խմելու ջրի նշան"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Հեծանիվ"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Հեծանիվների արգելք"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Հեծանվորդ"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Լեռնային հեծանվորդ"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Հետիոտն"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Հետիոտների արգելք"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Հատող երեխաներ"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Տղամարդկանց նշան"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Կանանց նշան"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Զուգարան"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Մանուկի նշան"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Զուգարան"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Արտաքնոց"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Ցնցուղ"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Բաղնիք"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Լոգարան"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Անձնագրերի ստուգում"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Մաքսատուն"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Ուղեբեռի ստացում"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Ձախ ուղեբեռ"</string> +</resources> diff --git a/java/res/values-hy-rAM/strings-letter-descriptions.xml b/java/res/values-hy-rAM/strings-letter-descriptions.xml new file mode 100644 index 000000000..ed4d69e56 --- /dev/null +++ b/java/res/values-hy-rAM/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Դասական թվականների իգական սեռի ցուցիչ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Մյու"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Դասական թվականների արական սեռի ցուցիչ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Էսցետ"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, վերևում օղակով"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, կցագիր"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, սեդիլով"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Էթ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, թեք հատող գծիկով"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Տոռն"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, վերևում երկու կետիկով"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, վերևում գծիկով"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, պոչիկով"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, վերևում կետիկով"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, աջ կողմի վերևում ապաթարցով"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, գծիկով"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, վերևում գծիկով"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, վերևում կետիկով"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, պոչիկով"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, վերևում կետիկով"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, սեդիլով"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, գծիկով"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, վերևում գծիկով"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, պոչիկով"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Կետազուրկ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, կցագիր"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, սեդիլով"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Կռա"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, սեդիլով"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, աջ կողմի վերևում ապաթարցով"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, աջ կողմի մեջտեղում կետիկով"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, գծիկով"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, սեդիլով"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, ձախ կողմում ապաթարցով"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Էնգ"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, վերևում գծիկով"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, վերևում կրկնակի շեշտանշանով"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, կցագիր"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, սեդիլով"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, սեդիլով"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, սեդիլով"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, աջ կողմի վերևում ապաթարցով"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, գծիկով"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, վերևում գծիկով"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, վերևում կոր գծիկով"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, վերևում օղակով"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U վերևում կրկնակի շեշտանշանով"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, պոչիկով"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, վերևում կոչանիշով"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, վերևում կետիկով"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, վերևում «ծիտիկով»"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Երկար S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, աջ կողմում եղջյուրով"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, աջ կողմում եղջյուրով"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ներքևում ստորակետով"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ներքևում ստորակետով"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Չեզոք ձայնավոր"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, վերևում կոչանիշով և շեշտանշանով"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, վերևում կոչանիշով և բութի նշանով"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, վերևում կոչանիշով և կեռիկով"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, վերևում կոչանիշով և ալիքանշանով"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, վերևում կոչանիշով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, վերևում կոր գծիկով և շեշտանշանով"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, վերևում կոր գծիկով և բութի նշանով"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, վերևում կոր գծիկով և կեռիկով"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, վերևում կոր գծիկով և ալիքանշանով"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, վերևում կոր գծիկով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, վերևում կոչանիշով և շեշտանշանով"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, վերևում կոչանիշով և բութի նշանով"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, վերևում կոչանիշով և կեռիկով"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, վերևում կոչանիշով և ալիքանշանով"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, վերևում կոչանիշով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, վերևում կոչանիշով և շեշտանշանով"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, վերևում կոչանիշով և բութի նշանով"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, վերևում կոչանիշով և կեռիկով"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, վերևում կոչանիշով և ալիքանշանով"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, վերևում կոչանիշով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, աջ կողմում եղջյուրով և վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, աջ կողմում եղջյուրով և վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, աջ կողմում եղջյուրով և վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, աջ կողմում եղջյուրով և վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, աջ կողմում եղջյուրով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, աջ կողմում եղջյուրով և վերևում շեշտանշանով"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, աջ կողմում եղջյուրով և վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, աջ կողմում եղջյուրով և վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, աջ կողմում եղջյուրով և վերևում ալիքանշանով"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, աջ կողմում եղջյուրով և ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, վերևում բութի նշանով"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ներքևում կետիկով"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, վերևում կեռիկով"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, վերևում ալիքանշանով"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Շրջած բացականչական նշան"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Բացող հայկական չակերտ"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Մեջտեղի կետիկ"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Վերգիր մեկ"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Փակող հայկական չակերտ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Շրջած հարցական նշան"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ձախ վերին չակերտ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Աջ վերին չակերտ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ստորին չակերտ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ձախ վերին կրկնակի չակերտ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Աջ վերին կրկնակի չակերտ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Խաչ"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Կրկնակի խաչ"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Պրոմիլի նշան"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Շտրիխ"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Կրկնակի շտրիխ"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ձախ անկյունային փակագիծ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Աջ անկյունային փակագիծ"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Վերգիր չորս"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Վերգիր լատիներեն փոքրատառ n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Պեսոյի նշան"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Միջոցով"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Աջ սլաք"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Ներքև սլաք"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Դատարկ բազմություն"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Ավելացում"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Փոքր կամ հավասար է"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Մեծ կամ հավասար է"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Սև աստղ"</string> +</resources> diff --git a/java/res/values-hy-rAM/strings-talkback-descriptions.xml b/java/res/values-hy-rAM/strings-talkback-descriptions.xml new file mode 100644 index 000000000..44784bd86 --- /dev/null +++ b/java/res/values-hy-rAM/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Միացրեք ականջակալը՝ բարձրաձայն արտասանվող գաղտնաբառը լսելու համար:"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Տվյալ տեքստը %s է"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Տեքստ չի մուտքագրվել"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>-ը շտկում է <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ը՝ դարձնելով <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ստեղնը ինքնաշտկում է կատարում"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Անհայտ տառանշան"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Հավելյալ նշաններ"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Նշաններ"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ջնջել"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Նշաններ"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Տառեր"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Թվեր"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Կարգավորումներ"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Բացատ"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Ձայնային մուտքագրում"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Զմայլիկներ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Վերադառնալ"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Որոնել"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Կետ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Փոխել լեզուն"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Հաջորդը"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Նախորդը"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift-ը միացված է"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock-ը միացված է"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Նշանների ռեժիմ"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Հավելյալ նշանների ռեժիմ"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Տառերի ռեժիմ"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Հեռախոսային ռեժիմ"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Հեռախոսի նշանների ռեժիմ"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Ստեղնաշարը թաքցված է"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Ցուցադրվում է <xliff:g id="KEYBOARD_MODE">%s</xliff:g> ստեղնաշարը"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ամսաթիվ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ամսաթիվ և ժամ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"էլփոստ"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"նամակագրություն"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"թվեր"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"հեռախոսահամար"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"տեքստ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ժամանակ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Վերջինները"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Մարդիկ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Օբյեկտներ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Բնություն"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Վայրեր"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Նշաններ"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Զմայլիկներ"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Մեծատառ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Մեծատառ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Մեծատառ I, վերևում կետիկ"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Անհայտ նշան"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Անհայտ զմայլիկ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Լրացուցիչ տառանշաններով ստեղնաշարը հասանելի է"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Լրացուցիչ տառանշաններով ստեղնաշարը փակված է"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Լրացուցիչ առաջարկներով վահանակը հասանելի է"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Լրացուցիչ առաջարկներով վահանակը փակված է"</string> +</resources> diff --git a/java/res/values-hy-rAM/strings.xml b/java/res/values-hy-rAM/strings.xml index 0b8e19a76..f606c4b39 100644 --- a/java/res/values-hy-rAM/strings.xml +++ b/java/res/values-hy-rAM/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Ներածման ընտրանքներ"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Հետազոտական գրառումների հրամաններ"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Փնտրել կոնտակտային անուններ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Տառասխալների ուղղիչն օգտագործում է ձեր կոնտակտների ցանկի տվյալները"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Թրթռալ սեղմման ժամանակ"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Ձայնը սեղմման ժամանակ"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Ելնող պատուհան՝ ստեղնի հպման դեպքում"</string> - <string name="general_category" msgid="1859088467017573195">"Ընդհանուր"</string> - <string name="correction_category" msgid="2236750915056607613">"Տեքստի ուղղում"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Ժեստերով մուտքագրում"</string> - <string name="misc_category" msgid="6894192814868233453">"Այլ ընտրանքներ"</string> - <string name="advanced_settings" msgid="362895144495591463">"Ընդլայնված կարգավորումներ"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Ընտրանքներ փորձագետների համար"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Ներածման նախընտրանքներ"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Արտաքին տեսք"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Բազմալեզու տարբերակներ"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Ժեստերով մուտքագրման նախընտրանքներ"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Տեքստի ուղղում"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Ընդլայնված"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Անցնել մուտքագրման այլ եղանակների"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Լեզվի փոխարկման բանալին ընդգրկում է այլ մուտքագրման եղանակներ ևս"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Լեզվի փոխարկման ստեղն"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Համակարգի լռելյայնները"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Առաջարկել կոնտակտների անունները"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Օգտագործել կոնտակտների անունները՝ առաջարկների և ուղղումների համար"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Անհատականացված առաջարկներ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Բարելավել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ը"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Կրկնաբացակի վերջակետ"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Բացակի ստեղնի կրկնակի հպումը բացակից հետո վերջակետ է դնում"</string> <string name="auto_cap" msgid="1719746674854628252">"Ավտոմատ գլխատառացում"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Ցույց տալ ժեստի հետագիծը"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Դինամիկ սահող նախատեսք"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Տեսեք առաջարկված բառը՝ ժեստի միջոցով"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>` պահված է"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Միացրեք ականջակալը՝ բարձրաձայն արտասանվող գաղտնաբառը լսելու համար:"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Տվյալ տեքստը %s է"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Տեքստ չի մուտքագրվել"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g>-ը շտկում է <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ը և դարձնում <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> ստեղնը ինքնաշտկում է կատարում"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Բանալու կոդը՝ %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift-ը միացված է (հպել անջատելու համար)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock-ը միացված է (հպել՝ անջատելու համար)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Ջնջել"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Նշաններ"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Տառեր"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Թվեր"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Կարգավորումներ"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Բացակ"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Ձայնային մուտքագրում"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Ժպիտ"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Վերադարձ"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Որոնել"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Կետ"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Փոխել լեզուն"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Հաջորդը"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Նախորդը"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift-ը միացված է"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock-ը միացված է"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift-ն անջատված է"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Նշանների ռեժիմ"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Տառերի ռեժիմ"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Հեռախոսային ռեժիմ"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Հեռախոսի նշանների ռեժիմ"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Ստեղնաշարը թաքցված է"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Ցուցադրված է <xliff:g id="MODE">%s</xliff:g> ստեղնաշարը"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ամսաթիվ"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ամսաթիվ և ժամ"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"էլփոստ"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"նամակագրություն"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"թվեր"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"հեռախոսահամար"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"տեքստ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ժամանակ"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Բառակապակցային ժեստ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Ներմուծեք բացատներ ժեստերի ընթացքում՝ սահելով բացատ ստեղնի վրայով"</string> <string name="voice_input" msgid="3583258583521397548">"Ձայնային մուտքագրման ստեղն"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ձայնային ներածման որևէ եղանակ միացված չէ։ Ստուգեք Լեզվի և ներածման կարգավորումները։"</string> <string name="configure_input_method" msgid="373356270290742459">"Կարգավորել մուտքագրման մեթոդները"</string> <string name="language_selection_title" msgid="1651299598555326750">"Մուտքագրման լեզուներ"</string> <string name="send_feedback" msgid="1780431884109392046">"Արձագանքել"</string> <string name="select_language" msgid="3693815588777926848">"Մուտքագրման լեզուներ"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Պահպանելու համար կրկին հպեք"</string> <string name="has_dictionary" msgid="6071847973466625007">"Բառարանն առկա է"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Միացնել օգտվողի արձագանքը"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Օգնել բարելավել այս մուտքագրման եղանակի խմբագրիչը՝ ինքնուրույն ուղարկելով Google-ին օգտագործման վիճակագրությունն ու վթարների հաշվետվությունները:"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Ստեղնաշարի թեման"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Անգլերեն (ՄԹ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Անգլերեն (ԱՄՆ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Իսպաներեն (ԱՄՆ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Անգլերեն (ՄԹ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Անգլերեն (ԱՄՆ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Իսպաներեն (ԱՄՆ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (ավանդական)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Անգլերեն (ՄԹ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Անգլերեն (ԱՄՆ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Իսպաներեն (ԱՄՆ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ավանդական)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (կյուրեղյան)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (լատինական)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Ոչ մի լեզվով (Այբուբեն)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Այբուբեն (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Այբուբեն (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Այբուբեն (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Այբուբեն (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Զմայլիկներ"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Գունավորում"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Սպիտակ"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Կապույտ"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Ստեղնաշարի թեման"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Պայծառ"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Բաց կապույտ"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Մուգ"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Բաց"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Մուտքագրման հատուկ ոճեր"</string> <string name="add_style" msgid="6163126614514489951">"Ավելացնել ոճ"</string> <string name="add" msgid="8299699805688017798">"Ավելացնել"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Միացնել"</string> <string name="not_now" msgid="6172462888202790482">"Ոչ հիմա"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Մուտքագրման այսպիսի ոճ արդեն գոյություն ունի՝ <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Հարմարավետության ուսումնասիրության ռեժիմ"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ստեղնի երկար սեղմման ուշացում"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Սեղմման թրթռոցի տևողություն"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Սեղմման ձայնի բարձրությունը"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Կարդալ արտաքին բառարանի ֆայլը"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ներբեռնումների թղթապանակում բառարանային ֆայլեր չկան"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Ընտրեք բառարանային ֆայլը տեղադրման համար"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Իրո՞ք ուզում եք տեղադրել այս ֆայլը <xliff:g id="LOCALE_NAME">%s</xliff:g>-ում:"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Տեղադրե՞լ այս ֆայլը <xliff:g id="LANGUAGE_NAME">%s</xliff:g> լեզվի համար:"</string> <string name="error" msgid="8940763624668513648">"Տեղի է ունեցել սխալ"</string> <string name="button_default" msgid="3988017840431881491">"Լռելյայնը"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Բարի գալուստ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Թարմացնել"</string> <string name="last_update" msgid="730467549913588780">"Վերջին անգամ թարմացվել է"</string> <string name="message_updating" msgid="4457761393932375219">"Ստուգվում է թարմացումների առկայությունը"</string> - <string name="message_loading" msgid="8689096636874758814">"Բեռնվում է..."</string> + <string name="message_loading" msgid="5638680861387748936">"Բեռնում..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Հիմնական բառարան"</string> <string name="cancel" msgid="6830980399865683324">"Չեղարկել"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Կարգավորումներ"</string> <string name="install_dict" msgid="180852772562189365">"Տեղադրել"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Չեղարկել"</string> <string name="delete_dict" msgid="756853268088330054">"Ջնջել"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Ձեր բջջային սարքում ընտրված լեզվով առկա է բառարան:<br/> Խորհուրդ ենք տալիս <b>ներբեռնել</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> բառարանը ձեր մուտքագրման հմտությունների բարելավման համար:<br/> <br/> Ներբեռնումը կարող է խլել մեկ կամ երկու րոպե 3G-ի դեպքում: Հնարավոր է գանձում կատարվի, եթե դուք չունեք <b>տվյալների անսահմանափակ փաթեթ</b>.<br/> Եթե դուք վստահ չեք, թե տվյալների որ փաթեթն ունեք, խորհուրդ ենք տալիս գտնել Wi-Fi կապ՝ ներբեռնումն ավտոմատ սկսելու համար:<br/> <br/> Հուշում. դուք կարող եք ներբեռնել և հեռացնել բառարաններ՝ գնալով ձեր բջջային սարքի <b>Կարգավորումներ ցանկի Լեզու & մուտքագրման</b> բաժինը:"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Ձեր բջջային սարքում ընտրված լեզվով առկա է բառարան:<br/> Խորհուրդ ենք տալիս <b>ներբեռնել</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> բառարանը՝ ձեր մուտքագրման հմտությունների բարելավման համար:<br/> <br/> Ներբեռնումը կարող է խլել մեկ կամ երկու րոպե 3G-ի դեպքում: Հնարավոր է գանձում կատարվի, եթե դուք չունեք <b>տվյալների անսահմանափակ փաթեթ</b>.<br/> Եթե դուք վստահ չեք, թե տվյալների որ փաթեթն ունեք, խորհուրդ ենք տալիս գտնել Wi-Fi կապ՝ ներբեռնումն ավտոմատ սկսելու համար:<br/> <br/> Հուշում. դուք կարող եք ներբեռնել և հեռացնել բառարաններ՝ անցնելով ձեր բջջային սարքի <b>Կարգավորումներ ցանկի Լեզու և մուտքագրում</b> բաժինը:"</string> <string name="download_over_metered" msgid="1643065851159409546">"Ներբեռնել հիմա (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>Մբ)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Ներբեռնել Wi-Fi-ով"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>-ով առկա է մի բառարան"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> լեզվի համար առկա է բառարան"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Սեղմեք՝ վերանայելու և ներբեռնելու համար"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Ներբեռնվում է. <xliff:g id="LANGUAGE">%1$s</xliff:g>-ի համար առաջարկները շուտով պատրաստ կլինեն:"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Ներբեռնում. <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> լեզվի համար առաջարկները պատրաստ կլինեն շուտով:"</string> <string name="version_text" msgid="2715354215568469385">"Տարբերակ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ավելացնել"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ավելացնել բառարանում"</string> diff --git a/java/res/values-in/strings-action-keys.xml b/java/res/values-in/strings-action-keys.xml index 26f32254d..7f1a28e29 100644 --- a/java/res/values-in/strings-action-keys.xml +++ b/java/res/values-in/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Balik"</string> <string name="label_done_key" msgid="7564866296502630852">"Beres"</string> <string name="label_send_key" msgid="482252074224462163">"Kirim"</string> + <string name="label_search_key" msgid="7965186050435796642">"Telusur"</string> <string name="label_pause_key" msgid="2225922926459730642">"Jeda"</string> <string name="label_wait_key" msgid="5891247853595466039">"Tunggu"</string> </resources> diff --git a/java/res/values-in/strings-config-important-notice.xml b/java/res/values-in/strings-config-important-notice.xml new file mode 100644 index 000000000..d5df91306 --- /dev/null +++ b/java/res/values-in/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Belajar dari komunikasi & data terketik untuk meningkatkan saran"</string> +</resources> diff --git a/java/res/values-in/strings-letter-descriptions.xml b/java/res/values-in/strings-letter-descriptions.xml new file mode 100644 index 000000000..711f68905 --- /dev/null +++ b/java/res/values-in/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikator ordinal feminin"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Simbol mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikator ordinal maskulin"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A dengan aksen nontirus (tanda coret miring ke arah kiri di bagian atas)"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A dengan aksen tirus (tanda coret miring ke arah kanan di bagian atas)"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A dengan aksen sirkumfleks (tanda aksen di bagian atas)"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A dengan aksen tilda (tanda gelombang di bagian atas)"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A dengan aksen diaeresis (titik dua di bagian atas)"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A dengan aksen lingkaran di bagian atas"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A E ligatur (Karakter A dan E yang digabungkan menjadi satu kesatuan unit)"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C dengan aksen cedilla (tanda kait di bagian bawah)"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E dengan aksen nontirus"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E dengan aksen tirus"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E dengan aksen diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I dengan aksen nontirus"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I dengan aksen tirus"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I dengan aksen diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N dengan aksen tilda"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O dengan aksen nontirus"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O dengan aksen tirus"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O dengan aksen tilda"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O dengan aksen diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O coret"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U dengan aksen nontirus"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U dengan aksen tirus"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U dengan aksen diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y dengan aksen tirus"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn (sekarang diganti dengan huruf th)"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y dengan aksen diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A dengan aksen makron (tanda pengulur/makron di bagian atas)"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A dengan aksen breve (tanda breve di bagian atas)"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A dengan aksen ogonek (tanda ekor di sebelah kanan bawah untuk menunjukkan bunyi sengau)"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C dengan aksen tirus"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C dengan titik di bagian atas"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C dengan aksen caron (tanda caron di bagian atas)"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D dengan aksen caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D coret"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E dengan aksen makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E dengan aksen breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E dengan titik di bagian atas"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E dengan aksen ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E dengan aksen caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G dengan aksen breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G dengan aksen titik di bagian atas"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H coret"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I dengan aksen tilda"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I dengan aksen makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I dengan aksen breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I dengan aksen ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I tanpa titik"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I dan J ligatur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L dengan aksen tirus"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L dengan aksen cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L dengan aksen caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L dengan titik di tengah"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L coret"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N dengan aksen tirus"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N dengan aksen caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N yang didahului tanda apostrof"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O dengan aksen makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O dengan aksen breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O dengan aksen tirus ganda"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O dan E ligatur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R dengan aksen tirus"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R dengan aksen caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S dengan aksen tirus"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S dengan aksen caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T dengan aksen cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T dengan aksen caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T coret"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U dengan aksen tilda"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U dengan aksen makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U dengan aksen breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U dengan aksen lingkaran di bagian atas"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U dengan aksen tirus ganda"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U dengan aksen ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y dengan aksen sirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z dengan aksen tirus"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z dengan titik di bagian atas"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z dengan aksen caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S Panjang"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O dengan aksen tanduk"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U dengan aksen tanduk"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S dengan aksen koma di bagian bawah"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T dengan aksen koma di bagian bawah"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa (aksen pepet)"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A dengan aksen sirkumfleks dan tirus"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A dengan aksen sirkumfleks dan nontirus"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A dengan aksen sirkumfleks dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A dengan aksen sirkumfleks dan tilda"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A dengan aksen sirkumfleks dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A dengan aksen breve dan tirus"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A dengan aksen breve dan nontirus"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A dengan aksen breve dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A dengan aksen breve dan tilda"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A dengan aksen breve dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E dengan aksen tilda"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E dengan aksen sirkumfleks dan tirus"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E dengan aksen sirkumfleks dan nontirus"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E dengan aksen sirkumfleks dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E dengan aksen sirkumfleks dan tilda"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E dengan aksen sirkumfleks dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O dengan aksen sirkumfleks dan tirus"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O dengan aksen sirkumfleks dan nontirus"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O dengan aksen sirkumfleks dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O dengan aksen sirkumfleks dan tilda"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O dengan aksen sirkumfleks dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O dengan aksen tanduk dan tirus"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O dengan aksen tanduk dan nontirus"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O dengan aksen tanduk dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O dengan aksen tanduk dan tilda"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O dengan aksen tanduk dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U dengan aksen tanduk dan tirus"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U dengan aksen tanduk dan nontirus"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U dengan aksen tanduk dan kait di bagian atas"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U dengan aksen tanduk dan tilda"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U dengan aksen tanduk dan titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y dengan aksen nontirus"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y dengan aksen titik di bagian bawah"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y dengan aksen kait di bagian atas"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y dengan aksen tilda"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Tanda seru terbalik"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dua tanda kurung sudut kiri"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Titik tengah"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript satu"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dua tanda kurung sudut kanan"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Tanda tanya terbalik"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Tanda petik tunggal kiri"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Tanda petik tunggal kanan"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tanda petik tunggal di bagian bawah"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Tanda petik ganda kiri"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Tanda petik ganda kanan"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger (Tanda belati)"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dagger ganda"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Simbol per mil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Tanda petik"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Tanda petik ganda"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Tanda kurung sudut kiri tunggal"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Tanda kurung sudut kanan tunggal"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript empat"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript huruf latin kecil n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Simbol peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dengan alamat"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Panah ke kanan"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Panah ke bawah"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Himpunan kosong"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Penambahan"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kurang dari atau sama dengan"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lebih dari atau sama dengan"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Bintang hitam"</string> +</resources> diff --git a/java/res/values-in/strings-talkback-descriptions.xml b/java/res/values-in/strings-talkback-descriptions.xml new file mode 100644 index 000000000..f7334d9d0 --- /dev/null +++ b/java/res/values-in/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Pasang headset untuk mendengar tombol sandi yang diucapkan dengan lantang."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Teks saat ini adalah %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Tidak ada teks yang dimasukkan"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> mengoreksi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> melakukan koreksi otomatis"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Karakter tak dikenal"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Simbol lainnya"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simbol"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Hapus"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simbol"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Huruf"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Angka"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Setelan"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Spasi"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Masukan suara"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Kembali"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Telusuri"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Titik"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Beralih bahasa"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Berikutnya"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Sebelumnya"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift diaktifkan"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock diaktifkan"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Mode simbol"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Mode simbol lainnya"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Mode huruf"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Mode telepon"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Mode simbol telepon"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Keyboard disembunyikan"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Menampilkan keyboard <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"tanggal"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"tanggal dan waktu"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"pesan"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"angka"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telepon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teks"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"waktu"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Terbaru"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Orang"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objek"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Alam"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tempat"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbol"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikon"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Huruf kapital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Huruf kapital I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Huruf kapital I dengan aksen titik di bagian atas"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol tak dikenal"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji tak dikenal"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Karakter alternatif tersedia"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Karakter alternatif ditolak"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Saran alternatif tersedia"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Saran alternatif ditolak"</string> +</resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index d83a22c6c..129a23cdf 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opsi masukan"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Riset Perintah Log"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cari nama kontak"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Pemeriksa ejaan menggunakan entri dari daftar kontak Anda"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string> <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="general_category" msgid="1859088467017573195">"Umum"</string> - <string name="correction_category" msgid="2236750915056607613">"Koreksi teks"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Pengetikan isyarat"</string> - <string name="misc_category" msgid="6894192814868233453">"Opsi lain"</string> - <string name="advanced_settings" msgid="362895144495591463">"Setelan lanjutan"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opsi untuk ahli"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Beralih ke metode masukan lain"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tombol beralih bahasa juga mencakup metode masukan lain"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tombol pengalih bahasa"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Default sistem"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sarankan nama Kontak"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama dari Kontak untuk saran dan koreksi"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Saran hasil personalisasi"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Tingkatkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Titik spasi ganda"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetuk tombol spasi dua kali akan memasukkan titik diikuti satu spasi"</string> <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Tampilkan jalur isyarat"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratinjau mengambang dinamis"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat kata yang disarankan saat melakukan isyarat"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Telah disimpan"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Pasang headset untuk mendengar tombol sandi yang diucapkan dengan keras."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Teks saat ini adalah %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Tidak ada teks yang dimasukkan"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> mengoreksi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> melakukan koreksi otomatis"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kode tombol %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift hidup (ketuk untuk mematikan)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock hidup (ketuk untuk mematikan)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Hapus"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simbol"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Huruf"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Angka"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Setelan"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spasi"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Masukan suara"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Wajah tersenyum"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Kembali"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Telusuri"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Titik"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Ganti bahasa"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Berikutnya"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Sebelumnya"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift diaktifkan"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock diaktifkan"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift dinonaktifkan"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mode simbol"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode huruf"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode telepon"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode simbol telepon"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Keyboard disembunyikan"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Menampilkan keyboard <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"tanggal"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"tanggal dan waktu"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"pesan"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"angka"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telepon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"waktu"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Isyarat frasa"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Masukkan spasi dalam isyarat dengan meluncur ke tombol spasi"</string> <string name="voice_input" msgid="3583258583521397548">"Tombol masukan suara"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Tidak ada metode masukan suara yang diaktifkan. Periksa setelan Bahasan & masukan."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan metode masukan"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string> <string name="send_feedback" msgid="1780431884109392046">"Kirim masukan"</string> <string name="select_language" msgid="3693815588777926848">"Bahasa masukan"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan masukan pengguna"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Bantu tingkatkan editor metode masukan dengan mengirim statistik penggunaan dan laporan kerusakan secara otomatis"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema keyboard"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inggris (Inggris)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inggris (AS)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spanyol (AS)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inggris (Inggris) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inggris (AS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spanyol (AS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Tradisional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Inggris (Inggris)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Inggris (AS)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>) Spanyol (AS)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradisional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Sirilik)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Tidak ada bahasa (Abjad)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abjad (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abjad (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Abjad (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Abjad (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Skema warna"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Putih"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Biru"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Gaya masukan khusus"</string> <string name="add_style" msgid="6163126614514489951">"Tambah gaya"</string> <string name="add" msgid="8299699805688017798">"Tambahkan"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktifkan"</string> <string name="not_now" msgid="6172462888202790482">"Nanti saja"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Sudah ada gaya masukan yang sama: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mode studi daya guna"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Penundaan tekan lama tombol"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durasi getar saat tekan tombol"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume suara saat tekan tombol"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Membaca file kamus eksternal"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Tidak ada file kamus di folder Unduhan"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih file kamus untuk dipasang"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Yakin ingin memasang file ini untuk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Yakin ingin memasang file ini untuk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Terjadi kesalahan"</string> <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Selamat datang di <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -193,7 +160,7 @@ <string name="dictionary_provider_name" msgid="3027315045397363079">"Penyedia Kamus"</string> <string name="dictionary_service_name" msgid="6237472350693511448">"Layanan Kamus"</string> <string name="download_description" msgid="6014835283119198591">"Informasi pembaruan kamus"</string> - <string name="dictionary_settings_title" msgid="8091417676045693313">"Kamus add-on"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Kamus pengaya"</string> <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Kamus yang tersedia"</string> <string name="dictionary_settings_summary" msgid="5305694987799824349">"Setelan untuk kamus"</string> <string name="user_dictionaries" msgid="3582332055892252845">"Kamus pengguna"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Segarkan"</string> <string name="last_update" msgid="730467549913588780">"Terakhir diperbarui"</string> <string name="message_updating" msgid="4457761393932375219">"Memeriksa pembaruan"</string> - <string name="message_loading" msgid="8689096636874758814">"Memuat..."</string> + <string name="message_loading" msgid="5638680861387748936">"Memuat…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Kamus utama"</string> <string name="cancel" msgid="6830980399865683324">"Batal"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Setelan"</string> <string name="install_dict" msgid="180852772562189365">"Pasang"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Batal"</string> <string name="delete_dict" msgid="756853268088330054">"Hapus"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Bahasa pilihan pada perangkat seluler Anda memiliki kamus yang tersedia.<br/> Silakan <b>mengunduh</b> kamus <xliff:g id="LANGUAGE">%1$s</xliff:g> untuk meningkatkan pengalaman pengetikan.<br/> <br/> Unduhan dapat berlangsung selama satu atau dua menit melalui 3G. Mungkin dikenakan tagihan data jika Anda tidak memiliki <b>paket data tak terbatas</b>.<br/> Jika tidak yakin paket data mana yang Anda miliki, sebaiknya Anda mencari sambungan Wi-Fi untuk memulai unduhan secara otomatis.<br/> <br/> Kiat: Anda dapat mengunduh atau menghapus kamus dengan membuka <b>Bahasa & masukan</b> di menu <b>Setelan</b> perangkat seluler Anda."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Tersedia kamus untuk bahasa pilihan pada perangkat seluler Anda.<br/> Sebaiknya <b>unduh</b> kamus <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> untuk meningkatkan pengalaman pengetikan.<br/> <br/> Unduhan dapat berlangsung selama satu atau dua menit melalui 3G. Mungkin dikenakan biaya data jika tidak memiliki <b>paket data tak terbatas</b>.<br/> Jika tidak yakin dengan jenis paket data Anda, sebaiknya cari koneksi Wi-Fi untuk memulai unduhan secara otomatis.<br/> <br/> Kiat: Anda dapat mengunduh dan menghapus kamus dengan membuka <b>Bahasa & masukan</b> di menu <b>Setelan</b> perangkat seluler Anda."</string> <string name="download_over_metered" msgid="1643065851159409546">"Unduh sekarang (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Unduh melalui Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamus tersedia untuk bahasa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Kamus tersedia untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Tekan untuk meninjau dan mengunduh"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Mengunduh: saran untuk bahasa <xliff:g id="LANGUAGE">%1$s</xliff:g> akan segera tersedia."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Mengunduh: saran untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> akan segera tersedia."</string> <string name="version_text" msgid="2715354215568469385">"Versi <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Tambahkan"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Tambahkan ke kamus"</string> diff --git a/java/res/values-is-rIS/strings-action-keys.xml b/java/res/values-is-rIS/strings-action-keys.xml new file mode 100644 index 000000000..27df51608 --- /dev/null +++ b/java/res/values-is-rIS/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"Áfram"</string> + <string name="label_next_key" msgid="5586407279258592635">"Næsta"</string> + <string name="label_previous_key" msgid="1421141755779895275">"Fyrra"</string> + <string name="label_done_key" msgid="7564866296502630852">"Lokið"</string> + <string name="label_send_key" msgid="482252074224462163">"Senda"</string> + <string name="label_search_key" msgid="7965186050435796642">"Leita"</string> + <string name="label_pause_key" msgid="2225922926459730642">"Hlé"</string> + <string name="label_wait_key" msgid="5891247853595466039">"Bíða"</string> +</resources> diff --git a/java/res/values-is-rIS/strings-appname.xml b/java/res/values-is-rIS/strings-appname.xml new file mode 100644 index 000000000..d23f38503 --- /dev/null +++ b/java/res/values-is-rIS/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android lyklaborð (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android ritvilluleit (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Stillingar Android lyklaborðs (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Stillingar Android ritvilluleitar (AOSP)"</string> +</resources> diff --git a/java/res/values-is-rIS/strings-config-important-notice.xml b/java/res/values-is-rIS/strings-config-important-notice.xml new file mode 100644 index 000000000..457df064f --- /dev/null +++ b/java/res/values-is-rIS/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Læra af samskiptum þínum og innslegnum gögnum til að bæta tillögur"</string> +</resources> diff --git a/java/res/values-is-rIS/strings-emoji-descriptions.xml b/java/res/values-is-rIS/strings-emoji-descriptions.xml new file mode 100644 index 000000000..405af9c93 --- /dev/null +++ b/java/res/values-is-rIS/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Höfundarréttarmerki"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Skráð"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Tvöfalt upphrópunarmerki"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Upphrópunarmerki og spurningarmerki"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Vörumerki"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Upplýsingar"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Ör til vinstri og hægri"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Ör upp og niður"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Ör norðvestur"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Ör norðaustur"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Ör suðaustur"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Ör suðaustur"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Ör til vinstri með krók"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Ör til hægri með krók"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Úr"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Stundaglas"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Tveir svartir þríhyrningar sem vísa til hægri"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Tveir svartir þríhyrningar sem vísa til vinstri"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Tveir svartir þríhyrningar sem vísa upp"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Tveir svartir þríhyrningar sem vísa niður"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Vekjaraklukka"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Stundaglas með fallandi sandi"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Stórt M með hring utan um"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Lítill fylltur ferningur"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Lítill ófylltur ferningur"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Fylltur þríhyrningur sem vísar til hægri"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Fylltur þríhyrningur sem vísar til vinstri"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Miðlungsstór ófylltur þríhyrningur"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Miðlungsstór fylltur ferningur"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Miðlungslítill ófylltur ferningur"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Miðlungslítill fylltur ferningur"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Fyllt sól með geislum"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Ský"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Fylltur sími"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Gátreitur með haki"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Regnhlíf með regndropum"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Heitur drykkur"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Ófylltur vísifingur sem vísar upp og snýr lófa að"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Ófyllt brosandi andlit"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Hrútur"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Naut"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Tvíburar"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Krabbi"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Ljón"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Meyja"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Vog"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Sporðdreki"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Bogmaður"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Steingeit"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Vatnsberi"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Fiskar"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Fylltur spaði"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Fyllt lauf"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Fyllt hjarta"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Fylltur tígull"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Hverir"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Svart alþjóðlegt tákn fyrir endurvinnslu"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Hjólastólatákn"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Akkeri"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Viðvörunarskilti"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Háspennutákn"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Miðlungsstór ófylltur hringur"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Miðlungsstór fylltur hringur"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Fótbolti"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Hafnabolti"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Snjókarl án snjós"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Sól á bak við ský"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Naðurvaldi"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Aðgangur bannaður"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Kirkja"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Gosbrunnur"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Fáni í holu"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Seglskúta"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Tjald"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Eldsneytisdæla"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Fyllt skæri"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Ófyllt þykkt hak"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Flugvél"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Umslag"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Hnefi á lofti"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Hönd á lofti"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Friðarmerki"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Blýantur"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Fylltur pennaoddur"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Þykkt hak"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Þykkt margföldunarmerki"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Stjörnur"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Stjarna með átta örmum"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Fyllt stjarna með átta örmum"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Snjókorn"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Stjarna"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Krosstákn"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Negatíft krossmark í kassa"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Fyllt spurningarmerki"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Ófyllt spurningarmerki"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Ófyllt upphrópunarmerki"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Þykkt upphrópunarmerki"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Þykkt fyllt hjarta"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Þykkt plúsmerki"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Þykkt mínusmerki"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Þykkt deilingarmerki"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Svört ör til hægri"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Lykkja"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Tvöföld lykkja"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Ör sem vísar til hægri og upp"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Ör sem vísar til hægri og niður"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Fyllt ör til vinstri"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Fyllt ör upp"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Fyllt ör niður"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Stór fylltur ferningur"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Stór ófylltur ferningur"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Miðlungsstór ófyllt stjarna"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Þykkur stór hringur"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Bylgjustrik"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Hlutverkaskiptatákn"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Heillaóskatákn í hring"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Leyndarmálstákn í hring"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Flís með rauðum dreka í Mahjong"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Svartur jóker í spilum"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"A-blóðflokkur"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"B-blóðflokkur"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"O-blóðflokkur"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Bílastæði"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"AB-blóðflokkur"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"CL í kassa"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Orðið „COOL“ í kassa"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Orðið „FREE“ í kassa"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ID í kassa"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Orðið „NEW“ í kassa"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"NG í kassa"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"OK í kassa"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"SOS í kassa"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Orðið „UP“ með upphrópunarmerki í kassa"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"VS í kassa"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Katakana-táknið fyrir „hér“ í kassa"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Katakana-táknið fyrir „þjónusta“ í kassa"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Táknið „ókeypis“ í kassa"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Táknið „frátekið sæti“ í kassa"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Táknið „bannað“ í kassa"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Táknið „laust“ í kassa"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Táknið „samþykkt“ í kassa"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Táknið „fullt“ í kassa"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Táknið „greitt“ í kassa"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Táknið „mánaðarlegt“ í kassa"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Táknið „umsókn“ í kassa"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Táknið „afsláttur“ í kassa"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Táknið „í rekstri“ í kassa"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Yfirburðatákn í hring"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Samþykkistákn í hring"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Iða"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Þoka"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Lokuð regnhlíf"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Stjörnubjört nótt"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Sólarupprás milli fjalla"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sólarupprás"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Borgarlandslag um kvöld"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Sólarupprás milli bygginga"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Regnbogi"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Brú um nótt"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Alda"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Eldfjall"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Vetrarbrautin"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Evrópa og Afríka á hnetti"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Norður- og Suður-Ameríka á hnetti"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Asía og Eyjaálfa á hnetti"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Hnöttur með lengdar- og breiddarlínum"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Tákn fyrir nýtt tungl"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Tákn fyrir vaxandi tungl"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Tákn fyrir fyrsta kvartil tunglsins"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Tákn fyrir vaxandi hálft tungl"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Tákn fyrir fullt tungl"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Tákn fyrir minnkandi hálft tungl"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Tákn fyrir síðasta kvartil tunglsins"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Tákn fyrir minnkandi tungl"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Hálfmáni"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Nýtt tungl með andliti"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Fyrsta kvartil tunglsins með andliti"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Síðasta kvartil tunglsins með andliti"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Fullt tungl með andliti"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Sól með andliti"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Ljómandi stjarna"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Stjörnuhrap"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Kastaníuhneta"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Græðlingur"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Sígrænt tré"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Sumargrænt tré"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Pálmatré"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Kaktus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Túlípani"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Kirsuberjablóm"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Rós"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Hawaiirós"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Sólblóm"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Blómstur"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Maísstöngull"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Hrísgrjónaax"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Jurt"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Fjögurra laufa smári"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Hlynslauf"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Fallið lauf"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Lauf í vindi"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Sveppur"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tómatur"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Eggaldin"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Vínber"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Melóna"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Vatnsmelóna"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Mandarína"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Sítróna"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banani"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Ananas"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Rautt epli"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Grænt epli"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pera"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Ferskja"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Kirsuber"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Jarðarber"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamborgari"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Pítsusneið"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Kjöt á beini"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Kjúklingaleggur"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Hrísgrjónakex"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Hrísgrjónabolla"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Soðin hrísgrjón"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Karríréttur og hrísgrjón"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Rjúkandi skál"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spaghettí"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Brauð"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Franskar kartöflur"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Bökuð sæt kartafla"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Soðkökur á priki"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Djúpsteikt rækja"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Fiskikaka með spíral"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Rjómaís"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Skafís"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Ís"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Kleinuhringur"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Smákaka"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Súkkulaðistykki"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Sælgæti"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Sleikipinni"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Búðingur"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Hunangskrukka"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Terta"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Bentóbox"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Pottur af mat"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Matreiðsla"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Hnífur og gaffall"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Tebolli án halds"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sake-flaska og bolli"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Vínglas"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Kokkteilglas"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Suðrænn drykkur"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Bjórkanna"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Skál í bjór"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Peli"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Slaufa"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Innpökkuð gjöf"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Afmæliskaka"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Hrekkjavökugrasker"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Jólatré"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Jólasveinn"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Flugeldar"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Stjörnuljós"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Blaðra"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Knall"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Glitpappír"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Tanabata-tré"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Japanskir fánar í kross"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Blómaskreyting með furu"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Japanskar brúður"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Fiskveifur"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Vindharpa"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Tunglskoðunarhátíð"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Skólataska"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Útskriftarhúfa"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Hringekjuhestur"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Parísarhjól"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Rússíbani"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Veiðistöng og fiskur"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Hljóðnemi"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Kvikmyndatökuvél"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Bíó"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Heyrnartól"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Litapalletta"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Pípuhattur"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Sirkustjald"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Miði"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Klapptré"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Sviðslistir"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Tölvuleikur"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Beint í mark"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Spilakassi"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Billjarður"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Teningur"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Keila"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Spil með blómi"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Nóta"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Nótur"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saxófónn"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Gítar"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Hljómborð"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trompet"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Fiðla"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Nótnaskrift"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Hlaupabolur með borða"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Tennisbolti og spaði"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Skíði og skíðaskór"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Körfubolti og karfa"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Rásflagg"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Snjóbrettamaður"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Hlaupari"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Brimbrettamaður"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Verðlaunabikar"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Veðreiðar"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Amerískur fótbolti"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Ruðningur"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Sundmaður"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Hús"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Hús með garði"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Skrifstofubygging"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Japanskt pósthús"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Evrópskt pósthús"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Sjúkrahús"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Banki"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Hraðbanki"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hótel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Ástarhótel"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Nýlenduvöruverslun"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Skóli"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Stórmarkaður"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Verksmiðja"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Pappírsljósker"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Japanskur kastali"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Evrópskur kastali"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Rotta"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Mús"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Uxi"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Vatnabuffall"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Kýr"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Hlébarði"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Kanína"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Köttur"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Dreki"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Krókódíll"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Hvalur"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Snigill"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Snákur"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Hestur"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Hrútur"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Geit"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Kind"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Api"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Hani"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Kjúklingur"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Hundur"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Svín"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Villisvín"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Fíll"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Kolkrabbi"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Kuðungur"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Padda"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Maur"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Hunangsfluga"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Maríuhæna"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Fiskur"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Hitabeltisfiskur"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Blöðrufiskur"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Skjaldbaka"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Útungun"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Hænuungi"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Hænuungi sem snýr fram"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Fugl"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Mörgæs"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Kóalabjörn"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Púðluhundur"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Drómedari"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Úlfaldi"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Höfrungur"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Músarhaus"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Kýrhaus"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Tígrisdýrshaus"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Kanínuhaus"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Kattarhaus"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Drekahaus"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Blásandi hvalur"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Hestshaus"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Apahaus"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Hundshaus"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Svínshaus"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Froskshaus"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Hamsturshaus"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Úlfshaus"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Bjarnarhaus"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Pönduhaus"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Svínstrýni"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Loppuför"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Augu"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Eyra"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nef"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Munnur"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Tunga"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Ófylltur vísifingur sem vísar upp"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Ófylltur vísifingur sem vísar niður"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Ófylltur vísifingur sem vísar til vinstri"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Ófylltur vísifingur sem vísar til hægri"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Hnefatákn"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Tákn fyrir veifandi hönd"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Tákn fyrir að allt sé í lagi"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Tákn fyrir þumal upp"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Tákn fyrir þumal niður"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Tákn fyrir lófaklapp"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Tákn fyrir lófa"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Kóróna"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Kvenhattur"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Gleraugu"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Hálsbindi"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Stuttermabolur"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Gallabuxur"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Kjóll"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kímónó"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikiní"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Kvenföt"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Veski"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Handtaska"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Poki"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Karlmannsskór"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Íþróttaskór"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Háhælaður skór"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Kvensandali"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Kvenstígvél"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Fótspor"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Útlínur brjóstmyndar"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Útlínur brjóstmynda"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Strákur"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Stelpa"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Karl"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Kona"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Fjölskylda"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Maður og kona sem haldast í hendur"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Tveir menn sem haldast í hendur"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Tvær konur sem haldast í hendur"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Lögregluþjónn"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Kona með kanínueyru"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Brúður með slör"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Ljóshærð manneskja"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Maður með kínverskan hatt"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Maður með túrban"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Gamall maður"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Gömul kona"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Barn"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Verkamaður"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Prinsessa"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Japanskt tröll"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Japanskur púki"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Draugur"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Barnsengill"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Geimvera"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Geimveruskrímsli"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Púki"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Hauskúpa"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Upplýsingaborð"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Vörður"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Dansari"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Varalitur"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Naglalakk"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Andlitsnudd"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Klipping"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Rakarastofa"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Sprauta"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pilla"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Kossafar"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Ástarbréf"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Hringur"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Demantur"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Koss"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Blómvöndur"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Par með hjarta"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Brúðkaup"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Hjartsláttur"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Ástarsorg"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Tvö hjörtu"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Glitrandi hjarta"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Stækkandi hjarta"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Hjarta með ör"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Blátt hjarta"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Grænt hjarta"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Gult hjarta"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Fjólublátt hjarta"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Hjarta með slaufu"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Snúningshjörtu"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Skraut með hjarta"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Tígull með punkti inni í"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Ljósapera"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Reiðitákn"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Sprengja"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Svefntákn"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Árekstrartákn"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Svitadropatákn"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Dropi"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Hraðferðartákn"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Kúkur"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Spenntir upphandleggsvöðvar"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Svimatákn"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Talblaðra"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Hugsanablaðra"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Ófyllt blóm"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Tákn fyrir hundrað stig"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Peningapoki"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Gjaldmiðlar"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Þykkt dollaramerki"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Greiðslukort"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Seðill með yenmerki"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Seðill með dollaramerki"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Seðill með evrumerki"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Seðill með pundmerki"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Fljúgandi peningar"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Graf á uppleið og yenmerki"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Sæti"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Tölva"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Skjalataska"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisc"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Disketta"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Geisladiskur"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD-diskur"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Skjalamappa"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Opin skjalamappa"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Brotin síða"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Síða"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Dagatal"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Rifdagatal"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Spjaldskrá"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Graf á uppleið"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Graf á niðurleið"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Súlurit"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Klemmuspjald"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Teiknibóla"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Teiknibóla með kúlu"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Bréfaklemma"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Reglustika"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Þríhyrnd reglustika"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Bókamerkjaflipar"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Kladdi"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Glósubók"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Glósubók með skrautkápu"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Lokuð bók"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Opin bók"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Græn bók"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Blá bók"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Appelsínugul bók"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Bækur"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Nafnspjald"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Bókrolla"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Minnismiði"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Símtól"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Símboði"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Fax"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Loftnet"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Almannavarnahátalari"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Ómandi gjallarhorn"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Úthólf"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Innhólf"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Pakki"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Tákn fyrir tölvupóst"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Umslag berst"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Umslag með niðurör fyrir ofan"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Lokaður póstkassi með flaggið niðri"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Lokaður póstkassi með flaggið uppi"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Opinn póstkassi með flaggið uppi"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Opinn póstkassi með flaggið niðri"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Pósthólf"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Póstlúður"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Dagblað"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Farsími"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Farsími með hægriör vinstra megin"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Titringur"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Slökkt á farsíma"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Engir farsímar"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Loftnet með strikum"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Myndavél"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Kvikmyndatökuvél"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Sjónvarp"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Útvarp"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Myndbandsspóla"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Fléttaðar örvar til hægri"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Hringörvar sem vísa til hægri og vinstri og snúast réttsælis"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Hringörvar sem vísa til hægri og vinstri og snúast réttsælis með tölunni einum í hring yfir"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Hringörvar sem vísa niður og upp og snúast réttsælis"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Hringörvar sem vísa niður og upp og snúast rangsælis"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Tákn fyrir lágt birtustig"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Tákn fyrir hátt birtustig"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Yfirstrikaður hátalari"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Hátalari"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Hátalari með einni hljóðbylgju"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Hátalari með þremur hljóðbylgjum"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Rafhlaða"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Rafmagnskló"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Stækkunargler sem vísar til vinstri"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Stækkunargler sem vísar til hægri"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lás með blekpenna"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Læstur lás með lykli"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Lykill"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Lás"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Opinn lás"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Bjalla"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Yfirstrikuð bjalla"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Bókamerki"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Tenglatákn"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Valhnappur"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Til baka með ör fyrir ofan"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Ljúka með ör fyrir ofan"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Orðið „ON“ með upphrópunarmerki og örvum til vinstri og hægri"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Orðið „SOON“ með ör til hægri fyrir ofan"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Orðið „TOP“ með uppör fyrir ofan"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Tákn fyrir bannað innan átján"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Hnappur með tölunni 10"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Inntakstákn fyrir latneska hástafi"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Inntakstákn fyrir latneska lágstafi"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Inntakstákn fyrir tölur"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Inntakstákn fyrir tákn"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Inntakstákn fyrir latneska stafi"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Eldur"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Vasaljós"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Skiptilykill"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Hamar"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Bolti og ró"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hnífur"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Skammbyssa"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Smásjá"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Sjónauki"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Kristalskúla"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Sex arma stjarna með punkti í miðjunni"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Japanskt tákn fyrir byrjendur"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Þríforkstákn"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Fylltur ferningslaga hnappur"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Ófylltur ferningslaga hnappur"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Stór rauður hringur"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Stór blár hringur"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Stór appelsínugulur tígull"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Stór blár tígull"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Lítill appelsínugulur tígull"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Lítill blár tígull"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Rauður þríhyrningur sem vísar upp"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Rauður þríhyrningur sem vísar niður"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Lítill rauður þríhyrningur sem vísar upp"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Lítill rauður þríhyrningur sem vísar niður"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Klukka sem er eitt"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Klukka sem er tvö"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Klukka sem er þrjú"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Klukka sem er fjögur"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Klukka sem er fimm"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Klukka sem er sex"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Klukka sem er sjö"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Klukka sem er átta"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Klukka sem er níu"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Klukka sem er tíu"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Klukka sem er ellefu"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Klukka sem er tólf"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Klukka sem er hálftvö"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Klukka sem er hálfþrjú"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Klukka sem er hálffjögur"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Klukka sem er hálffimm"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Klukka sem er hálfsex"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Klukka sem er hálfsjö"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Klukka sem er hálfátta"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Klukka sem er hálfníu"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Klukka sem er hálftíu"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Klukka sem er hálfellefu"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Klukka sem er hálftólf"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Klukka sem er hálfeitt"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Fuji-fjall"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tókýóturn"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Frelsisstyttan"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Útlínur Japans"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai-stytta"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Glottandi andlit"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Glottandi andlit með bros í augum"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Andlit með gleðitár"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Brosandi andlit með opinn munn"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Brosandi andlit með opinn munn og bros í augum"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Brosandi andlit í köldum svita með opinn munn"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Brosandi andlit með opinn munn og augun lokuð"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Brosandi andlit með geislabaug"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Brosandi andlit með horn"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Blikkandi andlit"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Brosandi andlit með bros í augum"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Andlit að njóta ljúffengs matar"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Andlit sem er létt"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Brosandi andlit með hjartalaga augu"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Brosandi andlit með sólgleraugu"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Sjálfsánægt andlit"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Hlutlaust andlit"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Sviplaust andlit"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Andlit sem ekki er skemmt"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Andlit í köldum svita"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Hugsi andlit"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Ráðvillt andlit"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Ringlað andlit"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Andlit sem kyssir"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Andlit að senda koss"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Andlit sem kyssir með bros í augum"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Andlit sem kyssir með lokuð augun"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Andlit með tunguna út"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Blikkandi andlit með tunguna út"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Andlit með tunguna út og augun lokuð"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Vonsvikið andlit"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Áhyggjufullt andlit"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Reiðiandlit"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Fýlt andlit"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Grátandi andlit"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Þrjóskuandlit"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Andlit í sigurvímu"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Vonsvikið andlit sem er létt"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Fýluandlit með opinn munn"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Angistarandlit"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Óttaslegið andlit"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Þreytulegt andlit"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Syfjað andlit"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Þreytt andlit"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Geiflað andlit"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Hágrátandi andlit"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Andlit með opinn munn"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Þögult andlit"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Andlit í köldum svita með opinn munn"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Andlit að öskra af hræðslu"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Forviða andlit"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Rjótt andlit"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Sofandi andlit"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Svimaandlit"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Andlit án munns"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Andlit með læknagrímu"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Glottandi kattartrýni með bros í augum"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Kattartrýni með gleðitár"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Brosandi kattartrýni með opinn munn"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Brosandi kattartrýni með hjartalaga augu"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Kattartrýni með lymskubros"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kattartrýni sem kyssir með lokuð augun"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Fýlt kattartrýni"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Grátandi kattartrýni"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Þreytulegt kattartrýni"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Andlit með hendur fyrir munni"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Andlit með hendur yfir haus"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Manneskja að hneigja sig"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Api með hendur fyrir augum"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Api með hendur fyrir eyrum"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Api með hendur fyrir munni"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Glöð manneskja að rétta upp hönd"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Manneskja sem fagnar með því að rétta upp báðar hendur"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Fýld manneskja"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Manneskja sem setur upp stút"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Manneskja með krosslagðar hendur"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Eldflaug"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Þyrla"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Eimreið"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Járnbrautarvagn"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Hraðalest"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Háhraðalest"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Lest"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Neðanjarðarlest"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Léttlest"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Stöð"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Sporvagn"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Sporvagn"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Rúta"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Rúta á móti"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Rafknúinn strætisvagn"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Biðstöð"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Smárúta"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Sjúkrabíll"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Brunabíll"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Lögreglubíll"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Lögreglubíll á móti"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Leigubíll"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Leigubíll á móti"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Bíll"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Bíll á móti"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Jeppi"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Sendibifreið"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Liðskipt vörubifreið"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Dráttarvél"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Einteinungur"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Fjallalest"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Kláflest"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Kláfferja"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Kláfferja"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Skip"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Árabátur"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Hraðbátur"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Lárétt umferðarljós"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Lóðrétt umferðarljós"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Framkvæmdaskilti"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Lögregluljós"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Þríhyrndur fáni á stöng"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Hurð"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Bannskilti"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Reykingatákn"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Tákn fyrir reykingabann"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Tákn um að fleygja rusli í körfu"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Tákn sem bannar að rusli sé fleygt"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Tákn fyrir drykkjarhæft vatn"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Tákn fyrir vatn sem ekki er drykkjarhæft"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Reiðhjól"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Reiðhjól bönnuð"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Hjólreiðamaður"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Fjallahjólreiðamaður"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Vegfarandi"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Engir vegfarendur"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Börn á ferð"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Karlkynstákn"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Kvenkynstákn"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Snyrting"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Barnatákn"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Klósett"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Salerni"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Sturta"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bað"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Baðkar"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Vegabréfaeftirlit"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Tollur"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Farangur"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Geymsluhólf"</string> +</resources> diff --git a/java/res/values-is-rIS/strings-letter-descriptions.xml b/java/res/values-is-rIS/strings-letter-descriptions.xml new file mode 100644 index 000000000..fe175fa0e --- /dev/null +++ b/java/res/values-is-rIS/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Kvenkyns raðtölutákn"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Míkrómerki"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Karlkyns raðtölutákn"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Þýskt S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A með öfugum broddi"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A með broddi"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A með hatti"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A með tildu"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A með tvídepli"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A með hring"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, límingur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C með krók"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E með öfugum broddi"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E með broddi"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E með hatti"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E með tvídepli"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I með öfugum broddi"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I með broddi"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I með hatti"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I með tvídepli"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eð"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N með tildu"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O með öfugum broddi"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O með broddi"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O með hatti"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O með tildu"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O með tvídepli"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Danskt ö"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U með öfugum broddi"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U með broddi"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U með hatti"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U með tvídepli"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y með broddi"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Þorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y með tvídepli"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A með rá"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A með skál"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A með lykkju"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C með broddi"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C með hatti"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C með depli"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C með kríu"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D með kríu"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D með striki"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E með rá"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E með skál"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E með depli"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E með lykkju"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E með kríu"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G með hatti"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G með skál"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G með depli"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G með krók"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H með hatti"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H með striki"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I með tildu"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I með rá"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I með skál"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I með lykkju"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Depillaust I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, límingur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J með hatti"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K með krók"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"K, hásteflingur"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L með broddi"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L með krók"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L með kríu"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L með miðdepli"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L með striki"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N með broddi"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N með krók"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N með kríu"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N með forsett úrfellingarmerki"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O með rá"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O með skál"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O með tvíbroddi"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, límingur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R með broddi"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R með krók"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R með kríu"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S með broddi"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S með hatti"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S með krók"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S með kríu"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T með krók"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T með kríu"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T með striki"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U með tildu"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U með rá"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U með skál"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U með hring"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U með tvíbroddi"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U með lykkju"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W með hatti"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y með hatti"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z með broddi"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z með depli"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z með kríu"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Langt S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O með snaga"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U með snaga"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S með undirkommu"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T með undirkommu"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Hljóðritunartáknið E á hvolfi"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A með undirdepli"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A með krækju"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A með hatti og broddi"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A með hatti og öfugum broddi"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A með hatti og krækju"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A með hatti og tildu"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A með hatti og undirdepli"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A með skál og broddi"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A með skál og öfugum broddi"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A með skál og krækju"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A með skál og tildu"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A með skál og undirdepli"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E með undirdepli"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E með krækju"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E með tildu"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E með hatti og broddi"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E með hatti og öfugum broddi"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E með hatti og krækju"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E með hatti og tildu"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E með hatti og undirdepli"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I með krækju"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I með undirdepli"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O með undirdepli"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O með krækju"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O með hatti og broddi"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O með hatti og öfugum broddi"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O með hatti og krækju"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O með hatti og tildu"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O með hatti og undirdepli"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O með snaga og broddi"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O með snaga og öfugum broddi"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O með snaga og krækju"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O með snaga og tildu"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O með snaga og undirdepli"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U með undirdepli"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U með krækju"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U með snaga og broddi"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U með snaga og öfugum broddi"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U með snaga og krækju"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U með snaga og tildu"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U með snaga og undirdepli"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y með öfugum broddi"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y með undirdepli"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y með krækju"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y með tildu"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Öfugt upphrópunarmerki"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Vinstri tvíoddur"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Miðdepill"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Einn með brjóstletri"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Hægri tvíoddur"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Öfugt spurningarmerki"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Rísandi kló"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Hangandi kló"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Lágstæð kló"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Rísandi tvíkló"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Hangandi tvíkló"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Rýtingur"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Tvírýtingur"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Prómillumerki"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Högg"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Tvíhögg"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Vinstri oddur"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Hægri oddur"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Fjórir með brjóstletri"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Lágstafurinn n með latnesku brjóstletri"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Pesamerki"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Umsendingarmerki"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Hægri ör"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Niðurör"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tómamengi"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Vöxtur"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Undirstrikaður vinstri fleygur"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Undirstrikaður hægri fleygur"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Fyllt stjarna"</string> +</resources> diff --git a/java/res/values-is-rIS/strings-talkback-descriptions.xml b/java/res/values-is-rIS/strings-talkback-descriptions.xml new file mode 100644 index 000000000..978b07916 --- /dev/null +++ b/java/res/values-is-rIS/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Tengdu heyrnartól til að heyra stafi aðgangsorðsins lesna upphátt."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Núverandi texti er %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Engin texti sleginn inn"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> leiðréttir <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> yfir í <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> framkvæmir sjálfvirka leiðréttingu"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Óþekktur stafur"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Fleiri tákn"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Tákn"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Eyða"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Tákn"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Bókstafir"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Tölur"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Stillingar"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Bil"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Raddinntak"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji-tákn"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Venda"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Leita"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Kúla"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Skipta um tungumál"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Næsta"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Fyrra"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Kveikt á Shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Kveikt á hástafalás"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Táknastilling"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Stilling fyrir fleiri tákn"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Stafastilling"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Símastilling"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Símatáknastilling"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Lyklaborð falið"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Sýnir lyklaborð fyrir <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"dagsetning"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dagsetning og tími"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"netfang"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"skilaboð"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"tala"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"símanúmer"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texti"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"tími"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"vefslóð"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Nýlegt"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Fólk"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Hlutir"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Náttúra"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Staðir"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Tákn"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Broskarlar"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Hástafurinn <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Hástafurinn I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Hástafurinn I með depli"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Óþekkt tákn"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Óþekkt emoji-tákn"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Aukalegir stafir eru í boði"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Aukalegum stöfum lokað"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Aukalegar tillögur eru í boði"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Aukalegum tillögum lokað"</string> +</resources> diff --git a/java/res/values-is-rIS/strings.xml b/java/res/values-is-rIS/strings.xml new file mode 100644 index 000000000..c5b489fc4 --- /dev/null +++ b/java/res/values-is-rIS/strings.xml @@ -0,0 +1,199 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Valkostir innsláttar"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Fletta upp tengiliðum"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Ritvilluleit notar færslur úr tengiliðalistanum þínum"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Titringur þegar ýtt er á lykla"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Hljóð þegar ýtt er á lykil"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Stækkaðir stafir við innslátt"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Inntaksvalkostir"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Útlit"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Tungumálavalkostir"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Still. bendingainnsláttar"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Textaleiðrétting"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Ítarlegt"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Skipta um innsláttaraðferð"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Lykill til að skipta um mál inniheldur aðrar innsláttaraðferðir"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Lykill til að breyta tungumáli"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Sýna þegar mörg innsláttartungumál eru virk"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Sýna rennivísi"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Sýna myndræna vísbendingu þegar rennt er af Shift eða táknalykli"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Hunsunartöf lyklaglugga"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Engin töf"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Sjálfgefið"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms."</string> + <string name="settings_system_default" msgid="6268225104743331821">"Sjálfgildi kerfis"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Stinga upp á tengiliðum"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Nota nöfn úr tengiliðum fyrir tillögur og leiðréttingar"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Persónulegar tillögur"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Bæta <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Punktur við tvöfalt bil"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ef ýtt er tvisvar á bilslána er settur inn punktur og svo bil"</string> + <string name="auto_cap" msgid="1719746674854628252">"Sjálfvirkir hástafir"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Setja hástaf í upphaf hverrar málsgreinar"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Sérsniðin orðabók"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Viðbótarorðabækur"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Aðalorðabók"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Sýna leiðréttingartillögur"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Sýna orðatillögur við innslátt"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Sýna alltaf"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Sýna í skammsniði"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Fela alltaf"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Útiloka dónaleg orð"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Ekki stinga upp á orðum sem kunna að vera dónaleg"</string> + <string name="auto_correction" msgid="7630720885194996950">"Sjálfv. leiðrétting"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Bil og greinarmerki leiðrétta sjálfkrafa innsláttarvillur"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Slökkt"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Hófleg"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Mikil"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Mjög mikil"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Tillögur að næsta orði"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Nota fyrra orð til að útbúa tillögur"</string> + <string name="gesture_input" msgid="826951152254563827">"Kveikja á bendingainnslætti"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Slá inn orð með því að renna í gegnum stafina"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Sýna bendingaslóð"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Fljótandi rauntímaforskoðun"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Sjá orðatillöguna við bendingu"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Setningabending"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Setja inn bil í bendingum með því að renna yfir á bilslána"</string> + <string name="voice_input" msgid="3583258583521397548">"Raddinntakslykill"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Engar innsláttaraðferðir fyrir rödd virkar. Kannaðu stillingar tungumáls og innsláttar."</string> + <string name="configure_input_method" msgid="373356270290742459">"Stilla innsláttaraðferðir"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Innsláttartungumál"</string> + <string name="send_feedback" msgid="1780431884109392046">"Senda inn álit"</string> + <string name="select_language" msgid="3693815588777926848">"Innsláttartungumál"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Snertu aftur til að vista"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Orðabók í boði"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Þema lyklaborðs"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"Enskt (Bretland)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"Enskt (Bandaríkin)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Spænskt (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Enskt (Bretland) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Enskt (Bandaríkin) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spænskt (Bandaríkin) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (hefðbundið)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillískt)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latneskt)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"Ekkert tungumál (stafróf)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Stafróf (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Stafróf (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Stafróf (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Stafróf (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Stafróf (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Stafróf (tölva)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emoji-tákn"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Lyklaborðsþema"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Hvítt gegnsætt"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Blátt gegnsætt"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Dökkt"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Ljóst"</string> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Sérsniðnar innsláttaraðferðir"</string> + <string name="add_style" msgid="6163126614514489951">"Bæta stíl við"</string> + <string name="add" msgid="8299699805688017798">"Bæta við"</string> + <string name="remove" msgid="4486081658752944606">"Fjarlægja"</string> + <string name="save" msgid="7646738597196767214">"Vista"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Tungumál"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Skipan"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Gera þarf sérsniðnu innsláttaraðferðina virka áður en þú tekur hana í notkun. Viltu virkja hana núna?"</string> + <string name="enable" msgid="5031294444630523247">"Kveikja"</string> + <string name="not_now" msgid="6172462888202790482">"Ekki núna"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Sama innsláttaraðferð er þegar fyrir hendi: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Töf áður en lykli er haldið inni"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Lengd lyklatitrings"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Styrkur lyklahljóða"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lesa utanaðkomandi orðabókarskrá"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Engar orðabókarskrár í niðurhalsmöppunni"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Veldu orðabókarskrá til að setja upp"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Viltu setja upp þessa skrá fyrir <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> + <string name="error" msgid="8940763624668513648">"Villa kom upp"</string> + <string name="button_default" msgid="3988017840431881491">"Sjálfgefið"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"Velkomin(n) í <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"með bendingainnslætti"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Hefjast handa"</string> + <string name="setup_next_action" msgid="371821437915144603">"Næsta skref"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"Uppsetning <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"Virkjaðu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Hakaðu við „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“ í stillingum tungumáls og innsláttar. Þetta veitir því heimild til að keyra í tækinu."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> er þegar virkt í stillingum tungumáls og innsláttar og lokið hefur verið við þetta skref. Vindum okkur í næsta!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Virkja í stillingum"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"Skiptu yfir í <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Næst skaltu velja „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“ sem virka innsláttaraðferð fyrir texta."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Skipta um innsláttaraðferð"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Til hamingju, allt er klárt!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Nú geturðu notað <xliff:g id="APPLICATION_NAME">%s</xliff:g> til að skrifa í öllum uppáhaldsforritunum þínum."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Stilla önnur tungumál"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Lokið"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Sýna forritstákn"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Sýna forritstákn í ræsiforritinu"</string> + <string name="app_name" msgid="6320102637491234792">"Orðabókarveita"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Orðabókarveita"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Orðabókarþjónusta"</string> + <string name="download_description" msgid="6014835283119198591">"Uppfærsluupplýsingar orðabóka"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Viðbótarorðabækur"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Orðabók í boði"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Stillingar fyrir orðabækur"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Orðabækur notanda"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Orðabók notanda"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Orðabók í boði"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Niðurhal í gangi"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Uppsett"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Uppsett, óvirk"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Vandamál við að tengjast orðabókarþjónustu"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Engar orðabækur"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Endurnýja"</string> + <string name="last_update" msgid="730467549913588780">"Síðast uppfært"</string> + <string name="message_updating" msgid="4457761393932375219">"Leitar að uppfærslum"</string> + <string name="message_loading" msgid="5638680861387748936">"Hleður…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Aðalorðabók"</string> + <string name="cancel" msgid="6830980399865683324">"Hætta við"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Stillingar"</string> + <string name="install_dict" msgid="180852772562189365">"Setja upp"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Hætta við"</string> + <string name="delete_dict" msgid="756853268088330054">"Eyða"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Orðabók er í boði fyrir tungumálið sem valið er í fartækinu.<br/> Við mælum með því að þú <b>sækir</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> orðabók til að auðvelda þér innslátt.<br/> <br/> Niðurhalið gæti tekið nokkrar mínútur yfir 3G-kerfi. Kostnaður kann að hljótast af niðurhalinu ef þú ert ekki með <b>ótakmarkaða gagnaáskrift</b>.<br/> Ef þú ert ekki viss um hvernig gagnaáskrift þú ert með er mælt með að þú tengist Wi-Fi til að hefja niðurhalið sjálfkrafa.<br/> <br/> Ábending: Þú getur sótt og fjarlægt orðabækur undir <b>Tungumál og innsláttur</b> í valmyndinni <b>Stillingar</b> í fartækinu."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Sækja núna (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Sækja í gegnum Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Orðabók er í boði fyrir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Ýttu til að skoða og sækja"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Sækir: Tillögur fyrir <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> verða tilbúnar fljótlega."</string> + <string name="version_text" msgid="2715354215568469385">"Útgáfa <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Bæta við"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Bæta við orðabók"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Setning"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Fleiri valkostir"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Færri valkostir"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Í lagi"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Orð:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Flýtileið:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Tungumál:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Sláðu inn orð"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Valfrjáls flýtileið"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Breyta orði"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Breyta"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Eyða"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Engin orð eru í orðabók notanda. Bættu við orðum með því að snerta hnappinn Bæta við (+)."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Fyrir öll tungumál"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Fleiri tungumál…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Eyða"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-is/strings-talkback-descriptions.xml b/java/res/values-is/strings-talkback-descriptions.xml new file mode 100644 index 000000000..05b816ab7 --- /dev/null +++ b/java/res/values-is/strings-talkback-descriptions.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_search (1247236163755920808) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> + <skip /> + <!-- no translation found for spoken_description_action_next (8636078276664150324) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (800872415009336208) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> + <skip /> + <!-- no translation found for keyboard_mode_date (3137520166817128102) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> + <skip /> + <!-- no translation found for keyboard_mode_email (6216248078128294262) --> + <skip /> + <!-- no translation found for keyboard_mode_im (1137405089766557048) --> + <skip /> + <!-- no translation found for keyboard_mode_number (7991623440699957069) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> + <skip /> + <!-- no translation found for keyboard_mode_text (6479436687899701619) --> + <skip /> + <!-- no translation found for keyboard_mode_time (4381856885582143277) --> + <skip /> + <!-- no translation found for keyboard_mode_url (1519819835514911218) --> + <skip /> +</resources> diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml index 6f685d395..ab2f2625a 100644 --- a/java/res/values-is/strings.xml +++ b/java/res/values-is/strings.xml @@ -22,7 +22,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for english_ime_input_options (3909945612939668554) --> <skip /> - <!-- no translation found for english_ime_research_log (8492602295696577851) --> <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> <skip /> @@ -126,106 +125,8 @@ <skip /> <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> <skip /> - <!-- no translation found for added_word (8993883354622484372) --> - <skip /> - <!-- no translation found for spoken_use_headphones (896961781287283493) --> - <skip /> - <!-- no translation found for spoken_current_text_is (2485723011272583845) --> - <skip /> - <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> - <skip /> - <!-- no translation found for spoken_auto_correct (8005997889020109763) --> - <skip /> - <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> - <skip /> - <!-- no translation found for spoken_description_unknown (3197434010402179157) --> - <skip /> - <!-- no translation found for spoken_description_shift (244197883292549308) --> - <skip /> - <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> - <skip /> - <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> - <skip /> - <!-- no translation found for spoken_description_delete (8740376944276199801) --> - <skip /> - <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> - <skip /> - <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> - <skip /> - <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> - <skip /> - <!-- no translation found for spoken_description_settings (4627462689603838099) --> - <skip /> - <!-- no translation found for spoken_description_tab (2667716002663482248) --> - <skip /> - <!-- no translation found for spoken_description_space (2582521050049860859) --> - <skip /> - <!-- no translation found for spoken_description_mic (615536748882611950) --> - <skip /> - <!-- no translation found for spoken_description_smiley (2256309826200113918) --> - <skip /> - <!-- no translation found for spoken_description_return (8178083177238315647) --> - <skip /> - <!-- no translation found for spoken_description_search (1247236163755920808) --> - <skip /> - <!-- no translation found for spoken_description_dot (40711082435231673) --> - <skip /> - <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> - <skip /> - <!-- no translation found for spoken_description_action_next (8636078276664150324) --> - <skip /> - <!-- no translation found for spoken_description_action_previous (800872415009336208) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> - <skip /> - <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> - <skip /> - <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> - <skip /> - <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> - <skip /> - <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> - <skip /> - <!-- no translation found for keyboard_mode_date (3137520166817128102) --> - <skip /> - <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> - <skip /> - <!-- no translation found for keyboard_mode_email (6216248078128294262) --> - <skip /> - <!-- no translation found for keyboard_mode_im (1137405089766557048) --> - <skip /> - <!-- no translation found for keyboard_mode_number (7991623440699957069) --> - <skip /> - <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> - <skip /> - <!-- no translation found for keyboard_mode_text (6479436687899701619) --> - <skip /> - <!-- no translation found for keyboard_mode_time (4381856885582143277) --> - <skip /> - <!-- no translation found for keyboard_mode_url (1519819835514911218) --> - <skip /> <!-- no translation found for voice_input (3583258583521397548) --> <skip /> - <!-- 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 configure_input_method (373356270290742459) --> <skip /> <!-- no translation found for language_selection_title (1651299598555326750) --> @@ -238,9 +139,7 @@ <skip /> <!-- no translation found for has_dictionary (6071847973466625007) --> <skip /> - <!-- no translation found for prefs_enable_log (6620424505072963557) --> <skip /> - <!-- no translation found for prefs_description_log (7525225584555429211) --> <skip /> <!-- no translation found for keyboard_layout (8451164783510487501) --> <skip /> @@ -296,7 +195,6 @@ <skip /> <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> <skip /> - <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> <skip /> <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> <skip /> diff --git a/java/res/values-it/strings-action-keys.xml b/java/res/values-it/strings-action-keys.xml index 02e7b9c94..d61f2dadd 100644 --- a/java/res/values-it/strings-action-keys.xml +++ b/java/res/values-it/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Prec."</string> <string name="label_done_key" msgid="7564866296502630852">"Fine"</string> <string name="label_send_key" msgid="482252074224462163">"Invia"</string> + <string name="label_search_key" msgid="7965186050435796642">"Cerca"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> <string name="label_wait_key" msgid="5891247853595466039">"Attendi"</string> </resources> diff --git a/java/res/values-it/strings-config-important-notice.xml b/java/res/values-it/strings-config-important-notice.xml new file mode 100644 index 000000000..3690fac39 --- /dev/null +++ b/java/res/values-it/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Usa comunicazioni e dati digitati per migliorare i suggerimenti"</string> +</resources> diff --git a/java/res/values-it/strings-letter-descriptions.xml b/java/res/values-it/strings-letter-descriptions.xml new file mode 100644 index 000000000..e66516c40 --- /dev/null +++ b/java/res/values-it/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicatore ordinale femminile"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Simbolo micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicatore ordinale maschile"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Scharfes S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accento grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accento acuto"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accento circonflesso"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dieresi"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anello sopra"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, legatura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cediglia"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accento grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accento acuto"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accento circonflesso"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dieresi"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accento grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accento acuto"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accento circonflesso"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dieresi"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accento grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accento acuto"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accento circonflesso"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dieresi"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, barrata"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accento grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accento acuto"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accento circonflesso"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, dieresi"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accento acuto"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dieresi"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accento acuto"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accento circonflesso"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punto sovrascritto"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, barra"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punto sovrascritto"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accento circonflesso"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punto sovrascritto"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cediglia"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accento circonflesso"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, tagliata"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I senza punto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, legatura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accento circonflesso"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cediglia"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accento acuto"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cediglia"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punto mediano"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, tagliata"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accento acuto"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cediglia"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceduta dall\'apostrofo"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Nasale velare"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, doppio accento acuto"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, legatura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accento acuto"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cediglia"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accento acuto"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accento circonflesso"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cediglia"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cediglia"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, barrata"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anello sopra"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, doppio accento acuto"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accento circonflesso"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accento circonflesso"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accento acuto"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punto sovrascritto"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S lunga"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corno"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corno"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, virgola sotto"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, virgola sotto"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punto sottoscritto"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancio sopra"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accento circonflesso e acuto"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accento circonflesso e grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accento circonflesso e gancio sopra"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accento circonflesso e tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accento circonflesso e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e accento acuto"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e accento grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancio sopra"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punto sottoscritto"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancio sopra"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accento circonflesso e acuto"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accento circonflesso e grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accento circonflesso e gancio sopra"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accento circonflesso e tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accento circonflesso e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancio sopra"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punto sottoscritto"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punto sottoscritto"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancio sopra"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accento circonflesso e acuto"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accento circonflesso e grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accento circonflesso e gancio sopra"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accento circonflesso e tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accento circonflesso e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corno e accento acuto"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corno e accento grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corno e gancio sopra"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corno e tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corno e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punto sottoscritto"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancio sopra"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corno e accento acuto"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corno e accento grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corno e gancio sopra"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corno e tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corno e punto sottoscritto"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accento grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punto sottoscritto"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancio sopra"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Punto esclamativo invertito"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Virgolette basse doppie aperte"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punto mediano"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Uno in apice"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Virgolette basse doppie chiuse"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Punto interrogativo invertito"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Virgoletta singola aperta"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Virgoletta singola chiusa"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Virgoletta singola low-9"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Virgolette doppie aperte"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Virgolette doppie chiuse"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obelisco"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Doppio obelisco"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Segno di per mille"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primo"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Doppio primo"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Virgoletta bassa singola aperta"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Virgoletta bassa singola chiusa"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Quattro in apice"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Lettera latina n minuscola in apice"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Simbolo del peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Presso"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Freccia verso destra"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Freccia verso il basso"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Insieme vuoto"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Minore di o uguale a"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maggiore di o uguale a"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Stella nera"</string> +</resources> diff --git a/java/res/values-it/strings-talkback-descriptions.xml b/java/res/values-it/strings-talkback-descriptions.xml new file mode 100644 index 000000000..8665530c9 --- /dev/null +++ b/java/res/values-it/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Il testo attuale è %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nessun testo inserito"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregge <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> con <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> esegue la correzione automatica"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Carattere sconosciuto"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Maiusc"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Altri simboli"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maiusc"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboli"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Maiusc"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Elimina"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simboli"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Lettere"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Numeri"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Impostazioni"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"TAB"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Spazio"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Input vocale"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Invio"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Cerca"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Pallino"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Cambia lingua"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Successivo"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Precedente"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Maiusc attivo"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Bloc Maiusc attivo"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modalità simboli"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modalità altri simboli"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modalità lettere"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modalità telefono"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modalità simboli telefono"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastiera nascosta"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Ecco la tastiera <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data e ora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"messaggi"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"numero"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefono"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"testo"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recenti"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Persone"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Oggetti"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natura"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Luoghi"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboli"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticon"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiuscola"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiuscola"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiuscola, punto sovrascritto"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbolo sconosciuto"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji sconosciuta"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Sono disponibili caratteri alternativi"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"I caratteri alternativi vengono ignorati"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sono disponibili suggerimenti alternativi"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"I suggerimenti alternativi vengono ignorati"</string> +</resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 1111c4901..9b7f18cd5 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opzioni inserimento"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Ricerca comandi di log"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cerca in nomi contatti"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"La funzione di controllo ortografico usa voci dell\'elenco contatti"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrazione tasti"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Suono tasti"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup sui tasti"</string> - <string name="general_category" msgid="1859088467017573195">"Generali"</string> - <string name="correction_category" msgid="2236750915056607613">"Correzione testo"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Digitazione a gesti"</string> - <string name="misc_category" msgid="6894192814868233453">"Altre opzioni"</string> - <string name="advanced_settings" msgid="362895144495591463">"Impostazioni avanzate"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opzioni per esperti"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Altri metodi immissione"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Il tasto per cambiare lingua offre altri metodi di immissione"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tasto cambio lingua"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Predefinito sistema"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Suggerisci nomi di contatti"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizza nomi di Contatti per suggerimenti e correzioni"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggerimenti personalizz."</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Migliora <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Doppio spazio per punto"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocca due volte barra spaziatr. per inserire punto seguito da spazio"</string> <string name="auto_cap" msgid="1719746674854628252">"Maiuscole automatiche"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostra traccia con gesto"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Anteprima mobile dinamica"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Visualizza la parola suggerita durante il gesto"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : parola salvata"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Collega gli auricolari per ascoltare la pronuncia dei tasti premuti per la password."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Il testo attuale è %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nessun testo inserito"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corregge <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> con <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> esegue correzione automatica"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Codice tasto %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Maiuscolo"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Maiuscolo attivo (tocca per disattivare)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Blocco maiuscole attivo (tocca per disattivare)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Cancella"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboli"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Lettere"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numeri"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Impostazioni"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulazione"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spazio"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Input vocale"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smile"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Invio"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Cerca"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Pallino"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Cambia lingua"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Successivo"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Precedente"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Maiuscolo attivo"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Blocco maiuscole attivo"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Maiuscolo disattivato"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modalità simboli"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modalità lettere"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modalità telefono"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modalità simboli telefono"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastiera nascosta"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Visualizzazione tastiera <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e ora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"messaggi"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefono"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"testo"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gesto frase"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Inserisci spazi durante gesti facendo scivolare dito su spazio"</string> <string name="voice_input" msgid="3583258583521397548">"Tasto input vocale"</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">"Microfono su tastiera principale"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Microfono su tastiera simboli"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input vocale disatt."</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nessun metodo di immissione vocale abilitato. Controlla le impostazioni Lingua e input."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura metodi di immissione"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string> <string name="send_feedback" msgid="1780431884109392046">"Invia feedback"</string> <string name="select_language" msgid="3693815588777926848">"Lingue comandi"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tocca di nuovo per salvare"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dizionario disponibile"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Contribuisci a migliorare l\'editor del metodo di immissione inviando automaticamente statistiche sull\'utilizzo e rapporti sugli arresti anomali"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema della tastiera"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inglese (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inglese (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spagnolo (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglese (Regno Unito) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglese (Stati Uniti) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spagnolo (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradizionale)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglese (Regno Unito) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglese (Stati Uniti) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spagnolo (Stati Uniti) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradizionale)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cirillico)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latino)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nessuna lingua (alfabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Combinazione di colori"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Bianco"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blu"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Stili personalizzati"</string> <string name="add_style" msgid="6163126614514489951">"Aggiungi stile"</string> <string name="add" msgid="8299699805688017798">"Aggiungi"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Attiva"</string> <string name="not_now" msgid="6172462888202790482">"Non ora"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Esiste già uno stile di inuput uguale: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modalità Studio sull\'usabilità"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ritardo pressione lunga tasti"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Durata vibraz. pressione tasto"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume audio a pressione tasto"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leggi file dizionario esterno"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nessun file di dizionario nella cartella Download"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleziona un file di dizionario da installare"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Installare questo file per <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vuoi davvero installare questo file per <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Si è verificato un errore"</string> <string name="button_default" msgid="3988017840431881491">"Predefinito"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Benvenuto in <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Aggiorna"</string> <string name="last_update" msgid="730467549913588780">"Ultimo aggiornamento"</string> <string name="message_updating" msgid="4457761393932375219">"Verifica disponibilità aggiornamenti"</string> - <string name="message_loading" msgid="8689096636874758814">"Caricamento in corso..."</string> + <string name="message_loading" msgid="5638680861387748936">"Caricamento..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Dizionario principale"</string> <string name="cancel" msgid="6830980399865683324">"Annulla"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Impostazioni"</string> <string name="install_dict" msgid="180852772562189365">"Installa"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Annulla"</string> <string name="delete_dict" msgid="756853268088330054">"Elimina"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Per la lingua selezionata sul dispositivo mobile è disponibile un dizionario.<br/> Ti consigliamo di <b>scaricare</b> il dizionario in <xliff:g id="LANGUAGE">%1$s</xliff:g> per migliorare l\'esperienza di digitazione.<br/> <br/> Il download potrebbe richiedere un paio di minuti su 3G. Potrebbero essere applicati costi se non disponi di un <b>piano dati illimitato</b>.<br/> Se non sei sicuro di quale sia il tuo piano dati, dovresti trovare una connessione Wi-Fi per avviare il download automaticamente.<br/> <br/> Suggerimento. Puoi scaricare e rimuovere dizionari passando a <b>Lingue e immissione</b> nel menu <b>Impostazioni</b> del dispositivo mobile."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Per la lingua selezionata sul dispositivo mobile è disponibile un dizionario.<br/> Ti consigliamo di <b>scaricare</b> il dizionario in <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> per migliorare la digitazione.<br/> <br/> Il download potrebbe richiedere un paio di minuti su 3G. Potrebbero essere applicati costi se non disponi di un <b>piano dati illimitato</b>.<br/> Se non sei sicuro di quale sia il tuo piano dati, dovresti trovare una connessione Wi-Fi per avviare il download automaticamente.<br/> <br/> Suggerimento. Puoi scaricare e rimuovere dizionari selezionando <b>Lingua e immissione</b> nel menu <b>Impostazioni</b> del dispositivo mobile."</string> <string name="download_over_metered" msgid="1643065851159409546">"Scarica ora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Scarica tramite Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"È disponibile un dizionario per <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"È disponibile un dizionario per: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Premi per esaminare e scaricare"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download: i suggerimenti per <xliff:g id="LANGUAGE">%1$s</xliff:g> saranno pronti a breve."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Download: i suggerimenti per <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> saranno pronti a breve."</string> <string name="version_text" msgid="2715354215568469385">"Versione <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Aggiungi"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Aggiungi al dizionario"</string> diff --git a/java/res/values-fa/donottranslate.xml b/java/res/values-iw-sw600dp/donottranslate-config-spacing-and-punctuations.xml index 57de2538b..22f0353ff 100644 --- a/java/res/values-fa/donottranslate.xml +++ b/java/res/values-iw-sw600dp/donottranslate-config-spacing-and-punctuations.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, 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. @@ -21,5 +21,5 @@ <!-- The all letters need to be mirrored are found at http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt --> <!-- Symbols that are suggested between words --> - <string name="suggested_punctuations">!,?,\\,,:,;,\",(|),)|(,\',-,/,@,_</string> + <string name="suggested_punctuations">:,;,\",(|),)|(,\',-,/,@,_</string> </resources> diff --git a/java/res/values-ar/donottranslate.xml b/java/res/values-iw/donottranslate-config-spacing-and-punctuations.xml index 57de2538b..d30720811 100644 --- a/java/res/values-ar/donottranslate.xml +++ b/java/res/values-iw/donottranslate-config-spacing-and-punctuations.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, 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. diff --git a/java/res/values-iw/strings-action-keys.xml b/java/res/values-iw/strings-action-keys.xml index f0f466b8e..f72a6feeb 100644 --- a/java/res/values-iw/strings-action-keys.xml +++ b/java/res/values-iw/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"הקודם"</string> <string name="label_done_key" msgid="7564866296502630852">"בוצע"</string> <string name="label_send_key" msgid="482252074224462163">"שלח"</string> + <string name="label_search_key" msgid="7965186050435796642">"חפש"</string> <string name="label_pause_key" msgid="2225922926459730642">"השהה"</string> <string name="label_wait_key" msgid="5891247853595466039">"המתן"</string> </resources> diff --git a/java/res/values-iw/strings-config-important-notice.xml b/java/res/values-iw/strings-config-important-notice.xml new file mode 100644 index 000000000..34ef4cab5 --- /dev/null +++ b/java/res/values-iw/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"למד מהתכתבויות ומנתונים שהקלדת כדי לשפר את ההצעות"</string> +</resources> diff --git a/java/res/values-iw/strings-emoji-descriptions.xml b/java/res/values-iw/strings-emoji-descriptions.xml new file mode 100644 index 000000000..975ca10a8 --- /dev/null +++ b/java/res/values-iw/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"סימן זכויות יוצרים"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"סימן רשום"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"סימן קריאה כפול"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"סימן שאלה וסימן קריאה"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"סמל סימן מסחרי"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"מקור מידע"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"חץ ימינה ושמאלה"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"חץ למעלה ולמטה"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"חץ צפון מערב"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"חץ צפון מזרח"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"חץ דרום מזרח"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"חץ דרום מערב"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"חץ שמאלה עם קרס"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"חץ ימינה חץ עם קרס"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"שעון יד"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"שעון חול"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"משולש שחור כפול פונה ימינה"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"משולש שחור כפול פונה שמאלה"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"משולש שחור כפול פונה למעלה"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"משולש שחור כפול פונה למטה"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"שעון מעורר"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"שעון חול עם חול זורם"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"האות הלטינית הרישית M מוקפת בעיגול"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"ריבוע קטן שחור"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"ריבוע קטן לבן"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"משולש שחור פונה ימינה"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"משולש שחור פונה שמאלה"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"ריבוע אמצעי לבן"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"ריבוע אמצעי שחור"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"ריבוע קטן אמצעי לבן"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"ריבוע קטן אמצעי שחור"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"שמש שחורה עם קרניים"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"ענן"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"טלפון שחור"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"פתק עם סימן ביקורת"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"מטרייה עם טיפות גשם"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"משקה חם"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"אצבע לבנה מורה כלפי מעלה"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"פרצוף מחייך לבן"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"מזל טלה"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"מזל שור"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"מזל תאומים"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"מזל סרטן"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"מזל אריה"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"מזל בתולה"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"מזל מאזניים"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"מזל עקרב"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"מזל קשת"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"מזל גדי"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"מזל דלי"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"מזל דגים"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"קלף עלה שחור"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"קלף תלתן שחור"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"קלף לב שחור"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"קלף יהלום שחור"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"מעיינות חמים"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"סמל מיחזור אוניברסלי שחור"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"סמל כיסא גלגלים"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"עוגן"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"סימן אזהרה"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"סימן מתח גבוה"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"עיגול לבן אמצעי"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"עיגול שחור אמצעי"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"כדור כדורגל"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"כדור בסיס"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"בובת שלג בלי שלג"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"שמש מאחורי ענן"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"נושא הנחש"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"אין כניסה"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"כנסייה"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"מזרקה"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"דגל בחור"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"מפרשית"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"אוהל"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"משאבת דלק"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"מספריים שחורים"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"סימן ביקורת לבן עבה"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"מטוס"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"מעטפה"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"אגרוף מונף"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"יד מורמת"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"יד בסימן ניצחון"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"עיפרון"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"ציפורן שחורה"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"סימן ביקורת עבה"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"סימן כפל (x) עבה"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"ניצוצות"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"כוכבית עם שמונה חישורים"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"כוכב שחור עם שמונה קודקודים"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"פתית שלג"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"ניצוץ"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"סימן איקס"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"סימן איקס בתוך ריבוע המציין שלילה"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"סימן שאלה שחור"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"סימן שאלה לבן"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"סימן קריאה לבן"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"סמל סימן קריאה עבה"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"לב שחור עבה"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"סימן חיבור עבה"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"סימן חיסור עבה"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"סימן חלוקה עבה"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"חץ ימינה שחור"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"לולאה מסולסלת"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"לולאה מסולסלת כפולה"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"חץ פונה ימינה ולאחר מכן מתעקל כלפי מעלה"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"חץ פונה ימינה ולאחר מכן מתעקל מטה"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"חץ שחור פונה שמאלה"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"חץ שחור פונה למעלה"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"חץ שחור פונה למטה"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"ריבוע שחור גדול"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"ריבוע לבן גדול"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"כוכב אמצעי לבן"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"עיגול עבה גדול"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"מקף גלי"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"סימן החלפת חלק"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"אידאוגרף מוקף במעגל שמשמעותו \'מזל טוב\'"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"אידאוגרף מוקף במעגל שמשמעותו \'סוד\'"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"קוביית מהג\'ונג של דרקון אדום"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"קלף משחק של ג\'וקר שחור"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"סוג דם A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"סוג דם B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"סוג דם O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"חניון"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"סוג דם AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"ריבוע עם הכיתוב CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"ריבוע עם הכיתוב cool"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"ריבוע עם הכיתוב free"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ריבוע עם הכיתוב ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"ריבוע עם הכיתוב new"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"ריבוע עם הכיתוב NG"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"ריבוע עם הכיתוב OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"ריבוע עם הכיתוב SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"ריבוע עם הכיתוב Up עם סימן קריאה"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"ריבוע עם הכיתוב vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"ריבוע עם סמל \'כאן\' בקטקאנה"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"ריבוע עם סמל \'שירות\' בקטקאנה"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"ריבוע עם אידאוגרף שמשמעותו \'בחינם\'"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"ריבוע עם אידאוגרף שמשמעותו \'מושב שמור\'"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"ריבוע עם אידאוגרף שמשמעותו \'איסור\'"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"ריבוע עם אידאוגרף שמשמעותו \'ריק\'"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"ריבוע עם אידאוגרף שמשמעותו \'התקבל\'"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"ריבוע עם אידאוגרף שמשמעותו \'תפוסה מלאה\'"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"ריבוע עם אידאוגרף שמשמעותו \'שולם\'"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"ריבוע עם אידאוגרף שמשמעותו \'חודשי\'"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"ריבוע עם אידאוגרף שמשמעותו \'הגשת בקשה/מועמדות\'"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"ריבוע עם אידאוגרף שמשמעותו \'הנחה\'"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"ריבוע עם אידאוגרף שמשמעותו \'בעסקים\'"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"עיגול עם אידאוגרף שמשמעותו \'יתרון\'"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"עיגול עם אידאוגרף שמשמעותו \'קבל\'"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"ציקלון"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"ערפל"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"מטרייה סגורה"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"לילה עם כוכבים"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"זריחה מעל הרים"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"זריחה"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"נוף עירוני בשעת בין ערביים"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"שקיעה מעל בניינים"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"קשת"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"גשר בלילה"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"גל מים"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"הר געש"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"שביל החלב"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"כדור הארץ אירופה-אפריקה"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"כדור הארץ אמריקה"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"כדור הארץ אסיה-אוסטרליה"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"כדור הארץ עם מרידיאנים"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"סמל ירח חדש"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"סמל חרמש מתמלא ראשון"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"סמל ירח ברבע הראשון"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"סמל חרמש מתמלא שני"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"סמל ירח מלא"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"סמל חרמש נחסר ראשון"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"סמל ירח ברבע האחרון"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"סמל חרמש נחסר שני"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"ירח אפל"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"ירח חדש עם פרצוף"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"ירח ברבע הראשון עם פרצוף"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"ירח ברבע האחרון עם פרצוף"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"ירח מלא עם פרצוף"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"שמש עם פרצוף"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"כוכב זוהר"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"כוכב נופל"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"ערמונים"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"שתיל"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"עץ ירוק עד"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"עץ נשיר"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"עץ דקל"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"קקטוס"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"צבעוני"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"פריחת הדובדבן"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"ורד"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"היביסקוס"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"חמנית"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"פריחה"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"קלח תירס"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"שיבולת אורז"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"עשב"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"תלתן בעל ארבעה עלים"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"עלה אדר"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"עלה שלכת"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"עלה מתנופף ברוח"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"פטרייה"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"עגבנייה"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"חציל"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"ענבים"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"מלון"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"אבטיח"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"קלמנטינה"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"לימון"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"בננה"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"אננס"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"תפוח אדום"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"תפוח ירוק"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"אגס"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"אפרסק"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"דובדבנים"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"תות"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"המבורגר"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"משולש פיצה"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"בשר על עצם"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"שוק עוף"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"פריכיית אורז"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"כדור אורז"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"אורז מבושל"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"קארי ואורז"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"קערה מהבילה"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"ספגטי"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"לחם"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"צ\'יפס"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"בטטה קלויה"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"דנגו"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"אודן"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"סושי"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"שרימפס מטוגן"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"לביבת דג עם עיצוב מערבולת"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"גלידה אמריקאית"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"ברד"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"גלידה"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"סופגנייה"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"עוגייה"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"חפיסת שוקולד"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"סוכרייה"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"סוכרייה על מקל"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"רפרפת"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"סיר דבש"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"עוגת פירות"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"מארז בנטו"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"סיר אוכל"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"בישול"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"סכין ומזלג"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"כוס תה ללא ידית"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"בקבוק סאקה וכוס"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"כוס יין"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"כוס קוקטייל"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"משקה טרופי"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"ספל בירה"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"כוסות בירה מושקות"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"בקבוק של תינוק"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"סרט"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"מתנה ארוזה"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"עוגת יום הולדת"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack-O-Lantern"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"עץ חג המולד"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"אבא חג המולד"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"זיקוקין"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ניצוץ זיקוקין"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"בלון"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"קונפטי"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"כדור קונפטי"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"עץ טנאבאטה"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"דגלים מוצלבים"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"קישוט אורן"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"בובות יפניות"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"עפיפוני דגים"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"פעמוני רוח"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"טקס צפייה בירח"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"ילקוט בית ספר"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"כובע סיום לימודים"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"סוס קרוסלה"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"גלגל ענק"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"רכבת שעשועים"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"חכה ודגים"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"מיקרופון"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"מצלמת קולנוע"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"קולנוע"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"אוזנייה"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"כן ציור"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"מגבעת"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"אוהל קרקס"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"כרטיס"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"לוח קלאפר"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"אמנויות הבמה"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"משחק וידאו"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"פגיעה ישירה"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"מכונת מזל"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"ביליארד"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"קוביית משחק"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"באולינג"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"קלפי משחק עם פרחים"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"תו נגינה"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"תווי נגינה מרובים"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"סקסופון"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"גיטרה"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"מקלדת מוסיקלית"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"חצוצרה"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"כינור"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"פרטיטורה"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"חולצת ריצה עם חגורה"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"מחבט טניס וכדור"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"סקי ונעל סקי"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"כדורסל וחישוק"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"דגל משבצות"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"איש גולש על סנובורד"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"איש רץ"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"איש גולש"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"גביע ניצחון"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"מרוץ סוסים"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"פוטבול אמריקאי"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"כדורגל רוגבי"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"שחיין"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"בית"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"בית עם גינה"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"משרד"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"סניף דואר יפני"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"סניף דואר אירופאי"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"בית חולים"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"בנק"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"כספומט"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"מלון"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"מלון אהבה"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"חנות נוחות"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"בית ספר"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"חנות כלבו"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"מפעל"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"בר יפני"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"טירה יפנית"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"טירה אירופאית"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"עכברוש"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"עכבר"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"שור"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"תאו מים"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"פרה"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"נמר"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"ארנב"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"חתול"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"דרקון"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"תנין"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"לווייתן"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"שבלול"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"נחש"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"סוס"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"אייל"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"עז"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"כבשה"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"קוף"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"תרנגול"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"עוף"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"כלב"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"חזיר"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"חזיר"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"פיל"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"תמנון"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"קונכייה"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"חרק"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"נמלה"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"דבורת דבש"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"מושית"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"דג"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"דג טרופי"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"דג הכדור"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"צב"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"אפרוח בוקע"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"אפרוח"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"אפרוח מסתכל קדימה"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"ציפור"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"פינגווין"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"קואלה"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"פודל"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"גמל חד-דבשת"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"גמל כפול-דבשת"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"דולפין"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"פרצוף עכבר"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"פרצוף פרה"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"פרצוף טייגר"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"פרצוף ארנב"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"פרצוף חתול"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"פרצוף דרקון"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"לווייתן מתיז מים"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"פרצוף סוס"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"פרצוף קוף"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"פרצוף כלב"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"פרצוף חזיר"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"פרצוף צפרדע"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"פרצוף של אוגר"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"פרצוף זאב"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"פרצוף דוב"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"פרצוף פנדה"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"אף חזיר"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"עקבות של כפות"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"עיניים"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"אוזן"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"אף"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"פה"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"לשון"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"אצבע לבנה מורה כלפי מעלה עם גב כף היד"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"אצבע לבנה מורה כלפי מטה עם גב כף היד"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"אצבע לבנה מורה כלפי שמאל עם גב כף היד"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"אצבע לבנה מורה כלפי ימין עם גב כף היד"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"סימן אגרוף"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"סימן יד מנופפת"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"סימן יד מאשרת"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"סימן אגודל כלפי מעלה"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"סימן אגודל כלפי מטה"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"סימן מחיאות כפיים"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"סימן ידיים פתוחות"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"כתר"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"כובע נשים"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"משקפיים"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"עניבה"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"חולצת טי"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ג\'ינס"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"שמלה"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"קימונו"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"ביקיני"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"בגדי נשים"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"ארנק"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"תיק יד"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"נרתיק"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"נעל של גבר"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"נעל ספורט"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"נעל עם עקב גבוה"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"סנדל של נשים"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"מגפי נשים"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"עקבות"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"פסל ראש, כתפיים וחזה עם צללית"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"פסלי ראש, כתפיים וחזה עם צללית"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ילד"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"ילדה"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"גבר"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"אישה"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"משפחה"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"גבר ואישה מחזיקים ידיים"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"שני גברים מחזיקים ידיים"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"שתי נשים מחזיקות ידיים"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"שוטר"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"אישה עם אוזני ארנב"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"כלה עם הינומה"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"אדם עם שיער בלונדיני"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"גבר עם כובע Gua Pi Mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"גבר עם טורבן"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"איש זקן"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"אישה זקנה"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"תינוק"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"פועל בניין"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"נסיכה"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"מפלצת יפנית"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"גובלין יפני"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"רוח רפאים"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"תינוק מלאך"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"חייזר"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"מפלצת חייזרית"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"שד"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"גולגולת"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"נציג בדלפק מידע"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"זקיף"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"רקדן"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"שפתון"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"לק"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"עיסוי פנים"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"תספורת"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"מוט ספרים"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"מזרק"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"גלולה"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"סימן נשיקה"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"מכתב אהבה"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"טבעת"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"אבן חן"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"נשיקה"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"זר"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"זוג עם לב"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"חתונה"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"לב פועם"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"לב שבור"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"שני לבבות"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"לב מנצנץ"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"לב גדל"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"לב עם חץ"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"לב כחול"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"לב ירוק"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"לב צהוב"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"לב סגול"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"לב עם סרט"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"לבבות מסתובבים"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"עיטור לב"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"צורת יהלום עם נקודה בפנים"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"נורת חשמל"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"סמל כעס"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"פצצה"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"סמל שינה"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"סמל התנגשות"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"סמל זיעה מותזת"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"טיפה"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"סמל מקף"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"ערימת קקי"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"שרירים מכווצים"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"סמל סחרחורת"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"בלון דיבור"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"בלון מחשבות"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"פרח לבן"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"סמל מאה נקודות"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"שק כסף"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"המרת מטבע"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"סימן דולר עבה"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"כרטיס אשראי"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"שטר עם סימן ין"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"שטר עם סימן דולר"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"שטר עם סימן אירו"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"שטר עם סימן לירה שטרלינג"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"כסף עם כנפיים"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"תרשים עם מגמת עלייה וסימן ין"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"מושב"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"מחשב אישי"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"תיק נשיאה"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"מיני-דיסק"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"תקליטון"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"דיסק אופטי"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"תיקיית קבצים"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"תיקיית קבצים פתוחה"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"דף עם גלילה מלמטה"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"דף פונה כלפי מעלה"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"לוח שנה"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"לוח שנה נתלש"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"כרטסת"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"תרשים עם מגמת עלייה"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"תרשים עם מגמת ירידה"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"תרשים עמודות"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"לוח"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"נעץ"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"נעץ עגול"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"סיכת משרד"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"סרגל ישר"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"סרגל משולש"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"לשוניות מפרידי עמודים"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"ספר חשבונות"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"מחברת"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"מחברת עם עטיפה מקושטת"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"ספר סגור"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"ספר פתוח"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"ספר ירוק"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"ספר כחול"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"ספר כתום"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"ספרים"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"תג שם"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"מגילה"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"תזכיר"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"שפופרת טלפון"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"זימונית"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"מכשיר פקס"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"אנטנת לוויין"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"רמקול כריזה של כתובות ציבוריות"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"מגפון מריע"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"מגש דואר יוצא"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"מגש דואר נכנס"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"חבילה"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"סמל דוא\"ל"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"מעטפה נכנסת"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"מעטפה ועליה חץ למטה"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"תיבת דואר סגורה עם דגל מורד"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"תיבת דואר סגורה עם דגל מורם"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"תיבת דואר פתוחה עם דגל מורם"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"תיבת דואר פתוחה עם דגל מורד"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"תיבת דואר"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"חצוצרת דואר"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"עיתון"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"טלפון נייד"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"טלפון נייד עם חץ ימינה בצד שמאל"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"מצב רטט"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"טלפון נייד כבוי"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"איסור שימוש בטלפונים ניידים"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"אנטנה עם פסים"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"מצלמה"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"מצלמת וידאו"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"טלוויזיה"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"רדיו"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"קלטת וידאו"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"חצים משולבים פונים ימינה"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"חצים שיוצרים מעגל פתוח הפונים ימינה ושמאלה בכיוון השעון"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"חצים שיוצרים מעגל פתוח הפונים ימינה ושמאלה בכיוון השעון ומעליו מעגל עם המספר 1"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"חצים שיוצרים מעגל פתוח הפונים מעלה ומטה בכיוון השעון"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"חצים שיוצרים מעגל פתוח הפונים מעלה ומטה נגד כיוון השעון"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"סמל בהירות נמוכה"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"סמל בהירות גבוהה"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"רמקול עם קו חוצה לסימן ביטול"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"רמקול"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"רמקול עם גל קול אחד"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"רמקול עם שלושה גלי קול"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"סוללה"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"תקע חשמלי"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"זכוכית מגדלת שמצביעה שמאלה"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"זכוכית מגדלת שמצביעה ימינה"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"מנעול עם עט דיו"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"מנעול סגור עם מפתח"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"מפתח"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"מנעול"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"מנעול פתוח"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"פעמון"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"פעמון עם קו חוצה לסימן ביטול"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"סימנייה"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"סמל קישור"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"לחצן בחירה"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"המילה Back (חזרה) עם חץ שמאלה מעליה"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"המילה End (סיום) עם חץ שמאלה מעליה"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"המילה On (פועל) עם סימן קריאה וחץ ימינה ושמאלה מעליה"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"המילה Soon (עוד מעט) עם חץ ימינה מעליה"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"המילה Top (למעלה) עם חץ למעלה מעליה"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"סמל מגיל 18 ומעלה"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"כיסוי מקלדת עם המספר 10"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"סמל קלט לאותיות לטיניות רישיות"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"סמל קלט לאותיות לטיניות קטנות"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"סמל קלט למספרים"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"סמל קלט לסמלים"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"סמל קלט לאותיות לטיניות"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"אש"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"פנס חשמלי"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"מפתח ברגים"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"פטיש"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"אום ובורג"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"סכין"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"אקדח"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"מיקרוסקופ"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"טלסקופ"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"כדור בדולח"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"כוכב עם שישה קודקודים ונקודה באמצע"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"סמל יפנית למתחילים"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"סמל קלשון"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"לחצן ריבועי שחור"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"לחצן ריבועי לבן"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"עיגול אדום גדול"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"עיגול כחול גדול"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"יהלום כתום גדול"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"יהלום כחול גדול"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"יהלום כתום קטן"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"יהלום כחול קטן"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"משולש אדום פונה כלפי מעלה"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"משולש אדום פונה כלפי מטה"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"משולש אדום קטן פונה כלפי מעלה"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"משולש אדום קטן פונה כלפי מטה"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"פני שעון עם השעה אחת"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"פני שעון עם השעה שתיים"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"פני שעון עם השעה שלוש"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"פני שעון עם השעה ארבע"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"פני שעון עם השעה חמש"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"פני שעון עם השעה שש"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"פני שעון עם השעה שבע"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"פני שעון עם השעה שמונה"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"פני שעון עם השעה תשע"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"פני שעון עם השעה עשר"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"פני שעון עם השעה אחת עשרה"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"פני שעון עם השעה שתים עשרה"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"פני שעון עם השעה אחת וחצי"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"פני שעון עם השעה שתיים וחצי"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"פני שעון עם השעה שלוש וחצי"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"פני שעון עם השעה ארבע וחצי"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"פני שעון עם השעה חמש וחצי"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"פני שעון עם השעה שש וחצי"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"פני שעון עם השעה שבע וחצי"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"פני שעון עם השעה שמונה וחצי"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"פני שעון עם השעה תשע וחצי"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"פני שעון עם השעה עשר וחצי"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"פני שעון עם השעה אחת עשרה וחצי"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"פני שעון עם השעה שתים עשרה וחצי"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"הר פוג\'י"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"מגדל טוקיו"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"פסל החירות"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"צללית של יפן"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"פסל Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"פרצוף מחייך"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"פרצוף מחייך עם עיניים מחייכות"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"פרצוף עם דמעות של שמחה"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"פרצוף מחייך עם פה פתוח"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"פרצוף מחייך עם פה פתוח ועיניים מחייכות"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"פרצוף מחייך עם פה פתוח וזיעה קרה"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"פרצוף מחייך עם פה פתוח ועיניים עצומות בחוזקה"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"פרצוף מחייך עם הילה"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"פרצוף מחייך עם קרניים"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"פרצוף קורץ"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"פרצוף מחייך עם עיניים מחייכות"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"פרצוף שמתענג על אוכל טעים"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"פרצוף של הקלה"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"פרצוף מחייך עם עיניים בצורת לבבות"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"פרצוף מחייך עם משקפי שמש"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"פרצוף מגחך"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"פרצוף נייטרלי"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"פרצוף חסר הבעה"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"פרצוף משועשע"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"פרצוף עם זיעה קרה"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"פרצוף מהורהר"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"פרצוף מבולבל"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"פרצוף נדהם"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"פרצוף מנשק"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"פרצוף שמפריח נשיקה"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"פרצוף מנשק עם עיניים מחייכות"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"פרצוף מנשק עם עיניים עצומות"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"פרצוף חורץ לשון"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"פרצוף חורץ לשון עם עין קורצת"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"פרצוף חורץ לשון עם עיניים עצומות בחוזקה"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"פרצוף מאוכזב"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"פרצוף מודאג"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"פרצוף כועס"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"פרצוף חמוץ"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"פרצוף בוכה"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"פרצוף עיקש"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"פרצוף עם מבט של ניצחון"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"פרצוף של אכזבה עם הקלה"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"פרצוף זועם עם פה פתוח"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"פרצוף מיוסר"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"פרצוף מפוחד"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"פרצוף עייף"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"פרצוף ישנוני"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"פרצוף מותש"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"פרצוף של העוויית פנים"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"פרצוף בוכה בקול"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"פרצוף עם פה פתוח"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"פרצוף מהוסה"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"פרצוף עם פה פתוח וזיעה קרה"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"פרצוף צורח בפחד"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"פרצוף המום"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"פרצוף סמוק"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"פרצוף ישן"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"פרצוף מסוחרר"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"פרצוף ללא פה"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"פרצוף עם מסכה רפואית"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"פרצוף חתול מחייך עם עיניים מחייכות"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"פרצוף חתול עם דמעות של שמחה"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"פרצוף חתול מחייך עם פה פתוח"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"פרצוף חתול מחייך עם עיניים בצורת לבבות"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"פרצוף חתול עם חיוך עקום"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"פרצוף חתול מנשק עם עיניים עצומות"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"פרצוף חמוץ של חתול"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"פרצוף חתול בוכה"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"פרצוף חתול עייף"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"פרצוף עם מחוות \'לא טוב\'"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"פרצוף עם מחוות אישור"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"אדם קד קידה עמוקה"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"קוף שאינו רוצה לראות דבר רע"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"קוף שאינו רוצה לשמוע דבר רע"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"קוף שאינו רוצה לומר דבר רע"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"אדם שמח מרים יד אחת"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"אדם שמרים שתי ידיים בחגיגה"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"אדם זועף"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"אדם עם פרצוף חמוץ"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"אדם עם ידיים שלובות"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"רקטה"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"מסוק"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"קטר קיטור"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"קרון רכבת"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"רכבת מהירה"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"רכבת מהירה עם חרטום דמוי קליע"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"רכבת"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"רכבת תחתית"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"רכבת קלה"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"תחנה"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"חשמלית"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"קרון חשמלית"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"אוטובוס"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"אוטובוס מתקרב"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"חשמלית"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"תחנת אוטובוס"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"מיניבוס"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"אמבולנס"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"כבאית"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"ניידת משטרה"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"ניידת משטרה מתקרבת"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"מונית"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"מונית מתקרבת"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"מכונית"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"מכונית מתקרבת"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"מעונוע"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"משאית הובלה"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"משאית מודגשת"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"טרקטור"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"רכבת חד-מסילתית"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"רכבת הרים"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"רכבל"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"רכבל הרים"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"חשמלית אווירית"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"אנייה"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"סירת משוטים"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"סירת מרוץ"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"רמזור אופקי"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"רמזור אנכי"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"סימן בנייה"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"אור מהבהב בניידת משטרה"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"דגל משולש על עמוד"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"דלת"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"סימן אין כניסה"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"סמל עישון"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"סמל \'אסור לעשן\'"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"סמל \'האשפה לסל וחסל\'"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"סמל \'נא לשמור על הניקיון\'"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"סמל מים ראויים לשתייה"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"סמל של מים לא ראויים לשתייה"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"אופניים"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"אין לנסוע באופניים"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"רוכב אופנים"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"רוכב על אופני הרים"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"הולך רגל"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"אין כניסה להולכי רגל"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"ילדים חוצים"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"סמל גברים"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"סמל נשים"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"שירותים"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"סמל תינוקות"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"שירותים"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"בית שימוש"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"מקלחת"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"אמבטיה"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"אמבטיה"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"ביקורת דרכונים"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"מכס"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"איסוף מזוודות"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"השארת מטען"</string> +</resources> diff --git a/java/res/values-iw/strings-letter-descriptions.xml b/java/res/values-iw/strings-letter-descriptions.xml new file mode 100644 index 000000000..1b0e72f42 --- /dev/null +++ b/java/res/values-iw/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"סימן סידורי נקבי"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"סימן מיקרו"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"סימן סידורי זכרי"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S חדה"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, הטעמה משנית"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, הטעמה עלית"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, גג"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, טילדה"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, עלית כפולה"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, טבעת מעל"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ליגטורה"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, סדיליה"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, הטעמה משנית"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, הטעמה עלית"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, גג"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, הטעמה משנית"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, הטעמה עלית"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, גג"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, טילדה"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, הטעמה משנית"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, הטעמה עלית"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, גג"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, טילדה"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, קו חוצה"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, הטעמה משנית"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, הטעמה עלית"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, גג"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, הטעמה עלית"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, קו עלי"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ברווה"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, זנבון"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, הטעמה עלית"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, גג"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, נקודה מעל"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, וי קטן"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, וי קטן"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, קו חוצה"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, קו עלי"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ברווה"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, נקודה מעל"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, זנבון"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, וי קטן"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, גג"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ברווה"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, נקודה מעל"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, סדיליה"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, גג"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, קו חוצה"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, טילדה"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, קו עלי"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ברווה"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, זנבון"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I ללא נקודות"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ליגטורה"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, גג"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, סדיליה"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, הטעמה עלית"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, סדיליה"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, וי קטן"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, נקודה אמצעית"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, קו חוצה"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, הטעמה עלית"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, סדיליה"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, וי קטן"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, עם גרש לפני"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, קו עלי"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ברווה"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ליגטורה"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, הטעמה עלית"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, סדיליה"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, וי קטן"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, הטעמה עלית"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, גג"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, סדיליה"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, וי קטן"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, סדיליה"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, וי קטן"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, קו חוצה"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, טילדה"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, קו עלי"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ברווה"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, טבעת מעל"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, הטעמה עלית כפולה"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, זנבון"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, גג"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, גג"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, הטעמה עלית"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, נקודה מעל"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, וי קטן"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S ארוכה"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, קרן"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, קרן"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, פסיק מתחת"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, פסיק מתחת"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, נקודה מתחת"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, קרס מעל"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, גג והטעמה עלית"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, גג והטעמה משנית"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, גג וקרס מעל"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, גג וטילדה"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, גג ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ברווה והטעמה עלית"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ברווה והטעמה משנית"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ברווה וקרס מעל"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ברווה וטילדה"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ברווה ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, נקודה מתחת"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, קרס מעל"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, טילדה"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, גג והטעמה עלית"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, גג והטעמה משנית"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, גג וקרס מעל"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, גג וטילדה"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, גג ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, קרס מעל"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, נקודה מתחת"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, נקודה מתחת"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, קרס מעל"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, גג והטעמה עלית"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, גג והטעמה משנית"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, גג וקרס מעל"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, גג וטילדה"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, גג ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, קרן והטעמה עלית"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, קרן והטעמה משנית"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, קרן וקרס מעל"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, קרן וטילדה"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, קרן ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, נקודה מתחת"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, קרס מעל"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, קרן והטעמה עלית"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, קרן והטעמה משנית"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, קרן וקרס מעל"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, קרן וטילדה"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, קרן ונקודה מתחת"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, הטעמה משנית"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, נקודה מתחת"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, קרס מעל"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, טילדה"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"סימן קריאה הפוך"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"סימן ציטוט זוויתי כפול הפונה שמאלה"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"נקודה אמצעית"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"אחד בכתב עלי"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"סימן ציטוט זוויתי כפול הפונה ימינה"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"סימן שאלה הפוך"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"גרש שמאלי יחיד"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"גרש ימני יחיד"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"גרש יחיד תחתון"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"מירכאות כפולות שמאליות"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"מירכאות כפולות ימניות"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"צלבון"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"צלבון כפול"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"סימן פרומיל"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prime כפול"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"סימן ציטוט זוויתי יחיד הפונה שמאלה"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"סימן ציטוט זוויתי יחיד הפונה ימינה"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ארבע בכתב עלי"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"n לטינית קטנה בכתב עלי"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"סימן פזו"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"סימן \"לכבוד\""</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"חץ ימינה"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"חץ מטה"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty Set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"הגדל"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"קטן מ- או שווה ל-"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"גדול מ- או שווה ל-"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"כוכב שחור"</string> +</resources> diff --git a/java/res/values-iw/strings-talkback-descriptions.xml b/java/res/values-iw/strings-talkback-descriptions.xml new file mode 100644 index 000000000..a43b64ec7 --- /dev/null +++ b/java/res/values-iw/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"הטקסט הנוכחי הוא %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"לא הוזן טקסט"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מתקן את <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ל-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מבצע תיקון אוטומטי"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"תו לא מוכר"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"סמלים נוספים"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"סמלים"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"מחק"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"סמלים"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"אותיות"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"מספרים"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"הגדרות"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"רווח"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"קלט הקול"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"אמוג\'י"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"חפש"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"נקודה"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"החלף שפה"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"הבא"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"הקודם"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift פועל"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock פועל"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"מצב סמלים"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"מצב \'סמלים נוספים\'"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"מצב אותיות"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"מצב טלפון"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"מצב סמלי טלפון"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"המקלדת מוסתרת"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"מציג מקלדת <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"תאריך"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"תאריך ושעה"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"דוא\"ל"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"העברת הודעות"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"מספרים"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"מספרי טלפון"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"טקסט"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"זמן"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"כתובות אתרים"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"אחרונים"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"אנשים"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"אובייקטים"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"טבע"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"מקומות"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"סמלים"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"רגשונים"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> גדולה"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I גדולה"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I גדולה, נקודה מעל"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"סמל לא מוכר"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji לא מוכר"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"תווים חלופיים זמינים"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"תווים חלופיים נדחים"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"הצעות חלופיות זמינות"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"הצעות חלופיות נדחות"</string> +</resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 8d02e685b..d36d3ce7f 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"אפשרויות קלט"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"פקודות יומן מחקר"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"חפש שמות של אנשי קשר"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"בודק האיות משתמש בערכים מרשימת אנשי הקשר שלך"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"רטט בלחיצה על מקשים"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"צלילים בעת לחיצה על מקשים"</string> <string name="popup_on_keypress" msgid="123894815723512944">"חלון קופץ בלחיצה על מקש"</string> - <string name="general_category" msgid="1859088467017573195">"כללי"</string> - <string name="correction_category" msgid="2236750915056607613">"תיקון טקסט"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"הקלדה ללא הרמת אצבע"</string> - <string name="misc_category" msgid="6894192814868233453">"אפשרויות אחרות"</string> - <string name="advanced_settings" msgid="362895144495591463">"הגדרות מתקדמות"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"אפשרויות למומחים"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"העדפות קלט"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"מראה"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"אפשרויות ריבוי שפות"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"העדפות של הקלדת החלקה"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"תיקון טקסט"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"מתקדם"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"עבור לשיטות קלט אחרות"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"מתג החלפת השפה מכסה גם שיטות קלט אחרות"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"מתג החלפת שפה"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"ברירת מחדל של המערכת"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"הצע שמות של אנשי קשר"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"השתמש בשמות מרשימת אנשי הקשר עבור הצעות ותיקונים"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"הצעות מותאמות אישית"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"שפר את <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"רווח כפול לנקודה"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"הקשה פעמיים על מקש הרווח מזינה נקודה ואחריה רווח"</string> <string name="auto_cap" msgid="1719746674854628252">"הפיכת אותיות לרישיות באופן אוטומטי"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"הצג שובל תנועות"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"תצוגה צפה דינמית"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ראה את המילה המוצעת תוך כדי הזזת האצבע"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : נשמרה"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"חבר אוזניות כדי לשמוע הקראה של מפתחות סיסמה."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"הטקסט הנוכחי הוא %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"לא הוזן טקסט"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> מתקן את <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ל-<xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> מבצע תיקון אוטומטי"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"קוד מקש %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift פועל (הקש כדי להשבית)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock פועל (הקש כדי להשבית)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"מחק"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"סמלים"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"אותיות"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"מספרים"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"הגדרות"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"כרטיסייה"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"רווח"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"קלט קולי"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"סמיילי"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"חזרה"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"חפש"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"נקודה"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"החלף שפה"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"הבא"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"הקודם"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift פועל"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock פועל"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift מושבת"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"מצב סמלים"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"מצב אותיות"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"מצב טלפון"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"מצב סמלי טלפון"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"המקלדת מוסתרת"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"מציג מקלדת <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"תאריך"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"תאריך ושעה"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"דוא\"ל"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"העברת הודעות"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"מספרים"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"מספרי טלפון"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"טקסט"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"זמן"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"כתובות אתרים"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"הקלדת משפט בהחלקה"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"הזן רווחים במהלך התנועה על ידי החלקה אל מקש הרווח"</string> <string name="voice_input" msgid="3583258583521397548">"מקש קלט קולי"</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="voice_input_disabled_summary" msgid="8141750303464726129">"לא הופעלו שיטות של קלט קולי. בדוק את הגדרות השפה והקלט."</string> <string name="configure_input_method" msgid="373356270290742459">"הגדרת שיטות קלט"</string> <string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string> <string name="send_feedback" msgid="1780431884109392046">"שלח משוב"</string> <string name="select_language" msgid="3693815588777926848">"שפות קלט"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"גע שוב כדי לשמור"</string> <string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"הפעל משוב ממשתמשים"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"עזור לשפר את עורך שיטת הקלט על ידי שליחה אוטומטית של סטטיסטיקת שימוש ודוחות קריסה."</string> <string name="keyboard_layout" msgid="8451164783510487501">"עיצוב מקלדת"</string> <string name="subtype_en_GB" msgid="88170601942311355">"אנגלית (בריטניה)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"אנגלית (ארה\"ב)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"ספרדית (ארצות הברית)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"אנגלית (בריטניה) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"אנגלית (ארה\"ב) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"ספרדית (ארצות הברית) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (מסורתית)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"אנגלית (בריטניה) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"אנגלית (ארה\"ב) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ספרדית (ארה\"ב) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (מסורתית)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (קירילית)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (לטינית)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"ללא שפה (אלף-בית)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"אלף-בית (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"אלף-בית (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"אלף-בית (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"אלף-בית (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"אמוג\'י"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"ערכת צבעים"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"לבן"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"כחול"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"עיצוב מקלדת"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"לבן מלא"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"כחול מלא"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"שחור כהה"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"לבן בהיר"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"סגנונות קלט מותאמים אישית"</string> <string name="add_style" msgid="6163126614514489951">"הוסף סגנון"</string> <string name="add" msgid="8299699805688017798">"הוסף"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"הפעל"</string> <string name="not_now" msgid="6172462888202790482">"לא עכשיו"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"סגנון קלט זהה כבר קיים: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"מצב לחקירת שימושיות"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"השהיית לחיצה ארוכה על מקש"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"משך רטט של לחיצת מקש"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"עוצמת קול של לחיצת מקש"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"קריאה של קובץ מילון חיצוני"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"אין קובצי מילונים בתיקיית ההורדות"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"בחירת קובץ מילון להתקנה"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"האם באמת להתקין את הקובץ הזה עבור <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"האם אתה באמת רוצה להתקין את הקובץ הזה עבור <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"אירעה שגיאה"</string> <string name="button_default" msgid="3988017840431881491">"ברירת מחדל"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"ברוך הבא אל <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"רענן"</string> <string name="last_update" msgid="730467549913588780">"עודכן לאחרונה"</string> <string name="message_updating" msgid="4457761393932375219">"מחפש עדכונים"</string> - <string name="message_loading" msgid="8689096636874758814">"טוען..."</string> + <string name="message_loading" msgid="5638680861387748936">"טוען…"</string> <string name="main_dict_description" msgid="3072821352793492143">"מילון ראשי"</string> <string name="cancel" msgid="6830980399865683324">"בטל"</string> + <string name="go_to_settings" msgid="3876892339342569259">"הגדרות"</string> <string name="install_dict" msgid="180852772562189365">"התקן"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"בטל"</string> <string name="delete_dict" msgid="756853268088330054">"מחק"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"לשפה הנבחרת במכשיר הנייד שלך יש מילון זמין.<br/> אנו ממליצים <b>להוריד</b> את המילון ב<xliff:g id="LANGUAGE">%1$s</xliff:g> כדי לשפר את חוויית ההקלדה.<br/> <br/> ההורדה עשויה לארוך דקה או שתיים ב-3G. ייתכן שתחויב אם אין לך <b>תכנית נתונים בלתי מוגבלת</b>.<br/> אם אינך בטוח איזו תכנית נתונים יש לך, אנו ממליצים לחפש חיבור Wi-Fi כדי להתחיל בהורדה באופן אוטומטי.<br/> <br/> טיפ: ניתן להוריד ולהסיר מילונים ב<b>שפה וקלט</b> בתפריט <b>הגדרות</b> של המכשיר הנייד שלך."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"יש מילון זמין עבור השפה הנבחרת במכשיר הנייד שלך.<br/> אנחנו ממליצים <b>להוריד</b> את המילון ב<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> לשיפור חוויית ההקלדה.<br/> <br/> ייתכן שההורדה תארך דקה או שתיים ברשת דור שלישי. ייתכנו חיובים אם אין לך <b>תכנית נתונים ללא הגבלה</b>.<br/> אם אינך בטוח איזו תכנית נתונים יש לך, אנחנו ממליצים למצוא חיבור Wi-Fi כדי להתחיל את ההורדה באופן אוטומטי.<br/> <br/> טיפ: ניתן להוריד ולהסיר מילונים על ידי מעבר אל <b>שפה וקלט</b> בתפריט <b>הגדרות</b> של המכשיר הנייד."</string> <string name="download_over_metered" msgid="1643065851159409546">"הורד עכשיו (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"הורד באמצעות Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"יש מילון זמין עבור <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"יש מילון זמין עבור <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"לחץ כדי לעיין ולהוריד"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"מוריד: הצעות ב<xliff:g id="LANGUAGE">%1$s</xliff:g> יהיו מוכנות בקרוב."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"מוריד: הצעות עבור <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> יהיו מוכנות בקרוב."</string> <string name="version_text" msgid="2715354215568469385">"גרסה <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"הוסף"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"הוסף למילון"</string> diff --git a/java/res/values-ja/strings-action-keys.xml b/java/res/values-ja/strings-action-keys.xml index 68aa6479e..a8ed43468 100644 --- a/java/res/values-ja/strings-action-keys.xml +++ b/java/res/values-ja/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"前へ"</string> <string name="label_done_key" msgid="7564866296502630852">"完了"</string> <string name="label_send_key" msgid="482252074224462163">"送信"</string> + <string name="label_search_key" msgid="7965186050435796642">"検索"</string> <string name="label_pause_key" msgid="2225922926459730642">"停止"</string> <string name="label_wait_key" msgid="5891247853595466039">"待機"</string> </resources> diff --git a/java/res/values-ja/strings-config-important-notice.xml b/java/res/values-ja/strings-config-important-notice.xml new file mode 100644 index 000000000..03c1f48e9 --- /dev/null +++ b/java/res/values-ja/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"メッセージなどのやり取りや入力したデータから入力候補を予測します"</string> +</resources> diff --git a/java/res/values-ja/strings-letter-descriptions.xml b/java/res/values-ja/strings-letter-descriptions.xml new file mode 100644 index 000000000..4112fb04b --- /dev/null +++ b/java/res/values-ja/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"女性序数標識"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"マイクロ記号"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"男性序数標識"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"エスツェット"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A、グレイヴ"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A、アキュート"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A、サーカムフレックス"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A、チルド"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A、ダイエレシス"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A、上リング"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A、E、合字"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C、セディーユ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E、グレイヴ"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E、アキュート"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E、サーカムフレックス"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E、ダイエレシス"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I、グレイヴ"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I、アキュート"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I、サーカムフレックス"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I、ダイエレシス"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"エーズ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N、チルド"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O、グレイヴ"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O、アキュート"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O、サーカムフレックス"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O、チルド"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O、ダイエレシス"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O、ストローク"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U、グレイヴ"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U、アキュート"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U、サーカムフレックス"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U、ダイエレシス"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y、アキュート"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ソーン"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y、ダイエレシス"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A、マクロン"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A、ブリーブ"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A、オゴネク"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C、アキュート"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C、サーカムフレックス"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C、上点"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C、キャロン"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D、キャロン"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D、ストローク"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E、マクロン"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E、ブリーブ"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E、上点"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E、オゴネク"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E、キャロン"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G、サーカムフレックス"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G、ブリーブ"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G、上点"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G、セディーユ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H、サーカムフレックス"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H、ストローク"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I、チルド"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I、マクロン"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I、ブリーブ"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I、オゴネク"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"点なしI"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I、J、合字"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J、サーカムフレックス"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K、セディーユ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"クラー"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L、アキュート"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L、セディーユ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L、キャロン"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L、中点"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L、ストローク"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N、アキュート"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N、セディーユ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N、キャロン"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N、前にアポストロフィ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"エング"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O、マクロン"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O、ブリーブ"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O、ダブルアキュート"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O、E、合字"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R、アキュート"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R、セディーユ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R、キャロン"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S、アキュート"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S、サーカムフレックス"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S、セディーユ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S、キャロン"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T、セディーユ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T、キャロン"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T、ストローク"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U、チルド"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U、マクロン"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U、ブリーブ"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U、上リング"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U、ダブルアキュート"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U、オゴネク"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W、サーカムフレックス"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y、サーカムフレックス"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z、アキュート"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z、上点"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z、キャロン"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"長いS"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O、ホーン"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U、ホーン"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S、下カンマ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T、下カンマ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"シュワー"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A、下点"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A、上フック"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A、サーカムフレックスとアキュート"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A、サーカムフレックスとグレイヴ"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A、サーカムフレックスと上フック"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A、サーカムフレックスとチルド"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A、サーカムフレックスと下点"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A、ブリーブとアキュート"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A、ブリーブとグレイヴ"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A、ブリーブと上フック"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A、ブリーブとチルド"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A、ブリーブと下点"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E、下点"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E、上フック"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E、チルド"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E、サーカムフレックスとアキュート"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E、サーカムフレックスとグレイヴ"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E、サーカムフレックスと上フック"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E、サーカムフレックスとチルド"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E、サーカムフレックスと下点"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I、上フック"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I、下点"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O、下点"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O、上フック"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O、サーカムフレックスとアキュート"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O、サーカムフレックスとグレイヴ"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O、サーカムフレックスと上フック"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O、サーカムフレックスとチルド"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O、サーカムフレックスと下点"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O、ホーンとアキュート"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O、ホーンとグレイヴ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O、ホーンと上フック"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O、ホーンとチルド"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O、ホーンと下点"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U、下点"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U、上フック"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U、ホーンとアキュート"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U、ホーンとグレイヴ"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U、ホーンと上フック"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U、ホーンとチルド"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U、ホーンと下点"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y、グレイヴ"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y、下点"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y、上フック"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y、チルド"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"倒立感嘆符"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"左の二重角引用符"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"中点"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"上付き文字1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"右の二重角引用符"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"倒立疑問符"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"左の一重引用符"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"右の一重引用符"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"下の一重引用符"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"左の二重引用符"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"右の二重引用符"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ダガー"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ダブルダガー"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"パーミル記号"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"プライム"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ダブルプライム"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"左の一重角引用符"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"右の一重角引用符"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"上付き文字4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"上付きラテン小文字n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ペソ記号"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"宛名記号"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"右向き矢印"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"下向き矢印"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"空集合"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"インクリメント"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"小なりイコール"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"大なりイコール"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"黒星"</string> +</resources> diff --git a/java/res/values-ja/strings-talkback-descriptions.xml b/java/res/values-ja/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e4f5db5e3 --- /dev/null +++ b/java/res/values-ja/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"現在のテキスト: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"テキストが入力されていません"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>は<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>を<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>に修正します"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g>で自動修正が実行されます"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"不明な文字"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"記号拡張"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"記号"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"削除"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"記号"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"英字"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"数字"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"設定"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"タブ"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"音声入力"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"絵文字"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"検索"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ドット"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"言語を切り替え"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"次へ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"前へ"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift有効"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"CapsLock有効"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"記号モード"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"記号拡張モード"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"英数モード"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"電話モード"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"電話記号モード"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"キーボードは非表示です"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g>のキーボードを表示しています"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"日付"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"日時"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"メールアドレス"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"メッセージ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"数値"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"電話番号"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"テキスト"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"時刻"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"最近"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"人"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"物"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"自然"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"場所"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"記号"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"絵文字"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"大文字<xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"大文字I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"大文字I、上点"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"不明な記号"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"不明な絵文字"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"代替文字が利用可能です"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"代替文字が消去されます"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"代替候補が利用可能です"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"代替候補が消去されます"</string> +</resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index fbfd3b7f7..741dbb653 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"入力オプション"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"ログコマンドの検索"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"連絡先名の検索"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"スペルチェッカーでは連絡先リストのエントリを使用します"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"キー操作バイブ"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"キー操作音"</string> <string name="popup_on_keypress" msgid="123894815723512944">"キー押下時ポップアップ"</string> - <string name="general_category" msgid="1859088467017573195">"全般"</string> - <string name="correction_category" msgid="2236750915056607613">"テキストの修正"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"ジェスチャー入力"</string> - <string name="misc_category" msgid="6894192814868233453">"他のオプション"</string> - <string name="advanced_settings" msgid="362895144495591463">"詳細設定"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"上級者向けオプション"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"他の入力方法に切り替え"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"言語切り替えキーは他の入力方法にも対応しています"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"言語切り替えキー"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"システムのデフォルト"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"連絡先の名前を候補に表示"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"連絡先の名前を使用して候補表示や自動修正を行います"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"入力候補のカスタマイズ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>を改善"</string> <string name="use_double_space_period" msgid="8781529969425082860">"ダブルスペースピリオド"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"スペースバーをダブルタップするとピリオドとスペースを挿入できます"</string> <string name="auto_cap" msgid="1719746674854628252">"自動大文字変換"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"ジェスチャートレイルを表示"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"動的フローティングプレビュー"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ジェスチャーで入力候補を表示できます"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:保存しました"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"パスワードのキーが音声出力されるのでヘッドセットを接続してください。"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"現在のテキスト:%s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"テキストが入力されていません"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g>は<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>を<xliff:g id="CORRECTED">%3$s</xliff:g>に修正します"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g>で自動修正が実行されます"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"キーコード:%d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift有効(タップして解除)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock有効(タップして解除)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"DEL"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"記号"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"英字"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"数字"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"設定"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Space"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"音声入力"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"顔文字"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"検索"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"中点"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"言語を切り替え"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"次へ"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"前へ"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift有効"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock有効"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift解除"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"記号モード"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"英数モード"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"電話モード"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"電話記号モード"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"キーボードは非表示です"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g>のキーボードを表示しています"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"日付"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"日時"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"メールアドレス"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"メッセージ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"数値"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"電話番号"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"テキスト"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"時刻"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"フレーズジェスチャー"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Spaceキーに指を滑らせると、ジェスチャー中にスペースを入力できます"</string> <string name="voice_input" msgid="3583258583521397548">"音声入力キー"</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">"OFF"</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="voice_input_disabled_summary" msgid="8141750303464726129">"有効になっている音声入力方法がありません。[言語と入力]設定をご確認ください。"</string> <string name="configure_input_method" msgid="373356270290742459">"入力方法を設定"</string> <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string> <string name="send_feedback" msgid="1780431884109392046">"フィードバックを送信"</string> <string name="select_language" msgid="3693815588777926848">"入力言語"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"保存するにはもう一度タップ"</string> <string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string> <string name="keyboard_layout" msgid="8451164783510487501">"キーボードのテーマ"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英語 (英国)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英語 (米国)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"スペイン語 (米国)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"英語 (英国) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"英語 (米国) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"スペイン語 (米国) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g>(伝統言語)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"英語(英国)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"英語(米国)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"スペイン語(米国)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(伝統言語)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(キリル文字)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(ラテン文字)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"言語なし(アルファベット)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"アルファベット(QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"アルファベット(QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"アルファベット(Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"アルファベット(PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"絵文字"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"カラーパターン"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"白"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"青"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"カスタム入力スタイル"</string> <string name="add_style" msgid="6163126614514489951">"スタイル追加"</string> <string name="add" msgid="8299699805688017798">"追加"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"有効にする"</string> <string name="not_now" msgid="6172462888202790482">"後で行う"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"同じ入力スタイルが既に存在します: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"使いやすさの研究モード"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"キーの長押し時間"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"キー操作バイブの振動時間"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"キー操作音の音量"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"外部辞書ファイルの読み取り"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ダウンロードフォルダに辞書ファイルはありません"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"インストールする辞書ファイルの選択"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"この<xliff:g id="LOCALE_NAME">%s</xliff:g>のファイルをインストールしてもよろしいですか?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"この<xliff:g id="LANGUAGE_NAME">%s</xliff:g>のファイルをインストールしますか?"</string> <string name="error" msgid="8940763624668513648">"エラーが発生しました"</string> <string name="button_default" msgid="3988017840431881491">"デフォルト"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>へようこそ"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"更新"</string> <string name="last_update" msgid="730467549913588780">"最終更新"</string> <string name="message_updating" msgid="4457761393932375219">"アップデートを確認しています"</string> - <string name="message_loading" msgid="8689096636874758814">"読み込んでいます..."</string> + <string name="message_loading" msgid="5638680861387748936">"読み込んでいます…"</string> <string name="main_dict_description" msgid="3072821352793492143">"メイン辞書"</string> <string name="cancel" msgid="6830980399865683324">"キャンセル"</string> + <string name="go_to_settings" msgid="3876892339342569259">"設定"</string> <string name="install_dict" msgid="180852772562189365">"インストール"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"キャンセル"</string> <string name="delete_dict" msgid="756853268088330054">"削除"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"お使いの携帯端末で選択した言語に対応する辞書があります。<br/>入力機能をより快適にご利用いただくため、<xliff:g id="LANGUAGE">%1$s</xliff:g>の辞書の<b>ダウンロード</b>をおすすめします。<br/> <br/>3G経由の場合、ダウンロードに要する時間は1~2分です。<b>定額制のデータプラン</b>をご利用でない場合は通信料が発生する可能性があります。<br/>ご利用のデータプランが不明な場合は、自動的にダウンロードが開始されるWi-Fi接続を探すことをおすすめします。<br/> <br/>ヒント: 辞書のダウンロードや削除は、お使いの携帯端末の[<b>設定</b>]メニューの[<b>言語と入力</b>]で行えます。"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"お使いの携帯端末で選択した言語に対応する辞書があります。<br/>入力機能をより快適にご利用いただくため、<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>の辞書の<b>ダウンロード</b>をおすすめします。<br/> <br/>3G経由の場合、ダウンロードに要する時間は1~2分です。<b>定額制のデータプラン</b>をご利用でない場合は通信料が発生する可能性があります。<br/>ご利用のデータプランが不明な場合は、自動的にダウンロードが開始されるWi-Fi接続を探すことをおすすめします。<br/> <br/>ヒント: 辞書のダウンロードや削除は、お使いの携帯端末の[<b>設定</b>]メニューの[<b>言語と入力</b>]で行えます。"</string> <string name="download_over_metered" msgid="1643065851159409546">"今すぐダウンロード(<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi経由でダウンロード"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>の辞書を利用できます"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>の辞書を利用できます"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"押すと確認/ダウンロードできます"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ダウンロード中: <xliff:g id="LANGUAGE">%1$s</xliff:g>の入力候補をまもなく利用できます。"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ダウンロード中: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>の入力候補をまもなく利用できます。"</string> <string name="version_text" msgid="2715354215568469385">"バージョン<xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"追加"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"辞書に追加"</string> diff --git a/java/res/values-ka-rGE/strings-action-keys.xml b/java/res/values-ka-rGE/strings-action-keys.xml index e2dd05f7b..5fa92357c 100644 --- a/java/res/values-ka-rGE/strings-action-keys.xml +++ b/java/res/values-ka-rGE/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"წინა"</string> <string name="label_done_key" msgid="7564866296502630852">"დასრ."</string> <string name="label_send_key" msgid="482252074224462163">"გაგზ."</string> + <string name="label_search_key" msgid="7965186050435796642">"ძიება"</string> <string name="label_pause_key" msgid="2225922926459730642">"პაუზა"</string> <string name="label_wait_key" msgid="5891247853595466039">"მოცდა"</string> </resources> diff --git a/java/res/values-ka-rGE/strings-config-important-notice.xml b/java/res/values-ka-rGE/strings-config-important-notice.xml new file mode 100644 index 000000000..188ac871c --- /dev/null +++ b/java/res/values-ka-rGE/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"უკეთესი შეთავაზებისთვის თქვენი კომუნიკაციიდან და ტექსტიდან სწავლა"</string> +</resources> diff --git a/java/res/values-ka-rGE/strings-emoji-descriptions.xml b/java/res/values-ka-rGE/strings-emoji-descriptions.xml new file mode 100644 index 000000000..1840efc10 --- /dev/null +++ b/java/res/values-ka-rGE/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"საავტორო უფლების ნიშანი"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"რეგისტრირებული სავაჭრო ნიშნის სიმბოლო"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"ორმაგი ძახილის ნიშანი"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"ძახილის და კითხვის ნიშანი"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"სავაჭრო ნიშნის ნიშანი"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"ინფორმაციის წყარო"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"მარცხენა და მარჯვენა ისარი"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"ზედა და ქვედა ისარი"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"ჩრდილო დასავლეთის ისარი"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"ჩრდილო აღმოსავლეთის ისარი"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"სამხრეთ აღმოსავლეთის ისარი"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"სამხრეთ დასავლეთის ისარი"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"მარცხნივ მიმართული ისარი კაუჭით"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"მარჯვნივ მიმართული ისარი კაუჭით"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"საათი"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"ქვიშის საათი"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"მარჯვნივ მიმართული შავი ორმაგი სამკუთხედი"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"მარცხნივ მიმართული შავი ორმაგი სამკუთხედი"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"ზევით მიმართული შავი ორმაგი სამკუთხედი"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"ქვევით მიმართული შავი ორმაგი სამკუთხედი"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"მაღვიძარა"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"ქვიშის საათი ჩამოყრილი ქვიშით"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"წრეში ჩასმული ლათინური ასო m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"შავი პატარა კვადრატი"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"თეთრი პატარა კვადრატი"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"შავი მარჯვნივ მიმართული სამკუთხედი"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"შავი მარცხნივ მიმართული სამკუთხედი"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"თეთრი საშუალო კვადრატი"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"შავი საშუალო კვადრატი"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"თეთრი საშუალო პატარა კვადრატი"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"შავი საშუალო პატარა კვადრატი"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"შავი მზე სხივებით"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"ღრუბელი"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"შავი ტელეფონი"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"მონიშნული საარჩევნო ბიულეტენი"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"ქოლგა წვიმის წვეთებით"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"ცხელი სასმელი"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"თეთრი ზევით მიმართული საჩვენებელი"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"თეთრი მომღიმარი სახე"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"ვერძი"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"კურო"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"ტყუპები"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"კირჩხიბი"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"ლომი"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"ქალწული"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"სასწორი"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"მორიელი"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"მშვილდოსანი"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"თხის რქა"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"მერწყული"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"თევზები"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"ბანქოს შავი ყვავი"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"ბანქოს შავი ჯვარი"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"ბანქოს შავი გული"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"ბანქოს შავი აგური"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"ცხელი წყარო"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"უნივერსალური გადამუშავების შავი სიმბოლო"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"სატარებელი სავარძლის სიმბოლო"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"ღუზა"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"გაფრთხილების ნიშანი"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"მაღალი ძაბვის ნიშანი"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"საშუალო თეთრი წრე"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"საშუალო შავი წრე"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"ფეხბურთის ბურთი"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"ბეისბოლის ბურთი"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"თოვლის კაცი თოვლის გარეშე"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"ღრუბელს მიფარებული მზე"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"გველისმჭერის თანავარსკვლავედი"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"შესვლა აკრძალულია"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"ეკლესია"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"შადრევანი"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"ალამი ორმოში"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"იალქნიანი გემი"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"კარავი"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"საწვავის სატუმბი"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"შავი მაკრატელი"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"თეთრი მკვეთრი მონიშვნის ნიშანი"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"თვითმფრინავი"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"კონვერტი"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"აღმართული მუშტი"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"აღმართული ხელი"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"გამარჯვების აღმნიშვნელი ხელი"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"ფანქარი"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"შავი კალმის წვერი"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"მკვეთრი მონიშვნის ნიშანი"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"მკვეთრი გამრავლების x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"ნაპერწკლები"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"რვაწვერა ვარსკვლავი"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"რვაქიმიანი შავი ვარსკვლავი"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"ფიფქი"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"ნაპერწკალი"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"გადახაზვის ნიშანი"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"კვადრატში ჩასმული გადახაზული ნიშანი ნეგატივში"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"შავი კითხვის ნიშნის ორნამენტი"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"თეთრი კითხვის ნიშნის ორნამენტი"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"თეთრი ძახილის ნიშნის ორნამენტი"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"მკვეთრი ძახილის ნიშნის სიმბოლო"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"დიდი შავი გული"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"მკვეთრი პლუსის ნიშანი"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"მკვეთრი მინუსის ნიშანი"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"მკვეთრი გაყოფის ნიშანი"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"შავი მარჯვნივ მიმართული ისარი"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"მარყუჟი"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"ორმაგი მარყუჟი"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"მარჯვნივ მიმართული და ზევით მოხვეული ისარი"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"მარჯვნივ მიმართული და ქვევით მოხვეული ისარი"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"მარცხნივ მიმართული შავი ისარი"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"ზევით მიმართული შავი ისარი"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"მარცხნივ ქვევით მიმართული შავი ისარი"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"დიდი შავი კვადრატი"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"დიდი თეთრი კვადრატი"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"თეთრი საშუალო ვარსკვლავი"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"მკვეთრი დიდი წრე"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"ტალღოვანი ტირე"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"იორიტენი"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"მილოცვის იდეოგრაფი წრეში"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"საიდუმლოების იდეოგრაფი წრეში"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahjong მოზაიკის წითელი დრაკონი"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"ბანქოს შავი ჯოკერი"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"სისხლის ტიპი A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"სისხლის ტიპი B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"სისხლის ტიპი O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"პარკინგის ადგილი"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"სისხლის ტიპი AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"CL კვადრატში"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"cool კვადრატში"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"free კვადრატში"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ID კვადრატში"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"new კვადრატში"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"N G კვადრატში"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"OK კვადრატში"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"SOS კვადრატში"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"up ძახილის ნიშნით კვადრატში"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"vs კვადრატში"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"katakana koko კვადრატში"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"katakana sa კვადრატში"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"CJK უნიფიცირებული იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"დაჯავშნილი ადგილის იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"პროჰიბიციის იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"ვაკანსიის იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"მიღების იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"დაკავებულობის იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"იდეოგრაფი გადახდილია კვადრატში"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"იდეოგრაფი ყოველთვიურად კვადრატში"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"იდეოგრაფი აპლიკაცია კვადრატში"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"ფასდაკლების იდეოგრაფი კვადრატში"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"იდეოგრაფი მუშაობს კვადრატში"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"უპირატესობის იდეოგრაფი წრეში"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"მიღების იდეოგრაფი წრეში"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"ციკლონი"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"ნისლიანი"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"დახურული ქოლგა"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"ვარსკვლავიანი ღამე"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"მზის ამოსვლა მთებზე"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"მზის ამოსვლა"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"ქალაქის პეიზაჟი შებინდებისას"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"მზის ჩასვლა შენობების ფონზე"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"ცისარტყელა"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"ხიდი ღამით"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"წყლის ტალღა"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"ვულკანი"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"ირმის ნახტომი"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"გლობუსი ევროპა-აფრიკა"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"გლობუსი ამერიკა"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"გლობუსი აზია-ავსტრალია"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"გლობუსი მერიდიანებით"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"ახალი მთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"შევსებადი ნახევარმთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"პირველი მეოთხედის მთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"მილევადი ნახევარმთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"სავსე მთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"შევსებადი კუზიანი მთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"ბოლო მეოთხედის მთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"შევსებადი ნახევარმთვარის სიმბოლო"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"ნახევარმთვარე"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"ახალი მთვარი სახით"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"პირველი მეოთხედის მთვარე სახით"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"ბოლო მეოთხედის მთვარე სახით"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"სავსე მთვარე სახით"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"მზე სახით"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"მოკიაფე ვარსკვლავი"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"ჩამოვარდნილი ვარსკვლავი"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"წაბლი"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"ნერგი"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"მარადმწვანე ხე"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"ფოთლოვანი ხე"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"პალმის ხე"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"კაქტუსი"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"ტიტა"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"აყვავებული ალუბალი"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"ვარდი"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"ჰიბისკუსი"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"მზესუმზირა"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"ყვავილობა"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"სიმინდის ტარო"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"ბრინჯის თავთავი"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"ბალახი"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"ოთხფოთლიანი სამყურა"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"ნეკერჩხლის ფოთოლი"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"ჩამოვარდნილი ფოთოლი"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"ქარში მოფრიალე ფოთოლი"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"სოკო"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"პომიდორი"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"ბადრიჯანი"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"ყურძენი"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"ნესვი"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"საზამთრო"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"მანდარინი"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"ლიმონი"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"ბანანი"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"ანანასი"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"წითელი ვაშლი"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"მწვანე ვაშლი"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"მსხალი"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"ატამი"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"ალუბალი"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"მარწყვი"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"ჰამბურგერი"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"პიცას ნაჭერი"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"ხორცი ძვალზე"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"ქათმის ბარკალი"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"ბრინჯის კრეკერი"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"ბრინჯის გუნდა"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"მოხარშული ბრინჯი"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"კარი და ბრინჯი"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"ორთქლიანი თასი"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"სპაგეტი"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"პური"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"კარტოფილი ფრი"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"შემწვარი ტკბილი კარტოფილი"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"დანგო"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ოდენი"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"სუში"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"შემწვარი კრევეტი"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"ტორტი ლოკოკინის დიზაინით"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"ჩამოსასხმელი ნაყინი"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"გაცრილი ყინული"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"ნაყინი"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"დონატი"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"შინაური ნამცხვარი"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"შოკოლადის ფილა"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"კანფეტი"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"შაქარყინული"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"ნადუღის კრემი"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"თაფლის ქოთანი"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"ფხვიერი ნამცხვარი"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"ბენტოს ყუთი"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"საკვების თასი"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"სამზარეულო"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"დანა-ჩანგალი"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"ჩაის"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"საკეს ბოთლი და ჭიქა"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"ღვინის ჭიქა"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"კოქტეილის ჭიქა"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"ტროპიკული სასმელი"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"ლუდის კათხა"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"ლუდის კათხების მიჭახუნება"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"ჩვილის ბოთლი"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ლენტი"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"შეფუთული საჩუქარი"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"დაბადების დღის ტორტი"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"ჯეკის ფარანი"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"ნაძვის ხე"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"თოვლის ბაბუა"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"ფეიერვერკი"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ფეიერვერკის შუშხუნი"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"ბუშტი"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"სადღესასწაულო სატკაცუნო"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"კონფეტის ბურთი"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"ტანაბატას ტოტი"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"გადაჯვარედინებული დროშები"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"ფიჭვის დეკორაცია"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"იაპონური სათამაშოები"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"კარპას ალამი"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"ქარის ზარი"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"მთვარის ჭვრეტის ცერემონიალი"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"სკოლის ჩანთა"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"ოქსფორდის ქუდი"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"კარუსელის ცხენი"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"ეშმაკის ბორბალი"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"როლერკოსტერი"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"თევზი და ანკესი"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"მიკროფონი"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"კინოკამერა"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"კინოთეატრი"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"ყურსასმენი"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"მხატვრის პალიტრა"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"ცილინდრი"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"ცირკის კარავი"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"ბილეთი"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"კინოს ტკაცუნა"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"საშემსრულებლო ხელოვნება"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"ვიდეოთამაში"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"მიზანში გარტყმა"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"სლოტ-ავტომატი"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"ბილიარდი"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"კამათელი"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"ბოულინგი"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"ჰანაფუდა"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"მუსიკალური ნოტი"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"მუსიკალური ნოტები"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"საქსოფონი"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"გიტარა"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"კლავიშებიანი მუსიკალური ინსტრუმენტი"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"საყვირი"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"ვიოლინო"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"მუსიკალური ნოტები"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"სარბენი მაისური ლენტით"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"ტენისის ჩოგანი და ბურთი"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"თხილამური და ჩექმა"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"ბურთი და კალათა"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"კუბოკრული დროშა"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"სნოუბორდერი"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"მორბენალი"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"სერფერი"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"თასი"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"ცხენების დოღი"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"ამერიკული ფეხბურთის ბურთი"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"რაგბის ბურთი"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"მოცურავე"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"სახლის შენება"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"სახლი ბაღით"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"საოფისე შენობა"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"იაპონური ფოსტა"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"ევროპული ფოსტა"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"საავადმყოფო"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"ბანკი"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"ბანკომატი"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"სასტუმრო"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"სიყვარულის სასტუმრო"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"სადღეღამისო მაღაზია"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"სკოლა"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"უნივერსალური მაღაზია"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"ქარხანა"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"იზაკაიას ფარანი"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"იაპონური ციხე-სიმაგრე"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"ევროპული ციხე-სიმაგრე"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"ვირთხა"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"თაგვი"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"ხარი"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"აზიური კამეჩი"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"ძროხა"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"ლეოპარდი"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"კურდღელი"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"კატა"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"დრაკონი"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"ნიანგი"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"ვეშაპი"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"ლოკოკინა"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"გველი"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"ცხენი"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"ვერძი"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"თხა"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"ცხვარი"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"მაიმუნი"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"მამალი"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"ქათამი"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"ძაღლი"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"ღორი"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"დათვი"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"სპილო"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"რვაფეხა"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"სპირალური ნიჟარა"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"ხოჭო"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"ჭიანჭველა"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"ფუტკარი"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"ჭიამაია"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"თევზი"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"ტროპიკული თევზი"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"ზღარბთევზა"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"კუ"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"წიწილა და ნაჭუჭი"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"წიწილა"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"წიწილას სახე"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"ჩიტი"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"პინგვინი"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"კოალა"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"პუდელი"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"ცალკუზა აქლემი"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"ორკუზა აქლემი"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"დელფინი"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"თაგვის სახე"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"ძროხის სახე"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"ვეფხვის სახე"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"კურდღლის სახე"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"კატის სახე"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"დრაკონის სახე"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"მჩქეფარე ვეშაპი"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"ცხენის სახე"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"მაიმუნის სახე"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"ძაღლის სახე"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"ღორის სახე"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"ბაყაყის სახე"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"ზაზუნას სახე"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"მგლის სახე"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"დათვის სახე"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"პანდას სახე"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"ღორის ცხვირი"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"თათების კვალი"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"თვალები"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"ყური"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"ცხვირი"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"პირი"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"ენა"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"თეთრი ზევით მიმართული შეტრიალებული საჩვენებელი"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"თეთრი ქვევით მიმართული შეტრიალებული საჩვენებელი"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"თეთრი მარცხნივ მიმართული შეტრიალებული საჩვენებელი"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"თეთრი მარჯვნივ მიმართული შეტრიალებული საჩვენებელი"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"მომუშტული ხელი"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"ხელის დაქნევა"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ხელის ნიშანი OK"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"მაღლა აწეული ცერი"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"დაბლა დაწეული ცერი"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ტაშის დაკვრა"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"ღია ხელები"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"გვირგვინი"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"ქალის ქუდი"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"სათვალეები"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"ჰალსტუხი"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"მაისური"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ჯინსი"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"კაბა"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"კიმონო"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"ბიკინი"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"ქალის ტანსაცმელი"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"საფულე"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"ხელჩანთა"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"ქისა"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"კაცის ფეხსაცმელი"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"სპორტული ფეხსაცმელი"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"მაღალქუსლიანი ფეხსაცმელი"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"ქალის სანდალი"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"ქალის ჩექმა"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"ფეხის კვალი"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"ბიუსტი სილუეტში"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"ბიუსეტები სილუეტში"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ბიჭი"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"გოგო"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"კაცი"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ქალი"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"ოჯახი"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"ხელჩაკიდებული ქალი და კაცი"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"ხელჩაკიდებული ორი კაცი"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"ხელჩაკიდებული ორი ქალი"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"პოლიციელი"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"ქალი კურდღის ყურებით"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"პატარძალი პირბადით"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"ქერათმიანი ადამიანი"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"კაცი გუა-პი-მაოს ქუდით"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"კაცი ჩალმით"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"ხანდაზმული ადამიანი"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"ხანდაზმული ქალი"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"ჩვილი"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"მშენებელი"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"პრინცესა"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"იაპონელი კაციჭამია"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"იაპონელი გობლინი"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"მოჩვენება"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"ჩვილი ანგელოზი"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"უცხოპლანეტელი"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"უცხოპლანეტელი მონსტრი"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"ჭინკა"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"თავის ქალა"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"ინფორმაციის პუნქტის თანამშრომელი"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"მცველი"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"მოცეკვავე"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"პომადა"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"მანიკური"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"სახის მასაჟი"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"ვარცხნილობა"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"დალაქის ბოძი"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"შპრიცი"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"აბი"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"კოცნის ნიშანი"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"სასიყვარულო წერილი"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"დარეკვა"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"ძვირფასი ქვა"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"კოცნა"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"ბუკეტი"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"წყვილი გულით"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"ქორწილი"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"მფეთქავი გული"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"გატეხილი გული"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"ორი გული"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"მღელვარე გული"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"დიდი გული"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"გული ისრით"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"ლურჯი გული"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"მწვანე გული"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"ყვითელი გული"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"მეწამული გული"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"გული ლენტით"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"მბრუნავი გულები"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"გულის დეკორაცია"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"ალმასის ფორმა შიგნით წერტილით"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"ნათურა"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"სიბრაზის სიმბოლო"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"ბომბი"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"ძილის სიმბოლო"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"დაჯახების სიმბოლო"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"დაღვრილი ოფლის სიმბოლო"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"წვეთი"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"შხაპის სიმბოლო"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"განავალი"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"დაჭიმული კუნთი"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"თავბრუსხვევის სიმბოლო"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"დიალოგის ბუშტი"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"ფიქრის ბუშტი"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"თეთრი ყვავილი"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"ასქულიანი სიმბოლო"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"ფულის ჩანთა"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"ვალუტის გაცვლა"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"დოლარის მუქი ნიშანი"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"საკრედიტო ბარათი"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ბანკნოტი იენის ნიშნით"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"ბანკნოტი დოლარის ნიშნით"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ბანკნოტი ევროს ნიშნით"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"ბანკნოტი ფუნტის ნიშნით"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"ფრთიანი ფული"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"მატებადი დიაგრამა იენის ნიშნით"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"ადგილი"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"პერსონალური კომპიუტერი"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ქეისი"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisc"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Floppy დიკსი"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"ოპტიკური დისკი"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ფაილის საქაღალდე"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"ღია საქაღალდე"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"მოღუნული ქაღალდი"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"გვერდი პირაღმა"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"კალენდარი"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"მოსახევი კალენდარი"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"ბარათების ინდექსი"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"მატებადი დიაგრამა"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"კლებადი დიაგრამა"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"სვეტებიანი დიაგრამა"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"ფურცლის სამაგრი დაფა"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"საკანცელარიო ჭიკარტი"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"მომრგვალებული ჭიკარტი"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"ფურცლის საკინძი"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"სწორი სახაზავი"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"სამკუთხა სახაზავი"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"სანიშნის ყურები"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"დავთარი"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"რვეული"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"რვეული დეკორატიული ყდით"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"დახურული წიგნი"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"ღია წიგნი"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"მწვანე წიგნი"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"ლურჯი წიგნი"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"ნარინჯისფერი წიგნი"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"წიგნები"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"ბეჯი"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"გრაგნილი"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"ჩანაწერი"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"ყურმილი"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"პეიჯერი"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"ფაქსის აპარატი"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"სატელიტური ანტენა"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"რუპორი"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"გამამხნევებელი მეგაფონი"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"გამავალ წერილთა სათავსო"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"შემოსულების სათავსო"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"ამანათი"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"ელფოსტის სიმბოლო"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"შემომავალი კონვერტი"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"კონვერტი ქვედა ისრით ზევით"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"დახურული საფოსტო ყუთი დაშვებული ალმით"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"დახურული საფოსტო ყუთი აღმართული ალმით"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"ღია საფოსტო ყუთი აღმართული ალმით"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"ღია საფოსტო ყუთი დაშვებული ალმით"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"საფოსტო ყუთი"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"საფოსტო საყვირი"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"გაზეთი"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"მობილური ტელეფონი"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"მობილური ტელეფონი მარჯვნივ მიმართული ისრით მარცხნივ"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"ვიბრაციის რეჟიმი"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"მობილური ტელეფონის გამორთვა"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"მობილური ტელეფონები აკრძალულია"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"ანტენა სვეტებით"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"ფოტოაპარატი"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"ვიდეოკამერა"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"ტელევიზია"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"რადიო"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"ვიდეოკასეტა"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"გადაჯვარედინებული მარჯვნივ მიმართული ისრები"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"საათის მიმართულებით მარჯვენა და მარცხენა ღია წრიული ისრები"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"საათის მიმართულებით მარჯვენა და მარცხენა ღია წრიული ისრები, ერთიანით წრეში"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"საათის მიმართულებით ქვედა და ზედა ღია წრიული ისრები"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"საათის საწინააღმდეგო მიმართულებით ქვედა და ზედა ღია წრიული ისრები"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"დაბალი სიკაშკაშის სიმბოლო"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"მაღალი სიკაშკაშის სიმბოლო"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"ხაზგადასმული სპიკერი"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"სპიკერი"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"სპიკერი ხმის ერთი ტალღით"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"სპიკერი ხმის სამი ტალღით"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"ბატარეა"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"ელექტრონული შესაერთებელი"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"მარცხნივ მიმართული გამადიდებელი ლუპა"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"მარჯვნივ მიმართული გამადიდებელი ლუპა"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"საკეტი მელნის კალმით"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"დახურული საკეტი გასაღებით"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"გასაღები"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"საკეტი"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"ღია საკეტი"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"ზარი"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"ხაზგადასმული ზარი"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"სანიშნე"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"ბმულის სიმბოლო"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"არჩევანის ღილაკი"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Back მარცხენა ისრით ზევით"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"End მარცხენა ისრით ზევით"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"On ძახილის ნიშნით, მარცხენა მარჯვენა ისრით ზევით"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Soon მარჯვენა ისრით ზევით"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Top ზედა ისრით ზევით"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"18 წლამდე აკრძალვის სიმბოლო"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"კლავიში ათი"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"ლათინური დიდი ასოების შეყვანის სიმბოლო"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"ლათინური პატარა ასოების შეყვანის სიმბოლო"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"რიცხვების შეყვანის სიმბოლო"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"სიმბოლოთა შეყვანის სიმბოლო"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"ლათინური ასოების შეყვანის სიმბოლო"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"ხანძარი"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"ელექტრო ლამპარი"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"ქანჩი"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"ჩაქუჩი"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"თხილი და სამტვრევი"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"ჰოჩოს დანა"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"პისტოლეტი"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"მიკროსკოპი"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"ტელესკოპი"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"კრისტალის ბურთი"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"ექვსქიმა ვარსკვლავი შუა წერტილით"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"დამწყების იაპონური სიმბოლო"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"სამკაპის ემბლემა"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"შავი კვადრატული ღილაკი"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"თეთრი კვადრატული ღილაკი"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"დიდი წითელი წრე"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"დიდი ლურჯი წრე"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"დიდი ნარინჯისფერი ალმასი"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"დიდი ლურჯი ალმასი"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"პატარა ნარინჯისფერი ალმასი"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"პატარა ლურჯი ალმასი"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"ზევით მიმართული წითელი სამკუთხედი"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"ქვევით მიმართული წითელი სამკუთხედი"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"ზევით მიმართული პატარა წითელი სამკუთხედი"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"ქვევით მიმართული პატარა წითელი სამკუთხედი"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"საათი, რომელიც აჩვენებს პირველ საათს"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"საათი, რომელიც აჩვენებს ორ საათს"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"საათი, რომელიც აჩვენებს სამ საათს"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"საათი, რომელიც აჩვენებს ოთხ საათს"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"საათი, რომელიც აჩვენებს ხუთ საათს"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"საათი, რომელიც აჩვენებს ექვს საათს"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"საათი, რომელიც აჩვენებს შვიდ საათს"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"საათი, რომელიც აჩვენებს რვა საათს"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"საათი, რომელიც აჩვენებს ცხრა საათს"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"საათი, რომელიც აჩვენებს ათ საათს"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"საათი, რომელიც აჩვენებს თერთმეტ საათს"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"საათი, რომელიც აჩვენებს თორმეტ საათს"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"საათი, რომელიც აჩვენებს ორის ნახევარს"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"საათი, რომელიც აჩვენებს სამის ნახევარს"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"საათი, რომელიც აჩვენებს ოთხის ნახევარს"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"საათი, რომელიც აჩვენებს ხუთის ნახევარს"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"საათი, რომელიც აჩვენებს ექვსის ნახევარს"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"საათი, რომელიც აჩვენებს შვიდის ნახევარს"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"საათი, რომელიც აჩვენებს რვის ნახევარს"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"საათი, რომელიც აჩვენებს ცხრის ნახევარს"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"საათი, რომელიც აჩვენებს ათის ნახევარს"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"საათი, რომელიც აჩვენებს თერთმეტის ნახევარს"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"საათი, რომელიც აჩვენებს თორმეტის ნახევარს"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"საათი, რომელიც აჩვენებს პირველის ნახევარს"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"ფუძიამა"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"ტოკიოს ანძა"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"თავისუფლების ქანდაკება"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"იაპონიის სილუეტი"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"მოიანის ქვის ქანდაკება"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"სასტიკი სახე"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"სასტიკი სახე მომღიმარი თვალებით"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"სახე სიხარულის ცრემლებით"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"მომღიმარი პირდაღებული სახე"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"მომღიმარი სახე, ღია პირით და მოცინარი თვალებით"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"მომღიმარი სახე, ღია პირით და ცივი ოფლით"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"მომღიმარი სახე, ღია პირით და კარგად დახუჭული თვალებით"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"მომღიმარი სახე მნათი წრით"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"მომღიმარი სახე რქებით"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"თვალის ჩაკვრა"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"მომღიმარი სახე მომღიმარი თვალებით"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"გემრიელი საჭმლის დამაგემოვნებელი სახე"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"შებამოგვრილი სახე"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"მომღიმარი სახე გულის ფორმის თვალებით"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"მომღიმარი სახე მზის სათვალეებით"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"თავმომწონე სახე"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"ნეიტრალური სახე"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"უემოციო სახე"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"უკმაყოფილო სახე"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"სახე ცივი ოფლით"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"ჩაფიქრებული სახე"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"დაბნეული სახე"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"შეცბუნებული სახე"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"კოცნის სახე"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"კოცნის გაგზავნის სახე"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"კოცნის სახე მომღიმარი თვალებით"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"კოცნის სახე დახუჭული თვალებით"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"ენაგამოყოფილი სახე"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"ენაგამოყოფილი სახე თვალის ჩაკვრით"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"ენაგამოყოფილი სახე მჭიდროდ დახუჭული თვალებით"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"იმედგაცრუებული სახე"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"შეწუხებული სახე"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"ბრაზიანი სახე"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"გაბუტული სახე"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"მტირალი სახე"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"შეუპოვარი სახე"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"ტრიუმფალური სახე"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"იმედგაცრუებული მაგრამ შვებამოგვრილი სახე"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"წარბშეჭმუხნული პირდაღებული სახე"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"გატანჯული სახე"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"შიშნარევი სახე"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"დაქანცული სახე"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"მომძინარე სახე"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"დაღლილი სახე"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"დამანჭული სახე"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"ხმამაღლა მტირალი სახე"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"პირდაღებული სახე"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"გაჩუმებული სახე"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"სახე ღია პირით და ცივი ოფლით"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"შიშისგან მყვირალი სახე"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"გაოცებული სახე"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"წამოწითლებული სახე"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"მძინარი სახე"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"თავბრუდახვეული სახე"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"უპირო სახე"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"სახე სამედიცინო ნიღბით"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"სასტიკი კატის სახე მომღიმარი თვალებით"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"კატის სახე სიხარულის ცრემლებით"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"მომღიმარი კატის პირდაღებული სახე"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"მომღიმარი კატის სახე გულის ფორმის თვალებით"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"კატის სახე ირონიული ღიმილით"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"კოცნის სახე დახუჭული თვალებით"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"გაბუტული კატის სახე"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"მტირალი კატის სახე"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"დაქანცული კატის სახე"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"სახე უვარგისობის ჟესტით"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"სახე ok ჟესტით"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"ადამიანი თავის დაკვრით"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"არც-თუ-ისე ეშმაკი მაიმუნი"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"არ-მესმის მაიმუნი"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"არ ვლაპარაკობ მაიმუნი"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"ბედნიერი, ხელაწეული ადამიანი"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"სიხარულით ხელაპყრობილი ადამიანი"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"წარბშეკრული ადამიანი"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"ადამიანი გაბუტული სახით"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"ადამიანი დაწყობილი ხელებით"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"რაკეტა"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"ვერტმფრენი"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"ორთქლის ლოკომოტივი"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"რკინიგზის ვაგონი"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"ჩქაროსნული მატარებელი"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"ჩქაროსნული მატარებელი ტყვიის წვერით"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"მატარებელი"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"მეტრო"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"მსუბუქი რკინიგზა"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"სადგური"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"ტრამვაი"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"ტრამვაის ვაგონი"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"ავტობუსი"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"მომავალი ავტობუსი"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"ტროლეიბუსი"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"ავტობუსის გაჩერება"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"მიკროავტობუსი"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"სასწრაფო"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"სახანძრო"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"პოლიციის მანქანა"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"მომავალი პოლიციის მანქანა"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"ტაქსი"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"მომავალი ტაქსი"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"ავტომობილი"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"მომავალი ავტომობილი"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"რეკრეაციული ავტომანქანა"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"სატვირთო მანქანა"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"გადაბმული სატვირთო"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ტრაქტორი"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"მონორელსი"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"მთის რკინიგზა"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"შეჩერებული რკინიგზა"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"მთის საბაგირო"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"საბაგირო"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"გემი"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"სანიჩბოსნო ნავი"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"სწრაფმავალი მოტორიანი გემი"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"ჰორიზონტალური შუქნიშანი"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"ვერტიკალური შუქნიშანი"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"მშენებლობის ნიშანი"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"პოლიციის მანქანა შუქის სიგნალით"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"სამკუთხა ალამი პოსტზე"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"კარი"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"შესვლის აკრძალვის ნიშანი"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"მოწევის ნიშანი"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"მოწევის აკრძალვის ნიშანი"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"ნაგვის გამოყოფილ ადგილზე ჩაყრის სიმბოლო"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"სიმბოლო ნაგავი არ დაყაროთ"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"დასალევად ვარგისი წყლის სიმბოლო"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"დასალევად უვარგისი წყლის სიმბოლო"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"ველოსიპედი"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"ველოსიპედები არ არის"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"ველოსიპედისტი"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"სამთო ველოსიპედისტი"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"ფეხით მოსიარულე"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"ფეხით სიარული აკრძალულია"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"ბავშვების გადასასვლელი"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"კაცების ნიშანი"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"ქალების ნიშანი"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"საპირფარეშო"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"ჩვილების ნიშანი"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"ტუალეტი"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"უნიტაზი"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"შხაპი"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"სააბაზანო"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"აბაზანა"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"პასპორტის კონტროლი"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"საბაჟო"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"ბარგის აღება"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"ბარგის ჩაბარება"</string> +</resources> diff --git a/java/res/values-ka-rGE/strings-letter-descriptions.xml b/java/res/values-ka-rGE/strings-letter-descriptions.xml new file mode 100644 index 000000000..ae3ddabce --- /dev/null +++ b/java/res/values-ka-rGE/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ნიშანი მიკრო"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ერთიანი ზედა ინდექსში"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"მარცხნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"მარჯვნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ოთხიანი ზედა ინდექსში"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ლათინური ასო n ზედა ინდექსში"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"პესოს ნიშანი"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"მარჯვნივ მიმართული ისარი"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"ქვევით მიმართლი ისარი"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ნაკლებობა ან ტოლობა"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"მეტობა ან ტოლობა"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"შავი ვარსკვლავი"</string> +</resources> diff --git a/java/res/values-ka-rGE/strings-talkback-descriptions.xml b/java/res/values-ka-rGE/strings-talkback-descriptions.xml new file mode 100644 index 000000000..5d23b09e8 --- /dev/null +++ b/java/res/values-ka-rGE/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"შეაერთეთ ყურსასმენი, რათა მოისმინოთ აკრეფილი პაროლის კლავიშების სახელები."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"მიმდინარე ტექსტი არის %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ტექსტი შეყვანილი არ არის"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> შეასწორებს <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ს <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>-ად"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ასრულებს ავტოკორექციას"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"უცნობი სიმბოლო"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"დამატებითი სიმბოლოები"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"სიმბოლოები"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"წაშლა"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"სიმბოლოები"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ასოები"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"ნომრები"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"პარამეტრები"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab კლავიში"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"შორისი"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ხმოვანი შეყვანა"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"სიცილაკები"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"დაბრუნება"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ძიება"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"წერტილი"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ენის გადართვა"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"შემდ."</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"წინა"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ჩართულია"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"ჩართულია Caps"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"სიმბოლოების რეჟიმი"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"დამატებითი სიმბოლოების რეჟიმი"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"ასოების რეჟიმი"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ტელეფონის რეჟიმი"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ტელეფონის სიმბოლოების რეჟიმი"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"კლავიატურა დამალულია"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"ნაჩვენებია <xliff:g id="KEYBOARD_MODE">%s</xliff:g> კლავიატურა"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"თარიღი"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"თარიღი და დრო"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ელფოსტა"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"შეტყობინებები"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"რიცხვები"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ტელეფონი"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ტექსტი"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"დრო"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ბოლოს გამოყენებული"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ხალხი"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ობიექტები"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ბუნება"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ადგილები"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"სიმბოლოები"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"სიცილაკები"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"დიდი <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"დიდი I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"უცნობი სიმბოლო"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"უცნობი emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ალტერნატიული სიმბოლოები ხელმისაწვდომია"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ალტერნატიული სიმბოლოები გამოტოვებულია"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ალტერნატიული შეთავაზებები ხელმისაწვდომია"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ალტერნატიული შეთავაზებები გამოტოვებულია"</string> +</resources> diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml index dec6b3a6b..17e6b7ee4 100644 --- a/java/res/values-ka-rGE/strings.xml +++ b/java/res/values-ka-rGE/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"შეყვანის მეთოდები"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"კვლევის აღრიცხვის ბრძანებები"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"კონტაქტებში ძებნა"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"კონტაქტების სიის გამოყენება მართლწერის შემოწმებისას"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ვიბრაცია კლავიშზე დაჭერისას"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"ხმა კლავიშზე დაჭერისას"</string> <string name="popup_on_keypress" msgid="123894815723512944">"გადიდება ღილაკზე დაჭერისას"</string> - <string name="general_category" msgid="1859088467017573195">"ძირითადი"</string> - <string name="correction_category" msgid="2236750915056607613">"ტექსტის კორექცია"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"ჟესტებით წერა"</string> - <string name="misc_category" msgid="6894192814868233453">"სხვა პარამეტრები"</string> - <string name="advanced_settings" msgid="362895144495591463">"გაფართოებული პარამეტრები"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"პარამეტრები ექსპერტთათვის"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"შეყვანის პარამეტრები"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"იერსახე"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"მრავალენობრივი ვარიანტები"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"ჟესტით შეყვ. პარამეტრები"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"ტექსტის კორექცია"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"გაფართოებული"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"შეყვანის სხვა მეთოდებზე გადართვა"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ენის გადართვის ღილაკს შეყვანის სხვა მეთოდებსაც შეიცავს"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"ენის გადართვის კლავიში"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"სისტემის ნაგულისხმევი"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"კონტაქტის სახელების შეთავაზება"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"კონტაქტებიდან სახელების გამოყენება შეთავაზებებისთვის და კორექციისთვის"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"პერსონალიზებული შეთავაზებები"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-ის გაუმჯობესება"</string> <string name="use_double_space_period" msgid="8781529969425082860">"წერტილი ორმაგი შორისით"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"შორისზე ორჯერ შეხება დაწერს წერტილს და შორისის სიმბოლოს"</string> <string name="auto_cap" msgid="1719746674854628252">"ავტო-კაპიტალიზაცია"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"ჟესტიკულაციის კუდის ჩვენება"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"დინამიურად მოლივლივე გადახედვა"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ჟესტიკულაციისას შეთავაზებული სიტყვის ნახვა"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : შეინახა"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"შეაერთეთ ყურსაცვამი, რათა მოისმინოთ აკრეფილი პაროლის კლავიშების სახელები."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"მიმდინარე ტექსტი არის %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"ტექსტი არ შეყვანილა"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> შეასწორებს <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ს <xliff:g id="CORRECTED">%3$s</xliff:g>-ად"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> ასრულებს ავტოკორექციას"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"კლავიატურის კოდი %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ჩართულია (შეეხეთ გამოსართავად)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"ჩართულია Caps (შეეხეთ გამოსართავად)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"სიმბოლოები"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"ასოები"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"ნომრები"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"პარამეტრები"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"შორისი"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"ხმოვანი შეყვანა"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"ღიმილი"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"დაბრუნება"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"ძიება"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"წერტილი"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"ენის გადართვა"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"შემდეგი"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"წინა"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ჩართულია"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"ჩართულია Caps"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift გამორთულია"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"სიმბოლოების რეჟიმი"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"ასოების რეჟიმი"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"ტელეფონის რეჟიმი"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"ტელეფონის სიმბოლოების რეჟიმი"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"კლავიატურა დამალულია"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"ნაჩვენებია <xliff:g id="MODE">%s</xliff:g> კლავიატურა"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"თარიღი"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"თარიღი და დრო"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"ელფოსტა"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"შეტყობინებები"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"რიცხვები"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"ტელეფონი"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"ტექსტი"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"დრო"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ფრაზის ჟესტი"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"შეიყვანეთ შორისები ჟესტიკულაციისას შორისის კლავიშზე გასრიალებით"</string> <string name="voice_input" msgid="3583258583521397548">"ხმოვანი შეყვანის კლავიში"</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="voice_input_disabled_summary" msgid="8141750303464726129">"ხმოვანი შეყვანის მეთოდები ჩართული არ არის. შეამოწმეთ ენის & შეყვანის პარამეტრები."</string> <string name="configure_input_method" msgid="373356270290742459">"შეყვანის მეთოდების კონფიგურაცია"</string> <string name="language_selection_title" msgid="1651299598555326750">"შეყვანის ენები"</string> <string name="send_feedback" msgid="1780431884109392046">"უკუკავშირის გაგზავნა"</string> <string name="select_language" msgid="3693815588777926848">"შეყვანის ენები"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"შეეხეთ ისევ შესანახად"</string> <string name="has_dictionary" msgid="6071847973466625007">"ხელმისაწვდომია ლექსიკონი"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"მომხმარებლის უკუკავშირის ჩართვა"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"შეიტანეთ წვლილი შეყვანის ამ მეთოდის გაუმჯობესებაში — გააგზავნეთ მოხმარების სტატისტიკა და ავარიული გათიშვების ანგარიშები"</string> <string name="keyboard_layout" msgid="8451164783510487501">"კლავიატურის თემა"</string> <string name="subtype_en_GB" msgid="88170601942311355">"ინგლისური (გართ. სამ.)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"ინგლისური (აშშ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"ესპანური (აშშ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"ინგლისური (გაერთ. სამ.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"ინგლისური (აშშ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"ესპანური (აშშ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (ტრადიციული)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ინგლისური (გაერთ.სამ.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ინგლისური (აშშ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ესპანური (აშშ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ტრადიციული)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (კირილიცა)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ლათინური)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"ენის გარეშე (ანბანი)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ანბანი (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ანბანი (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ანბანი (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ანბანი (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"სიცილაკები"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"ფერის სქემა"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"თეთრი"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"ლურჯი"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"კლავიატურის თემა"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"ჰოლო-თეთრი"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"ჰოლო-ლურჯი"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"მუქი მასალა"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"ღია მასალა"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"შეყვანის სტილების კონფიგურაცია"</string> <string name="add_style" msgid="6163126614514489951">"სტილის დამატება"</string> <string name="add" msgid="8299699805688017798">"დამატება"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"ჩართვა"</string> <string name="not_now" msgid="6172462888202790482">"ახლა არა"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"შეყვანის იგივე სტილი უკვე არსებობს: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"გამოყენებადობის კვლევის რეჟიმი"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"კლავიშზე გრძელი დაჭერის დაყოვნება"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"კლავიშზე დაჭერის ვიბრაციის ხანგრძლივობა"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"კლავიშზე დაჭერის ხმა"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"გარე ლექსიკონის ფაილის წაკითხვა"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ჩამოტვირთვების საქაღალდეში ლექსიკონის ფაილები არ არის"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ინსტალაციისათვის აირჩიეთ ლექსიკონის ფაილი"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ნამდვილად გსურთ ამ ფაილის <xliff:g id="LOCALE_NAME">%s</xliff:g>-ისთვის ინსტალაცია?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ნამდვილად გსურთ ამ ფაილის <xliff:g id="LANGUAGE_NAME">%s</xliff:g>-ისთვის ინსტალაცია?"</string> <string name="error" msgid="8940763624668513648">"წარმოიშვა შეცდომა"</string> <string name="button_default" msgid="3988017840431881491">"ნაგულისხმევი"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"კეთილი იყოს თქვენი მობრძანება <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ში"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"განახლება"</string> <string name="last_update" msgid="730467549913588780">"ბოლო განახლება"</string> <string name="message_updating" msgid="4457761393932375219">"მიმდინარეობს განახლებების შემოწმება"</string> - <string name="message_loading" msgid="8689096636874758814">"იტვირთება…"</string> + <string name="message_loading" msgid="5638680861387748936">"იტვირთება..."</string> <string name="main_dict_description" msgid="3072821352793492143">"მთავარი ლექსიკონი"</string> <string name="cancel" msgid="6830980399865683324">"გაუქმება"</string> + <string name="go_to_settings" msgid="3876892339342569259">"პარამეტრები"</string> <string name="install_dict" msgid="180852772562189365">"ინსტალაცია"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"გაუქმება"</string> <string name="delete_dict" msgid="756853268088330054">"წაშლა"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"თქვენ მიერ მობილურ მოწყობილობაზე არჩეული ენისათვის ხელმისაწვდომია ლექსიკონი.<br/> გირჩევთ, <b>ჩამოტვირთოთ</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> ლექსიკონი, რათა გაიმარტივოთ ტექსტის შეყვანა.<br/> <br/> ჩამოტვირთვას შესაძლოა დაჭირდეს ერთი ან ორი წუთი 3G სისწრაფეზე. თუ ულიმიტო არ გაქვთ <b> მობილური ინტერნეტის ტარიფი</b>.<br/&gt, შესაძლოა ჩამოტვირთვა დამატებით გადასახადებთან იყოს დაკავშირებული; თუ არ ხართ დარწმუნებული მობილური ინტერნეტის აქტიური ტარიფის შესახებ, გირჩევთ იპოვოთ Wi-Fi კავშირი და ავტომატურად დაიწყოთ ჩამოტვირთვა.<br/> <br/> რჩევა: ლექსიკონების ჩამოტვირთვა და ამოშლა შესაძლებელია სექციიდან <b>ენა და შეყვანა</b> სექციიდან, თქვენი მობილური მოწყობილობის <b>პარამეტრების</b> მენიუში."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"თქვენ მიერ მობილურ მოწყობილობაზე არჩეული ენისთვის ხელმისაწვდომია ლექსიკონი.<br/> გირჩევთ, <b>ჩამოტვირთოთ</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ლექსიკონი, რათა გაიმარტივოთ ტექსტის შეყვანა.<br/> <br/> ჩამოტვირთვას შესაძლოა დასჭირდეს ერთი ან ორი წუთი 3G სისწრაფეზე. თუ <b> მობილური ინტერნეტის ტარიფი</b>.<br/&gt ულიმიტო არ გაქვთ, შესაძლოა გადახდა მოგიწიოთ; თუ არ ხართ დარწმუნებული მობილური ინტერნეტის აქტიური ტარიფის შესახებ, გირჩევთ, იპოვოთ Wi-Fi კავშირი და ავტომატურად დაიწყოთ ჩამოტვირთვა.<br/> <br/> რჩევა: ლექსიკონების ჩამოტვირთვა და ამოშლა შეიძლება სექციიდან <b>ენა და შეყვანა</b> თქვენი მობილური მოწყობილობის <b>პარამეტრების</b> მენიუში."</string> <string name="download_over_metered" msgid="1643065851159409546">"ახლა ჩამოტვირთვა (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>მბაიტი)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi კავშირზე ჩამოტვირთვა"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>-ისთვის ხელმისაწვდომია ლექსიკონი"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-სთვის ხელმისაწვდომია ლექსიკონი"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"დააჭირეთ განხილვას და ჩამოტვირთეთ"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ჩამოტვირთვა: <xliff:g id="LANGUAGE">%1$s</xliff:g>-ის შემოთავაზებები მალე მომზადდება."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"იტვირთება: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-ის შემოთავაზებები მალე მომზადდება."</string> <string name="version_text" msgid="2715354215568469385">"ვერსია <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"დამატება"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ლექსიკონში დამატება"</string> diff --git a/java/res/values-kk-rKZ/strings-action-keys.xml b/java/res/values-kk-rKZ/strings-action-keys.xml new file mode 100644 index 000000000..02144239f --- /dev/null +++ b/java/res/values-kk-rKZ/strings-action-keys.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for label_go_key (4033615332628671065) --> + <skip /> + <!-- no translation found for label_next_key (5586407279258592635) --> + <skip /> + <!-- no translation found for label_previous_key (1421141755779895275) --> + <skip /> + <!-- no translation found for label_done_key (7564866296502630852) --> + <skip /> + <!-- no translation found for label_send_key (482252074224462163) --> + <skip /> + <string name="label_search_key" msgid="7965186050435796642">"Іздеу"</string> + <!-- no translation found for label_pause_key (2225922926459730642) --> + <skip /> + <!-- no translation found for label_wait_key (5891247853595466039) --> + <skip /> +</resources> diff --git a/java/res/values-kk-rKZ/strings-appname.xml b/java/res/values-kk-rKZ/strings-appname.xml new file mode 100644 index 000000000..1e201fa9e --- /dev/null +++ b/java/res/values-kk-rKZ/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android пернетақтасы (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android емлені тексеру құралы (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android пернетақтасының параметрлері (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android емлені тексеру құралының параметрлері (AOSP)"</string> +</resources> diff --git a/java/res/values-kk-rKZ/strings-letter-descriptions.xml b/java/res/values-kk-rKZ/strings-letter-descriptions.xml new file mode 100644 index 000000000..8ba652a79 --- /dev/null +++ b/java/res/values-kk-rKZ/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Әйел реттік көрсеткіші"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Микро белгісі"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Еркек реттік көрсеткіші"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Эсцет"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A гравис"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A-акут"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Циркумфлексі бар а"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Тильдасы бар A"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A-умлаут"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Дөңгелегі бар A"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"AE, лигатура"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Седиль бар C"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Грейві бар E"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Акуты бар E"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Циркумфлексі бар E"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Тремасы бар Е"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Грейві бар I"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Акуты бар I"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Циркумфлексі бар I"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Тремасы бар I"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Тильдасы бар N"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Грейві бар O"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Акуты бар O"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Циркумфлексі бар O"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Тильдасы бар O"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Тремасы бар O"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Штрихі бар O"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Грейві бар U"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Акуты бар U"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Циркумфлексі бар U"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Тремасы бар U"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Акуты бар Y"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Тремасы бар Y"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Макроны бар A"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Бревисі бар A"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, огонэк"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Акуты бар C"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Циркумфлексі бар C"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Үстінде нүктесі бар C"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Гачек бар C"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Гачек бар D"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Штрихі бар D"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Макроны бар E"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Бревисі бар E"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Үстінде нүктесі бар E"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Огонэк бар E"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Гачек бар E"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Циркумфлексі бар G"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Бревисі бар G"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Үстінде нүктесі бар G"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Седиль бар G"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Циркумфлексі бар H"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Штрихі бар H"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Тильдасы бар I"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Макроны бар I"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Бревисі бар I"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Огонэк бар I"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Нүктесіз I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"IJ лигатурасы"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Циркумфлексі бар J"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Седиль бар K"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Акуты бар L"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Седиль бар L"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Гачек бар L"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"Үшкір нүктесі бар L"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Штрихі бар L"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Акуты бар N"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Седиль бар N"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Гачек бар N"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Алдында апострофы бар N"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Макроны бар O"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Бревисі бар O"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Қос акуты бар O"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"OE лигатурасы"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Акуты бар R"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Седиль бар R"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Гачек бар R"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Акуты бар S"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Циркумфлексі бар S"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Седиль бар S"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Гачек бар S"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Седиль бар T"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Гачек бар T"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Штрих бар T"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Тильдасы бар U"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Макроны бар U"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Бревисі бар U"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"Дөңгелегі бар U"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Қос акуты бар U"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Огонэк бар U"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Циркумфлексі бар W"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Циркумфлексі бар Y"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Акуты бар Z"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Үстінде нүктесі бар Z"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Гачек бар Z"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Ұзын S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Қармағы бар O"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"Қармағы бар U"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"Астында үтір бар S"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Астында үтір бар T"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Астында нүкте бар A"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"Үстінде ілгегі бар A"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"Циркумфлексі және акуты бар A"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"Циркумфлексі және грейві бар A"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"Үстінде циркумфлексі және ілгегі бар A"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"Циркумфлексі және тильдасы бар A"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"Астында циркумфлексі және нүктесі бар A"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Бревисі және акуты бар A"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"Бревисі және грейві бар A"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"Үстінде бревисі және ілгегі бар A"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"Бревисі және тильдасы бар A"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"Астында бревисі және нүктесі бар A"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Астында нүктесі бар E"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Үстінде ілгегі бар E"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Тильдасы бар E"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Циркумфлексі және акуты бар E"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Циркумфлексі және грейві бар E"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Үстінде циркумфлексі және ілгегі бар E"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Циркумфлексі және тильдасы бар E"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Астында циркумфлексі және нүктесі бар E"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"Үстінде ілгегі бар I"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"Астында нүктесі бар I"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Астында нүктесі бар O"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"Үстінде ілгегі бар O"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Циркумфлексі және акуты бар O"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"Циркумфлексі және грейві бар O"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"Үстінде циркумфлексі және ілгегі бар O"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"Циркумфлексі және тильдасы бар O"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Астында циркумфлексі және нүктесі бар O"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Қармағы және акуты бар O"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"Қармағы және грейві бар O"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"Үстінде қармағы және ілгегі бар O"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"Қармағы және тильдасы бар O"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"Астында қармағы және нүктесі бар O"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Астында нүктесі бар U"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Үстінде ілгегі бар U"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Қармағы және акуты бар U"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Қармағы және грейві бар U"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Үстінде қармағы және ілгегі бар U"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Қармағы және тильдасы бар U"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Астында қармағы және нүктесі бар U"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Грейві бар Y"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Астында нүктесі бар Y"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Үстінде қармағы бар Y"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Тильдасы бар Y"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Аударылған леп белгісі"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Жабатын тырнақша"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ортаңғы нүкте"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Жоғарғы индексті бір"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Ашатын тырнақша"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Аударылған сұрақ белгісі"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Сол жақ жалғыз тырнақша"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Оң жақ жалғыз тырнақша"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Жалғыз төмен-9 тырнақшасы"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Сол жақ қос тырнақша"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Оң жақ қос тырнақша"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Типографиялық шағын крест"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Қос типографиялық шағын крест"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Промилле белгісі"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Қос штрих"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Жалғыз ашатын бұрыштық тырнақша"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Жалғыз жабатын бұрыштық тырнақша"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Жоғарғы индексті төрт"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Жоғарғы индексті n латын шағын әрпі"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Песо белгісі"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Кімнің атына"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Оң жақ көрсеткі"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Төмен көрсеткі"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Диаметр"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Арту"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Азырақ немесе тең"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Үлкенірек немесе тең"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Қара жұлдызша"</string> +</resources> diff --git a/java/res/values-kk-rKZ/strings-talkback-descriptions.xml b/java/res/values-kk-rKZ/strings-talkback-descriptions.xml new file mode 100644 index 000000000..2d61bde13 --- /dev/null +++ b/java/res/values-kk-rKZ/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Белгісіз таңба"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Бас <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Бас I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Үстінде нүктесі бар бас I"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Белгісіз таңба"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Белгісіз эмодзи"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Баламалы таңбалар қол жетімді"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Баламалы таңбалар еленбейді"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Баламалы ұсыныстар қол жетімді"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Баламалы ұсыныстар еленбейді"</string> +</resources> diff --git a/java/res/values-kk-rKZ/strings.xml b/java/res/values-kk-rKZ/strings.xml new file mode 100644 index 000000000..24c99b3b5 --- /dev/null +++ b/java/res/values-kk-rKZ/strings.xml @@ -0,0 +1,227 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Енгізу опциялары"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Контакт аттарын іздеу"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Емлені тексеру құралы контактілер тізімінің жазбаларын пайдаланады"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Пернені басқан кездегі діріл"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Пернені басу кезіндегі дыбыс"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Пернені басқан кездегі ашылмалы мәзір"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Басқа енгізу әдістеріне ауыстырыңыз"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Тілді ауыстыру пернесі басқа енгізу әдістерін де қамтиды"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Тілді ауыстыру пернесі"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Бірнеше енгізу тілдері қосылған кезде көрсету"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Жылжыту индикаторын көрсету"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift немесе Таңба пернелерінен жылжыту кезіндегі көрнекі сөзкөмекті көрсету"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Перненің ашылмалы мәзірі кідірісті жояды"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Кідіріс жоқ"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Әдепкі"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>мс"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Жүйе әдепкісі"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Контакт аттарын ұсыну"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Ұсыныстар мен түзетулер үшін контакт аттарын пайдалану"</string> + <!-- no translation found for use_personalized_dicts (5167396352105467626) --> + <skip /> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> жақсарту"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Қос бос орын кезеңі"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Бос орынға екі рет түрту бос орыннан кейінгі кезеңді енгізеді"</string> + <string name="auto_cap" msgid="1719746674854628252">"Авто бас әріптерге түрлендіру"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Әрбір сөйлемнің бірінші әріпін бас әріпке түрлендіру"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Жеке сөздік"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Қосымша сөздіктер"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Негізгі сөздік"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Түзету ұсыныстарын көрсету"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Теру кезінде ұсынылған сөздерді көрсету"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Үнемі көрсету"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Портрет режимінде көрсету"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Үнемі жасыру"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Қорлаушы сөздерді құлыптамау"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Қорлаушы сөздерді ұсынбау"</string> + <string name="auto_correction" msgid="7630720885194996950">"Авто түзету"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Бос орын және тыныс белгі автоматты түрде қателерді түзетеді"</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_aggressive" msgid="7319007299148899623">"Белсенді"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Өте белсенді"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Келесі сөз ұсыныстары"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Ұсыныстар жасауда бастапқы сөзді пайдалану"</string> + <string name="gesture_input" msgid="826951152254563827">"Қимылмен теруді қосу"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Әріптерді жанап өту арқылы сөзді енгізу"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Қимыл қадамын көрсету"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамикалық қалқымалы қарап шығу"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Қимылдау кезінде ұсынылған сөзді көру"</string> + <!-- no translation found for gesture_space_aware (2078291600664682496) --> + <skip /> + <!-- no translation found for gesture_space_aware_summary (4371385818348528538) --> + <skip /> + <string name="voice_input" msgid="3583258583521397548">"Дауыстық енгізу пернесі"</string> + <!-- no translation found for voice_input_disabled_summary (8141750303464726129) --> + <skip /> + <string name="configure_input_method" msgid="373356270290742459">"Енгізу әдістерін теңшеу"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Енгізу тілдері"</string> + <string name="send_feedback" msgid="1780431884109392046">"Кері байланыс жіберу"</string> + <string name="select_language" msgid="3693815588777926848">"Енгізу тілдері"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Сақтау үшін қайта түртіңіз"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Сөздік қолжетімді"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Пернетақта тақырыбы"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ағылшын (ҰБ)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ағылшын (АҚШ)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Испан (АҚШ)"</string> + <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (510930471167541338) --> + <skip /> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <string name="subtype_no_language" msgid="7137390094240139495">"Тіл жоқ (әліпби)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Әліпби (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Әліпби (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Әліпби (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Әліпби (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Әліпби (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Әліпби (ДК)"</string> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Реттелетін енгізу стильдері"</string> + <string name="add_style" msgid="6163126614514489951">"Стиль қосу"</string> + <string name="add" msgid="8299699805688017798">"Қосу"</string> + <string name="remove" msgid="4486081658752944606">"Аластау"</string> + <string name="save" msgid="7646738597196767214">"Сақтау"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Тіл"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Пішім"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Реттелетін енгізу стилі пайдалануды бастамас бұрын қосылуы қажет. Оны қазір қосу қажет пе?"</string> + <string name="enable" msgid="5031294444630523247">"Қосу"</string> + <string name="not_now" msgid="6172462888202790482">"Қазір емес"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Бірдей енгізу стилі бұрыннан бар: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Пернені ұзақ басу кідірісі"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Пернені басқан кездегі діріл ұзақтығы"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Пернені басқан кездегі дыбыс деңгейі"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Сыртқы сөздік файлын оқу"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Жүктеп алулар қалтасында сөздік файлдары жоқ"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Орнату үшін сөздік файлын таңдау"</string> + <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) --> + <skip /> + <string name="error" msgid="8940763624668513648">"Қате болды"</string> + <string name="button_default" msgid="3988017840431881491">"Әдепкі"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасына қош келдіңіз"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"Қимылмен теру арқылы"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Іске қосылды"</string> + <string name="setup_next_action" msgid="371821437915144603">"Келесі қадам"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> орнату"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қосу"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Тіл & енгізу параметрлерінде <xliff:g id="APPLICATION_NAME">%s</xliff:g> тексеріңіз. Бұл оған құрылғыңызды басқаруға рұқсат береді."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасы әлдеқашан Тіл & енгізу параметрлерінде қосылған, сол себепті бұл қадам орындалған.Келесі біреуін қосыңыз!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Параметрлер ішінде қосу"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасына ауыстыру"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Одан кейін \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" қолданбасын белсенді мәтінді енгізу әдісі ретінде таңдаңыз."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Енгізу әдістерін ауыстыру"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Құттықтаймыз, барлығы дайын!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Қазір барлық таңдаулы қолданбаларда <xliff:g id="APPLICATION_NAME">%s</xliff:g> арқылы теруге болады."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Қосымша тілдерді теңшеу"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Аяқталған"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Қолданба белгішесін көрсету"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Іске қосу құралындағы қолданба белгішесін көрсету"</string> + <string name="app_name" msgid="6320102637491234792">"Сөздік провайдері"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Сөздік провайдері"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Сөздік қызметі"</string> + <string name="download_description" msgid="6014835283119198591">"Сөздікті жаңарту ақпараты"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Қосымша сөздіктер"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Сөздік қолжетімді"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Сөздіктер параметрлері"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Пайдаланушы сөздіктері"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Пайдаланушы сөздігі"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Сөздік қолжетімді"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Ағымда жүктеп алынуда"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Орнатылған"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Орнатылған, өшірілген"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Сөздік қызметіне қосылу мәселесі"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Сөздіктер қолжетімсіз"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Жаңарту"</string> + <string name="last_update" msgid="730467549913588780">"Соңғы жаңартылған"</string> + <string name="message_updating" msgid="4457761393932375219">"Жаңартуларды тексеру"</string> + <!-- no translation found for message_loading (5638680861387748936) --> + <skip /> + <string name="main_dict_description" msgid="3072821352793492143">"Негізгі сөздік"</string> + <string name="cancel" msgid="6830980399865683324">"Болдырмау"</string> + <!-- no translation found for go_to_settings (3876892339342569259) --> + <skip /> + <string name="install_dict" msgid="180852772562189365">"Орнату"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Болдырмау"</string> + <string name="delete_dict" msgid="756853268088330054">"Жою"</string> + <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) --> + <skip /> + <string name="download_over_metered" msgid="1643065851159409546">"Қазір жүктеп алу (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>МБ)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi арқылы жүктеп алу"</string> + <!-- no translation found for dict_available_notification_title (4583842811218581658) --> + <skip /> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Қарап шығу және жүктеп алу үшін басу"</string> + <!-- no translation found for toast_downloading_suggestions (6128155879830851739) --> + <skip /> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> нұсқасы"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Қосу"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Сөздікке қосу"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Фраза"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Басқа талғаулар"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Аз опциялар"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Жарайды"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Сөз:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Пернелер тіркесімі:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Тіл:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Сөзді теру"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Қосымша пернелер тіркесімі"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Сөзді өңдеу"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Өңдеу"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Жою"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Пайдаланушы сөздігінде сөздер жоқ. Қосу (+) түймесін басу арқылы сөзді қосыңыз."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Барлық тілдер үшін"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Қосымша тілдер…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Жою"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ"</string> +</resources> diff --git a/java/res/values-kk/strings-talkback-descriptions.xml b/java/res/values-kk/strings-talkback-descriptions.xml new file mode 100644 index 000000000..39388a4d7 --- /dev/null +++ b/java/res/values-kk/strings-talkback-descriptions.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="896961781287283493">"Дауыспен айтылатын құпия сөз кілттерін есту үшін құлақаспап қосыңыз."</string> + <string name="spoken_current_text_is" msgid="2485723011272583845">"Ағымдағы мәтін - %s"</string> + <string name="spoken_no_text_entered" msgid="7479685225597344496">"Мәтін енгізілмеген"</string> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (5139930082759824442) --> + <skip /> + <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> + <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift қосулы (өшіру үшін түрту)"</string> + <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock қосулы (өшіру үшін түрту)"</string> + <string name="spoken_description_delete" msgid="8740376944276199801">"Жою"</string> + <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Таңбалар"</string> + <string name="spoken_description_to_alpha" msgid="23129338819771807">"Әріптер"</string> + <string name="spoken_description_to_numeric" msgid="591752092685161732">"Сандар"</string> + <string name="spoken_description_settings" msgid="4627462689603838099">"Баптаулар"</string> + <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> + <string name="spoken_description_space" msgid="2582521050049860859">"Бос орын"</string> + <string name="spoken_description_mic" msgid="615536748882611950">"Дауыстық енгізу"</string> + <string name="spoken_description_smiley" msgid="2256309826200113918">"Жымиған жүз"</string> + <string name="spoken_description_return" msgid="8178083177238315647">"Қалпына келтіру"</string> + <string name="spoken_description_search" msgid="1247236163755920808">"Іздеу"</string> + <string name="spoken_description_dot" msgid="40711082435231673">"Нүкте"</string> + <string name="spoken_description_language_switch" msgid="5507091328222331316">"Тілді ауыстыру"</string> + <string name="spoken_description_action_next" msgid="8636078276664150324">"Келесі"</string> + <string name="spoken_description_action_previous" msgid="800872415009336208">"Алдағы"</string> + <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift қосылған"</string> + <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock қосылған"</string> + <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift өшірілген"</string> + <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Таңбалар режимі"</string> + <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Әріптер режимі"</string> + <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Телефон режимі"</string> + <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Телефон таңбалары режимі"</string> + <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Пернетақта жасырылған"</string> + <string name="announce_keyboard_mode" msgid="4729081055438508321">"Көрсетілетін <xliff:g id="MODE">%s</xliff:g> пернетақтасы"</string> + <string name="keyboard_mode_date" msgid="3137520166817128102">"күн"</string> + <string name="keyboard_mode_date_time" msgid="339593358488851072">"күн мен уақыт"</string> + <string name="keyboard_mode_email" msgid="6216248078128294262">"электрондық пошта"</string> + <string name="keyboard_mode_im" msgid="1137405089766557048">"хабар алмасу"</string> + <string name="keyboard_mode_number" msgid="7991623440699957069">"нөмір"</string> + <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефон"</string> + <string name="keyboard_mode_text" msgid="6479436687899701619">"мәтін"</string> + <string name="keyboard_mode_time" msgid="4381856885582143277">"уақыт"</string> + <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> +</resources> diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml index 947ff2fe9..29780513c 100644 --- a/java/res/values-kk/strings.xml +++ b/java/res/values-kk/strings.xml @@ -21,7 +21,6 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Енгізу опциялары"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Журнал пәрмендерін зерттеу"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Контакт аттарын іздеу"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Емлені тексеру құралы контактілер тізімінің жазбаларын пайдаланады"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Пернені басқан кездегі діріл"</string> @@ -73,66 +72,15 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Қимыл қадамын көрсету"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамикалық қалқымалы қарап шығу"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Қимылдау кезінде ұсынылған сөзді көру"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сақталды"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Дауыспен айтылатын құпия сөз кілттерін есту үшін құлақаспап қосыңыз."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Ағымдағы мәтін - %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Мәтін енгізілмеген"</string> - <!-- no translation found for spoken_auto_correct (8005997889020109763) --> - <skip /> - <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> - <skip /> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Перне коды %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift қосулы (өшіру үшін түрту)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock қосулы (өшіру үшін түрту)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Жою"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Таңбалар"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Әріптер"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Сандар"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Баптаулар"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Бос орын"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Дауыстық енгізу"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Жымиған жүз"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Қалпына келтіру"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Іздеу"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Нүкте"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Тілді ауыстыру"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Келесі"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Алдағы"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift қосылған"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock қосылған"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift өшірілген"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Таңбалар режимі"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Әріптер режимі"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Телефон режимі"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Телефон таңбалары режимі"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Пернетақта жасырылған"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Көрсетілетін <xliff:g id="MODE">%s</xliff:g> пернетақтасы"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"күн"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"күн мен уақыт"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"электрондық пошта"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"хабар алмасу"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"нөмір"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефон"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"мәтін"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"уақыт"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="8244483979855138643">"Фраза қимылы"</string> + <string name="gesture_space_aware_summary" msgid="3226298212755100667">"Бос орын пернесін жанау арқылы қимылдар барысында бос орындарды енгізу"</string> <string name="voice_input" msgid="3583258583521397548">"Дауыстық енгізу пернесі"</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">"Негізгі пернетақтадағы Mic"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Таңбалар пернетақтасындағы Mic"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Дауыстық енгізу өшірілген"</string> <string name="configure_input_method" msgid="373356270290742459">"Енгізу әдістерін теңшеу"</string> <string name="language_selection_title" msgid="1651299598555326750">"Енгізу тілдері"</string> <string name="send_feedback" msgid="1780431884109392046">"Кері байланыс жіберу"</string> <string name="select_language" msgid="3693815588777926848">"Енгізу тілдері"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Сақтау үшін қайта түртіңіз"</string> <string name="has_dictionary" msgid="6071847973466625007">"Сөздік қолжетімді"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Пайдаланушының кері байланысын қосу"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Қолданыс статистикасын және бұзылыс есептерін автоматты түрде жіберу арқылы осы енгізу әдісінің редакторын арттыруға көмектесу"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Пернетақта тақырыбы"</string> <string name="subtype_en_GB" msgid="88170601942311355">"ағылшын (ҰБ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"ағылшын (АҚШ)"</string> @@ -162,7 +110,6 @@ <string name="enable" msgid="5031294444630523247">"Қосу"</string> <string name="not_now" msgid="6172462888202790482">"Қазір емес"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Бірдей енгізу стилі бұрыннан бар: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Қолайлылықты зерттеу режимі"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Пернені ұзақ басу кідірісі"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Пернені басқан кездегі діріл ұзақтығы"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Пернені басқан кездегі дыбыс деңгейі"</string> diff --git a/java/res/values-km-rKH/donottranslate.xml b/java/res/values-km-rKH/donottranslate-config-spacing-and-punctuations.xml index a9893feec..a9893feec 100644 --- a/java/res/values-km-rKH/donottranslate.xml +++ b/java/res/values-km-rKH/donottranslate-config-spacing-and-punctuations.xml diff --git a/java/res/values-km-rKH/strings-action-keys.xml b/java/res/values-km-rKH/strings-action-keys.xml index ff747d9f5..3ff6d49b1 100644 --- a/java/res/values-km-rKH/strings-action-keys.xml +++ b/java/res/values-km-rKH/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"មុន"</string> <string name="label_done_key" msgid="7564866296502630852">"រួចរាល់"</string> <string name="label_send_key" msgid="482252074224462163">"ផ្ញើ"</string> + <string name="label_search_key" msgid="7965186050435796642">"ស្វែងរក"</string> <string name="label_pause_key" msgid="2225922926459730642">"ផ្អាក"</string> <string name="label_wait_key" msgid="5891247853595466039">"រង់ចាំ"</string> </resources> diff --git a/java/res/values-km-rKH/strings-config-important-notice.xml b/java/res/values-km-rKH/strings-config-important-notice.xml new file mode 100644 index 000000000..9d694db74 --- /dev/null +++ b/java/res/values-km-rKH/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"សិក្សាការភ្ជាប់របស់អ្នកនិងទិន្នន័យដែលបានបញ្ចូលដើម្បីធ្វើសំណើឲ្យល្អ"</string> +</resources> diff --git a/java/res/values-km-rKH/strings-emoji-descriptions.xml b/java/res/values-km-rKH/strings-emoji-descriptions.xml new file mode 100644 index 000000000..757df50e7 --- /dev/null +++ b/java/res/values-km-rKH/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"សញ្ញារក្សាសិទ្ធ"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"សញ្ញាចុះបញ្ជី"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"សញ្ញាឧទានពីរ"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"សញ្ញាឧទានសញ្ញាសួរ"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"សញ្ញានិក្ខិត្តសញ្ញា"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"ប្រភពព័ត៌មាន"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"ព្រួញឆ្វេងស្ដាំ"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"ព្រួញឡើងលើចុះក្រោម"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"ព្រួញទិសពាយព្យ"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"ព្រួញទិសឥសាន្តឦសាន្ត"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"ព្រួញទិសអាគ្នេយ៍"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"ព្រួញទិសនិរតី"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"ព្រួញទៅឆ្វេងមានទំពក់"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"ព្រួញទៅស្ដាំមានទំពក់"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"នាឡិកាដៃ"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"នាឡិកាពិសោធន៍"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"ត្រីកោណខ្មៅពីរចង្អុលទៅស្ដាំ"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"ត្រីកោណខ្មៅពីរចង្អុលទៅឆ្វេង"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"ត្រីកោណខ្មៅពីរចង្អុលឡើងលើ"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"ត្រីកោណខ្មៅពីរចង្អុលចុះក្រោម"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"នាឡិការោទ៍"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"កែវពិសោធន៍មានខ្សាច់ហូរ"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"អក្សរអឹមធំក្នុងរង្វង់"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"ការ៉េតូចពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"ការ៉េតូចពណ៌ស"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"ត្រីកោណចង្អុលស្ដាំពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"ត្រីកោណចង្អុលឆ្វេងពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"ការ៉េមធ្យមពណ៌ស"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"ការ៉េមធ្យមពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"ការ៉េតូចមធ្យមពណ៌ស"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"ការ៉េតូចមធ្យមពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"ព្រះអាទិត្យពណ៌ខ្មៅបញ្ចេញពន្លឺ"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"ពពក"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"ទូរស័ព្ទពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"ប្រអប់មានសញ្ញាធីក"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"ឆត្រមានតំណក់ទឹកភ្លៀង"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"ភេសជ្ជៈក្ដៅ"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"ចង្អុលដៃចង្អុលឡើងពណ៌ស"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"មុខញញឹមពណ៌ស"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"មេសៈរាសី"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"តៅរ៉ូស"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"ហ្គិមីនី"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"សញ្ញាទី៤នៃរាសីចក្រ"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"លីអូ"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"សញ្ញារាសី"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"លីប្រា"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"រាសីវច្ចៈ"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"រាសីធ្នូ"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"រាសីសេះ"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquarius"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"រាសីអាប់អួ"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"ឈុតប៊ិចពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"ឈុតជួងពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"ឈុតកឺពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"ឈុតការ៉ូពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Hot springs"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"និមិត្តសញ្ញាធុងសំរាមសកលពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"និមិត្តសញ្ញារទេះរុញ"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"យុថ្កា"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"សញ្ញាព្រមាន"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"សញ្ញាតង់ស្យុងខ្ពស់"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"រង្វង់ពណ៌សមធ្យម"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"រង្វង់ពណ៌ខ្មៅមធ្យម"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"បាល់ទាត់"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"បាល់បោះ"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"អ្នកលេងព្រិលដោយគ្មានព្រិល"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"ព្រះអាទិត្យនៅក្រោយពពក"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"សញ្ញា (⛎)"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"ហាមចូល"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"វិហារសាសនា"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"បាញ់ទឹក"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"ទង់ជាតិក្នុងរន្ធ"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"ទូកក្ដោង"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"តង់"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"បូមប្រេង"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"កន្ត្រៃពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"សញ្ញាធីកពណ៌សធំ"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"យន្តហោះ"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"ស្រោមសំបុត្រ"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"លើកកណ្ដាប់ដៃ"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"លើកដៃ"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"លើកដៃជ័យជម្នះ"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"ខ្មៅដៃ"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"ចុងខ្មៅដៃ"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"សញ្ញាធីកដិត"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"សញ្ញាគុណដិត"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"បញ្ចេញពន្លឺ"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"ផ្កាយប្រាំបីជ្រុង"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"ផ្កាយប្រាំបីជ្រុងដិត"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"សញ្ញា (❄)"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"បញ្ចេញពន្លឺ"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"សញ្ញាខ្វែង"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"សញ្ញាខ្វែងក្នុងប្រអប់"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"សញ្ញាសួរពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"សញ្ញាសួរពណ៌ស"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"សញ្ញាឧទានពណ៌ស"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"សញ្ញាឧទានពណ៌ខ្មៅដិត"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"បេះដូងពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"សញ្ញាបូកដិត"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"សញ្ញាដកដិត"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"សញ្ញាចែកដិត"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"ព្រួញទៅស្ដាំពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"រង្វង់អង្កាញ់"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"រង្វង់អង្កាញ់ពីរ"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"ព្រួញចង្អុលទៅស្ដាំបន្ទាប់មកបត់ឡើងលើ"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"ព្រួញចង្អុលទៅស្ដាំបន្ទាប់មកបត់ចុះក្រោម"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"ព្រួញពណ៌ខ្មៅទៅឆ្វេង"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"ព្រួញពណ៌ខ្មៅឡើងលើ"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"ព្រួញពណ៌ខ្មៅចុះក្រោម"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"ប្រអប់ការ៉េធំពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"ប្រអប់ការ៉េធំពណ៌ស"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"ផ្កាយមធ្យមពណ៌ស"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"រង្វង់ធំដិត"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"សញ្ញារលកដិត"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"សញ្ញា (〽)"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"សញ្ញា (㊗)"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"សញ្ញា (㊙)"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"សញ្ញា (🀄)"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"សញ្ញា (🃏)"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"ឈាមប្រភេទ A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"ឈាមប្រភេទ B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"ឈាមប្រភេទ O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"ចំណត"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"ឈាមប្រភេទ AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"ប្រអប់ CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"ប្រអប់ cool"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"ប្រអប់ free"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ប្រអប់ ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"ប្រអប់ new"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"ប្រអប់ N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"ប្រអប់ OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"ប្រអប់ SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"ប្រអប់ up!"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"ប្រអប់ vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"សញ្ញា (🈁)"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"សញ្ញា (🈂)"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"សញ្ញា (🈚)"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"សញ្ញា (🈯)"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"សញ្ញា (🈲)"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"សញ្ញា (🈳)"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"សញ្ញា (🈴)"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"សញ្ញា (🈵)"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"សញ្ញា (🈶)"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"សញ្ញា (🈷)"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"សញ្ញា (🈸)"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"សញ្ញា (🈹)"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"សញ្ញា (🈺)"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"សញ្ញា (🉐)"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"សញ្ញា (🉑)"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"ស៊ីក្លូន"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"អ័ភ្រ"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"ឆត្របិទ"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"រាត្រីមានផ្កាយ"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"ព្រះអាទិត្យលើភ្នំ"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"ព្រះអាទិត្យរះ"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"ទីក្រុងពេលព្រលប់"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"ព្រះអាទិត្យលិចចន្លោះអាគារ"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"ឥន្ទធនូ"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"ស្ពានពេលរាត្រី"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"ទឹករលក"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"ភ្នំភ្លើង"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"មេឃស្រទំ"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"ភូគោលអឺរ៉ុប-អាហ្រិក"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"ភូគោលអាមេរិក"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"ភូគោលអាស៊ី-អូស្ត្រាលី"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"ភូគោលមានខ្សែវណ្ឌ"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"ព្រះចន្ទ"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"ព្រះចន្ទមួយចំណិតស្ដាំ"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"ព្រះចន្ទពាក់កណ្ដាល"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"ព្រះចន្ទមួយចំណិតឆ្វេង"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"ព្រះចន្ទពេញវង់"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"ព្រះចន្ទភ្លឺមួយចំហៀង"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"ព្រះចន្ទភ្លឺពាក់កណ្ដាល"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"ព្រះចន្ទភ្លឺមួយចំណិតឆ្វេង"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"ព្រះចន្ទមួយចំណិត"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"ព្រះចន្ទមានមុខមនុស្ស"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"ព្រះចន្ទមានមុខមនុស្សពាក់កណ្ដាលស្ដាំ"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"ព្រះចន្ទមានមុខមនុស្សពាក់កណ្ដាលឆ្វេង"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"ព្រះចន្ទមានមុខមនុស្សពេញវង់"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"ព្រះអាទិត្យមានមុខមនុស្ស"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"ផ្កាយ"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"បាញ់ផ្កាយ"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"ឆេសណាត់"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"កូនឈើ"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"ដើមឈើបៃតង"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"ដើមឈើមិនខៀវជានិច្ច"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"ដើមត្នោត"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"ដំបងយក្ស"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"ផ្កា"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"ផ្កាឈឺរី"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"ផ្កាកុលាប"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"ផ្ការំយោល"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"ផ្កាឈូករ័ត្ន"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"ផ្កា"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"ស្នៀតពោត"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"គួរស្រូវ"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"រុក្ខជាតិ"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"ដើមដង្ហិត"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"ស្លឹកឈើ"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"ស្លឹកឈើជ្រុះ"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"ស្លឹកឈើបក់តាមខ្យល់"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"ផ្សិត"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"ប៉េងប៉ោះ"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"ត្រប់"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"ទំពាំងបាយជូរ"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"ត្រសក់ស្រូវ"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"ឪឡឹក"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"ក្រូចឃ្វិច"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"ក្រូចឆ្មារ"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"ចេក"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"ម្នាស់"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"ប៉ោមក្រហម"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"ប៉ោមបៃតង"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"ផ្លែព័រ"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"ផ្លែប៉ែស"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"ផ្លែឈឺរី"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"ផ្លែស្ត្របេរី"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"ហាំប៊ឺហ្គឺ"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"ភីហ្សាមួយស្លាយ"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"សាច់ចង្កាក់"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"ភ្លៅមាន់"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"ប៊ីស្គីបាយ"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"ដុំបាយ"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"បាយមួយចាន"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"ការី និងបាយ"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"ចានចំហុយ"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"ស្ប៉ាហ្គាទី"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"នំប៉័ង"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"ដំឡូងបំពង"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"ដំឡូងដុត"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"ប្រហិតដោតចង្កាក់"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ម្ហូបសមុទ្រដោតចង្កាក់"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"ស៊ូស៊ី"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"កំពឹសចៀន"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"នំត្រីរាងមូល"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"ការ៉េមបំពង់"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"ការ៉េមកែវ"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"ការ៉េម"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ដូណាត់"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"ខូគី"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"សូកូឡា"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"ស្ករគ្រាប់"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"ស្ករគ្រាប់មានដងកាន់"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"សង់ខ្យា"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"ថូ"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"នំខេក"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"ប្រអប់បេនតូ"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"ឆ្នាំងអាហារ"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"ចម្អិនអាហារ"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"សម និងកាំបិត"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"ពែងតែអត់ដៃកាន់"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"ដប និងពែង"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"កែវស្រា"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"កែវស្រាក្រឡុក"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"ភេសជ្ជៈត្រូពិក"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"កែវស្រាបៀ"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"ជល់កែវស្រាបៀ"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"ដបទឹកដោះគោ"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ខ្សែបូ"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"ខ្ចប់កាដូរ"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"នំខួបកំណើត"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"គោម"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"ដើមឈើបុណ្យណូអែល"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"តាណូអែល"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"កាំជ្រួច"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ពន្លឺកាំជ្រួច"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"ប៉េងប៉ោង"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"ឧបករណ៍ផ្ទុះពេលជប់លៀង"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"ក្រដាសពណ៌តូចៗ"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"ដើមតាណាប៉ាតា"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"ទង់ជាតិខ្វែង"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"ការតុបតែងដោយផ្លែស្រល់"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"តុក្កតាជប៉ុន"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"ខ្សែបូត្រីគល់រាំង"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"កណ្ដឹងខ្យល់"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"ពិធីមើលព្រះចន្ទ"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"កាបូបទៅសាលារៀន"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"មួកទទួលសញ្ញាប័ត្រ"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"សេះក្មេងជិះលេង"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"កន្ត្រកវិល"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"រថយន្តសម្រាប់ពាក់ជិះរំអិល"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"ដងសន្ទូច និងត្រី"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"មីក្រូហ្វូន"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"ម៉ាស៊ីនថតភាពយន្ត"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"ភាពយន្ត"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"កាស"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"ក្ដារលាយពណ៌វិចិត្រករ"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"មួកសម្ដែងសិល្បៈ"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"តង់សៀក"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"សំបុត្រ"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"បន្ទះកណ្ដឹង"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"សម្ដែងសិល្បៈ"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"ហ្គេមវីដេអូ"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"វាយចំគោលដៅ"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"ម៉ាស៊ីនដាក់កាក់"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"ល្បែងបុកប៊ីយ៉ា"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"ហ្គេមឡុកឡាក់"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"ប៊ូលីង"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"សន្លឹកបៀរមានផ្កា"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"ណោតតន្ត្រី"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"ណោតតន្ត្រីច្រើន"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"ត្រែ"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"ហ្គីតា"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"ខ្ទង់សម្រាប់ចុចតន្ត្រី"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"ត្រុំប៉ែត"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"វីយូឡុង"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"និមិត្តសញ្ញាតន្ត្រី"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"អាវកីឡាមានខ្សែឆៀង"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"រ៉ាកែត និងបាល់"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"ជិះស្គី និងក្ដារស្គី"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"បាល់បោះ និងវណ្ណមូល"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"ទង់ជាតិប្រណាំងម៉ូតូ"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"អ្នកជិះក្ដាររំអិលលើព្រិល"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"អ្នករត់"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"អ្នកជិះទូករអិលលើទឹក"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"ពានរង្វាន់"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"ប្រណាំងសេះ"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"បាល់ទាត់អាមេរិក"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"បាល់អោប"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"អ្នកហែលទឹក"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"ការសាងសង់ផ្ទះ"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"ផ្ទះមានសួនច្បារ"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"អគារការិយាល័យ"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"ការិយាល័យប្រៃសណីយ៍ជប៉ុន"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"ការិយាល័យប្រៃសណីយ៍អឺរ៉ុប"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"មន្ទីរពេទ្យ"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"ធនាគារ"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"ម៉ាស៊ីនអេធីអឹម"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"សណ្ឋាគារ"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"សណ្ឋាគារក្ដីស្រឡាញ់"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"ហាងទំនិញ ២៤ម៉ោង"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"សាលារៀន"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"ហាងទំនិញធំៗ"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"រោងចក្រ"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"ចង្កៀងគោម Izakaya"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"វិមានជប៉ុន"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"វិមានអឺរ៉ុប"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"កណ្ដុរប្រែង"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"កណ្ដុរប្រមះ"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"គោ"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"ក្របីទឹក"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"គោ"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"ខ្លារខិន"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"ទន្សាយ"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"ឆ្មា"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"នាគ"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"ក្រពើ"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"ត្រីបាឡែន"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"ខ្យង់ក្ដក់"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"ពស់"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"សេះ"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"ចៀមឈ្មោល"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"ពពែ"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"ចៀម"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"ស្វា"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"មាន់ឈ្មោល"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"មាន់"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"ឆ្កែ"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"ជ្រូក"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"ជ្រូកព្រៃ"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"ដំរី"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"មឹក"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"ខ្យងគ្រែង"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"សង្កើច"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"ស្រមោច"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"ឃ្មុំ"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"អណ្ដើកមាស"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"ត្រី"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"ត្រីតំបន់ត្រូពិក"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"ត្រីក្រពត"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"អណ្ដើក"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"កូនមាន់ញាស់"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"កូនមាន់"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"មុខកូនមាន់"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"បក្សី"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"ភេនឃ្វីន"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"ខ្លាឃ្មុំ"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"ឆ្កែ"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"អូដ្ឋបូកមួយ"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"អូដ្ឋបូកពីរ"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"ត្រីផ្សោត"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"មុខកណ្ដុរ"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"មុខគោ"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"មុខខ្លា"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"មុខទន្សាយ"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"មុខឆ្មា"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"មុខនាគ"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"ព្រុយត្រីបាឡែន"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"មុខសេះ"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"មុខស្វា"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"មុខឆ្កែ"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"មុខជ្រូក"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"មុខកង្កែប"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"មុខកណ្ដុរ"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"មុខចចក"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"មុខខ្លាឃ្មុំ"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"មុខខ្លាឃ្មុំផេនដា"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"ច្រមុះជ្រូក"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"ក្រញាំជើង"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"ភ្នែក"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"ត្រចៀក"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"ច្រមុះ"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"មាត់"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"អណ្ដាត"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"ចង្អុលដៃឡើងលើ"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"ចង្អុលដៃចុះក្រោម"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"ចង្អុលដៃទៅឆ្វេង"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"ចង្អុលដៃទៅស្ដាំ"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"កណ្ដាប់ដៃ"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"គ្រវីបាតដៃ"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"សញ្ញាអូខេ"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"មេដៃឡើងលើ"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"មេដៃចុះក្រោម"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ទះដៃ"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"លាដៃ"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"មកុដ"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"មួកស្ត្រី"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"វ៉ែនតា"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"ក្រវ៉ាត់ករ"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"អាវយឺត"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ខោខោវប៊យ"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"សំលៀកបំពាក់"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"គីម៉ូណូ"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"ឈុតហែលទឹក"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"សំលៀកបំពាក់នារី"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"កាបូប"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"កាបូបដៃ"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"ថង់"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"ស្បែកជើងបុរស"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"ស្បែកជើងកីឡា"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"ស្បែកជើងកែង"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"ស្បែកជើងស៊កស្រ្តី"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"ស្បែកជើងកវែងស្ត្រី"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"ដានជើង"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"គណនីភ្ញៀវ"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"គណនី"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ក្មេងប្រុស"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"ក្មេងស្រី"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"បុរស"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ស្ត្រី"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"គ្រួសារ"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"បុរស និងស្ត្រីកាន់ដៃគ្នា"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"បុរសពីរនាក់កាន់ដៃគ្នា"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"ស្ត្រីពីរកាន់ដៃគ្នា"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"មន្ត្រីប៉ូលិស"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"ស្ត្រីចងសក់ទីទុយ"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"កូនក្រមុំពាក់ស្បៃមុខ"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"មនុស្សមានសក់ពណ៌ទង់ដែង"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"បុរសពុកមាត់ឆ្មា"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"បុរសពាក់ឈ្នួត"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"បុរសចំណាស់"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"ស្ត្រីចំណាស់"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"ទារក"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"កម្មករសំណង់"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"ព្រះអង្គម្ចាស់ក្សត្រី"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"សត្វចម្លែកជប៉ុន"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"ម្រេញគង្វាលជប៉ុន"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"ខ្មោច"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"អប្សរាទារក"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"មនុស្សក្រៅភព"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"សត្វចម្លែកក្រៅភព"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"ប្រែត"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"លលាដ៍ក្បាល"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"អ្នកផ្ដល់ព័ត៌មាន"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"អ្នកយាម"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"អ្នករាំ"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"ក្រេមលាបបបូរមាត់"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"ថ្នាំលាបក្រចក"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"ម៉ាស្សាមុខ"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"កាត់សក់"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"ស្លាកសញ្ញាកាត់សក់"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"ស៊ីរ៉ាំង"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"ថ្នាំគ្រាប់"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"ស្នាមថើប"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"លិខិតស្នេហា"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"រោទ៍"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"ត្បូងថ្ម"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"ថើប"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"បាច់ផ្កា"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"ប្ដីប្រពន្ធ និងរូបបេះដូង"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"អាពាហ៍ពិពាហ៍"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"សំឡេងបេះដូងលោត"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"ខូចចិត្ត"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"បេះដូងពីរ"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"បេះដូងមានពន្លឺ"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"បេះដូងលូតលាស់"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"បេះដូងជាប់ព្រួញ"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"បេះដូងពណ៌ខៀវ"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"បេះដូងពណ៌បៃតង"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"បេះដូងពណ៌លឿង"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"បេះដូងពណ៌ស្វាយ"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"បេះដូងជាប់ខ្សែបូ"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"បេះដូងវិល"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"ការតុបតែងបេះដូង"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"រាងពេជ្រមានចំណុចខាងក្នុង"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"អំពូលអគ្គិសនី"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"និមិត្តសញ្ញាកំហឹង"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"គ្រាប់បែក"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"និមិត្តសញ្ញាដេក"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"និមិត្តសញ្ញាប៉ះទង្គិចគ្នា"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"និមិត្តសញ្ញាស្រក់ញើស"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"ដំណក់ទឹក"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"និមិត្តសញ្ញាដកឃ្លា"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"គំនរធូលី"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"ដំឡើងសាច់ដុំដើមដៃ"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"និមិត្តសញ្ញាវិលមុខ"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"ប្រអប់បញ្ចេញយោបល់"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"ប្រអប់គំនិត"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"ផ្កាពណ៌ស"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"និមិត្តសញ្ញាមួយរយពិន្ទុ"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"កាបូបលុយ"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"ប្ដូររូបិយប័ណ្ណ"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"សញ្ញាដុល្លារ"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"កាតឥណទាន"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ក្រដាសប្រាក់ធនាគារមានសញ្ញាយ៉េន"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"លុយដុល្លារ"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ក្រដាសប្រាក់ធនាគារមានសញ្ញាអឺរ៉ូ"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"ក្រដាសប្រាក់ធនាគារមានសញ្ញាផោន"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"លុយមានស្លាប"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"ក្រាហ្វិកនិន្នាការឡើងមានសញ្ញាយ៉េន"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"កៅអី"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"កុំព្យូទ័រផ្ទាល់ខ្លួន"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"វ៉ាលី"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"ឌីសតូច"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"ថាសទន់"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"ថាស"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"ឌីវីឌី"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ថតឯកសារ"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"ថតឯកសារបើក"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"ទំព័រកោង"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"ទំព័របញ្ឈរ"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"ប្រតិទិន"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"ហែកប្រតិទិន"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"កាតរៀបតាមអក្សរ"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"ក្រាហ្វិកមាននិន្នាការឡើង"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"ក្រាហ្វិកមាននិន្នាការចុះ"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"គំនូសតាងរបារ"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"ក្ដារតម្បៀតខ្ទាស់"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"ម្ជុល"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"ម្ជុលក្បាលមូល"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"ដង្កៀបក្រដាស"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"បន្ទាត់ត្រង់"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"បន្ទាត់រៀងត្រីកោណ"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"ផ្ទាំងចំណាំ"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"បញ្ជីកត់ត្រា"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"សៀវភៅ"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"សៀវភៅមានក្របពណ៌"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"សៀវភៅបិទ"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"សៀវភៅបើក"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"សៀវភៅពណ៌បៃតង"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"សៀវភៅពណ៌ខៀវ"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"សៀវភៅពណ៌ទឹកក្រូច"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"សៀវភៅ"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"ស្លាកឈ្មោះ"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"ក្រដាសរមូរ"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"កំណត់ចំណាំ"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"អ្នកទទួលទូរស័ព្ទ"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"ភេយ័រ"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"ម៉ាស៊ីនទូរសារ"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"អង់តែនផ្កាយរណប"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"អូប៉ាល័រប្រកាសសាធារណៈ"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"ឧបករណ៍បំពងសំឡេង"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"ថាសចេញ"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"ថាសចូល"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"កញ្ចប់"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"និមិត្តសញ្ញាអ៊ីមែល"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"ស្រោមសំបុត្រចូល"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"ស្រោមសំបុត្រមានសញ្ញាព្រួញពីលើ"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"ប្រអប់សំបុត្របិទមានទង់ចុះក្រោម"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"ប្រអប់សំបុត្របិទមានទង់ឡើងលើ"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"ប្រអប់សំបុត្របើកមានទង់ឡើងលើ"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"ប្រអប់សំបុត្របើកមានទង់ចុះក្រោម"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"ប្រអប់ប្រៃសណីយ៍"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"ស្នែងប្រៃសណីយ៍"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"កាសែត"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"ទូរស័ព្ទចល័ត"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"ទូរស័ព្ទចល័តមានសញ្ញាព្រួញចូលពីឆ្វេង"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"របៀបញ័រ"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"បិទទូរស័ព្ទចល័ត"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"មិនមានទូរស័ព្ទចល័ត"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"អង់តែនមានរបារ"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"ម៉ាស៊ីនថត"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"ម៉ាស៊ីនថតវីដេអូ"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"ទូរទស្សន៍"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"វិទ្យុ"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"ការសែតវីដេអូ"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"ព្រួញរមួលទៅស្ដាំ"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"ព្រួញរាងជារង្វង់បើកស្របទិសទ្រនិចនាឡិកាទៅឆ្វេង-ស្ដាំ"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"ព្រួញរាងជារង្វង់បើកស្របទិសទ្រនិចនាឡិកាទៅឆ្វេង-ស្ដាំមានលេខ ១ក្នុងរង្វង់នៅពីលើ"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"ព្រួញរាងជារង្វង់បើកស្របទិសទ្រនិចនាឡិកាចុះក្រោម-ឡើងលើ"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"ព្រួញរាងជារង្វង់បើកច្រាសទិសទ្រនិចនាឡិកាចុះក្រោម-ឡើងលើ"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"និមិត្តសញ្ញាពន្លឺទាប"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"និមិត្តសញ្ញាពន្លឺខ្ពស់"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"អូប៉ាល័រមានបន្ទាត់កាត់"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"អូប៉ាល័រ"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"អូប៉ាល័រមានរលកសំឡេងមួយ"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"អូប៉ាល័រមានរលកសំឡេងបី"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"ថ្ម"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"ដុយអគ្គិសនី"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"កែវពង្រីកចង្អុលខាងឆ្វេង"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"កែវពង្រីកចង្អុលខាងស្ដាំ"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"ចាក់សោដោយប្រើប៊ិច"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"បិទសោដោយប្រើកូនសោ"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"សោ"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"ចាក់សោ"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"បើកសោ"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"កណ្ដឹង"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"កណ្ដឹងមានបន្ទាត់កាត់"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"ចំណាំ"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"និមិត្តសញ្ញាតំណ"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"ប៊ូតុងមូល"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"ថយក្រោយមានព្រួញទៅឆ្វេងខាងលើ"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"បញ្ចប់មានព្រួញទៅឆ្វេងខាងលើ"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"បើកមានសញ្ញាឧទានជាមួយនឹងព្រួញទៅឆ្វេងខាងលើ"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"ឆាប់ៗមានព្រួញទៅស្ដាំខាងលើ"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"កំពូលមានព្រួញឡើងលើនៅខាងលើ"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"និមិត្តសញ្ញាគ្មាននរណាម្នាក់អាយុក្រោមដប់ប្រាំបី"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"គ្រាប់ចុច ១០"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"និមិត្តសញ្ញាបញ្ចូលសម្រាប់អក្សរឡាតាំងធំ"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"និមិត្តសញ្ញាបញ្ចូលសម្រាប់អក្សរឡាតាំងតូច"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"និមិត្តសញ្ញាបញ្ចូលសម្រាប់លេខ"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"ការបញ្ចូលនិមិត្តសញ្ញា"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"និមិត្តសញ្ញាបញ្ចូលសម្រាប់អក្សរឡាតាំង"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"ភ្លើង"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"ពិលអគ្គិសនី"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"ម៉ាឡេត"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"ញញួរ"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"ឡោស៊ី"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"កាំបិត"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"កាំភ្លើងខ្លី"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"មីក្រូទស្សន៍"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"កែវយឹត"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"បាល់គ្រីស្តាល់"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"ផ្កាយ ៦ជ្រុងមានចំណុចកណ្ដាល"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"និមិត្តសញ្ញាជប៉ុនសម្រាប់អ្នកចាប់ផ្ដើម"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"លំពែងមុខបី"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"ប៊ូតុងការេពណ៌ខ្មៅ"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"ប៊ូតុងការ៉េពណ៌ស"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"រង្វង់ពណ៌ក្រហមធំ"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"រង្វង់ពណ៌ខៀវធំ"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"ពេជ្រពណ៌ទឹកក្រូចធំ"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"ពេជ្រពណ៌ខៀវធំ"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"ពេជ្រពណ៌ទឹកក្រូចតូច"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"ពេជ្រពណ៌ខៀវតូច"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"ត្រីកោណពណ៌ក្រហមកំពូលឡើងលើ"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"ត្រីកោណពណ៌ក្រហមកំពូលចុះក្រោម"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"ត្រីកោណពណ៌ក្រហមតូចកំពូលឡើងលើ"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"ត្រីកោណពណ៌ក្រហមតូចកំពូលចុះក្រោម"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"មុខនាឡិកាម៉ោងមួយ"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"មុខនាឡិកាម៉ោងពីរ"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"មុខនាឡិកាម៉ោងបី"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"មុខនាឡិកាម៉ោងបួន"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"មុខនាឡិកាម៉ោងប្រាំ"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"មុខនាឡិកាម៉ោងប្រាំមួយ"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"មុខនាឡិកាម៉ោងប្រាំពីរ"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"មុខនាឡិកាម៉ោងប្រាំបី"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"មុខនាឡិកាម៉ោងប្រាំបួន"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"មុខនាឡិកាម៉ោងដប់"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"មុខនាឡិកាម៉ោងដប់មួយ"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"មុខនាឡិកាម៉ោងដប់ពីរ"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"មុខនាឡិកាម៉ោងមួយកន្លះ"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"មុខនាឡិកាម៉ោងពីរកន្លះ"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"មុខនាឡិកាម៉ោងបីកន្លះ"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"មុខនាឡិកាម៉ោងបួនកន្លះ"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"មុខនាឡិកាម៉ោងប្រាំកន្លះ"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"មុខនាឡិកាម៉ោងប្រាំមួយកន្លះ"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"មុខនាឡិកាម៉ោងប្រាំពីរកន្លះ"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"មុខនាឡិកាម៉ោងប្រាំបីកន្លះ"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"មុខនាឡិកាម៉ោងប្រាំបួនកន្លះ"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"មុខនាឡិកាម៉ោងដប់កន្លះ"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"មុខនាឡិកាម៉ោងដប់មួយកន្លះ"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"មុខនាឡិកាម៉ោងដប់ពីរកន្លះ"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"ភ្នំហ្វូជី"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"អគារទីក្រុងតូក្យូ"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"រូបសំណាកសេរីភាព"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"គំនូរស្រមោលជប៉ុន"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"ម៉ូយ៉ៃ"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"មុខញញឹមខាំធ្មេញ"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"មុខញញឹមខាំធ្មេញជាមួយភ្នែកបើក"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"មុខទទឹកមានភ្នែករីករាយ"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"មុខញញឹមបើកមាត់"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"មុខញញឹមបើកមាត់ និងបើកភ្នែក"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"ញញឹមមុខបើកមាត់ និងខ្វល់ខ្វាយ"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"ញញឹមមុខបើកមាត់ និងបិទភ្នែកបន្តិច"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"មុខញញឹមមានរង្វង់ខាងលើ"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"មុខញញឹមមានស្នែង"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"មុខមិចភ្នែក"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"មុខញញឹមបើកភ្នែក"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"មុខបង្ហាញរសជាតិអាហារឆ្ងាញ់"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"មុខធូរស្រាល"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"មុខញញឹមជាមួយភ្នែករូបបេះដូង"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"មុខញញឹមពាក់វ៉ែនតាខ្មៅ"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"មុខញញឹមចំអក"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"មុខអព្យាក្រឹត"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"មុខគ្មានអារម្មណ៍"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"មុខអត់សប្បាយចិត្ត"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"មុខមានញើស"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"មុខគិត"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"មុខយល់ច្រឡំ"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"មុខអាក្រក់"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"មុខថើប"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"មុខបង្ហាញការថើប"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"មុខថើបបើកភ្នែក"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"មុខថើបបិទភ្នែក"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"មុខលៀនអណ្ដាត"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"មុខលៀនអណ្ដាត ហើយមិចភ្នែក"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"មុខលៀនអណ្ដាត ហើយបិទភ្នែកបន្តិច"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"មុខខកចិត្ត"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"មុខព្រួយបារម្ភ"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"មុខខឹង"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"មុខក្និកក្នក់"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"មុខយំ"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"មុខលំបាក"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"មុខជ័យជំនះ"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"មុខខកចិត្តប៉ុន្តែធូរស្រាល"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"មុខក្រញូវបើកមាត់"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"មុខខូចចិត្ត"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"មុខភ័យខ្លាច"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"មុខនឿយហត់"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"មុខងងុយគេង"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"មុខអស់កម្លាំង"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"មុខក្រញេវក្រញូវ"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"មុខយំលឺៗ"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"មុខបើកមាត់"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"មុខស្ងៀមស្ងាត់"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"មុខបើកមាត់ ហើយមានញើស"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"មុខស្រែកដោយភ័យខ្លាច"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"មុខរភ្ញាក់ផ្អើល"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"មុខក្រហម"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"មុខកំពុងដេក"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"មុខកំពុងវិលមុខ"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"មុខអត់មានមាត់"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"មុខពាក់ម៉ាស់"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"មុខឆ្មាញញឹមខាំធ្មេញ ហើយបើកភ្នែក"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"មុខឆ្មាស្រកទឹកភ្នែក"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"មុខឆ្មាញញឹម ហើយបើកមាត់"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"មុខឆ្មាញញឹមជាមួយភ្នែករាងបេះដូង"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"មុខឆ្មាជាមួយការញញឹមញាក់មុខ"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"មុខឆ្មាថើបហើយបិទភ្នែក"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"មុខឆ្មាក្និកក្នក់"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"មុខឆ្មាយំ"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"មុខឆ្មានឿយហត់"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"មុខគ្មានកាយវិការល្អ"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"មុខមានកាយវិការយល់ព្រម"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"មនុស្សអោនខ្លួនខ្លាំង"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"ស្វាបិទភ្នែក"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"ស្វាបិទត្រចៀក"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"ស្វាបិទមាត់"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"មនុស្សសប្បាយលើកដៃមួយ"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"លើកដៃទាំងពីរអបអរ"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"មនុស្សចងចិញ្ចើម"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"មនុស្សមានមុខក្និកក្នក់"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"មនុស្សអោបដៃ"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"គ្រាប់រ៉ុកកែត"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"ឧទ្ធម្ភាគចក្រ"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"ក្បាលរថភ្លើង"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"ទូររថភ្លើង"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"រថភ្លើងល្បឿនលឿន"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"រថភ្លើងល្បឿនលឿនមានច្រមុះ"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"រថភ្លើង"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"មេត្រូ"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"រថភ្លើងប្រើពន្លឺ"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"ស្ថានីយ"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"រថយន្តរត់លើផ្លូវដែក"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"រថយន្តរត់លើផ្លូវដែក"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"រថយន្តក្រុង"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"រថយន្តក្រុងខាងមុខ"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"រថយន្តប្រើចរន្តអគ្គិសនី"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"ចំណតរថយន្តក្រុង"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"រថយន្តទេសចរណ៍តូច"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"រថយន្តសង្គ្រោះបន្ទាន់"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"ម៉ាស៊ីនភ្លើង"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"រថយន្តប៉ូលិស"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"រថយន្តប៉ូលិសខាងមុខ"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"តាក់ស៊ី"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"តាក់ស៊ីខាងមុខ"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"រថយន្ត"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"រថយន្តខាងមុខ"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"រថយន្តសម្រាប់កម្សាន្ត"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"រថយន្តចែកចាយ"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"ឡានកាមីយ៉ុង"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ត្រាក់ទ័រ"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"ប្រព័ន្ធផ្លូវរថភ្លើង"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"ផ្លូវរថភ្លើងកាត់ភ្នំ"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"ផ្លូវរថភ្លើងផ្អាកដំណើរការ"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"ខ្សែកាបឆ្លងភ្នំុ"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"ផ្លូវរថភ្លើងលើអាកាស"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"កប៉ាល់"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"ទូកចែវ"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"ទូកល្បឿនលឿន"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"ភ្លើងចរាចរណ៍"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"ភ្លើងចរាចរណ៍បញ្ឈរ"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"សញ្ញាសំណង់"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"រថយន្តប៉ូលិសបើកសារ៉ែនវិល"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"បង្គោលទង់ជាតិរាងត្រីកោណ"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"ទ្វារ"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"សញ្ញាហាមចូល"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"សញ្ញាជក់បារី"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"ហាមជក់បារី"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"និមិត្តសញ្ញាដាក់សំរាមក្នុងធុង"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"និមិត្តសញ្ញាហាមចោលសំរាម"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"និមិត្តសញ្ញាទឹកចល័ត"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"និមិត្តសញ្ញាទឹកមិនចល័ត"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"កង់"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"ហាមជិះកង់"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"អ្នកជិះកង់"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"អ្នកជិះកង់ឡើងភ្នំ"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"ថ្មើរជើង"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"មិនសម្រាប់ថ្មើរជើង"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"កុមារឆ្លងកាត់"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"និមិត្តសញ្ញាបុរស"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"និមិត្តសញ្ញាស្ត្រី"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"បន្ទប់ទឹក"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"និមិត្តសញ្ញាទារក"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"បង្គន់"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"បន្ទប់ទឹក"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"ផ្កាឈូកងូតទឹក"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"ងូតទឹក"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"អាងងូតទឹក"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"ការត្រួតពិនិត្យលិខិតឆ្លងដែន"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"គយ"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"ប្រកាសឥវ៉ាន់"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"ឥវ៉ាន់នៅសល់"</string> +</resources> diff --git a/java/res/values-km-rKH/strings-letter-descriptions.xml b/java/res/values-km-rKH/strings-letter-descriptions.xml new file mode 100644 index 000000000..f58eff4d1 --- /dev/null +++ b/java/res/values-km-rKH/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"សញ្ញា ª"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"សញ្ញា µ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"សញ្ញា º"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"សញ្ញា ß"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"សញ្ញា à"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"សញ្ញា á"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"សញ្ញា â"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"សញ្ញា ã"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"សញ្ញា ä"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"សញ្ញា å"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"សញ្ញា æ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"សញ្ញា ç"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"សញ្ញា è"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"សញ្ញា é"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"សញ្ញា ê"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"សញ្ញា ë"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"សញ្ញា ì"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"សញ្ញា í"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"សញ្ញា î"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"សញ្ញា ï"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"សញ្ញា ð"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"សញ្ញា ñ"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"សញ្ញា ò"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"សញ្ញា ó"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"សញ្ញា ô"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"សញ្ញា õ"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"សញ្ញា ö"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"សញ្ញា ø"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"សញ្ញា ù"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"សញ្ញា ú"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"សញ្ញា û"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"សញ្ញា ü"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"សញ្ញា ý"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"សញ្ញា þ"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"សញ្ញា ÿ"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"សញ្ញា ā"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"សញ្ញា ă"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"សញ្ញា ą"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"សញ្ញា ć"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"សញ្ញា ĉ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"សញ្ញា ċ"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"សញ្ញា č"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"សញ្ញា ď"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"សញ្ញា đ"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"សញ្ញា ē"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"សញ្ញា ĕ"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"សញ្ញា ė"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"សញ្ញា ę"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"សញ្ញា ě"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"សញ្ញា ĝ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"សញ្ញា ğ"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"សញ្ញា ġ"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"សញ្ញា ģ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"សញ្ញា ĥ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"សញ្ញា ħ"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"សញ្ញា ĩ"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"សញ្ញា ī"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"សញ្ញា ĭ"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"សញ្ញា į"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"សញ្ញា ı"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"សញ្ញា ij"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"សញ្ញា ĵ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"សញ្ញា ķ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"សញ្ញា ĸ"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"សញ្ញា ĺ"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"សញ្ញា ļ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"សញ្ញា ľ"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"សញ្ញា ŀ"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"សញ្ញា ł"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"សញ្ញា ń"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"សញ្ញា ņ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"សញ្ញា ň"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"សញ្ញា ʼn"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"សញ្ញា ŋ"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"សញ្ញា ō"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"សញ្ញា ŏ"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"សញ្ញា ő"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"សញ្ញា œ"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"សញ្ញា ŕ"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"សញ្ញា ŗ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"សញ្ញា ř"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"សញ្ញា ś"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"សញ្ញា ŝ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"សញ្ញា ş"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"សញ្ញា š"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"សញ្ញា ţ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"សញ្ញា ť"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"សញ្ញា ŧ"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"សញ្ញា ũ"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"សញ្ញា ū"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"សញ្ញា ŭ"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"សញ្ញា ů"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"សញ្ញា ű"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"សញ្ញា ų"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"សញ្ញា ŵ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"សញ្ញា ŷ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"សញ្ញា ź"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"សញ្ញា ż"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"សញ្ញា ž"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"សញ្ញា ſ"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"សញ្ញា ơ"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"សញ្ញា ư"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"សញ្ញា ș"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"សញ្ញា ț"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"សញ្ញា ə"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"សញ្ញា ạ"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"សញ្ញា ả"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"សញ្ញា ấ"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"សញ្ញា ầ"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"សញ្ញា ẩ"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"សញ្ញា ẫ"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"សញ្ញា ậ"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"សញ្ញា ắ"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"សញ្ញា ằ"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"សញ្ញា ẳ"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"សញ្ញា ẵ"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"សញ្ញា ặ"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"សញ្ញា ẹ"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"សញ្ញា ẻ"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"សញ្ញា ẽ"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"សញ្ញា ế"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"សញ្ញា ề"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"សញ្ញា ể"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"សញ្ញា ễ"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"សញ្ញា ệ"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"សញ្ញា ỉ"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"សញ្ញា ị"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"សញ្ញា ọ"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"សញ្ញា ỏ"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"សញ្ញា ố"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"សញ្ញា ồ"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"សញ្ញា ổ"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"សញ្ញា ỗ"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"សញ្ញា ộ"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"សញ្ញា ớ"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"សញ្ញា ờ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"សញ្ញា ở"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"សញ្ញា ỡ"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"សញ្ញា ợ"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"សញ្ញា ụ"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"សញ្ញា ủ"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"សញ្ញា ứ"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"សញ្ញា ừ"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"សញ្ញា ử"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"សញ្ញា ữ"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"សញ្ញា ự"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"សញ្ញា ỳ"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"សញ្ញា ỵ"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"សញ្ញា ỷ"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"សញ្ញា ỹ"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"សញ្ញា ¡"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"សញ្ញា «"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"សញ្ញា ·"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"សញ្ញា ¹"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"សញ្ញា »"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"សញ្ញា ¿"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"សញ្ញា ‘"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"សញ្ញា ’"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"សញ្ញា ‚"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"សញ្ញា “"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"សញ្ញា ”"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"សញ្ញា †"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"សញ្ញា ‡"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"សញ្ញា ‰"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"សញ្ញា ′"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"សញ្ញា ″"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"សញ្ញា ‹"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"សញ្ញា ›"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"សញ្ញា ⁴"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"សញ្ញា ⁿ"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"សញ្ញា ₱"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"សញ្ញា ℅"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"សញ្ញា →"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"សញ្ញា ↓"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"សញ្ញា ∅"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"សញ្ញា ∆"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"សញ្ញា ≤"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"សញ្ញា ≥"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"សញ្ញា ★"</string> +</resources> diff --git a/java/res/values-km-rKH/strings-talkback-descriptions.xml b/java/res/values-km-rKH/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e5b786048 --- /dev/null +++ b/java/res/values-km-rKH/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ដោតកាស ដើម្បីស្ដាប់ពាក្យសម្ងាត់ដែលនិយាយឮៗ។"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"អត្ថបទបច្ចុប្បន្នគឺ %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"គ្មានអត្ថបទបានបញ្ចូល"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> កែ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ទៅជា <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> អនុវត្តការកែស្វ័យប្រវត្តិ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"មិនស្គាល់តួអក្សរ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"និមិត្តសញ្ញាច្រើនទៀត"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"និមិត្តសញ្ញា"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"លុប"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"និមិត្តសញ្ញា"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"អក្សរ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"លេខ"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ការកំណត់"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ដកឃ្លា"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ការបញ្ចូលសំឡេង"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"សញ្ញាអារម្មណ៍"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ស្វែងរក"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"សញ្ញា(.)"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ប្ដូរភាសា"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"បន្ទាប់"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"មុន"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"បានបើក Shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"បានបើក Caps lock"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"របៀបនិមិត្តសញ្ញា"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"របៀបនិមិត្តសញ្ញាច្រើនទៀត"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"របៀបអក្សរ"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"របៀបទូរស័ព្ទ"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"របៀបនិមិត្តសញ្ញាទូរស័ព្ទ"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"បានលាក់ក្ដារចុច"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"បង្ហាញក្ដារចុច <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"កាលបរិច្ឆេទ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"កាលបរិច្ឆេទ និងពេលវេលា"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"អ៊ីមែល"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ការផ្ញើសារ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"លេខ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ទូរស័ព្ទ"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"អត្ថបទ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ពេលវេលា"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ថ្មីៗ"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"មនុស្ស"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"វត្ថុ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ធម្មជាតិ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ទីកន្លែង"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"និមិត្តសញ្ញា"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"សញ្ញាអារម្មណ៍"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"អក្សរធំ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"សញ្ញា I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"សញ្ញា İ"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"មិនស្គាល់និមិត្តសញ្ញា"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"មិនស្គាល់សញ្ញាអារម្មណ៍"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"តួអក្សរជំនួសអាចប្រើបាន"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"បានបដិសេធតួអក្សរជំនួស"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ការស្នើជំនួសអាចប្រើបាន"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"បានបដិសេធការស្នើជំនួស"</string> +</resources> diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml index 86ecc5e10..1c64583be 100644 --- a/java/res/values-km-rKH/strings.xml +++ b/java/res/values-km-rKH/strings.xml @@ -21,34 +21,35 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"ជម្រើសបញ្ចូល"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"ពាក្យបញ្ជាកំណត់ហេតុការស្រាវជ្រាវ"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"រកមើលឈ្មោះទំនាក់ទំនង"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"កម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធប្រើធាតុពីក្នុងបញ្ជីទំនាក់ទំនងរបស់អ្នក"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ញ័រនៅពេលចុចគ្រាប់ចុច"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"សំឡេងនៅពេលចុចគ្រាប់ចុច"</string> <string name="popup_on_keypress" msgid="123894815723512944">"លេចឡើងនៅពេលចុចគ្រាប់ចុច"</string> - <string name="general_category" msgid="1859088467017573195">"ទូទៅ"</string> - <string name="correction_category" msgid="2236750915056607613">"ការកែអត្ថបទ"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"បញ្ចូលដោយប្រើកាយវិការ"</string> - <string name="misc_category" msgid="6894192814868233453">"ជម្រើសផ្សេងទៀត"</string> - <string name="advanced_settings" msgid="362895144495591463">"ការកំណត់កម្រិតខ្ពស់"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"ជម្រើសសម្រាប់អ្នកជំនាញ"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"ចំណូលចិត្តបញ្ចូល"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"រូបរាង"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"ជម្រើសភាសាច្រើន"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"ចំណូលចិត្តបញ្ចូលកាយវិការ"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"ការកែអត្ថបទ"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"កម្រិតខ្ពស់"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ប្ដូរទៅវិធីសាស្ត្របញ្ចូលផ្សេងទៀត"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"គ្រាប់ចុចប្ដូរភាសាតាមវិធីសាស្ត្របញ្ចូលផ្សេងទៀត"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"គ្រាប់ចុចប្ដូរភាសា"</string> <string name="show_language_switch_key_summary" msgid="7343403647474265713">"បង្ហាញនៅពេលដែលបើកភាសាបញ្ចូលច្រើន"</string> <string name="sliding_key_input_preview" msgid="6604262359510068370">"បង្ហាញទ្រនិចបង្ហាញស្លាយ"</string> <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"បង្ហាញសញ្ញាមើលឃើញខណៈពេលដែលរុញពីឆ្វេង ឬគ្រាប់ចុចនិមិត្តសញ្ញា"</string> - <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"សោលេចឡើងបោះបង់ការពន្យារពេល"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"សោលេចឡើងបោះបង់ការពន្យារពេល"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"គ្មានការពន្យារពេល"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"លំនាំដើម"</string> <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> មិល្លីវិនាទី"</string> <string name="settings_system_default" msgid="6268225104743331821">"លំនាំដើមប្រព័ន្ធ"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"ស្នើឈ្មោះទំនាក់ទំនង"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ប្រើឈ្មោះពីទំនាក់ទំនងសម្រាប់ការស្នើ និងកែ"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ការស្នើផ្ទាល់ខ្លួន"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"ធ្វើឲ្យ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ប្រសើរឡើង"</string> <string name="use_double_space_period" msgid="8781529969425082860">"រយៈពេលចុចដកឃ្លាពីរដង"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"ប៉ះដកឃ្លាពីរដងបញ្ចូលរយៈពេលដែលអនុវត្តតាមដកឃ្លា"</string> - <string name="auto_cap" msgid="1719746674854628252">"ការសរសេរជាអក្សរធំស្វ័យប្រវត្តិ"</string> + <string name="auto_cap" msgid="1719746674854628252">"ការសរសេរជាអក្សរធំស្វ័យប្រវត្តិ"</string> <string name="auto_cap_summary" msgid="7934452761022946874">"សរសេរពាក្យដំបូងជាអក្សរធំនៃប្រយោគនីមួយៗ"</string> <string name="edit_personal_dictionary" msgid="3996910038952940420">"វចនានុក្រមផ្ទាល់ខ្លួន"</string> <string name="configure_dictionaries_title" msgid="4238652338556902049">"ផ្នែកបន្ថែមវចនានុក្រម"</string> @@ -59,7 +60,7 @@ <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"បង្ហាញនៅក្នុងរបៀបបញ្ឈរ"</string> <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"លាក់ជានិច្ច"</string> <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"ទប់ស្កាត់ពាក្យបំពាន"</string> - <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"កុំស្នើឲ្យពាក្យបំពានមានសក្ដានុពល"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"កុំស្នើឲ្យពាក្យបំពានមានសក្ដានុពល"</string> <string name="auto_correction" msgid="7630720885194996950">"ការកែស្វ័យប្រវត្តិ"</string> <string name="auto_correction_summary" msgid="5625751551134658006">"ចន្លោះមិនឃើញ និងសញ្ញាវណ្ណយុត្តកែពាក្យដែលបានវាយខុសស្វ័យប្រវត្តិ"</string> <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"បិទ"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"បង្ហាញដានកាយវិការ"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"មើលការអណ្ដែតដែលមានចលនាជាមុន"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"មើលពាក្យដែលបានស្នើខណៈពេលកំពុងធ្វើកាយវិការ"</string> - <string name="added_word" msgid="8993883354622484372">"បានរក្សាទុក <xliff:g id="WORD">%s</xliff:g> ៖"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"ដោតកាស ដើម្បីស្ដាប់ពាក្យសម្ងាត់។"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"អត្ថបទបច្ចុប្បន្នគឺ %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"គ្មានអត្ថបទបានបញ្ចូល"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> កែ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ទៅ <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> អនុវត្តការកែដោយស្វ័យប្រវត្តិ"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"កូដគ្រាប់ចុច %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"បើក Shift (ប៉ះដើម្បីបិទ)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"បើក Caps lock (ប៉ះដើម្បីបិទ)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"និមិត្តសញ្ញា"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"អក្សរ"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"លេខ"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"ការកំណត់"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"ដកឃ្លា"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"បញ្ចូលសំឡេង"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"មុខញញឹម"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"ស្វែងរក"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Dot"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"ប្ដូរភាសា"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"បន្ទាប់"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"មុន"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"បានបើក Shift"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"បានបើក Caps lock"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"បានបិទ Shift"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"របៀបនិមិត្តសញ្ញា"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"របៀបអក្សរ"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"របៀបទូរស័ព្ទ"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"របៀបនិមិត្តសញ្ញាទូរស័ព្ទ"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"បានលាក់ក្ដារចុច"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"បង្ហាញក្ដារចុច <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"កាលបរិច្ឆេទ"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"កាលបរិច្ឆេទ និងពេលវេលា"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"អ៊ីមែល"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ផ្ញើសារ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"លេខ"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"ទូរស័ព្ទ"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"អត្ថបទ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ពេលវេលា"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"កាយវិការឃ្លា"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"បញ្ចូលដកឃ្លាអំឡុងកាយវិការ ដោយរំកិលទៅគ្រាប់ចុចដកឃ្លា"</string> <string name="voice_input" msgid="3583258583521397548">"គ្រាប់ចុចបញ្ចូលសំឡេង"</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="voice_input_disabled_summary" msgid="8141750303464726129">"គ្មានវិធីសាស្ត្របញ្ចូលសំឡេងបានបើក។ ពិនិត្យមើលការកំណត់ភាសា & ការបញ្ចូល។"</string> <string name="configure_input_method" msgid="373356270290742459">"កំណត់រចនាសម្ព័ន្ធវិធីសាស្ត្របញ្ចូល"</string> <string name="language_selection_title" msgid="1651299598555326750">"បញ្ចូលភាសា"</string> <string name="send_feedback" msgid="1780431884109392046">"ផ្ញើមតិអ្នកប្រើ"</string> <string name="select_language" msgid="3693815588777926848">"បញ្ចូលភាសា"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"ប៉ះម្ដងទៀត ដើម្បីរក្សាទុក"</string> <string name="has_dictionary" msgid="6071847973466625007">"មានវចនានុក្រម"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"បើកមតិត្រឡប់"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"ជំនួយធ្វើឲ្យប្រសើរឡើងនៃកម្មវិធីកែវិធីសាស្ត្របញ្ចូលដោយស្វ័យប្រវត្តិ ដោយផ្ញើស្ថិតិប្រើប្រាស់ និងរបាយការណ៍គាំង"</string> <string name="keyboard_layout" msgid="8451164783510487501">"រូបរាងក្ដារចុច"</string> <string name="subtype_en_GB" msgid="88170601942311355">"អង់គ្លេស (អង់គ្លេស)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"អង់គ្លេស (សហរដ្ឋអាមេរិក)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"អេស្ប៉ាញ (សហរដ្ឋអាមេរិក)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"អង់គ្លេស (ចក្រភពអង់គ្លេស) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"អង់គ្លេស (អាមេរិក) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"អេស្ប៉ាញ (អាមេរិក) ( <xliff:g id="LAYOUT">%s</xliff:g> )"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (អក្សរពេញ)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"អង់គ្លេស (ចក្រភពអង់គ្លេស) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"អង់គ្លេស (អាមេរិក) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"អេស្ប៉ាញ (អាមេរិក) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (អក្សរពេញ)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ស៊ីរី)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ឡាតាំង)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"គ្មានភាសា (អក្សរក្រម)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"តាមលំដាប់អក្សរក្រម (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"តាមលំដាប់អក្សរក្រម (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"តាមលំដាប់អក្សរក្រម (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"តាមលំដាប់អក្សរក្រម (កុំព្យូទ័រ)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"សញ្ញាអារម្មណ៍"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"ពណ៌ចម្រុះ"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"ស"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"ខៀវ"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"រូបរាងក្ដារចុច"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"សផ្លេកៗ"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"ខៀវខ្ចី"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"ងងឹត"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"ភ្លឺ"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"រចនាប័ទ្មបញ្ចូលផ្ទាល់ខ្លួន"</string> <string name="add_style" msgid="6163126614514489951">"បន្ថែមរចនាប័ទ្ម"</string> <string name="add" msgid="8299699805688017798">"បន្ថែម"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"បើក"</string> <string name="not_now" msgid="6172462888202790482">"មិនមែនឥឡូវ"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"មានរចនាប័ទ្មបញ្ចូលដូចគ្នាដូចហើយ៖ <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"របៀបការសិក្សាដែលអាចប្រើបាន"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"ពន្យារពេលចុចគ្រាប់ចុចឲ្យយូរ"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ថិរវេលាញ័រពេលចុចគ្រាប់ចុច"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"កម្រិតសំឡេងពេលចុចគ្រាប់ចុច"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"អានឯកសារវចនានុក្រមខាងក្រៅ"</string> - <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"គ្មានឯកសារវចនានុក្រមនៅក្នុងថតទាញយក"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"គ្មានឯកសារវចនានុក្រមនៅក្នុងថតទាញយក"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ជ្រើសឯកសារវចនានុក្រម ដើម្បីដំឡើង"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ពិតជាដំឡើងឯកសារនេះសម្រាប់ <xliff:g id="LOCALE_NAME">%s</xliff:g> ឬ?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ពិតជាដំឡើងឯកសារនេះសម្រាប់ <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"មានកំហុស"</string> <string name="button_default" msgid="3988017840431881491">"លំនាំដើម"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"សូមស្វាគមន៍មកកាន់ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -193,7 +149,7 @@ <string name="dictionary_provider_name" msgid="3027315045397363079">"កម្មវិធីផ្ដល់វចនានុក្រម"</string> <string name="dictionary_service_name" msgid="6237472350693511448">"សេវាកម្មវចនានុក្រម"</string> <string name="download_description" msgid="6014835283119198591">"ព័ត៌មានបច្ចុប្បន្នភាពវចនានុក្រម"</string> - <string name="dictionary_settings_title" msgid="8091417676045693313">"ផ្នែកបន្ថែមវចនានុក្រម"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ផ្នែកបន្ថែមវចនានុក្រម"</string> <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"វចនានុក្រមអាចប្រើបាន"</string> <string name="dictionary_settings_summary" msgid="5305694987799824349">"ការកំណត់សម្រាប់វចនានុក្រម"</string> <string name="user_dictionaries" msgid="3582332055892252845">"វចនានុក្រមអ្នកប្រើ"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"ផ្ទុកឡើងវិញ"</string> <string name="last_update" msgid="730467549913588780">"បានធ្វើបច្ចុប្បន្នភាពចុងក្រោយ"</string> <string name="message_updating" msgid="4457761393932375219">"ពិនិត្យមើលបច្ចុប្បន្នភាព"</string> - <string name="message_loading" msgid="8689096636874758814">"កំពុងផ្ទុក..."</string> + <string name="message_loading" msgid="5638680861387748936">"កំពុងផ្ទុក..."</string> <string name="main_dict_description" msgid="3072821352793492143">"វចនានុក្រមចម្បង"</string> - <string name="cancel" msgid="6830980399865683324">"បោះបង់"</string> + <string name="cancel" msgid="6830980399865683324">"បោះបង់"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ការកំណត់"</string> <string name="install_dict" msgid="180852772562189365">"ដំឡើង"</string> - <string name="cancel_download_dict" msgid="7843340278507019303">"បោះបង់"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"បោះបង់"</string> <string name="delete_dict" msgid="756853268088330054">"លុប"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ភាសាដែលបានជ្រើសនៅលើឧបករណ៍របស់អ្នកមានវចនានុក្រម។ <br/> យើងបានផ្ដល់អនុសាសន៍ <b>ទាញយក</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> វចនានុក្រម ដើម្បីធ្វើឲ្យការវាយបញ្ចូលរបស់អ្នកប្រសើរឡើង។ <br/> <br/> ការទាញយកអាចចំណាយពេលមួយ ឬពីរនាទីតាម 3G ។ ការកាត់លុយអាចអនុវត្ត ប្រសិនបើអ្នកបាន <b>កំណត់ទិន្នន័យគ្មានដែនកំណត់ </b>.<br/> ប្រសិនបើអ្នកមិនប្រាកដថាទិន្នន័យអ្នកមិនបានកំណត់ យើងបានផ្ដល់អនុសាសន៍ដោយស្វែងរកការភ្ជាប់វ៉ាយហ្វាយ ដើម្បីចាប់ផ្ដើមទាញយកដោយស្វ័យប្រវត្តិ។<br/> <br/> ព័ត៌មានជំនួយ៖ អ្នកអាចទាញយក និងលុបវចនានុក្រមដោយចូលទៅ <b>ភាសា& បញ្ចូល</b>នៅក្នុងម៉ឺនុយ <b>ការកំណត់ </b> របស់ឧបករណ៍ចល័ត។"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ភាសាដែលបានជ្រើសនៅលើឧបករណ៍ចល័តមានវចនានុក្រមអាចប្រើបាន។<br/> យើងផ្ដល់អនុសាសន៍ឲ្យ <b>ទាញយក</b> វចនានុក្រមភាសា <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ដើម្បីបង្កើនបទពិសោធន៍វាយបញ្ចូលរបស់អ្នក។<br/> <br/> ការទាញយកអាចចំណាយពេលប្រហែលពីរនាទីនៅតាម 3G។ ការគិតថ្លៃអាចអនុវត្តប្រសិនបើអ្នកមិនប្រើ <b>ផែនការទិន្នន័យគ្មានដែនកំណត់</b>.<br/> បើអ្នកមិនប្រាកដថាផែនការណាមួយដែលអ្នកមាន យើងផ្ដល់អនុសាសន៍ឲ្យភ្ជាប់វ៉ាយហ្វាយ ដើម្បីចាប់ផ្ដើមទាញយកដោយស្វ័យប្រវត្តិ។<br/> <br/> ជំនួយ៖ អ្នកអាចទាញយក និងលុបវចនានុក្រមដោយចូលទៅ <b>ភាសា & ការបញ្ចូល</b> នៅក្នុងម៉ឺនុយ <b>ការកំណត់</b> សម្រាប់ឧបករណ៍ចល័ត។"</string> <string name="download_over_metered" msgid="1643065851159409546">"ទាញយកឥឡូវនេះ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> មេកាបៃ)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"ទាញយកតាមវ៉ាយហ្វាយ"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"វចនានុក្រមអាចប្រើបានសម្រាប់ <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"វចនានុក្រមអាចប្រើបានសម្រាប់ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"ចុច ដើម្បីពិនិត្យមើលឡើងវិញ និងទាញយក"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ទាញយក៖ ការស្នើសម្រាប់ <xliff:g id="LANGUAGE">%1$s</xliff:g> នឹងបញ្ចប់ឆាប់ៗ។"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ទាញយក៖ ការស្នើសម្រាប់ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> នឹងរួចរាល់ក្នុងពេលឆាប់ៗនេះ។"</string> <string name="version_text" msgid="2715354215568469385">"កំណែ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"បន្ថែម"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"បន្ថែមទៅវចនានុក្រម"</string> @@ -229,7 +186,7 @@ <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"ពាក្យ៖"</string> <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"ផ្លូវកាត់៖"</string> <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ភាសា៖"</string> - <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"វាយបញ្ចូលពាក្យ"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"វាយបញ្ចូលពាក្យ"</string> <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ផ្លូវកាត់ជាជម្រើស"</string> <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"កែពាក្យ"</string> <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"កែ"</string> diff --git a/java/res/values-kn-rIN/strings-action-keys.xml b/java/res/values-kn-rIN/strings-action-keys.xml new file mode 100644 index 000000000..d54cbda60 --- /dev/null +++ b/java/res/values-kn-rIN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"ಹೋಗು"</string> + <string name="label_next_key" msgid="5586407279258592635">"ಮುಂದೆ"</string> + <string name="label_previous_key" msgid="1421141755779895275">"ಹಿಂದೆ"</string> + <string name="label_done_key" msgid="7564866296502630852">"ಮುಗಿದಿದೆ"</string> + <string name="label_send_key" msgid="482252074224462163">"ಕಳುಹಿಸು"</string> + <string name="label_search_key" msgid="7965186050435796642">"ಹುಡುಕಾಟ"</string> + <string name="label_pause_key" msgid="2225922926459730642">"ವಿರಾಮಗೊಳಿಸು"</string> + <string name="label_wait_key" msgid="5891247853595466039">"ನಿರೀಕ್ಷಿಸು"</string> +</resources> diff --git a/java/res/values-kn-rIN/strings-appname.xml b/java/res/values-kn-rIN/strings-appname.xml new file mode 100644 index 000000000..180915a33 --- /dev/null +++ b/java/res/values-kn-rIN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android ಕೀಬೋರ್ಡ್ (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android ಕೀಬೋರ್ಡ್ ಸೆಟ್ಟಿಂಗ್ಗಳು (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ ಸೆಟ್ಟಿಂಗ್ಗಳು (AOSP)"</string> +</resources> diff --git a/java/res/values-kn-rIN/strings-config-important-notice.xml b/java/res/values-kn-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..1ac5a2977 --- /dev/null +++ b/java/res/values-kn-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"ಸಲಹೆಗಳನ್ನು ಸುಧಾರಿಸಲು ನಿಮ್ಮ ಸಂವಹನಗಳು ಮತ್ತು ಟೈಪ್ ಮಾಡಿದ ಡೇಟಾದಿಂದ ತಿಳಿಯಿರಿ"</string> +</resources> diff --git a/java/res/values-kn-rIN/strings-letter-descriptions.xml b/java/res/values-kn-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..90e7d2c1d --- /dev/null +++ b/java/res/values-kn-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ಫೆಮಿನೈನ್ ಆರ್ಡಿನಲ್ ಸೂಚಕ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ಮೈಕ್ರೋ ಚಿಹ್ನೆ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ಫೆಮಿನೈನ್ ಆರ್ಡಿನಲ್ ಸೂಚಕ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ಶಾರ್ಪ್ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, ಮೊನಚು"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ಮೇಲೆ ರಿಂಗ್"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eನೇ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ಥಾರ್ನ್"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ಡಾಟ್ ಇಲ್ಲದ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ಕ್ರಾ"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ಮಧ್ಯದ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, ಅಫಾಸ್ಟ್ರಫಿಯಿಂದ ಮುಂದುವರೆದ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ಇಂಗ್ಲಿ"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, ಡಬಲ್ ಅಕ್ಯೂಟ್"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ಮೇಲೆ ರಿಂಗ್"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, ಡಬಲ್ ಅಕ್ಯೂಟ್"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"ದೀರ್ಘ S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ಕೋಡುಗಳು"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ಕೋಡು"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ಕೆಳಗೆ ಅಲ್ಪವಿರಾಮ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ಕೆಳಗೆ ಅಲ್ಪವಿರಾಮ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ಸ್ಕ್ವಾ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ಬ್ರೀವ್ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ಬ್ರೀವ್ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ಬ್ರೀವ್ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ಬ್ರೀವ್ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ಬ್ರೀವ್ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ಕೋಡು ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ಕೋಡು ಮತ್ತು ಸಮಾಧಿ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ಕೋಡು ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ಕೋಡು ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ಕೋಡು ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ಕೋಡು ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ಕೋಡು ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ಕೋಡು ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ಕೋಡು ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ಕೋಡು ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, ಟಿಲ್ಡ್"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"ತಲೆಕೆಳಗಾದ ಆಶ್ಚರ್ಯಸೂಚಕ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ಎಡಕ್ಕೆ ತಿರುಗಿದ ಡಬಲ್ ಕೋನದ ಉಲ್ಲೇಖನ ಗುರುತು"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"ಮಧ್ಯ ಡಾಟ್"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ಒಂದು"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ಬಲಕ್ಕೆ ತಿರುಗಿದ ಎರಡು ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"ತಲೆಕೆಳಗಾದ ಪ್ರಶ್ನಾರ್ಥಕ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ಎಡ ಏಕ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"ಬಲ ಏಕ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ಏಕೈಕ ಕೆಳಗಿನ-9 ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ಎಡ ಡಬಲ್ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ಬಲ ಡಬಲ್ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ಡ್ಯಾಗರ್"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ಡಬಲ್ ಡ್ಯಾಗರ್"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"ಪರ್ ಮಿಲ್ಲೆ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"ಪ್ರೈಮ್"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ಡಬಲ್ ಪ್ರೈಮ್"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ಏಕ ಎಡಕ್ಕೆ ತಿರುಗಿದ ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ಏಕ ಬಲಕ್ಕೆ ತಿರುಗಿದ ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ನಾಲ್ಕು"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ಲ್ಯಾಟಿನ್ ಸಣ್ಣ ಅಕ್ಷರ n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ಪೆಸೊ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"ಆರೈಕೆ"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ಬಲಭಾಗದ ಬಾಣ"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"ಕೆಳಮುಖವಾಗಿರುವ ಬಾಣ"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ಖಾಲಿ ಸೆಟ್"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"ವೃದ್ಧಿ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ಅದಕ್ಕಿಂತ ಕಡಿಮೆ ಅಥವಾ ಸಮ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಅಥವಾ ಸಮ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ಬ್ಲ್ಯಾಕ್ ಸ್ಟಾರ್"</string> +</resources> diff --git a/java/res/values-kn-rIN/strings-talkback-descriptions.xml b/java/res/values-kn-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..15cef7c97 --- /dev/null +++ b/java/res/values-kn-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ಪಾಸ್ವರ್ಡ್ ಕೀಗಳನ್ನು ಗಟ್ಟಿಯಾಗಿ ಕೇಳಲು ಹೆಡ್ಸೆಟ್ ಪ್ಲಗ್ ಇನ್ ಮಾಡಿ."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ಪ್ರಸ್ತುತ ಪದವು %s ಆಗಿದೆ"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ಯಾವುದೇ ಪಠ್ಯವನ್ನು ನಮೂದಿಸಿಲ್ಲ"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ನಿಂದ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ಆಗಿ <xliff:g id="KEY_NAME">%1$s</xliff:g> ಸರಿಪಡಿಸುತ್ತದೆ"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ಸ್ವಯಂ ತಿದ್ದುಪಡಿಯನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"ಅಪರಿಚಿತ ಅಕ್ಷರ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ಇನ್ನಷ್ಟು ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ಅಳಿಸು"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ಪತ್ರಗಳು"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"ಸಂಖ್ಯೆಗಳು"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ಟ್ಯಾಬ್"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ಸ್ಪೇಸ್"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ಧ್ವನಿ ಇನ್ಪುಟ್"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ಎಮೋಜಿ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ಹಿಂತಿರುಗು"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ಹುಡುಕು"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ಚುಕ್ಕೆ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ಭಾಷೆ ಬದಲಾಯಿಸಿ"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"ಮುಂದೆ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"ಹಿಂದೆ"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"ಹೆಚ್ಚು ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"ಅಕ್ಷರಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ಫೋನ್ ಮೋಡ್"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ಫೋನ್ ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"ಕೀಬೋರ್ಡ್ ಮರೆಮಾಡಲಾಗಿದೆ"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> ಕೀಬೋರ್ಡ್ ತೋರಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ದಿನಾಂಕ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ಇಮೇಲ್"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"ಸಂಖ್ಯೆ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ಫೋನ್"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ಪಠ್ಯ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ಸಮಯ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ಇತ್ತೀಚಿನವುಗಳು"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ಜನರು"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ವಸ್ತುಗಳು"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ಪ್ರಕೃತಿ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ಸ್ಥಳಗಳು"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ಎಮೋಟಿಕಾನ್ಗಳು"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"ಕ್ಯಾಪಿಟಲ್ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"ಕ್ಯಾಪಿಟಲ್ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"ಕ್ಯಾಪಿಟಲ್ I, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"ಅಪರಿಚಿತ ಚಿಹ್ನೆ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ಅಪರಿಚಿತ ಎಮೋಜಿ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ಪರ್ಯಾಯ ಅಕ್ಷರಗಳು ಲಭ್ಯ"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ಪರ್ಯಾಯ ಅಕ್ಷರಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ಪರ್ಯಾಯ ಸಲಹೆಗಳು ಲಭ್ಯ"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ಪರ್ಯಾಯ ಸಲಹೆಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> +</resources> diff --git a/java/res/values-kn-rIN/strings.xml b/java/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..6cc78ec5f --- /dev/null +++ b/java/res/values-kn-rIN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ಇನ್ಪುಟ್ ಆಯ್ಕೆಗಳು"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ಸಂಪರ್ಕ ಹೆಸರುಗಳನ್ನು ಹುಡುಕು"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವು ನಿಮ್ಮ ಸಂಪರ್ಕ ಪಟ್ಟಿಯ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"ಕೀಲಿಯನ್ನು ಒತ್ತಿದಾಗ ವೈಬ್ರೇಷನ್"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"ಕೀಲಿಯನ್ನು ಒತ್ತಿದಾಗ ಶಬ್ದಮಾಡು"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"ಕೀ ಒತ್ತಿದಾಗ ಪಾಪ್ ಅಪ್ ಮಾಡು"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ಇತರೆ ಇನ್ಪುಟ್ ವಿಧಾನಗಳಿಗೆ ಬದಲಾಯಿಸು"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ಭಾಷಾ ಬದಲಾವಣೆ ಕೀಯು ಇತರೆ ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಕೂಡ ಒಳಗೊಂಡಿರುತ್ತದೆ"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ಭಾಷೆ ಬದಲಾವಣೆ ಕೀ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"ಬಹು ಇನ್ಪುಟ್ ಭಾಷೆಗಳು ಸಕ್ರಿಯಗೊಂಡಾಗ ತೋರಿಸು"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"ಸ್ಲೈಡ್ ಸೂಚಕ ತೋರಿಸು"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift ಅಥವಾ ಚಿಹ್ನೆ ಕೀಗಳಿಂದ ಸ್ಲೈಡ್ ಮಾಡುವಾಗ ದೃಶ್ಯ ಕ್ಯೂ ಪ್ರದರ್ಶಿಸು"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"ಕೀ ಪಾಪ್ಅಪ್ನ ವಜಾ ವಿಳಂಬ"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ಯಾವುದೇ ವಿಳಂಬವಿಲ್ಲ"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ಡೀಫಾಲ್ಟ್"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>ಮಿ.ಸೆ."</string> + <string name="settings_system_default" msgid="6268225104743331821">"ಸಿಸ್ಟಂ ಡೀಫಾಲ್ಟ್"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"ಸಂಪರ್ಕ ಹೆಸರುಗಳನ್ನು ಸೂಚಿಸು"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ಸಲಹೆಗಳು ಮತ್ತು ತಿದ್ದುಪಡಿಗಳಿಗಾಗಿ ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ವೈಯುಕ್ತೀಕರಿಸಿದ ಸಲಹೆಗಳು"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಸುಧಾರಿಸಿ"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ಡಬಲ್-ಸ್ಪೇಸ್ ವಿರಾಮ"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"ಸ್ಪೇಸ್ಬಾರ್ ಮೇಲೆ ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡುವುದರಿಂದ ಸ್ಪೇಸ್ ನಂತರ ವಿರಾಮವನ್ನು ಸೇರಿಸುತ್ತದೆ"</string> + <string name="auto_cap" msgid="1719746674854628252">"ಸ್ವಯಂ-ದೊಡ್ಡಕ್ಷರ"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ಪ್ರತಿ ವಾಕ್ಯದ ಮೊದಲ ಅಕ್ಷರವನ್ನು ದೊಡ್ಡಕ್ಷರಗೊಳಿಸು"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"ವೈಯಕ್ತಿಕ ನಿಘಂಟು"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು"</string> + <string name="main_dictionary" msgid="4798763781818361168">"ಮುಖ್ಯ ನಿಘಂಟು"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"ತಿದ್ದುಪಡಿ ಸಲಹೆಗಳನ್ನು ತೋರಿಸು"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ಟೈಪ್ ಮಾಡುವಾಗ ಸಲಹೆ ನೀಡಿದ ಪದಗಳನ್ನು ಪ್ರದರ್ಶಿಸು"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ಯಾವಾಗಲೂ ತೋರಿಸು"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"ಪೋಟ್ರೇಟ್ ಮೋಡ್ನಲ್ಲಿ ತೋರಿಸು"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ಯಾವಾಗಲೂ ಮರೆಮಾಡು"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"ಅಕ್ಷೇಪಾರ್ಹ ಪದಗಳನ್ನು ನಿರ್ಬಂಧಿಸು"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"ಸಂಭಾವ್ಯ ಆಕ್ಷೇಪಾರ್ಹ ಪದಗಳ ಸಲಹೆ ನೀಡದಿರು"</string> + <string name="auto_correction" msgid="7630720885194996950">"ಸ್ವಯಂ-ತಿದ್ದುಪಡಿ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿದ ಪದಗಳನ್ನು ಸ್ಪೇಸ್ಬಾರ್ ಮತ್ತು ವಿರಾಮಚಿಹ್ನೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸರಿಪಡಿಸುತ್ತವೆ"</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_aggressive" msgid="7319007299148899623">"ಆಕ್ರಮಣಶೀಲ"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"ಹೆಚ್ಚು ಆಕ್ರಮಣಶೀಲ"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"ಮುಂದಿನ ಪದದ ಸಲಹೆಗಳು"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"ಸಲಹೆಗಳನ್ನು ಮಾಡುವಾಗ ಹಿಂದಿನ ಪದವನ್ನು ಬಳಸು"</string> + <string name="gesture_input" msgid="826951152254563827">"ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"ಅಕ್ಷರಗಳ ಮೇಲೆ ಸರಿಸುವ ಮೂಲಕ ಪದವೊಂದನ್ನು ನಮೂದಿಸಿ"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"ಗೆಶ್ಚರ್ ಟ್ರಯಲ್ ತೋರಿಸು"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ಡೈನಮಿಕ್ ಫ್ಲೋಟಿಂಗ್ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ಗೆಸ್ಟರ್ ಮಾಡುವಾಗ ಸೂಚಿಸಿದ ಪದವನ್ನು ನೋಡಿ"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ಪದಗುಚ್ಛದ ಗೆಶ್ಚರ್"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ಸ್ಪೇಸ್ ಕೀಗೆ ಗ್ಲೈಡ್ ಮಾಡುವ ಮೂಲಕ ಗೆಶ್ಚರ್ಗಳ ಅವಧಿಯಲ್ಲಿ ಅಂತರ ನಮೂದಿಸಿ"</string> + <string name="voice_input" msgid="3583258583521397548">"ಧ್ವನಿ ಇನ್ಪುಟ್ ಕೀ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"ಯಾವುದೇ ಧ್ವನಿ ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ. ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."</string> + <string name="configure_input_method" msgid="373356270290742459">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ಇನ್ಪುಟ್ ಭಾಷೆಗಳು"</string> + <string name="send_feedback" msgid="1780431884109392046">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string> + <string name="select_language" msgid="3693815588777926848">"ಇನ್ಪುಟ್ ಭಾಷೆಗಳು"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"ಉಳಿಸಲು ಮತ್ತೆ ಸ್ಪರ್ಶಿಸಿ"</string> + <string name="has_dictionary" msgid="6071847973466625007">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"ಕೀಬೋರ್ಡ್ ಥೀಮ್"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ಇಂಗ್ಲಿಷ್ (UK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ಇಂಗ್ಲಿಷ್ (US)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ಸ್ಪ್ಯಾನಿಷ್ (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ಇಂಗ್ಲಿಷ್ (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ಇಂಗ್ಲಿಷ್ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ಸ್ಪ್ಯಾನಿಷ್ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಸಾಂಪ್ರದಾಯಿಕ)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಸಿರಿಲಿಕ್)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಲ್ಯಾಟಿನ್)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ (ವರ್ಣಮಾಲೆ)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ವರ್ಣಮಾಲೆ (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ವರ್ಣಮಾಲೆ (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"ವರ್ಣಮಾಲೆ (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"ವರ್ಣಮಾಲೆ (ಡ್ವೊರಕ್)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ವರ್ಣಮಾಲೆ (ಕೋಲ್ಮ್ಯಾಕ್)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ವರ್ಣಮಾಲೆ (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ಎಮೋಜಿ"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"ಕಸ್ಟಮ್ ಇನ್ಪುಟ್ ಶೈಲಿಗಳು"</string> + <string name="add_style" msgid="6163126614514489951">"ಶೈಲಿ ಸೇರಿಸು"</string> + <string name="add" msgid="8299699805688017798">"ಸೇರಿಸು"</string> + <string name="remove" msgid="4486081658752944606">"ತೆಗೆದುಹಾಕಿ"</string> + <string name="save" msgid="7646738597196767214">"ಉಳಿಸಿ"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ಭಾಷೆ"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"ಲೇಔಟ್"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"ನಿಮ್ಮ ಕಸ್ಟಮ್ ಇನ್ಪುಟ್ ಶೈಲಿಯನ್ನು ನೀವು ಬಳಸಲು ಪ್ರಾರಂಭಿಸುವ ಮುನ್ನ ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾದ ಅಗತ್ಯವಿದೆ. ಇದೀಗ ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ?"</string> + <string name="enable" msgid="5031294444630523247">"ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="not_now" msgid="6172462888202790482">"ಸದ್ಯಕ್ಕೆ ಬೇಡ"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ಅದೇ ರೀತಿಯ ಇನ್ಪುಟ್ ಶೈಲಿಯು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"ಕೀಯ ದೀರ್ಘ ಒತ್ತುವ ವಿಳಂಬ"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ಕೀಒತ್ತುವ ವೈಬ್ರೇಷನ್ ಅವಧಿ"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"ಕೀಒತ್ತುವ ಶಬ್ದದ ವಾಲ್ಯೂಮ್"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ಬಾಹ್ಯ ನಿಘಂಟು ಫೈಲ್ ಓದಿ"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ಡೌನ್ಲೋಡ್ ಫೋಲ್ಡರ್ನಲ್ಲಿ ಯಾವುದೇ ನಿಘಂಟು ಫೈಲ್ಗಳಿಲ್ಲ"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ಸ್ಥಾಪಿಸಬೇಕಾದ ನಿಘಂಟು ಫೈಲ್ ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> ಗಾಗಿ ಈ ಫೈಲ್ ಅನ್ನು ನಿಜಕ್ಕೂ ಸ್ಥಾಪಿಸುವುದೇ?"</string> + <string name="error" msgid="8940763624668513648">"ದೋಷ ಉಂಟಾಗಿದೆ"</string> + <string name="button_default" msgid="3988017840431881491">"ಡೀಫಾಲ್ಟ್"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಗೆ ಸುಸ್ವಾಗತ"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್ನೊಂದಿಗೆ"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ಪ್ರಾರಂಭ"</string> + <string name="setup_next_action" msgid="371821437915144603">"ಮುಂದಿನ ಹಂತ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"ನಿಮ್ಮ ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ದಯವಿಟ್ಟು \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" ಅನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅದನ್ನು ಚಾಲನೆ ಮಾಡಲು ಅದು ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಅನ್ನು ಈಗಾಗಲೇ ನಿಮ್ಮ ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಹೀಗಾಗಿ ಈ ಹಂತ ಮುಗಿದಿದೆ. ಮುಂದಿನದಕ್ಕೆ ತೆರಳಿ!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಗೆ ಬದಲಾಯಿಸಿ"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"ಮುಂದೆ, ನಿಮ್ಮ ಸಕ್ರಿಯ ಪಠ್ಯ-ಇನ್ಪುಟ್ ವಿಧಾನವಾಗಿ \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಬದಲಾಯಿಸು"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"ಅಭಿನಂದನೆಗಳು, ನೀವೀಗ ಎಲ್ಲವನ್ನೂ ಹೊಂದಿಸಿರುವಿರಿ!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"ಈಗ ನೀವು <xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ನಿಮ್ಮ ಎಲ್ಲ ಮೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡಬಹುದು."</string> + <string name="setup_step3_action" msgid="600879797256942259">"ಹೆಚ್ಚುವರಿ ಭಾಷೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡು"</string> + <string name="setup_finish_action" msgid="276559243409465389">"ಮುಕ್ತಾಯಗೊಂಡಿದೆ"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ತೋರಿಸು"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ಲಾಂಚರ್ನಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ಪ್ರದರ್ಶಿಸು"</string> + <string name="app_name" msgid="6320102637491234792">"ನಿಘಂಟು ಪೂರೈಕೆದಾರರು"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ನಿಘಂಟು ಪೂರೈಕೆದಾರರು"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"ನಿಘಂಟು ಸೇವೆ"</string> + <string name="download_description" msgid="6014835283119198591">"ನಿಘಂಟು ನವೀಕರಣ ಮಾಹಿತಿ"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"ನಿಘಂಟುಗಳಿಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ಬಳಕೆದಾರರ ನಿಘಂಟುಗಳು"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ಬಳಕೆದಾರರ ನಿಘಂಟು"</string> + <string name="dictionary_available" msgid="4728975345815214218">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"ಪ್ರಸ್ತುತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ಸ್ಥಾಪಿಸಲಾಗಿದೆ, ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"ನಿಘಂಟು ಸೇವೆಗೆ ಸಂಪರ್ಕಗೊಳಿಸುವಾಗ ಸಮಸ್ಯೆ"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"ನಿಘಂಟುಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"ರೀಫ್ರೆಶ್ ಮಾಡಿ"</string> + <string name="last_update" msgid="730467549913588780">"ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಿರುವುದು"</string> + <string name="message_updating" msgid="4457761393932375219">"ನವೀಕರಣಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="message_loading" msgid="5638680861387748936">"ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"ಮುಖ್ಯ ನಿಘಂಟು"</string> + <string name="cancel" msgid="6830980399865683324">"ರದ್ದುಮಾಡು"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="install_dict" msgid="180852772562189365">"ಸ್ಥಾಪಿಸು"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ರದ್ದುಮಾಡು"</string> + <string name="delete_dict" msgid="756853268088330054">"ಅಳಿಸು"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದಲ್ಲಿ ಆಯ್ಕೆ ಮಾಡಲಾದ ಭಾಷೆಗೆ ನಿಘಂಟು ಲಭ್ಯವಿದೆ.<br/> ನಿಮ್ಮ ಟೈಪ್ ಮಾಡುವ ಅನುಭವದ ಸುಧಾರಣೆಗೆ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ನಿಘಂಟು <b>ಡೌನ್ಲೋಡ್</b> ಮಾಡಿಕೊಳ್ಳಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.<br/> <br/> ಡೌನ್ಲೋಡ್ಗೆ 3G ಯಲ್ಲಿ ಒಂದು ಅಥವಾ ಎರಡು ನಿಮಿಷ ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ನೀವು <b>ಅನಿಯಮಿತ ಡೇಟಾ ಪ್ಲ್ಯಾನ್</b> ಹೊಂದಿಲ್ಲದೆ ಇದ್ದರೆ ಶುಲ್ಕ ಅನ್ವಯಿಸಬಹುದು, ನಿಮ್ಮ ಡೇಟಾ ಪ್ಲ್ಯಾನ್ ಯಾವುದು ಅನ್ನುವುದರ ಕುರಿತು ನಿಮಗೆ ಖಾತ್ರಿಯಿಲ್ಲವಾದರೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಪ್ರಾರಂಭಿಸುವುದಕ್ಕಾಗಿ Wi-Fi ಸಂಪರ್ಕ ಹುಡುಕಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.<br/> <br/> ಸಲಹೆ: ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದ ಮೆನುನಲ್ಲಿ <b>ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ</b> <b>ಭಾಷೆ & ಇನ್ಪುಟ್ಗೆ</b> ಹೋಗುವ ಮೂಲಕ ನಿಘಂಟುಗಳನ್ನು ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಬಹುದು ಮತ್ತು ತೆಗೆದುಹಾಕಬಹುದು."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ಇದೀಗ ಡೌನ್ಲೋಡ್ ಮಾಡು (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi ಮೂಲಕ ಡೌನ್ಲೋಡ್ ಮಾಡು"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ಗೆ ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"ವಿಮರ್ಶಿಸಲು ಮತ್ತು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಒತ್ತಿರಿ"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ಗೆ ಸಲಹೆಗಳು ಶೀಘ್ರವೇ ಸಿದ್ಧಗೊಳ್ಳಲಿವೆ."</string> + <string name="version_text" msgid="2715354215568469385">"ಆವೃತ್ತಿ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ಸೇರಿಸು"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"ನುಡಿಗಟ್ಟು"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"ಕಡಿಮೆ ಆಯ್ಕೆಗಳು"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ಸರಿ"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"ಪದ:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"ಶಾರ್ಟ್ಕಟ್:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ಭಾಷೆ:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"ಪದವನ್ನು ಟೈಪ್ ಮಾಡಿ"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ಐಚ್ಛಿಕ ಶಾರ್ಟ್ಕಟ್"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"ಪದವನ್ನು ಸಂಪಾದಿಸಿ"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"ಸಂಪಾದಿಸಿ"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"ಅಳಿಸು"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ಬಳಕೆದಾರರ ನಿಘಂಟಿನಲ್ಲಿ ನೀವು ಯಾವುದೇ ಪದಗಳನ್ನು ಹೊಂದಿಲ್ಲ. ಸೇರಿಸು (+) ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸುವ ಮೂಲಕ ಪದವೊಂದನ್ನು ಸೇರಿಸಿ."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"ಎಲ್ಲ ಭಾಷೆಗಳಿಗೆ"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"ಇನ್ನಷ್ಟು ಭಾಷೆಗಳು…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"ಅಳಿಸು"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings-action-keys.xml b/java/res/values-kn-rKA/strings-action-keys.xml new file mode 100644 index 000000000..d54cbda60 --- /dev/null +++ b/java/res/values-kn-rKA/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"ಹೋಗು"</string> + <string name="label_next_key" msgid="5586407279258592635">"ಮುಂದೆ"</string> + <string name="label_previous_key" msgid="1421141755779895275">"ಹಿಂದೆ"</string> + <string name="label_done_key" msgid="7564866296502630852">"ಮುಗಿದಿದೆ"</string> + <string name="label_send_key" msgid="482252074224462163">"ಕಳುಹಿಸು"</string> + <string name="label_search_key" msgid="7965186050435796642">"ಹುಡುಕಾಟ"</string> + <string name="label_pause_key" msgid="2225922926459730642">"ವಿರಾಮಗೊಳಿಸು"</string> + <string name="label_wait_key" msgid="5891247853595466039">"ನಿರೀಕ್ಷಿಸು"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings-appname.xml b/java/res/values-kn-rKA/strings-appname.xml new file mode 100644 index 000000000..180915a33 --- /dev/null +++ b/java/res/values-kn-rKA/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android ಕೀಬೋರ್ಡ್ (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android ಕೀಬೋರ್ಡ್ ಸೆಟ್ಟಿಂಗ್ಗಳು (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android ಕಾಗುಣಿತ ಪರೀಕ್ಷಕ ಸೆಟ್ಟಿಂಗ್ಗಳು (AOSP)"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings-config-important-notice.xml b/java/res/values-kn-rKA/strings-config-important-notice.xml new file mode 100644 index 000000000..1ac5a2977 --- /dev/null +++ b/java/res/values-kn-rKA/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"ಸಲಹೆಗಳನ್ನು ಸುಧಾರಿಸಲು ನಿಮ್ಮ ಸಂವಹನಗಳು ಮತ್ತು ಟೈಪ್ ಮಾಡಿದ ಡೇಟಾದಿಂದ ತಿಳಿಯಿರಿ"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings-letter-descriptions.xml b/java/res/values-kn-rKA/strings-letter-descriptions.xml new file mode 100644 index 000000000..90e7d2c1d --- /dev/null +++ b/java/res/values-kn-rKA/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ಫೆಮಿನೈನ್ ಆರ್ಡಿನಲ್ ಸೂಚಕ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ಮೈಕ್ರೋ ಚಿಹ್ನೆ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ಫೆಮಿನೈನ್ ಆರ್ಡಿನಲ್ ಸೂಚಕ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ಶಾರ್ಪ್ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, ಮೊನಚು"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ಮೇಲೆ ರಿಂಗ್"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eನೇ"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ಥಾರ್ನ್"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ಡಯಾರೆಸಿಸ್"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ಡಾಟ್ ಇಲ್ಲದ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ಕ್ರಾ"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ಮಧ್ಯದ ಡಾಟ್"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, ಅಫಾಸ್ಟ್ರಫಿಯಿಂದ ಮುಂದುವರೆದ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ಇಂಗ್ಲಿ"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, ಡಬಲ್ ಅಕ್ಯೂಟ್"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ಲಿಗೇಚರ್"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, ಸೆಡಿಲಾ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, ಸ್ಟ್ರೋಕ್"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, ಮ್ಯಾಕ್ರಾನ್"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ಬ್ರೀವ್"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ಮೇಲೆ ರಿಂಗ್"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, ಡಬಲ್ ಅಕ್ಯೂಟ್"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ಒಗೊನೆಕ್"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, ಬಾಗಿರುವ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, ಕ್ಯಾರನ್"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"ದೀರ್ಘ S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ಕೋಡುಗಳು"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ಕೋಡು"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ಕೆಳಗೆ ಅಲ್ಪವಿರಾಮ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ಕೆಳಗೆ ಅಲ್ಪವಿರಾಮ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ಸ್ಕ್ವಾ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ಬ್ರೀವ್ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ಬ್ರೀವ್ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ಬ್ರೀವ್ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ಬ್ರೀವ್ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ಬ್ರೀವ್ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, ಬಾಗಿರುವ ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, ಬಾಗಿರುವ ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, ಬಾಗಿರುವ ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, ಬಾಗಿರುವ ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, ಬಾಗಿರುವ ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ಕೋಡು ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ಕೋಡು ಮತ್ತು ಸಮಾಧಿ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ಕೋಡು ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ಕೋಡು ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ಕೋಡು ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ಕೋಡು ಮತ್ತು ಮೊನಚಾದ"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ಕೋಡು ಮತ್ತು ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ಕೋಡು ಮತ್ತು ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ಕೋಡು ಮತ್ತು ಟಿಲ್ಡ್"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ಕೋಡು ಮತ್ತು ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, ಗ್ರೇವ್"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ಕೆಳಗೆ ಡಾಟ್"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ಮೇಲೆ ಹುಕ್"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, ಟಿಲ್ಡ್"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"ತಲೆಕೆಳಗಾದ ಆಶ್ಚರ್ಯಸೂಚಕ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ಎಡಕ್ಕೆ ತಿರುಗಿದ ಡಬಲ್ ಕೋನದ ಉಲ್ಲೇಖನ ಗುರುತು"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"ಮಧ್ಯ ಡಾಟ್"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ಒಂದು"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ಬಲಕ್ಕೆ ತಿರುಗಿದ ಎರಡು ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"ತಲೆಕೆಳಗಾದ ಪ್ರಶ್ನಾರ್ಥಕ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ಎಡ ಏಕ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"ಬಲ ಏಕ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ಏಕೈಕ ಕೆಳಗಿನ-9 ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ಎಡ ಡಬಲ್ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ಬಲ ಡಬಲ್ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ಡ್ಯಾಗರ್"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ಡಬಲ್ ಡ್ಯಾಗರ್"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"ಪರ್ ಮಿಲ್ಲೆ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"ಪ್ರೈಮ್"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ಡಬಲ್ ಪ್ರೈಮ್"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ಏಕ ಎಡಕ್ಕೆ ತಿರುಗಿದ ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ಏಕ ಬಲಕ್ಕೆ ತಿರುಗಿದ ಕೋನದ ಉದ್ಧರಣ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ನಾಲ್ಕು"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ಸೂಪರ್ಸ್ಕ್ರಿಪ್ಟ್ ಲ್ಯಾಟಿನ್ ಸಣ್ಣ ಅಕ್ಷರ n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ಪೆಸೊ ಚಿಹ್ನೆ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"ಆರೈಕೆ"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ಬಲಭಾಗದ ಬಾಣ"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"ಕೆಳಮುಖವಾಗಿರುವ ಬಾಣ"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ಖಾಲಿ ಸೆಟ್"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"ವೃದ್ಧಿ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ಅದಕ್ಕಿಂತ ಕಡಿಮೆ ಅಥವಾ ಸಮ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಅಥವಾ ಸಮ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ಬ್ಲ್ಯಾಕ್ ಸ್ಟಾರ್"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings-talkback-descriptions.xml b/java/res/values-kn-rKA/strings-talkback-descriptions.xml new file mode 100644 index 000000000..15cef7c97 --- /dev/null +++ b/java/res/values-kn-rKA/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ಪಾಸ್ವರ್ಡ್ ಕೀಗಳನ್ನು ಗಟ್ಟಿಯಾಗಿ ಕೇಳಲು ಹೆಡ್ಸೆಟ್ ಪ್ಲಗ್ ಇನ್ ಮಾಡಿ."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ಪ್ರಸ್ತುತ ಪದವು %s ಆಗಿದೆ"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ಯಾವುದೇ ಪಠ್ಯವನ್ನು ನಮೂದಿಸಿಲ್ಲ"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ನಿಂದ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ಆಗಿ <xliff:g id="KEY_NAME">%1$s</xliff:g> ಸರಿಪಡಿಸುತ್ತದೆ"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ಸ್ವಯಂ ತಿದ್ದುಪಡಿಯನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"ಅಪರಿಚಿತ ಅಕ್ಷರ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ಇನ್ನಷ್ಟು ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ಅಳಿಸು"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ಪತ್ರಗಳು"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"ಸಂಖ್ಯೆಗಳು"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ಟ್ಯಾಬ್"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ಸ್ಪೇಸ್"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ಧ್ವನಿ ಇನ್ಪುಟ್"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ಎಮೋಜಿ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ಹಿಂತಿರುಗು"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ಹುಡುಕು"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ಚುಕ್ಕೆ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ಭಾಷೆ ಬದಲಾಯಿಸಿ"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"ಮುಂದೆ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"ಹಿಂದೆ"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"ಹೆಚ್ಚು ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"ಅಕ್ಷರಗಳ ಮೋಡ್"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ಫೋನ್ ಮೋಡ್"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ಫೋನ್ ಸಂಕೇತಗಳ ಮೋಡ್"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"ಕೀಬೋರ್ಡ್ ಮರೆಮಾಡಲಾಗಿದೆ"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> ಕೀಬೋರ್ಡ್ ತೋರಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ದಿನಾಂಕ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ಇಮೇಲ್"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"ಸಂಖ್ಯೆ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ಫೋನ್"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ಪಠ್ಯ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ಸಮಯ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ಇತ್ತೀಚಿನವುಗಳು"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ಜನರು"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ವಸ್ತುಗಳು"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ಪ್ರಕೃತಿ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ಸ್ಥಳಗಳು"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ಸಂಕೇತಗಳು"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ಎಮೋಟಿಕಾನ್ಗಳು"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"ಕ್ಯಾಪಿಟಲ್ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"ಕ್ಯಾಪಿಟಲ್ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"ಕ್ಯಾಪಿಟಲ್ I, ಮೇಲೆ ಡಾಟ್"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"ಅಪರಿಚಿತ ಚಿಹ್ನೆ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ಅಪರಿಚಿತ ಎಮೋಜಿ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ಪರ್ಯಾಯ ಅಕ್ಷರಗಳು ಲಭ್ಯ"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ಪರ್ಯಾಯ ಅಕ್ಷರಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ಪರ್ಯಾಯ ಸಲಹೆಗಳು ಲಭ್ಯ"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ಪರ್ಯಾಯ ಸಲಹೆಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string> +</resources> diff --git a/java/res/values-kn-rKA/strings.xml b/java/res/values-kn-rKA/strings.xml new file mode 100644 index 000000000..6cc78ec5f --- /dev/null +++ b/java/res/values-kn-rKA/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ಇನ್ಪುಟ್ ಆಯ್ಕೆಗಳು"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ಸಂಪರ್ಕ ಹೆಸರುಗಳನ್ನು ಹುಡುಕು"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ಕಾಗುಣಿತ ಪರೀಕ್ಷಕವು ನಿಮ್ಮ ಸಂಪರ್ಕ ಪಟ್ಟಿಯ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"ಕೀಲಿಯನ್ನು ಒತ್ತಿದಾಗ ವೈಬ್ರೇಷನ್"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"ಕೀಲಿಯನ್ನು ಒತ್ತಿದಾಗ ಶಬ್ದಮಾಡು"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"ಕೀ ಒತ್ತಿದಾಗ ಪಾಪ್ ಅಪ್ ಮಾಡು"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ಇತರೆ ಇನ್ಪುಟ್ ವಿಧಾನಗಳಿಗೆ ಬದಲಾಯಿಸು"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ಭಾಷಾ ಬದಲಾವಣೆ ಕೀಯು ಇತರೆ ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಕೂಡ ಒಳಗೊಂಡಿರುತ್ತದೆ"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ಭಾಷೆ ಬದಲಾವಣೆ ಕೀ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"ಬಹು ಇನ್ಪುಟ್ ಭಾಷೆಗಳು ಸಕ್ರಿಯಗೊಂಡಾಗ ತೋರಿಸು"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"ಸ್ಲೈಡ್ ಸೂಚಕ ತೋರಿಸು"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift ಅಥವಾ ಚಿಹ್ನೆ ಕೀಗಳಿಂದ ಸ್ಲೈಡ್ ಮಾಡುವಾಗ ದೃಶ್ಯ ಕ್ಯೂ ಪ್ರದರ್ಶಿಸು"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"ಕೀ ಪಾಪ್ಅಪ್ನ ವಜಾ ವಿಳಂಬ"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ಯಾವುದೇ ವಿಳಂಬವಿಲ್ಲ"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ಡೀಫಾಲ್ಟ್"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>ಮಿ.ಸೆ."</string> + <string name="settings_system_default" msgid="6268225104743331821">"ಸಿಸ್ಟಂ ಡೀಫಾಲ್ಟ್"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"ಸಂಪರ್ಕ ಹೆಸರುಗಳನ್ನು ಸೂಚಿಸು"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ಸಲಹೆಗಳು ಮತ್ತು ತಿದ್ದುಪಡಿಗಳಿಗಾಗಿ ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ವೈಯುಕ್ತೀಕರಿಸಿದ ಸಲಹೆಗಳು"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಸುಧಾರಿಸಿ"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ಡಬಲ್-ಸ್ಪೇಸ್ ವಿರಾಮ"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"ಸ್ಪೇಸ್ಬಾರ್ ಮೇಲೆ ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡುವುದರಿಂದ ಸ್ಪೇಸ್ ನಂತರ ವಿರಾಮವನ್ನು ಸೇರಿಸುತ್ತದೆ"</string> + <string name="auto_cap" msgid="1719746674854628252">"ಸ್ವಯಂ-ದೊಡ್ಡಕ್ಷರ"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ಪ್ರತಿ ವಾಕ್ಯದ ಮೊದಲ ಅಕ್ಷರವನ್ನು ದೊಡ್ಡಕ್ಷರಗೊಳಿಸು"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"ವೈಯಕ್ತಿಕ ನಿಘಂಟು"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು"</string> + <string name="main_dictionary" msgid="4798763781818361168">"ಮುಖ್ಯ ನಿಘಂಟು"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"ತಿದ್ದುಪಡಿ ಸಲಹೆಗಳನ್ನು ತೋರಿಸು"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ಟೈಪ್ ಮಾಡುವಾಗ ಸಲಹೆ ನೀಡಿದ ಪದಗಳನ್ನು ಪ್ರದರ್ಶಿಸು"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ಯಾವಾಗಲೂ ತೋರಿಸು"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"ಪೋಟ್ರೇಟ್ ಮೋಡ್ನಲ್ಲಿ ತೋರಿಸು"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ಯಾವಾಗಲೂ ಮರೆಮಾಡು"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"ಅಕ್ಷೇಪಾರ್ಹ ಪದಗಳನ್ನು ನಿರ್ಬಂಧಿಸು"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"ಸಂಭಾವ್ಯ ಆಕ್ಷೇಪಾರ್ಹ ಪದಗಳ ಸಲಹೆ ನೀಡದಿರು"</string> + <string name="auto_correction" msgid="7630720885194996950">"ಸ್ವಯಂ-ತಿದ್ದುಪಡಿ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿದ ಪದಗಳನ್ನು ಸ್ಪೇಸ್ಬಾರ್ ಮತ್ತು ವಿರಾಮಚಿಹ್ನೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸರಿಪಡಿಸುತ್ತವೆ"</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_aggressive" msgid="7319007299148899623">"ಆಕ್ರಮಣಶೀಲ"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"ಹೆಚ್ಚು ಆಕ್ರಮಣಶೀಲ"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"ಮುಂದಿನ ಪದದ ಸಲಹೆಗಳು"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"ಸಲಹೆಗಳನ್ನು ಮಾಡುವಾಗ ಹಿಂದಿನ ಪದವನ್ನು ಬಳಸು"</string> + <string name="gesture_input" msgid="826951152254563827">"ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"ಅಕ್ಷರಗಳ ಮೇಲೆ ಸರಿಸುವ ಮೂಲಕ ಪದವೊಂದನ್ನು ನಮೂದಿಸಿ"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"ಗೆಶ್ಚರ್ ಟ್ರಯಲ್ ತೋರಿಸು"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ಡೈನಮಿಕ್ ಫ್ಲೋಟಿಂಗ್ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ಗೆಸ್ಟರ್ ಮಾಡುವಾಗ ಸೂಚಿಸಿದ ಪದವನ್ನು ನೋಡಿ"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ಪದಗುಚ್ಛದ ಗೆಶ್ಚರ್"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ಸ್ಪೇಸ್ ಕೀಗೆ ಗ್ಲೈಡ್ ಮಾಡುವ ಮೂಲಕ ಗೆಶ್ಚರ್ಗಳ ಅವಧಿಯಲ್ಲಿ ಅಂತರ ನಮೂದಿಸಿ"</string> + <string name="voice_input" msgid="3583258583521397548">"ಧ್ವನಿ ಇನ್ಪುಟ್ ಕೀ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"ಯಾವುದೇ ಧ್ವನಿ ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ. ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."</string> + <string name="configure_input_method" msgid="373356270290742459">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ಇನ್ಪುಟ್ ಭಾಷೆಗಳು"</string> + <string name="send_feedback" msgid="1780431884109392046">"ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string> + <string name="select_language" msgid="3693815588777926848">"ಇನ್ಪುಟ್ ಭಾಷೆಗಳು"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"ಉಳಿಸಲು ಮತ್ತೆ ಸ್ಪರ್ಶಿಸಿ"</string> + <string name="has_dictionary" msgid="6071847973466625007">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"ಕೀಬೋರ್ಡ್ ಥೀಮ್"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ಇಂಗ್ಲಿಷ್ (UK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ಇಂಗ್ಲಿಷ್ (US)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ಸ್ಪ್ಯಾನಿಷ್ (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ಇಂಗ್ಲಿಷ್ (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ಇಂಗ್ಲಿಷ್ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ಸ್ಪ್ಯಾನಿಷ್ (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಸಾಂಪ್ರದಾಯಿಕ)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಸಿರಿಲಿಕ್)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ಲ್ಯಾಟಿನ್)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ (ವರ್ಣಮಾಲೆ)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ವರ್ಣಮಾಲೆ (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ವರ್ಣಮಾಲೆ (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"ವರ್ಣಮಾಲೆ (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"ವರ್ಣಮಾಲೆ (ಡ್ವೊರಕ್)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ವರ್ಣಮಾಲೆ (ಕೋಲ್ಮ್ಯಾಕ್)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ವರ್ಣಮಾಲೆ (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ಎಮೋಜಿ"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"ಕಸ್ಟಮ್ ಇನ್ಪುಟ್ ಶೈಲಿಗಳು"</string> + <string name="add_style" msgid="6163126614514489951">"ಶೈಲಿ ಸೇರಿಸು"</string> + <string name="add" msgid="8299699805688017798">"ಸೇರಿಸು"</string> + <string name="remove" msgid="4486081658752944606">"ತೆಗೆದುಹಾಕಿ"</string> + <string name="save" msgid="7646738597196767214">"ಉಳಿಸಿ"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ಭಾಷೆ"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"ಲೇಔಟ್"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"ನಿಮ್ಮ ಕಸ್ಟಮ್ ಇನ್ಪುಟ್ ಶೈಲಿಯನ್ನು ನೀವು ಬಳಸಲು ಪ್ರಾರಂಭಿಸುವ ಮುನ್ನ ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾದ ಅಗತ್ಯವಿದೆ. ಇದೀಗ ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ?"</string> + <string name="enable" msgid="5031294444630523247">"ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="not_now" msgid="6172462888202790482">"ಸದ್ಯಕ್ಕೆ ಬೇಡ"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ಅದೇ ರೀತಿಯ ಇನ್ಪುಟ್ ಶೈಲಿಯು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"ಕೀಯ ದೀರ್ಘ ಒತ್ತುವ ವಿಳಂಬ"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ಕೀಒತ್ತುವ ವೈಬ್ರೇಷನ್ ಅವಧಿ"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"ಕೀಒತ್ತುವ ಶಬ್ದದ ವಾಲ್ಯೂಮ್"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ಬಾಹ್ಯ ನಿಘಂಟು ಫೈಲ್ ಓದಿ"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ಡೌನ್ಲೋಡ್ ಫೋಲ್ಡರ್ನಲ್ಲಿ ಯಾವುದೇ ನಿಘಂಟು ಫೈಲ್ಗಳಿಲ್ಲ"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ಸ್ಥಾಪಿಸಬೇಕಾದ ನಿಘಂಟು ಫೈಲ್ ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> ಗಾಗಿ ಈ ಫೈಲ್ ಅನ್ನು ನಿಜಕ್ಕೂ ಸ್ಥಾಪಿಸುವುದೇ?"</string> + <string name="error" msgid="8940763624668513648">"ದೋಷ ಉಂಟಾಗಿದೆ"</string> + <string name="button_default" msgid="3988017840431881491">"ಡೀಫಾಲ್ಟ್"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಗೆ ಸುಸ್ವಾಗತ"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್ನೊಂದಿಗೆ"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ಪ್ರಾರಂಭ"</string> + <string name="setup_next_action" msgid="371821437915144603">"ಮುಂದಿನ ಹಂತ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"ನಿಮ್ಮ ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ದಯವಿಟ್ಟು \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" ಅನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅದನ್ನು ಚಾಲನೆ ಮಾಡಲು ಅದು ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಅನ್ನು ಈಗಾಗಲೇ ನಿಮ್ಮ ಭಾಷೆ & ಇನ್ಪುಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಹೀಗಾಗಿ ಈ ಹಂತ ಮುಗಿದಿದೆ. ಮುಂದಿನದಕ್ಕೆ ತೆರಳಿ!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸು"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ಗೆ ಬದಲಾಯಿಸಿ"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"ಮುಂದೆ, ನಿಮ್ಮ ಸಕ್ರಿಯ ಪಠ್ಯ-ಇನ್ಪುಟ್ ವಿಧಾನವಾಗಿ \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಬದಲಾಯಿಸು"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"ಅಭಿನಂದನೆಗಳು, ನೀವೀಗ ಎಲ್ಲವನ್ನೂ ಹೊಂದಿಸಿರುವಿರಿ!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"ಈಗ ನೀವು <xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ನಿಮ್ಮ ಎಲ್ಲ ಮೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡಬಹುದು."</string> + <string name="setup_step3_action" msgid="600879797256942259">"ಹೆಚ್ಚುವರಿ ಭಾಷೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡು"</string> + <string name="setup_finish_action" msgid="276559243409465389">"ಮುಕ್ತಾಯಗೊಂಡಿದೆ"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ತೋರಿಸು"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ಲಾಂಚರ್ನಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ಪ್ರದರ್ಶಿಸು"</string> + <string name="app_name" msgid="6320102637491234792">"ನಿಘಂಟು ಪೂರೈಕೆದಾರರು"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ನಿಘಂಟು ಪೂರೈಕೆದಾರರು"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"ನಿಘಂಟು ಸೇವೆ"</string> + <string name="download_description" msgid="6014835283119198591">"ನಿಘಂಟು ನವೀಕರಣ ಮಾಹಿತಿ"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"ನಿಘಂಟುಗಳಿಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ಬಳಕೆದಾರರ ನಿಘಂಟುಗಳು"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ಬಳಕೆದಾರರ ನಿಘಂಟು"</string> + <string name="dictionary_available" msgid="4728975345815214218">"ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"ಪ್ರಸ್ತುತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ಸ್ಥಾಪಿಸಲಾಗಿದೆ, ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"ನಿಘಂಟು ಸೇವೆಗೆ ಸಂಪರ್ಕಗೊಳಿಸುವಾಗ ಸಮಸ್ಯೆ"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"ನಿಘಂಟುಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"ರೀಫ್ರೆಶ್ ಮಾಡಿ"</string> + <string name="last_update" msgid="730467549913588780">"ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಿರುವುದು"</string> + <string name="message_updating" msgid="4457761393932375219">"ನವೀಕರಣಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="message_loading" msgid="5638680861387748936">"ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"ಮುಖ್ಯ ನಿಘಂಟು"</string> + <string name="cancel" msgid="6830980399865683324">"ರದ್ದುಮಾಡು"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="install_dict" msgid="180852772562189365">"ಸ್ಥಾಪಿಸು"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ರದ್ದುಮಾಡು"</string> + <string name="delete_dict" msgid="756853268088330054">"ಅಳಿಸು"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದಲ್ಲಿ ಆಯ್ಕೆ ಮಾಡಲಾದ ಭಾಷೆಗೆ ನಿಘಂಟು ಲಭ್ಯವಿದೆ.<br/> ನಿಮ್ಮ ಟೈಪ್ ಮಾಡುವ ಅನುಭವದ ಸುಧಾರಣೆಗೆ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ನಿಘಂಟು <b>ಡೌನ್ಲೋಡ್</b> ಮಾಡಿಕೊಳ್ಳಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.<br/> <br/> ಡೌನ್ಲೋಡ್ಗೆ 3G ಯಲ್ಲಿ ಒಂದು ಅಥವಾ ಎರಡು ನಿಮಿಷ ತೆಗೆದುಕೊಳ್ಳಬಹುದು. ನೀವು <b>ಅನಿಯಮಿತ ಡೇಟಾ ಪ್ಲ್ಯಾನ್</b> ಹೊಂದಿಲ್ಲದೆ ಇದ್ದರೆ ಶುಲ್ಕ ಅನ್ವಯಿಸಬಹುದು, ನಿಮ್ಮ ಡೇಟಾ ಪ್ಲ್ಯಾನ್ ಯಾವುದು ಅನ್ನುವುದರ ಕುರಿತು ನಿಮಗೆ ಖಾತ್ರಿಯಿಲ್ಲವಾದರೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಪ್ರಾರಂಭಿಸುವುದಕ್ಕಾಗಿ Wi-Fi ಸಂಪರ್ಕ ಹುಡುಕಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.<br/> <br/> ಸಲಹೆ: ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದ ಮೆನುನಲ್ಲಿ <b>ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ</b> <b>ಭಾಷೆ & ಇನ್ಪುಟ್ಗೆ</b> ಹೋಗುವ ಮೂಲಕ ನಿಘಂಟುಗಳನ್ನು ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಬಹುದು ಮತ್ತು ತೆಗೆದುಹಾಕಬಹುದು."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ಇದೀಗ ಡೌನ್ಲೋಡ್ ಮಾಡು (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi ಮೂಲಕ ಡೌನ್ಲೋಡ್ ಮಾಡು"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ಗೆ ನಿಘಂಟು ಲಭ್ಯವಿದೆ"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"ವಿಮರ್ಶಿಸಲು ಮತ್ತು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಒತ್ತಿರಿ"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ಗೆ ಸಲಹೆಗಳು ಶೀಘ್ರವೇ ಸಿದ್ಧಗೊಳ್ಳಲಿವೆ."</string> + <string name="version_text" msgid="2715354215568469385">"ಆವೃತ್ತಿ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ಸೇರಿಸು"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"ನುಡಿಗಟ್ಟು"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"ಕಡಿಮೆ ಆಯ್ಕೆಗಳು"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ಸರಿ"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"ಪದ:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"ಶಾರ್ಟ್ಕಟ್:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ಭಾಷೆ:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"ಪದವನ್ನು ಟೈಪ್ ಮಾಡಿ"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ಐಚ್ಛಿಕ ಶಾರ್ಟ್ಕಟ್"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"ಪದವನ್ನು ಸಂಪಾದಿಸಿ"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"ಸಂಪಾದಿಸಿ"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"ಅಳಿಸು"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ಬಳಕೆದಾರರ ನಿಘಂಟಿನಲ್ಲಿ ನೀವು ಯಾವುದೇ ಪದಗಳನ್ನು ಹೊಂದಿಲ್ಲ. ಸೇರಿಸು (+) ಬಟನ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸುವ ಮೂಲಕ ಪದವೊಂದನ್ನು ಸೇರಿಸಿ."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"ಎಲ್ಲ ಭಾಷೆಗಳಿಗೆ"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"ಇನ್ನಷ್ಟು ಭಾಷೆಗಳು…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"ಅಳಿಸು"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-ko/strings-action-keys.xml b/java/res/values-ko/strings-action-keys.xml index 04febeeea..f2e2c44b8 100644 --- a/java/res/values-ko/strings-action-keys.xml +++ b/java/res/values-ko/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"이전"</string> <string name="label_done_key" msgid="7564866296502630852">"완료"</string> <string name="label_send_key" msgid="482252074224462163">"전송"</string> + <string name="label_search_key" msgid="7965186050435796642">"검색"</string> <string name="label_pause_key" msgid="2225922926459730642">"중지"</string> <string name="label_wait_key" msgid="5891247853595466039">"대기"</string> </resources> diff --git a/java/res/values-ko/strings-config-important-notice.xml b/java/res/values-ko/strings-config-important-notice.xml new file mode 100644 index 000000000..47936efc3 --- /dev/null +++ b/java/res/values-ko/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"사용자의 대화 내용과 입력한 데이터를 통해 단어 추천의 정확도를 개선합니다."</string> +</resources> diff --git a/java/res/values-ko/strings-letter-descriptions.xml b/java/res/values-ko/strings-letter-descriptions.xml new file mode 100644 index 000000000..ac7ee879b --- /dev/null +++ b/java/res/values-ko/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"여성형 서수 표시기"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"마이크로 기호"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"남성형 서수 표시기"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"샤프 에스"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"에이, 그레이브"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"에이, 어큐트"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"에이, 서컴플렉스"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"에이, 틸드"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"에이, 디애레시스"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"에이, 위 링"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"에이, 이, 리가츄어"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"씨, 세딜라"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"이, 그레이브"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"이, 어큐트"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"이, 서컴플렉스"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"이, 디애레시스"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"아이, 그레이브"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"아이, 어큐트"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"아이, 서컴플렉스"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"아이, 디애레시스"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"에쓰"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"엔, 틸드"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"오, 그레이브"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"오, 어큐트"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"오, 서컴플렉스"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"오, 틸드"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"오, 디애레시스"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"오, 스트로크"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"유, 그레이브"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"유, 어큐트"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"유, 서컴플렉스"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"유, 디애레시스"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"와이, 어큐트"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"쏜"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"와이, 디애레시스"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"에이, 매크론"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"에이, 브레베"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"에이, 오고넥"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"씨, 어큐트"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"씨, 서컴플렉스"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"씨, 위 닷"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"씨, 캐론"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"디, 캐론"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"디, 스트로크"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"이, 매크론"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"이, 브레베"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"이, 위 닷"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"이, 오고넥"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"이, 캐론"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"지, 서컴플렉스"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"지, 브레베"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"지, 위 닷"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"지, 세딜라"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"에이치, 서컴플렉스"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"에이치, 스트로크"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"아이, 틸드"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"아이, 매크론"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"아이, 브레베"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"아이, 오고넥"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"닷리스 아이"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"아이, 제이, 리가츄어"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"제이, 서컴플렉스"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"케이, 세딜라"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"크라"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"엘, 어큐트"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"엘, 세딜라"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"엘, 캐론"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"엘, 가운데 닷"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"엘, 스트로크"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"엔, 어큐트"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"엔, 세딜라"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"엔, 캐론"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"엔, 앞 아포스트로피"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"잉"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"오, 매크론"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"오, 브레베"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"오, 더블 어큐트"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"오, 이, 리가츄어"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"알, 어큐트"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"알, 세딜라"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"알, 캐론"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"에스, 어큐트"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"에스, 서컴플렉스"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"에스, 세딜라"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"에스, 캐론"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"티, 세딜라"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"티, 캐론"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"티, 스트로크"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"유, 틸드"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"유, 매크론"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"유, 브레베"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"유, 위 링"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"유, 더블 어큐트"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"유, 오고넥"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"더블유, 서컴플렉스"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"와이, 서컴플렉스"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"지, 어큐트"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"지, 위 닷"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"지, 캐론"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"롱 에스"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"오, 혼"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"유, 혼"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"에스, 아래 콤마"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"티, 아래 콤마"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"슈와"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"에이, 아래 닷"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"에이, 위 후크"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"에이, 서컴플렉스 및 어큐트"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"에이, 서컴플렉스 및 그레이브"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"에이, 서컴플렉스 및 위 후크"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"에이, 서컴플렉스 및 틸드"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"에이, 서컴플렉스 및 아래 닷"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"에이, 브레베 및 어큐트"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"에이, 브레베 및 그레이브"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"에이, 브레베 및 위 후크"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"에이, 브레베 및 틸드"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"에이, 브레베 및 아래 닷"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"이, 아래 닷"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"이, 위 후크"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"이, 틸드"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"이, 서컴플렉스 및 어큐트"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"이, 서컴플렉스 및 그레이브"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"이, 서컴플렉스 및 위 후크"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"이, 서컴플렉스 및 틸드"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"이, 서컴플렉스 및 아래 닷"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"아이, 위 후크"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"아이, 아래 닷"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"오, 아래 닷"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"오, 위 후크"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"오, 서컴플렉스 및 어큐트"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"오, 서컴플렉스 및 그레이브"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"오, 서컴플렉스 및 위 후크"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"오, 서컴플렉스 및 틸드"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"오, 서컴플렉스 및 아래 닷"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"오, 혼 및 어큐트"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"오, 혼 및 그레이브"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"오, 혼 및 위 후크"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"오, 혼 및 틸드"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"오, 혼 및 아래 닷"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"유, 아래 닷"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"유, 위 후크"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"유, 혼 및 어큐트"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"유, 혼 및 그레이브"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"유, 혼 및 위 후크"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"유, 혼 및 틸드"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"유, 혼 및 아래 닷"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"와이, 그레이브"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"와이, 아래 닷"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"와이, 위 후크"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"와이, 틸드"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"반전 느낌표"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"왼쪽 겹꺾쇠표"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"가운뎃점"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"슈퍼스크립트 1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"오른쪽 겹꺾쇠표"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"반전 물음표"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"왼쪽 작은따옴표"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"오른쪽 작은따옴표"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"쉼표"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"왼쪽 큰따옴표"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"오른쪽 큰따옴표"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"단검표"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"2중 단검표"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"퍼밀 기호"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"프라임"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"더블 프라임"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"왼쪽 꺾쇠표"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"오른쪽 꺾쇠표"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"슈퍼스크립트 4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"슈퍼스크립트 라틴 소문자 엔"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"페소 기호"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"전교 기호"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"오른쪽 화살표"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"아래쪽 화살표"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"공집합 기호"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"델타"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"작거나 같음"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"크거나 같음"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"검은 별"</string> +</resources> diff --git a/java/res/values-ko/strings-talkback-descriptions.xml b/java/res/values-ko/strings-talkback-descriptions.xml new file mode 100644 index 000000000..2a3fe8821 --- /dev/null +++ b/java/res/values-ko/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"입력한 텍스트: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"입력한 텍스트 없음"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>을(를) 누르면 <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>을(를) <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>(으)로 수정합니다."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g>을(를) 누르면 자동 수정됩니다."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"알 수 없는 문자"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift 키"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"기호 더보기"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift 키"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"기호"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift 키"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"삭제"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"기호"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"문자"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"숫자"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"설정"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"탭"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"스페이스바"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"음성 입력"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"그림 이모티콘"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"돌아가기"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"검색"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"글머리 기호"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"언어 전환"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"다음"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"이전"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift 사용"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock 사용"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"기호 모드"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"기호 더보기 모드"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"문자 모드"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"다이얼 모드"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"전화 기호 모드"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"키보드 숨김"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> 키보드 표시"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"날짜"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"날짜 및 시간"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"이메일"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"문자 메시지"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"숫자"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"전화번호"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"텍스트"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"시간"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"최근"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"사람"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"물건"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"자연"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"장소"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"기호"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"이모티콘"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"대문자 <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"대문자 아이"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"대문자 아이, 위 닷"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"알 수 없는 기호"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"알 수 없는 그림 이모티콘"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"대체 문자를 사용할 수 있습니다"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"대체 문자를 닫았습니다."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"대체 추천 단어를 사용할 수 있습니다"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"대체 추천 단어를 닫았습니다."</string> +</resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index ca10bdf52..b6f93e6e8 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"입력 옵션"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"로그 명령 탐색"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"연락처 이름 조회"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"맞춤법 검사기가 주소록의 항목을 사용합니다."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"키를 누를 때 진동 발생"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"키를 누를 때 소리 발생"</string> <string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string> - <string name="general_category" msgid="1859088467017573195">"일반"</string> - <string name="correction_category" msgid="2236750915056607613">"텍스트 수정"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"제스처 타이핑"</string> - <string name="misc_category" msgid="6894192814868233453">"기타 옵션"</string> - <string name="advanced_settings" msgid="362895144495591463">"고급 설정"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"전문가용 옵션"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"다른 입력 방법으로 전환"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"언어 전환 키가 제공하는 기타 입력 방법"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"언어 전환 키"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"시스템 기본값"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"주소록 이름 활용"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"추천 및 수정에 주소록의 이름 사용"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"맞춤 추천 검색어"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> 개선"</string> <string name="use_double_space_period" msgid="8781529969425082860">"더블스페이스 마침표"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"스페이스바를 두 번 탭하면 마침표와 공백 한 개가 삽입됩니다."</string> <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"제스처 흔적 표시"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"동적 플로팅 미리보기"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"제스처에 따라 추천 단어 보기"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"비밀번호 키를 음성으로 들으려면 헤드셋을 연결하세요."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"입력한 텍스트: %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"입력한 텍스트 없음"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g>을(를) 누르면 <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>을(를) <xliff:g id="CORRECTED">%3$s</xliff:g>(으)로 수정합니다."</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g>을(를) 누르면 자동 수정됩니다."</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"키 코드 %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"시프트 키"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift 사용(사용하지 않으려면 탭하세요.)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock 사용(사용하지 않으려면 탭하세요.)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"삭제 키"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"기호"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"문자"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"숫자"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"설정"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"탭"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"스페이스"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"음성 입력"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"웃는 얼굴"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"리턴 키"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"검색"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"점"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"언어 전환"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"다음"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"이전"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift 사용"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock 사용"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift 사용중지"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"기호 모드"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"문자 모드"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"다이얼 모드"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"전화 기호 모드"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"키보드 숨김"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> 키보드 표시"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"날짜"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"날짜 및 시간"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"이메일"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"문자 메시지"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"숫자"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"전화번호"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"텍스트"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"시간"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"구문 동작"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"동작 중에 스페이스바 쪽으로 움직여 공백 입력"</string> <string name="voice_input" msgid="3583258583521397548">"음성 입력 키"</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="voice_input_disabled_summary" msgid="8141750303464726129">"사용 설정된 음성 입력 방법이 없습니다. 언어 및 입력 설정을 확인하세요."</string> <string name="configure_input_method" msgid="373356270290742459">"입력 방법 설정"</string> <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string> <string name="send_feedback" msgid="1780431884109392046">"의견 보내기"</string> <string name="select_language" msgid="3693815588777926848">"입력 언어"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"저장하려면 다시 터치"</string> <string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"사용 통계 및 오류 보고서를 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string> <string name="keyboard_layout" msgid="8451164783510487501">"키보드 테마"</string> <string name="subtype_en_GB" msgid="88170601942311355">"영어(영국)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"영어(미국)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"스페인어(미국)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"영어(영국) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"영어(미국) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"스페인어(미국)(<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g>(일반)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"영어(영국)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"영어(미국)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"스페인어(미국)(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(번체)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(키릴어)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(라틴어)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"언어 없음(알파벳)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"알파벳(QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"알파벳(QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"알파벳(콜맥)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"알파벳(PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"이모티콘"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"색구성표"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"흰색"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"파란색"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"맞춤 입력 스타일"</string> <string name="add_style" msgid="6163126614514489951">"스타일 추가"</string> <string name="add" msgid="8299699805688017798">"추가"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"사용"</string> <string name="not_now" msgid="6172462888202790482">"나중에"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"같은 입력 스타일이 다음과 같이 이미 존재합니다. <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"가용성 연구 모드"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"키 길게 누르기 지연"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"키를 누를 때 진동 시간"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"키를 누를 때 소리 볼륨"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"외부 사전 파일 읽기"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"다운로드 폴더에 사전 파일이 없음"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"설치할 사전 파일 선택"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"이 파일을 <xliff:g id="LOCALE_NAME">%s</xliff:g>(으)로 설치하시겠습니까?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"이 파일을 <xliff:g id="LANGUAGE_NAME">%s</xliff:g>(으)로 설치하시겠습니까?"</string> <string name="error" msgid="8940763624668513648">"오류 발생"</string> <string name="button_default" msgid="3988017840431881491">"기본값"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>에 오신 것을 환영합니다."</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"새로고침"</string> <string name="last_update" msgid="730467549913588780">"최종 업데이트"</string> <string name="message_updating" msgid="4457761393932375219">"업데이트를 확인하는 중"</string> - <string name="message_loading" msgid="8689096636874758814">"로드 중..."</string> + <string name="message_loading" msgid="5638680861387748936">"로드 중..."</string> <string name="main_dict_description" msgid="3072821352793492143">"기본 사전"</string> <string name="cancel" msgid="6830980399865683324">"취소"</string> + <string name="go_to_settings" msgid="3876892339342569259">"설정"</string> <string name="install_dict" msgid="180852772562189365">"설치"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"취소"</string> <string name="delete_dict" msgid="756853268088330054">"삭제"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"기기에서 선택한 언어로 사용할 수 있는 사전이 있습니다.<br/> <xliff:g id="LANGUAGE">%1$s</xliff:g> 사전을 <b>다운로드</b>하여 입력 환경을 개선해 보세요..<br/> <br/> 3G로 다운로드하는 경우 1-2분 정도 걸립니다. <b>무제한 데이터 요금제</b>가 아닌 경우 요금이 청구됩니다.<br/> 사용 중인 데이터 요금제를 잘 모르는 경우 Wi-Fi에 연결할 수 있는 곳을 찾아 자동 다운로드를 시작하는 것이 좋습니다.<br/> <br/> 도움말: 사전을 다운로드하거나 삭제하려면 <b>언어 및 키보드</b>로 이동하면 되며 이는 휴대기기의 <b>설정</b> 메뉴에 있습니다."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"휴대기기에서 선택한 언어로 사용할 수 있는 사전이 있습니다.<br/> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> 사전을 <b>다운로드</b>하여 입력 환경을 개선해 보세요.<br/> <br/> 3G로 다운로드하는 경우 1~2분 정도 걸립니다. <b>무제한 데이터 요금제</b>가 아닌 경우 요금이 청구될 수 있습니다.<br/> 사용 중인 데이터 요금제를 잘 모르는 경우 Wi-Fi에 연결할 수 있는 곳을 찾아 자동 다운로드를 시작하는 것이 좋습니다.<br/> <br/> 도움말: 사전을 다운로드하거나 삭제하려면 휴대기기의 <b>설정</b> 메뉴에 있는 <b>언어 및 입력</b>으로 이동하면 됩니다."</string> <string name="download_over_metered" msgid="1643065851159409546">"지금 다운로드(<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi를 통해 다운로드"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> 사전을 사용할 수 있습니다."</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> 사전을 사용할 수 있습니다."</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"검토하고 다운로드하려면 누르세요."</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"다운로드 중: <xliff:g id="LANGUAGE">%1$s</xliff:g>에 대한 추천항목이 곧 준비됩니다."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"다운로드 중: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>에 대한 추천항목이 곧 준비됩니다."</string> <string name="version_text" msgid="2715354215568469385">"버전 <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"추가"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"사전에 추가"</string> diff --git a/java/res/values-ky-rKG/strings-action-keys.xml b/java/res/values-ky-rKG/strings-action-keys.xml new file mode 100644 index 000000000..115a392f9 --- /dev/null +++ b/java/res/values-ky-rKG/strings-action-keys.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for label_go_key (4033615332628671065) --> + <skip /> + <!-- no translation found for label_next_key (5586407279258592635) --> + <skip /> + <!-- no translation found for label_previous_key (1421141755779895275) --> + <skip /> + <!-- no translation found for label_done_key (7564866296502630852) --> + <skip /> + <!-- no translation found for label_send_key (482252074224462163) --> + <skip /> + <string name="label_search_key" msgid="7965186050435796642">"Издөө"</string> + <!-- no translation found for label_pause_key (2225922926459730642) --> + <skip /> + <!-- no translation found for label_wait_key (5891247853595466039) --> + <skip /> +</resources> diff --git a/java/res/values-ky-rKG/strings-letter-descriptions.xml b/java/res/values-ky-rKG/strings-letter-descriptions.xml new file mode 100644 index 000000000..75916a69b --- /dev/null +++ b/java/res/values-ky-rKG/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Аялдарга таандык иреттик көрсөткүч"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Микро белги"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Эркектерге таандык иреттик көрсөткүч"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Каткалаң S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, гравис"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, акут"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, циркумфлекс"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, тильда"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, диэрезис"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, төбөсүндө тегерекче бар"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, лигатура"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, седиль"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, гравис"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, акут"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, циркумфлекс"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, диэрезис"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, гравис"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, акут"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, циркумфлекс"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, диэрезис"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, тильда"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, гравис"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, акут"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, циркумфлекс"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, тильда"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, диэрезис"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, жантык белги"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, гравис"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, акут"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, циркумфлекс"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, диэрезис"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, акут"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, диэрезис"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, макрон"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, бреве"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, огонек"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, акут"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, циркумфлекс"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, төбөсүндө чекити бар"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, карон"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, карон"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, жантык белги"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, макрон"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, бреве"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, төбөсүндө чекити бар"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, огонек"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, карон"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, циркумфлекс"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, бреве"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, төбөсүндө чекити бар"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, седиль"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, циркумфлекс"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, жантык белги"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, тильда"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, макрон"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, бреве"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, огонек"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Чекити жок I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, лигатура"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, циркумфлекс"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, седиль"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, акут"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, седиль"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, карон"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ортоңку чекит"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, жантык белги"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, акут"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, седиль"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, карон"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, апострофу бар"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, макрон"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, бреве"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, кош акут"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, лигатура"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, акут"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, седиль"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, карон"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, акут"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, циркумфлекс"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, седиль"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, карон"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, седиль"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, карон"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, жантык белги"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, тильда"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, макрон"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, бреве"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, төбөсүндө тегерекче бар"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, кош акут"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, огонек"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, циркумфлекс"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, циркумфлекс"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, акут"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, төбөсүндө чекити бар"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, карон"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Узак S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, хорн"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, хорн"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, астында үтүр бар"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, астында үтүрү бар"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, астында чекити бар"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, циркумфлекс жана акут"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, циркумфлекс жана гравис"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, циркумфлекс жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, циркумфлекс жана тильда"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, циркумфлекс жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, бреве жана акут"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, бреве жана гравис"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, бреве жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, бреве жана тильда"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, бреве жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, астында чекити бар"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, тильда"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, циркумфлекс жана акут"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, циркумфлекс жана гравис"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, циркумфлекс жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, циркумфлекс жана тильда"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, циркумфлекс жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, астында чекити бар"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, астында чекити бар"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, циркумфлекс жана акут"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, циркумфлекс жана гравис"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, циркумфлекс жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, циркумфлекс жана тильда"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, циркумфлекс жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, хорн жана акут"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, хорн жана гравис"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, хорн жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, хорн жана тильда"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, хорн жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, астында чекити бар"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, хорн жана акут"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, хорн жана гравис"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, хорн жана төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, хорн жана тильда"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, хорн жана астында чекити бар"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, гравис"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, астында чекити бар"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, төбөсүндө илгичи бар"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, тильда"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Көңтөрүлгөн илеп белгиси"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Сол жакты карап турган кош бурчтуу тырмакча"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ортоңку чекит"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Жогорку индекс бир"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Оң жакты карап турган кош бурчтуу тырмакча"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Көңтөрүлгөн суроо белгиси"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Солду карап турган жалгыз тырмакча"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Оңду карап турган жалгыз тырмакча"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Төмөнкү котировкадагы жалгыз тырмакча"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Солду карап турган кош тырмакча"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Оңду карап турган кош тырмакча"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Крест"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Кош крест"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Промилле белгиси"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Кош штрих"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Сол жакты карап турган бир бурчтуу тырмакча"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Оң жакты карап турган бир бурчтуу тырмакча"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Жогорку индекс төрт"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Жогорку индекстеги кичинекей латын тамгасы n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Песо белгиси"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Кимге"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Оң жакты караган жебе"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Төмөн жакты караган жебе"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Бош көптүгү"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Инкремент"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Кичирээк же барабар"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Көбүрөөк же барабар"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Кара жылдыз"</string> +</resources> diff --git a/java/res/values-ky-rKG/strings-talkback-descriptions.xml b/java/res/values-ky-rKG/strings-talkback-descriptions.xml new file mode 100644 index 000000000..70c779238 --- /dev/null +++ b/java/res/values-ky-rKG/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Белгисиз белги"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Баш тамга <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Баш тамга I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Баш тамга I, төбөсүндө чекити бар"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Белгисиз символ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Белгисиз эмодзи"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Альтернативалуу белгилер бар"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Альтернативалуу белгилер этибарга алынбайт"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Альтернативалуу сунуштар бар"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Альтернативалуу сунуштар этибарга алынбайт"</string> +</resources> diff --git a/java/res/values-ky-rKG/strings.xml b/java/res/values-ky-rKG/strings.xml new file mode 100644 index 000000000..cf60508fc --- /dev/null +++ b/java/res/values-ky-rKG/strings.xml @@ -0,0 +1,374 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_personalized_dicts (5167396352105467626) --> + <skip /> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Жакшыртуу <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- 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 (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- 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_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for gesture_space_aware (2078291600664682496) --> + <skip /> + <!-- no translation found for gesture_space_aware_summary (4371385818348528538) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_disabled_summary (8141750303464726129) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for keyboard_layout (8451164783510487501) --> + <skip /> + <!-- no translation found for subtype_en_GB (88170601942311355) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (510930471167541338) --> + <skip /> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (5638680861387748936) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for go_to_settings (3876892339342569259) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) --> + <skip /> + <!-- no translation found for download_over_metered (1643065851159409546) --> + <skip /> + <!-- no translation found for do_not_download_over_metered (2176209579313941583) --> + <skip /> + <!-- no translation found for dict_available_notification_title (4583842811218581658) --> + <skip /> + <!-- no translation found for dict_available_notification_description (1075194169443163487) --> + <skip /> + <!-- no translation found for toast_downloading_suggestions (6128155879830851739) --> + <skip /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/res/values-ky/strings-talkback-descriptions.xml b/java/res/values-ky/strings-talkback-descriptions.xml new file mode 100644 index 000000000..f218bfebe --- /dev/null +++ b/java/res/values-ky/strings-talkback-descriptions.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> +</resources> diff --git a/java/res/values-ky/strings.xml b/java/res/values-ky/strings.xml index e30c4b965..8165a3c7d 100644 --- a/java/res/values-ky/strings.xml +++ b/java/res/values-ky/strings.xml @@ -110,76 +110,12 @@ <skip /> <!-- no translation found for bigram_prediction_summary (1747261921174300098) --> <skip /> - <!-- no translation found for added_word (8993883354622484372) --> - <skip /> <!-- no translation found for label_to_symbol_key (8516904117128967293) --> <skip /> <!-- no translation found for label_to_symbol_with_microphone_key (9035925553010061906) --> <skip /> - <!-- no translation found for spoken_use_headphones (896961781287283493) --> - <skip /> - <!-- no translation found for spoken_current_text_is (2485723011272583845) --> - <skip /> - <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> - <skip /> - <!-- no translation found for spoken_description_unknown (3197434010402179157) --> - <skip /> - <!-- no translation found for spoken_description_shift (244197883292549308) --> - <skip /> - <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> - <skip /> - <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> - <skip /> - <!-- no translation found for spoken_description_delete (8740376944276199801) --> - <skip /> - <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> - <skip /> - <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> - <skip /> - <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> - <skip /> - <!-- no translation found for spoken_description_settings (4627462689603838099) --> - <skip /> - <!-- no translation found for spoken_description_tab (2667716002663482248) --> - <skip /> - <!-- no translation found for spoken_description_space (2582521050049860859) --> - <skip /> - <!-- no translation found for spoken_description_mic (615536748882611950) --> - <skip /> - <!-- no translation found for spoken_description_smiley (2256309826200113918) --> - <skip /> - <!-- no translation found for spoken_description_return (8178083177238315647) --> - <skip /> - <!-- no translation found for spoken_description_dot (40711082435231673) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> - <skip /> - <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> - <skip /> - <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> - <skip /> <!-- no translation found for voice_input (3583258583521397548) --> <skip /> - <!-- 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 configure_input_method (373356270290742459) --> <skip /> <!-- no translation found for language_selection_title (1651299598555326750) --> @@ -190,9 +126,7 @@ <skip /> <!-- no translation found for has_dictionary (6071847973466625007) --> <skip /> - <!-- no translation found for prefs_enable_log (6620424505072963557) --> <skip /> - <!-- no translation found for prefs_description_log (5827825607258246003) --> <skip /> <!-- no translation found for keyboard_layout (8451164783510487501) --> <skip /> @@ -202,7 +136,6 @@ <skip /> <!-- no translation found for subtype_no_language_qwerty (2956121451616633133) --> <skip /> - <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> <skip /> <!-- no translation found for prefs_keypress_vibration_duration_settings (1829950405285211668) --> <skip /> diff --git a/java/res/values-land/config.xml b/java/res/values-land/config.xml index 7d93cc2ff..9ee430014 100644 --- a/java/res/values-land/config.xml +++ b/java/res/values-land/config.xml @@ -18,6 +18,61 @@ */ --> +<!-- Configuration values for Small Phone Landscape. --> <resources> <bool name="config_use_fullscreen_mode">true</bool> + + <!-- Preferable keyboard height in absolute scale: 1.100in --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">176.0dp</dimen> + <fraction name="config_min_keyboard_height">45%p</fraction> + + <!-- key_height + key_bottom_gap = config_more_keys_keyboard_key_height --> + <dimen name="config_more_keys_keyboard_key_height">44.8dp</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- config_more_keys_keyboard_key_height x 1.2 --> + <dimen name="config_more_keys_keyboard_slide_allowance">53.76dp</dimen> + + <fraction name="config_keyboard_top_padding_holo">2.727%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction> + <fraction name="config_key_vertical_gap_holo">5.368%p</fraction> + <fraction name="config_key_horizontal_gap_holo">1.020%p</fraction> + <!-- config_more_keys_keyboard_key_height x -0.5 --> + <dimen name="config_more_keys_keyboard_vertical_correction_holo">-22.4dp</dimen> + <dimen name="config_key_preview_offset_holo">1.6dp</dimen> + + <fraction name="config_key_preview_text_ratio">90%</fraction> + <fraction name="config_key_letter_ratio">65%</fraction> + <fraction name="config_key_large_letter_ratio">74%</fraction> + <fraction name="config_key_label_ratio">40%</fraction> + <fraction name="config_key_hint_letter_ratio">30%</fraction> + <fraction name="config_key_hint_label_ratio">52%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">40%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">40.000%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="config_key_label_horizontal_padding">8dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">3.20%p</fraction> + <fraction name="config_key_letter_ratio_5row">65%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">48%</fraction> + + <dimen name="config_suggestions_strip_height">36dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">54dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">54dp</dimen> + <dimen name="config_more_suggestions_row_height">36dp</dimen> + <integer name="config_max_more_suggestions_row">2</integer> + <fraction name="config_min_more_suggestions_width">60%</fraction> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">23dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">54dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">23dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">15dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">10%p</fraction> + <fraction name="config_emoji_keyboard_row_height">50%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">54%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">20</integer> </resources> diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml deleted file mode 100644 index c97e68f11..000000000 --- a/java/res/values-land/dimens.xml +++ /dev/null @@ -1,83 +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. -*/ ---> - -<resources> - <!-- Preferable keyboard height in absolute scale: 1.100in --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">176.0dp</dimen> - <fraction name="minKeyboardHeight">45%p</fraction> - <!-- key_height + key_bottom_gap = popup_key_height --> - <dimen name="popup_key_height">44.8dp</dimen> - - <fraction name="keyboard_top_padding_gb">1.818%p</fraction> - <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction> - <fraction name="key_bottom_gap_gb">5.941%p</fraction> - <fraction name="key_horizontal_gap_gb">0.997%p</fraction> - - <fraction name="keyboard_top_padding_holo">2.727%p</fraction> - <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction> - <fraction name="key_bottom_gap_holo">5.368%p</fraction> - <fraction name="key_horizontal_gap_holo">1.020%p</fraction> - - <!-- left or right padding of label alignment --> - <dimen name="key_label_horizontal_padding">8dp</dimen> - - <fraction name="key_letter_ratio">65%</fraction> - <fraction name="key_large_letter_ratio">74%</fraction> - <fraction name="key_label_ratio">40%</fraction> - <fraction name="key_hint_letter_ratio">30%</fraction> - <fraction name="key_hint_label_ratio">52%</fraction> - <fraction name="key_uppercase_letter_ratio">40%</fraction> - <fraction name="key_preview_text_ratio">90%</fraction> - <fraction name="spacebar_text_ratio">40.000%</fraction> - <dimen name="key_preview_offset_gb">0.0dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">3.20%p</fraction> - <fraction name="key_letter_ratio_5row">78%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">48%</fraction> - - <dimen name="key_preview_offset_holo">1.6dp</dimen> - <!-- popup_key_height x -0.5 --> - <dimen name="more_keys_keyboard_vertical_correction_holo">-22.4dp</dimen> - - <dimen name="suggestions_strip_height">36dp</dimen> - <dimen name="more_suggestions_row_height">36dp</dimen> - <integer name="max_more_suggestions_row">2</integer> - <fraction name="min_more_suggestions_width">60%</fraction> - <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.2 --> - <dimen name="more_keys_keyboard_slide_allowance">53.76dp</dimen> - <!-- popup_key_height x -1.0 --> - <dimen name="more_keys_keyboard_vertical_correction_gb">-44.8dp</dimen> - - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">23dp</dimen> - <dimen name="gesture_floating_preview_text_offset">54dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">23dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">15dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">10%p</fraction> - <fraction name="emoji_keyboard_row_height">50%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">54%p</fraction> - <integer name="emoji_keyboard_max_key_count">20</integer> - -</resources> diff --git a/java/res/values-land/keyboard-heights.xml b/java/res/values-land/keyboard-heights.xml index 670be3329..d57f96be3 100644 --- a/java/res/values-land/keyboard-heights.xml +++ b/java/res/values-land/keyboard-heights.xml @@ -33,7 +33,5 @@ <!-- Preferable keyboard height in absolute scale: 45.0mm --> <!-- Xoom --> <item>HARDWARE=stingray,265.4378</item> - <!-- Default value for unknown device: empty string --> - <item>,</item> </string-array> </resources> diff --git a/java/res/values-land/setup-dimens-small-phone-land.xml b/java/res/values-land/setup-dimens-small-phone-land.xml index 088e6562a..de93eee08 100644 --- a/java/res/values-land/setup-dimens-small-phone-land.xml +++ b/java/res/values-land/setup-dimens-small-phone-land.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">18sp</dimen> <dimen name="setup_step_bullet_text_size">18sp</dimen> <dimen name="setup_step_triangle_indicator_height">18dp</dimen> - <dimen name="setup_step_indicator_height">18dp</dimen> <dimen name="setup_step_title_text_size">18sp</dimen> <dimen name="setup_step_instruction_text_size">14sp</dimen> <dimen name="setup_step_action_text_size">16sp</dimen> diff --git a/java/res/values-lo-rLA/donottranslate.xml b/java/res/values-lo-rLA/donottranslate-config-spacing-and-punctuations.xml index a9893feec..a9893feec 100644 --- a/java/res/values-lo-rLA/donottranslate.xml +++ b/java/res/values-lo-rLA/donottranslate-config-spacing-and-punctuations.xml diff --git a/java/res/values-lo-rLA/strings-action-keys.xml b/java/res/values-lo-rLA/strings-action-keys.xml index 08dc983e0..e1cd91367 100644 --- a/java/res/values-lo-rLA/strings-action-keys.xml +++ b/java/res/values-lo-rLA/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"ກ່ອນໜ້າ"</string> <string name="label_done_key" msgid="7564866296502630852">"Done"</string> <string name="label_send_key" msgid="482252074224462163">"ສົ່ງ"</string> + <string name="label_search_key" msgid="7965186050435796642">"ຊອກຫາ"</string> <string name="label_pause_key" msgid="2225922926459730642">"ຢຸດຊົ່ວຄາວ"</string> <string name="label_wait_key" msgid="5891247853595466039">"ລໍຖ້າ"</string> </resources> diff --git a/java/res/values-lo-rLA/strings-config-important-notice.xml b/java/res/values-lo-rLA/strings-config-important-notice.xml new file mode 100644 index 000000000..7880ad158 --- /dev/null +++ b/java/res/values-lo-rLA/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"ຮຽນຮູ້ຈາກການສື່ສານ ແລະຂໍ້ມູນທີ່ທ່ານເຄີຍພິມເພື່ອປັບປຸງຄຳແນະນຳ"</string> +</resources> diff --git a/java/res/values-lo-rLA/strings-emoji-descriptions.xml b/java/res/values-lo-rLA/strings-emoji-descriptions.xml new file mode 100644 index 000000000..0747fa629 --- /dev/null +++ b/java/res/values-lo-rLA/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"ເຄື່ອງໝາຍລິຂະສິດ"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"ເຄື່ອງໝາຍຈົດທະບຽນ"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Double exclamation mark"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Exclamation question mark"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Trade mark sign"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Information source"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Left right arrow"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Up down arrow"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"North west arrow"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"North east arrow"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"South east arrow"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"South west arrow"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Leftwards arrow with hook"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Rightwards arrow with hook"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"ເບິ່ງ"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Hourglass"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Black right-pointing double triangle"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Black left-pointing double triangle"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Black up-pointing double triangle"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Black down-pointing double triangle"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"ໂມງປຸກ"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Hourglass with flowing sand"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Circled latin capital letter m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Black small square"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"White small square"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Black right-pointing triangle"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Black left-pointing triangle"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"White medium square"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Black medium square"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"White medium small square"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Black medium small square"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Black sun with rays"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Cloud"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Black telephone"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Ballot box with check"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Umbrella with rain drops"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Hot beverage"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"White up pointing index"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"White smiling face"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Aries"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Taurus"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gemini"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"ມະເຮັງ"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leo"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Virgo"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Libra"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Scorpius"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Sagittarius"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricorn"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquarius"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Pisces"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Black spade suit"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Black club suit"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Black heart suit"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Black diamond suit"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Hot springs"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Black universal recycling symbol"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Wheelchair symbol"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Anchor"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Warning sign"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"High voltage sign"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Medium white circle"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Medium black circle"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Soccer ball"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"ເບສບອລ"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Snowman without snow"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Sun behind cloud"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"No entry"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Church"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fountain"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Flag in hole"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Sailboat"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Tent"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Fuel pump"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Black scissors"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"White heavy check mark"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Airplane"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Envelope"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Raised fist"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Raised hand"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Victory hand"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Pencil"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Black nib"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Heavy check mark"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Heavy multiplication x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Sparkles"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Eight spoked asterisk"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Eight pointed black star"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Snowflake"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Sparkle"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Cross mark"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Negative squared cross mark"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Black question mark ornament"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"White question mark ornament"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"White exclamation mark ornament"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Heavy exclamation mark symbol"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"ຫົວໃຈສີດຳໜັກ"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Heavy plus sign"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Heavy minus sign"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Heavy division sign"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Black rightwards arrow"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Curly loop"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Double curly loop"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Arrow pointing rightwards then curving upwards"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Arrow pointing rightwards then curving downwards"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Leftwards black arrow"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Upwards black arrow"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Downwards black arrow"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Black large square"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"White large square"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"White medium star"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Heavy large circle"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Wavy dash"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Part alternation mark"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Circled ideograph congratulation"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Circled ideograph secret"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"ໄພ້ນົກກະຈອກເທດມັງກອນແດງ"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"ກຳລັງຫຼິ້ນໄພ້ໂຈກເກີສີດຳ"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"ເລືອດກຣຸບ A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"ເລືອດກຣຸບ B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"ເລືອດກຣຸບ O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"ບ່ອນຈອດລົດ"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"ເລືອດກຣຸບ AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"CL ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Cool ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Free ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ID ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"New ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"N G ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"OK ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"SOS ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"UP! ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"VS ສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"ບໍລິການ ແບບກະຕະກະນະສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"ບໍລິການ ແບບກະຕະກະນະສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Squared ideograph charge-free"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Squared ideograph reserved-seat"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Squared ideograph prohibitation"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Squared ideograph vacancy"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Squared ideograph acceptance"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Squared ideograph full occupancy"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Squared ideograph paid"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Squared ideograph monthly"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Squared ideograph application"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Squared ideograph discount"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Squared ideograph in business"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Circled ideograph advantage"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Circled ideograph accept"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"ພະຍຸໝຸນໄຊໂຄລນ"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"ໝອກຄວັນ"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"ຄັນຮົ່ມປິດ"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"ຄ່ຳຄືນກັບແສງດາວ"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"ຕາເວັນຂຶ້ນຢູ່ພູ"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"ຕາເວັນຂຶ້ນ"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"ເມືອງໃນຍາມໃກ້ຄ່ຳ"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"ຕາເວັນ"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"ຮຸ້ງ"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"ຂົວໃນຍາມຄ່ຳຄືນ"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"ຄື້ນນ້ຳ"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"ພູເຂົາໄຟ"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"ທາງຊ້າງເຜືອກ"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"ໜ່ວຍໂລກຢູໂຣບອາຟຣິກາ"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"ໜ່ວຍໂລກອາເມລິກາ"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"ໜ່ວຍໂລກເອເຊຍອອສເຕຣເລຍ"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"ໜ່ວຍໂລກມີເສັ້ນຕັດ"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"ສັນຍາລັກເດືອນມືດ"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"ສັນຍາລັກເດືອນບໍ່ເຕັມດວງ"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"ສັນຍາລັກເດືອນເຄິ່ງດວງທຳອິດ"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"ສັນຍາລັກເດືອນຂຶ້ນ"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"ສັນຍາລັກເດືອນເຕັມດວງ"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"ສັນຍາລັກເດືອນໃກ້ເຕັມດວງ"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"ສັນຍາລັກເດືອນເຄິ່ງດວງທ້າຍ"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"ສັນຍາລັກເດືອນສ້ຽວ"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"ເດືອນສ້ຽວ"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"ເດືອນມືດມີໜ້າ"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"ເດືອນເຄິ່ງດວງທຳອິດມີໜ້າ"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"ສັນຍາລັກເດືອນເຄິ່ງດວງທ້າຍມີໜ້າ"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"ເດືອນເຕັມດວງມີໜ້າ"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"ຕາເວັນມີໜ້າ"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"ດາວເຮືອງແສງ"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"ດາວຕົກ"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"ລູກເກົາລັດ"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"ກ້າໄມ້"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"ຕົ້ນໄມ້ບໍ່ຜັດໃບ"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"ຕົ້ນໄມ້ຜັດໃບ"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"ຕົ້ນປາມ"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"ກະບອງເພັດ"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"ທິວລິບ"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"ດອກເຊີຣີ"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"ດອກກຸຫລາບ"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"ສະກຸນຊະບາ"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"ດອກຕາເວັນ"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"ດອກໄມ້ບານ"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"ຕົ້ນສາລີ"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"ຕົ້ນເຂົ້າ"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"ສະໝຸນໄພ"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"ໂຄລເວີສີ່ໃບ"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"ໃບເມເປີ້ນ"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"ໃບໄມ້ຫຼົ່ນ"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"ໃບໄມ້ປິວຕາມລົມ"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"ເຫັດ"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"ໝາກເຫຼັ່ນ"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"ໝາກເຂືອ"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"ອະງຸ່ນ"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"ໝາກໂມ"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"ໝາກໂມ"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"ສົ້ມຂຽວຫວານ"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"ໝາກນາວ"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"ໝາກກ້ວຍ"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"ໝາກນັດ"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"ໝາກໂປ່ມແດງ"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"ໝາກໂປ່ມຂຽວ"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"ລູກສາລີ່"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"ລູກພີດ"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"ເຊີຣີ"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"ສະຕຣໍເບີຣີ"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"ແຮມເບີເກີ"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"ພິດຊ່າປ່ຽງນຶ່ງ"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"ຊີ້ນຕິດກະດູກ"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"ຂາສັດປີກ"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"ເຂົ້າໜົມເຂົ້າ"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"ເຂົ້າປັ້ນ"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"ເຂົ້າສຸກ"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"ເຂົ້າແກງກະຫລີ່"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"ຖ້ວຍຮ້ອນ"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"ສະປາເກັດຕີ"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"ເຂົ້າຈີ່"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"ມັນຝຣັ່ງທອດ"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"ມັນຝຣັ່ງຫວານອົບ"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"ດັງໂງະ"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ໂອເດັ້ງ"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"ຊູຊິ"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"ກຸ້ງທອດ"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"ເຄັກປາແບບໝຸນໆ"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"ກະແລ່ມນຸ້ມ"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"ນ້ຳແຂງໃສ"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"ກະແລ່ມ"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ໂດນັດ"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"ຄຸກກີ້"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"ຊັອກໂກແລັດບາ"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"ແຄນດີ້"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"ໂລລິປັອບ"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"ຄັສຕາດ"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"ໝໍ້ນ້ຳເຜິ້ງ"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"ຊັອດເຄັກ"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"ເບັນໂຕ"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"ໝໍ້ອາຫານ"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"ຄົວກິນ"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"ມີດແລະສ້ອມ"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"ຖ້ວຍຊາແບບບໍ່ມີດ້າມຈັບ"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"ຈອກແລະເຫຼົ້າສາເກ"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"ຈອກວາຍ"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"ຈອກຄັອກເທວ"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"ເຄື່ອງດື່ມເຂດຮ້ອນ"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"ແກ້ວເບຍ"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"ຕຳແກ້ວເບຍ"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"ຕຸກນົມແອນ້ອຍ"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"ຣິບບອນ"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"ຂອງຂວັນຫໍ່ໄວ້"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"ເຄັກວັນເກີດ"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"ແຈັກ-ໂອ-ແລນເທິນ"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"ຕົ້ນຄຣິສມາສ"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"ຊານຕາຄລອສ"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"ບັ້ງໄຟດອກ"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ດອກໄມ້ໄຟ"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"ບານລູນ"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"ປາຕີ້ປັອບເປີ"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"ບານຄອນເຟັດຕີ"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"ຕົ້ນທານາບາຕະ"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"ທຸງໄຂວ່ກັນ"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"ການຕົກແຕ່ງຕົ້ນພາຍ"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"ຕຸກກະຕາຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"ທຸງປາຄາຣ໌ບ"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"ກະດິ່ງລົມ"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"ພິທີຊົມເດືອນ"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"ກະເປົາໂຮງຮຽນ"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"ໝວກສຳເລັດການສຶກສາ"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"ມ້າໝຸນ"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"ຊິງຊ້າສະຫວັນ"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"ລົດໄຟເຫາະ"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"ເບັດຕຶກປາກັບປາ"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"ໄມໂຄຣໂຟນ"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"ກ້ອງຖ່າຍໜັງ"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"ໂຮງຮູບເງົາ"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"ຫູຟັງ"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"ຈານສີ"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"ໝວກຊົງສູງ"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"ເຕັ້ນລະຄອນສັດ"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"ປີ້"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"ແຄລັບເປີບອດ"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"ສິນລະປະການສະແດງ"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"ວິດີໂອເກມ"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"ຍິງເຂົ້າເປົ້າ"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"ສະລັອດແມັດຊີນ"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"ສະນຸກເກີ"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"ລູກເຕົ໋າ"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"ໂບລິງ"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"ໄພ່ດອກໄມ້"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"ໂນດດົນຕີ"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"ໂນດດົນຕີຫຼາຍອັນ"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"ແຊັກໂຊໂຟນ"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"ກີຕ້າ"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"ແປ້ນພິມດົນຕີ"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"ແຕ"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"ໄວໂອລິນ"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"ສະກໍດົນຕີ"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"ເສື້ອແລ່ນກັບສາຍພາຍ"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"ໄມ້ແລະລູກເທນນິສ"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"ສະກີແລະເກີບສະກີ"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"ບານບ້ວງແລະບ່ວງ"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"ທຸງເສັ້ນໄຊ"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"ສະໂນບອດເດີ"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"ນັກແລ່ນ"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"ນັກເຊີບ"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"ຮາງວັນ"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"ການແຂ່ງມ້າ"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"ອາເມລິກັນຟຸດບອນ"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"ຣັກບີ"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"ນັກລອຍນ້ຳ"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"ປຸກເຮືອນ"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"ເຮືອນພ້ອມສວນ"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"ອາຄານສຳນັກງານ"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"ຫ້ອງການໄປສະນີຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"ຫ້ອງການໄປສະນີຢູໂຣບ"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"ໂຮງໝໍ"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"ທະນາຄານ"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"ເອທີເອັມ"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"ໂຮງແຮມ"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"ມ່ານຮູດ"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"ຮ້ານສະດວກຊື້"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"ໂຮງຮຽນ"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"ຫ້າງສັບພະສິນຄ້າ"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"ໂຮງງານ"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"ໂຄມໄຟອິຊາກາຢະ"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"ຜາສາດຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"ຜາສາດຢູໂຣບ"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"ໜູ"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"ໜູ"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Ox"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"ຄວາຍ"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"ງົວ"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"ເສືອດາວ"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"ກະຕ່າຍ"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"ແມວ"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"ມັງກອນ"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"ແຂ້"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"ວານ"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"ຫອຍ"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"ງູ"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"ມ້າ"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"ແກະ"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"ແບ້"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"ແກະ"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"ລິງ"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"ໄກ່ໂຕຜູ້"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"ໄກ່"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"ໝາ"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"ໝູ"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"ໝູປ່າ"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"ຊ້າງ"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"ປາເໝິກ"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"ເປືອກຫອຍກຽວ"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"ແມງໄມ້"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"ມົດ"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"ເຜິ້ງ"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"ແມງເຕົ່າທອງ"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"ປາ"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"ປາເຂດຮ້ອນ"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"ປາປັກເປົ້າ"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"ເຕົ່າ"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"ໄຂ່ຟັກ"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"ໄກ່ນ້ອຍ"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"ໜ້າໄກ່ນ້ອຍ"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"ນົກ"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"ເພນກວິນ"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"ໂຄອາລາ"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"ພຸນເດິນ"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"ອູດອາຣາບຽນ"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"ອູດແບັກທຣຽນ"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"ໂລມາ"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"ໜ້າໜູ"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"ໜ້າງົວ"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"ໜ້າເສືອ"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"ໜ້າກະຕ່າຍ"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"ໜ້າແມວ"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"ໜ້າມັງກອນ"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"ວານພົ່ນນ້ຳ"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"ໜ້າມ້າ"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"ໜ້າລິງ"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"ໜ້າໝາ"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"ໜ້າໝູ"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"ໜ້າກົບ"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"ໜ້າໜູແຮມສະເຕີ"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"ໜ້າໝາປ່າ"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"ໜ້າໝີ"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"ໜ້າແພນດ້າ"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"ດັງໝູ"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"ຮອຍຕີນ"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"ຕາ"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"ຫູ"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"ດັງ"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"ປາກ"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"ລິ້ນ"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"ຫຼັງມືຊີ້ຂຶ້ນເທິງ"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"ຫຼັງມືຊີ້ລົງລຸ່ມ"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"ຫຼັງມືຊີ້ໄປຊ້າຍ"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"ຫຼັງມືຊີ້ໄປຂວາ"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"ກຳປັ້ນ"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"ມືໂບກໄປມາ"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ມືເຮັດທ່າໂອເຄ"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"ຍົກໂປ້ໃຫ້"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"ຊິ້ວນີ້ໂປ້ລົງ"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ຕົບມື"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"ແບມືອອກ"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"ມຸງກຸດ"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"ໝວກຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"ແວ່ນຕາ"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"ເນັກໄທ"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"ເສືອຢືນ"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ໂສ້ງຢີນ"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"ຊຸດເດຣສ"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"ກິໂມໂນ"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"ບິກີນີ"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"ເສື້ອຜ້າຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"ກະເປົາ"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"ກະເປົາ"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"ກະເປົາ"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"ເກີບຜູ່ຊາຍ"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"ເກີບກິລາ"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"ເກີບສົ້ນສູງ"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"ເກີບຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"ເກີດບູດຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"ຮອຍຕີນ"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"ຄົນເປັນເງົາ"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"ຄົນເປັນເງົາ"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"ຜູ່ຊາຍ"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"ຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"ຜູ່ຊາຍ"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ຜູ່ຍິງ"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"ຄອບຄົວ"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"ຊາຍຍິງຈູງມືກັນ"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"ຊາຍສອງຄົນຈູງມືກັນ"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"ຍິງສອງຄົນຈູງມືກັນ"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"ເຈົ້າໜ້າທີ່ຕຳຫຼວດ"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"ຜູ່ຍິງໃສ່ຫູກະຕ່າຍ"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"ເຈົ້າສາວມີຜ້າຄຸມໜ້າ"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"ຄົນຜົມສີບລອນ"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"ຄົນໃສ່ໝວກກົວປີເໝົາ"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"ຄົນໃສ່ຜ້າໂພກຫົວ"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"ຄົນອາຍຸຫຼາຍກວ່າ"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"ຜູ່ຍິງອາຍຸຫຼາຍກວ່າ"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"ແອນ້ອຍ"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"ຄົນເຮັດວຽກກໍ່ສ້າງ"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"ເຈົ້າຍິງ"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"ຍັກຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"ກລອບບິນຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"ຜີ"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"ທູດແອນ້ອຍສະຫວັນ"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"ມະນຸດຕ່າງດາວ"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"ສັດປະຫລາດຕ່າງດາວ"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"ອິມປ໌"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"ຫົວກະໂຫຼກ"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"ພະນັກງານບໍລິການຂໍ້ມູນ"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"ຍາມ"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"ນັກເຕັ້ນ"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"ລິບສະຕິກ"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"ຢາທາເລັບ"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"ນວດໜ້າ"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"ຕັດຜົມ"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"ເສົາຮ້ານຕັດຜົມ"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"ເຂັມສີດຢາ"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"ຢາເມັດ"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"ຮອຍຈູບ"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"ຈົດໝາຍຮັກ"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"ແຫວນ"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"ຫິນອັນຍະມະນີ"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"ຈູບ"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"ຊໍ່ດອກໄມ້"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"ຄູ່ຮັກກັບຫົວໃຈ"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"ການແຕ່ງດອງ"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"ຫົວໃຈເຕັ້ນ"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"ອົກຫັກ"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"ສອງໃຈ"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"ຫົວໃຈເປັນປະກາຍ"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"ຫົວໃຈຂະຫຍາຍ"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"ລູກສອນປັກຫົວໃຈ"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"ໃຈສີຟ້າ"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"ໃຈສີຂຽວ"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"ໃຈສີເຫຼືອງ"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"ໃຈສີມ່ວງ"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"ຫົວໃຈກັບຣິບບອນ"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"ຫົວໃຈວົງມົນ"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"ຕົກແຕ່ງຫົວໃຈ"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"ຮູບເພັດມີຈຸດທາງກາງ"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"ຫຼອດໄຟ"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"ສັນຍາລັກໃຈຮ້າຍ"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"ລະເບີດ"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"ສັນຍາລັກນອນຫຼັບ"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"ສັນຍາລັກປະທະກັນ"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"ສັນຍາລັກເຫື່ອກະຈາຍ"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"ຢົດນ້ຳ"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"ສັນຍາລັກແລ່ນ"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"ກອງອຸດຈາລະ"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"ເບັ່ງກ້າມ"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"ດາວໝຸນ"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"ບອນລູນຄຳເວົ້າ"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"ບອນລູນຄວາມຄິດ"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"ດອກໄມ້ຂາວ"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"ສັນຍາລັກຮ້ອຍ"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"ຖົງເງິນ"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"ອັດຕາແລກປ່ຽນ"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"ສັນຍາລັກໂດລ່າແບບໜາ"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"ບັດເຄຣດິດ"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"ທະນະບັດເງິນເຢນ"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"ທັນນະບັດຮູບເງິນໂດລ່າ"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ທະນະບັດເງິນຢູໂຣ"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"ທະນະບັດເງິນພາວດ໌"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"ເງິນຕິດປີກ"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"ແຜນວາດຊີ້ຂຶ້ນມີຮູບເງິນເຢນ"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"ບ່ອນນັ່ງ"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"ຄອມພິວເຕີສ່ວນບຸກຄົນ"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ກະເປົາເດີນທາງ"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"ມິນິດິສ"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"ຟລັອບປີ້ດິສ"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"ອັອບຕິຄອນ ດິສ"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"ດີວີດີ"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ໄຟລ໌ໂຟນເດີ"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"ເປີດໂຟນເດີໄຟລ໌"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"ເຈ້ຍມ້ວນທາງລຸ່ມ"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"ເຈ້ຍຫງາຍໜ້າຂຶ້ນ"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"ປະຕິທິນ"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"ປະຕິທິນຖືກຈີກ"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"ດັດຊະນີບັດ"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"ແຜນວາດຊີ້ຂຶ້ນ"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"ແຜນວາດຊີ້ລົງ"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"ແຜນວາດແບບບາ"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"ຄລິບບອດ"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"ເຂັມມຸດ"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"ເຂັມມຸດຫົວມົນ"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"ອັນໜີບເຈ້ຍ"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"ໄມ້ບັນທັດ"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"ໄມ້ບັດທັດສາມຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"ແຖບບຸກມາກ"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"ປຶ້ມບັນຊີ"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"ສະມຸດບັນທຶກ"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"ສະມຸດບັນທຶກແບບມີປົກຕົບແຕ່ງ"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"ປຶ້ມທີ່ປິດໄວ້"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"ປຶ້ມທີ່ເປີດໄວ້"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"ປຶ້ມຂຽວ"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"ປຶ້ມຟ້າ"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"ປຶ້ມສົ້ມ"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"ປຶ້ມ"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"ປ້າຍຊື່"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"ເລື່ອນ"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"ບັນທຶກ"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"ຫູໂທລະສັບ"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"ເພກເຈີ"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"ເຄື່ອງແຟັກ"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"ຈານດາວທຽມ"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"ໂທລະໂຄ່ງ"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"ໂທລະໂຂ່ງ"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"ຖາດຂາອອກ"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"ຖາດຂາເຂົ້າ"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"ພັດສະດຸ"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"ສັນຍາລັກອີເມວ"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"ຈົດໝາຍເຂົ້າ"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"ຈົດໝາຍມີລູກສອນຢູ່ທາງເທິງ"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"ກ່ອງຈົດໝາຍປິດໄວ້ມີທຸງທາງລຸ່ມ"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"ກ່ອງຈົດໝາຍປິດໄວ້ມີທຸງສະບັດ"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"ກ່ອງຈົດໝາຍເປິດໄວ້ມີທຸງສະບັດ"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"ກ່ອງຈົດໝາຍເປິດໄວ້ມີທຸງທາງລຸ່ມ"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"ຕູ້ໄປສະນີ"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"ແຕໄປສະນີ"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"ໜັງສືພິມ"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"ໂທລະສັບມືຖື"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"ໂທລະສັບມືຖືມີລູກສອນຊີ້ໄປທາງຂວາຢູ່ທາງຊ້າຍ"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"ໂໝດສັ່ນ"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"ໂທລະສັບມືຖືປິດ"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"ບໍ່ມີໂທລະສັບມືຖື"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"ຂີດສັນຍານໂທລະສັບ"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"ກ້ອງຖ່າຍຮູບ"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"ກ້ອງວິດີໂອ"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"ໂທລະພາບ"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"ວິທະຍຸ"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"ກະແຊັດວິດີໂອ"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"ລູກສອນໄຂວ່ກັນ"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"ລູກສອນໝຸນວົນຕາມເຂັມໂມງ"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"ລູກສອນໝຸນຕາມເຂັມໂມງມີເລກສູນໃນວົງມົນຢູ່ຊ້າຍລຸ່ມ"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"ລູກສອນໝຸນຕາມເຂັມໂມງລວງຕັ້ງ"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"ລູກສອນໝຸນທວນເຂັມໂມງໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"ສັນຍາລັກຄວາມແຈ້ງຕ່ຳ"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"ສັນຍາລັກຄວາມແຈ້ງສູງ"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"ລຳໂພງມີຂີດຂ້າ"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"ລຳໂພງ"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"ລຳໂພງມີຄື້ນສຽງອັນນຶ່ງ"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"ລຳໂພງມີຄື້ນສຽງສາມອັນ"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"ແບັດເຕີຣີ"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"ປລັກໄຟຟ້າ"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"ແວ່ນຂະຫຍາຍສ່ອງໄປທາງຊ້າຍ"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"ແວ່ນຂະຫຍາຍສ່ອງໄປທາງຂວາ"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"ລັອກມີປາກກາ"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"ລັອກທີ່ປິດໄວ້ພ້ອມກະແຈ"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"ກະແຈ"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"ລັອກ"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"ລັອກທີ່ເປີດໄວ້"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"ກະດິ່ງ"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"ກະດິ່ງມີຂີດຂ້າ"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"ບຸກມາກ"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"ສັນຍາລັກລິ້ງ"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"ປຸ່ມເຄື່ອງໝາຍເລືອກ"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"ລູກສອນຊີ້ໄປທາງຊ້າຍມີຄຳວ່າ Back"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"ລູກສອນຊີ້ໄປທາງຊ້າຍມີຄຳວ່າ End"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"ຄຳວ່າ On ມີເຄື່ອງໝາຍທ້ວງກັບລູກສອນຊີ້ໄປທາງຊ້າຍແລະຂວາຢູ່ເທິງ"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"ຄຳວ່າ Soon ມີລູກສອນຊີ້ໄປທາງຂວາຢູ່ເທິງ"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"ຄຳວ່າ Top ມີລູກສອນຊີ້ໄປທາງເທິງຢູ່ເທິງ"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"ສັນຍາລັກຫ້າມຕ່ຳກວ່າສິບແປດ"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"ເລກສິບໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"ABCD ໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"abcd ໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"ໂຕເລກໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"ໃສ່ສັນຍາລັກເພື່ອສັນຍາລັກ"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"ໂຕອັກສອນລາຕິນໃນຂອບສີ່ຫຼ່ຽມ"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"ໄຟ"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"ໄຟສາຍ"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"ປະແຈ"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"ຄ້ອນ"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"ນັອດ"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"ມີດ"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"ປືນສັ້ນ"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"ກ້ອງຈຸລະທັດ"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"ກ້ອງສ່ອງ"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"ບານຄຣິສຕັນ"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"ດາວຫົກຫຼ່ຽມມີຈ້ຳທາງກາງ"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"ສັນຍາລັກພາສາຍີ່ປຸ່ນສຳລັບຜູ່ເລີ່ມຕົ້ນ"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"ສັນຍາລັກສາມງ່າມ"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"ປຸ່ມສີ່ຫຼ່ຽມສີດຳ"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"ປຸ່ມສີ່ຫຼ່ຽມສີຂາວ"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"ວົງມົນໃຫຍ່ສີແດງ"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"ວົງມົນໃຫຍ່ສີຟ້າ"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"ເພັດເມັດໃຫຍ່ສີສົ້ມ"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"ເພັດເມັດໃຫຍ່ສີຟ້າ"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"ເພັດເມັດນ້ອຍສີສົ້ມ"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"ເພັດເມັດນ້ອຍສີຟ້າ"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"ສາມຫຼ່ຽມສີແດງຊີຂຶ້ນ"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"ສາມຫຼ່ຽມສີແດງຊີລົງ"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"ສາມຫຼ່ຽມນ້ອຍສີແດງຊີຂຶ້ນ"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"ສາມຫຼ່ຽມນ້ອຍສີແດງຊີລົງ"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລານຶ່ງໂມງ"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສອງໂມງ"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສາມໂມງ"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສີ່ໂມງ"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາຫ້າໂມງ"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາຫົກໂມງ"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາເຈັດໂມງ"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາແປດໂມງ"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາເກົ້າໂມງ"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບໂມງ"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບເອັດໂມງ"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບສອງໂມງ"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລານຶ່ງໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສອງໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສາມໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສີ່ໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາຫ້າໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາຫົກໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາເຈັດໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາແປດໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາເກົ້າໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບເອັດໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"ໂມງພ້ອມເຂັມຊີ້ໄປເວລາສິບສອງໂມງເຄິ່ງ"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"ພູເຂົາໄຟຟູຈິ"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"ຫໍຄອຍໂຕກຽວ"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"ເທພີເສລີພາບ"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"ເງົາປະເທດຍີ່ປຸ່ນ"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"ໂມອາຍ"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"ໜ້າຍິ້ມເຫັນແຂ້ວ"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"ໜ້າຕາຍິ້ມເຫັນແຂ້ວ"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"ໜ້າພ້ອມດ້ວຍນ້ຳຕາແຫ່ງຄວາມສຸກ"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"ໜ້າຍິ້ມພ້ອມກັບອ້າປາກ"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"ໜ້າຕາຍິ້ມພ້ອມກັບອ້າປາກ"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"ໜ້າຕາຍິ້ມພ້ອມກັບເຫື່ອຕົກ"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"ໜ້າຕາຍິ້ມພ້ອມກັບຫຼັບຕາ"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"ໜ້າຍິ້ມພ້ອມມີວົງແຫວນເທິງຫົວ"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"ໜ້າຍິ້ມມີເຂົາ"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"ໜ້າຍິ້ມກະພິບຕາຂ້າງນຶ່ງ"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"ໜ້າຕາຍິ້ມແຍ້ມ"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"ໜ້າຍິ້ມລິ້ນເລຍສົບ"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"ໜ້າຜ່ອນຄາຍ"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"ໜ້າຍິ້ມພ້ອມຕາເປັນຫົວໃຈ"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"ໜ້າຍິ້ມໃສ່ແວ່ນຕາ"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"ໜ້າຍິ້ມມີເລດສະໄນ"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"ໜ້າຊື່ໆ"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"ໜ້າບໍ່ມີຄວາມຮູ້ສຶກ"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"ໜ້າບໍ່ຕະຫລົກ"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"ໜ້າມີເຫື່ອໄຫຼ"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"ໜ້າໝົ່ນໝອງ"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"ໜ້າສັບສົນ"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"ໜ້າຜູ່ຮ້າຍ"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"ໜ້າຈູບ"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"ໜ້າເປົ່າຈູບ"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"ໜ້າຈູບພ້ອມກັບຍິ້ມ"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"ໜ້າຍິ້ມພ້ອມກັບຫຼັບຕາ"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"ໜ້າແລບລິ້ນ"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"ໜ້າແລບລິ້ນຫຼັບຕາຂ້າງນຶ່ງ"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"ໜ້າແລບລິ້ນຫຼັບຕາສອງຂ້າງ"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"ໜ້າຜິດຫວັງ"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"ໜ້າເປັນກັງວົນ"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"ໜ້າໃຈຮ້າຍ"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"ໜ້າມຸ້ຍ"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"ໜ້າຮ້ອງໄຫ້"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"ໜ້າຂະໝວດ"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"ໜ້າໃຈຮ້າຍລົມອອກດັງ"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"ໜ້າຜິດຫວັງແຕ່ໂລ່ງໃຈ"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"ໜ້າມຸ້ຍອ້າປາກ"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"ໜ້າເຈັບປວດ"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"ໜ້າຢ້ານ"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"ໜ້າເມື່ອຍສຸດຂີດ"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"ໜ້າເຫງົານອນ"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"ໜ້າເມື່ອຍ"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"ໜ້າຍິ້ມແຫ້ງໆ"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"ໜ້າຮ້ອງໄຫ້ສຽງດັງ"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"ໜ້າອ້າປາກ"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"ໜ້າຕະລຶງງຽບ"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"ໜ້າອ້າປາກມີເຫື່ອຕົກ"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"ໜ້າຮ້ອງດ້ວຍຄວາມຢ້ານ"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"ໜ້າປະຫຼາດໃຈ"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"ໜ້າແດງ"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"ໜ້າເຫງົານອນ"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"ໜ້າວິງວຽນ"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"ໜ້າບໍ່ມີປາກ"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"ໜ້າໃສ່ຜ້າປິດປາກ"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"ໜ້າແມວຍິ້ມ"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"ໜ້າແມວຍິ້ມພ້ອມນ້ຳຕາແຫ່ງຄວາມສຸກ"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"ໜ້າແມວຍິ້ມພ້ອມກັບອ້າປາກ"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Smiling cat face with heart-shaped eyes"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Cat face with wry smile"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kissing cat face with closed eyes"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Pouting cat face"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Crying cat face"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Weary cat face"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Face with no good gesture"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Face with ok gesture"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Person bowing deeply"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"See-no-evil monkey"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Hear-no-evil monkey"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Speak-no-evil monkey"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Happy person raising one hand"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"ຄົນຍົກມືຂຶ້ນສະຫຼອງ"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Person frowning"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Person with pouting face"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Person with folded hands"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Rocket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helicopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Steam locomotive"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Railway car"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"High-speed train"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"High-speed train with bullet nose"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Train"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Light rail"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Station"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tram"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Tram car"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Oncoming bus"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Trolleybus"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Bus stop"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Minibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulance"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Fire engine"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Police car"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Oncoming police car"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Oncoming taxi"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automobile"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Oncoming automobile"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Recreational vehicle"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Delivery truck"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"ລົດບັນທຸກພ່ວງ"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Tractor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorail"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Mountain railway"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Suspension railway"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Mountain cableway"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Aerial tramway"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Ship"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Rowboat"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Speedboat"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"ໄຟສັນຍານຈະລາຈອນລວງນອນ"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Vertical traffic light"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Construction sign"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Police cars revolving light"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Triangular flag on post"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Door"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"No entry sign"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Smoking symbol"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"ສັນຍາລັກຫ້າມສູບຢາ"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Put litter in its place symbol"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Do not litter symbol"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Potable water symbol"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Non-potable water symbol"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicycle"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"No bicycles"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Bicyclist"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Mountain bicyclist"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pedestrian"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"No pedestrians"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens symbol"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens symbol"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby symbol"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Shower"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bath"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Bathtub"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Passport control"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Customs"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Baggage claim"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Left luggage"</string> +</resources> diff --git a/java/res/values-lo-rLA/strings-letter-descriptions.xml b/java/res/values-lo-rLA/strings-letter-descriptions.xml new file mode 100644 index 000000000..ecc0b7a71 --- /dev/null +++ b/java/res/values-lo-rLA/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ໂຕບົ່ງຊີ້ລຳດັບເພດຍິງ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ສັນຍາລັກໄມໂຄຣ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ໂຕບົ່ງຊີ້ລຳດັບເພດຊາຍ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"ຈ້ຳເມັດທາງກາງ"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ເຄື່ອງໝາຍວົງຢືມຊ້າຍ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ເຄື່ອງໝາຍວົງຢືມຂວາ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"ເຄື່ອງໝາຍຕໍ່ໄມລ໌"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"ໂຕຍົກເລກສີ່"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"ໂຕຍົກ n ໂຕນ້ອຍ"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ເຄື່ອງໝາຍເປໂຊ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"CARE OF"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ລູກສອນຊີ້ໄປຂວາ"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"ລູກສອນຊີ້ລົງ"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ຊຸດຫວ່າງເປົ່າ"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"ເພີ່ມ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ໜ້ອຍກວ່າ ຫຼືເທົ່າກັບ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ຫຼາຍກວ່າ ຫຼືເທົ່າກັບ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ດາວດຳ"</string> +</resources> diff --git a/java/res/values-lo-rLA/strings-talkback-descriptions.xml b/java/res/values-lo-rLA/strings-talkback-descriptions.xml new file mode 100644 index 000000000..187b63ae5 --- /dev/null +++ b/java/res/values-lo-rLA/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ສຽບສາຍຫູຟັງ ເພື່ອຟັງສຽງລະຫັດຜ່ານທີ່ຈະຖືກເວົ້າອອກມາ."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ຂໍ້ຄວາມປັດຈຸບັນແມ່ນ %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ບໍ່ມີການໃສ່ຂໍ້ຄວາມ"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ແກ້ໄຂ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ເປັນ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ດຳເນີນການແກ້ໄຂອັດຕະໂນມັດ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"ໂຕອັກສອນທີ່ບໍ່ຮູ້ຈັກ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ສັນຍາລັກເພີ່ມເຕີມ"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ສັນຍາລັກ"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ລຶບ"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ສັນຍາລັກ"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ໂຕອັກສອນ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"ໂຕເລກ"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ການຕັ້ງຄ່າ"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ແຖບ"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ຍະຫວ່າງ"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"ການປ້ອນຂໍ້ມູນດ້ວຍສຽງ"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ອີໂມຈິ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ກັບຄືນ"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ຊອກຫາ"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ຈ້ຳ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ສະລັບພາສາ"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"ຕໍ່ໄປ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"ກ່ອນໜ້ານີ້"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ເປີດນຳໃຊ້ຢູ່"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ເປີດນຳໃຊ້ຢູ່"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"ໂຫມດສັນຍາລັກ"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"ໂໝດສັນຍາລັກເພີ່ມເຕີມ"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"ໂຫມດໂຕອັກສອນ"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ໂຫມດໂທລະສັບ"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ໂຫມດສັນຍາລັກໂທລະສັບ"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"ເຊື່ອງແປ້ນພິມໄວ້ແລ້ວ"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"ກຳລັງສະແດງແປ້ນພິມ <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ວັນທີ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ວັນທີແລະເວລາ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ອີເມວ"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ຂໍ້ຄວາມ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"ໂຕເລກ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ໂທລະສັບ"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ຂໍ້ຄວາມ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ເວລາ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ຫາກໍໃຊ້"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ຄົນ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ວັດຖຸ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ທຳມະຊາດ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ສະຖານທີ່"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ສັນຍາລັກ"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ອີໂມຕິຄອນ"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"ໂຕພິມໃຫຍ່ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"ໂຕພິມໃຫຍ່ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"ໂຕພິມໃຫຍ່ I ມີຈ້ຳເມັດຢູ່ເທິງ"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"ສັນຍາລັກທີ່ບໍ່ຮູ້ຈັກ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ອີໂມຈິທີ່ບໍ່ຮູ້ຈັກ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ມີໂຕອັກສອນສຳຮອງໃຫ້ເລືອກ"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ປິດໂຕອັກສອນສຳຮອງແລ້ວ"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ມີຄຳແນະນຳສຳຮອງໃຫ້ເລືອກ"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ປິດການແນະນຳສຳຮອງແລ້ວ"</string> +</resources> diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml index a4dbc2de2..b0e090afe 100644 --- a/java/res/values-lo-rLA/strings.xml +++ b/java/res/values-lo-rLA/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"ຕົວເລືອກການປ້ອນຂໍ້ມູນ"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Research Log Commands"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ເບິ່ງທີ່ຊື່ຂອງລາຍຊື່ຜູ່ຕິດຕໍ່"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ໂຕຊ່ວຍສະກົດໃຊ້ຂໍ້ມູນຈາກລາຍການຂອງລາຍຊື່ຜູ່ຕິດຕໍ່ຂອງທ່ານ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"ສັ່ນເຕືອນເມື່ອພິມ"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"ສຽງໃນການກົດປຸ່ມ"</string> <string name="popup_on_keypress" msgid="123894815723512944">"ໂຕອັກສອນເວລາພິມ"</string> - <string name="general_category" msgid="1859088467017573195">"ທົ່ວໄປ"</string> - <string name="correction_category" msgid="2236750915056607613">"ໂຕຊ່ວຍແປງຂໍ້ຄວາມ"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"ການພິມແບບ Gesture"</string> - <string name="misc_category" msgid="6894192814868233453">"ໂຕເລືອກອື່ນໆ"</string> - <string name="advanced_settings" msgid="362895144495591463">"ການຕັ້ງຄ່າຂັ້ນສູງ"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"ຕົວເລືອກສຳລັບຜູ່ທີ່ຊຳນານ"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"ການຕັ້ງຄ່າການປ້ອນຂໍ້ມູນ"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"ຮູບແບບໜ້າຕາ"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"ໂຕເລືອກລະບົບຫຼາຍພາສາ"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"ການຕັ້ງຄ່າການພິມດ້ວຍທ່າທາງ"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"ການແປງຄຳໃຫ້ຖືກຕ້ອງ"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"ຂັ້ນສູງ"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ປ່ຽນໄປໃຊ້ການປ້ອນຂໍ້ມູນແບບອື່ນ"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ໂຕປ່ຽນພາສາເປັນທັງໂຕປ່ຽນຮູບແບບການປ້ອນຂໍ້ມູນເຊັ່ນກັນ"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"ປຸ່ມປ່ຽນພາສາ"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"ຄ່າເລີ່ມຕົ້ນຂອງລະບົບ"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"ແນະນຳລາຍຊື່ຜູ່ຕິດຕໍ່"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ໃຊ້ຊື່ຈາກລາຍຊື່ຜູ່ຕິດຕໍ່ສຳລັບການແນະນຳ ແລະ ການຊ່ວຍແກ້ຄຳ"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ຄຳແນະນຳຕາມການນຳໃຊ້ຂອງທ່ານ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"ປັບປຸງ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"ຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດ"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"ກົດທີ່ປຸ່ມຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດແລ້ວຕາມດ້ວຍການຍະຫວ່າງ"</string> <string name="auto_cap" msgid="1719746674854628252">"ເຮັດໂຕພິມໃຫຍ່ອັດຕະໂນມັດ"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"ສະແດງຫາງຂອງ Gesture"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ມີຄຳຕົວຢ່າງລອຍຂຶ້ນມາ"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ເບິ່ງຄຳທີ່ຖືກແນະນຳໃນເວລາທີ່ກຳລັງຊີ້"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : ບັນທຶກແລ້ວ"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"ສຽບສາຍຫູຟັງເພື່ອຟັງລະຫັດຜ່ານ."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"ຂໍ້ຄວາມປະຈຸບັນແມ່ນ %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"ບໍ່ມີການໃສ່ຂໍ້ຄວາມ"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> ແກ້ໄຂ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ເປັນ <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> ປະຕິບັດການແປງຄຳຜິດອັດຕະໂນມັດ"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"ລະຫັດກະແຈ %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ເປີດນຳໃຊ້ຢູ່ (ກົດເພື່ອປິດນຳໃຊ້)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock ເປີດຢູ່ (ກົດເພື່ອປິດນຳໃຊ້)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"ລຶບ"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"ສັນຍາລັກ"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"ໂຕອັກສອນ"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"ໂຕເລກ"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"ການຕັ້ງຄ່າ"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"ແທັບ"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"ຍະຫວ່າງ"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"ການປ້ອນຂໍ້ມູນດ້ວຍສຽງ"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"ຮອຍຍິ້ມ"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"ກັບຄືນ"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"ຊອກຫາ"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"ຈ້ຳ"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"ສະລັບພາສາ"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"ຕໍ່ໄປ"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"ກ່ອນໜ້າ"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ເປີດນຳໃຊ້ຢູ່"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock ເປີດນຳໃຊ້ຢູ່"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift ປິດນຳໃຊ້ຢູ່"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"ໂຫມດສັນຍາລັກ"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"ໂຫມດໂຕອັກສອນ"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"ໂຫມດໂທລະສັບ"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"ໂຫມດສັນຍາລັກໂທລະສັບ"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"ແປ້ນພິມເຊື່ອງໄວ້"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"ກຳລັງສະແດງແປ້ນພິມ <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ວັນທີ"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ວັນທີແລະເວລາ"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ຂໍ້ຄວາມ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"ໂຕເລກ"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"ໂທລະສັບ"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"ຂໍ້ຄວາມ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ເວລາ"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ການສະແດງທ່າທາງດ້ວຍປະໂຫຍກ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ໃສ່ຍະຫວ່າງເຂົ້າໄປໃນຂະນະທີ່ສະແດງທ່າທາງ ໂດຍການເລື່ອນໄປທີ່ປຸ່ມຍະຫວ່າງ"</string> <string name="voice_input" msgid="3583258583521397548">"ປຸ່ມປ້ອນຂໍ້ມູນດ້ວຍສຽງ"</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="voice_input_disabled_summary" msgid="8141750303464726129">"ບໍ່ມີວິທີການປ້ອນສຽງເປີດນໍາໃຊ້. ໃຫ້ກວດເບິ່ງການຕັ້ງຄ່າໃນເມນູ ພາສາ & ການປ້ອນຂໍ້ມູນ."</string> <string name="configure_input_method" msgid="373356270290742459">"ຕັ້ງຄ່າຮູບແບບການປ້ອນຂໍ້ມູນ"</string> <string name="language_selection_title" msgid="1651299598555326750">"ພາສາການປ້ອນຂໍ້ມູນ"</string> <string name="send_feedback" msgid="1780431884109392046">"ສົ່ງຄຳຕິຊົມ"</string> <string name="select_language" msgid="3693815588777926848">"ພາສາການປ້ອນຂໍ້ມູນ"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"ກົດອີກຄັ້ງເພື່ອບັນທຶກ"</string> <string name="has_dictionary" msgid="6071847973466625007">"ມີວັດຈະນານຸກົມ"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"ເປີດນຳໃຊ້ຄຳຕິຊົມຈາກຜູ່ໃຊ້"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"ຊ່ວຍເພີ່ມປະສິດທິພາບໂຕແກ້ໄຂການປ້ອນຂໍ້ມູນ ໂດຍການສົ່ງສະຖິຕິການນຳໃຊ້ ແລະການລາຍການຂໍ້ຜິດພາດໂດຍອັດຕະໂນມັດ"</string> <string name="keyboard_layout" msgid="8451164783510487501">"ສີສັນແປ້ນພິມ"</string> <string name="subtype_en_GB" msgid="88170601942311355">"ອັງກິດ (ສະຫະລາດຊະອານາຈັກ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"ອັງກິດ (ສະຫະລັດຯ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"ສະເປນ (ອາເມລິກາ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"ພາສາອັງກິດ (ອັງກິດ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"ອັງກິດ (ອາເມລິກາ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"ແອສປາໂຍນ (ສະຫະລັດ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (ດັ້ງເດີມ)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ອັງກິດ (ສະຫະລາດຊະອານາຈັກ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ອັງກິດ (ສະຫະລັດຯ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ສະແປນນິດ (ສະຫະລັດຯ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ດັ້ງເດີມ)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ຊິຣິວລິກ)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ລາຕິນ)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"ບໍ່ມີພາສາ (ໂຕອັກສອນ)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ໂຕອັກສອນ (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ໂຕອັກສອນ (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ໂຕອັກສອນ (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ໂຕອັກສອນ (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"ອີໂມຈິ"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"ຮູບແບບສີ"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"ສີຂາວ"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"ສີຟ້າ"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"ຮູບແບບສີສັນແປ້ນພິມ"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"ຂາວແຈ້ງ"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"ຟ້າແຈ້ງ"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"ສະສານມືດ"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"ສະສານແຈ້ງ"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"ຮູບແບບການປ້ອນຂໍ້ມູນສ່ວນຕົວ"</string> <string name="add_style" msgid="6163126614514489951">"ເພີ່ມຮູບແບບ"</string> <string name="add" msgid="8299699805688017798">"ເພີ່ມ"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"ເປີດນຳໃຊ້"</string> <string name="not_now" msgid="6172462888202790482">"ບໍ່ແມ່ນຕອນນີ້"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ຮູບແບບການປ້ອນຂໍ້ມູນທີ່ຄືກັນມີຢູ່ແລ້ວ: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"ໂໝດການສຶກສາ Usability"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"ໄລຍະເວລາຂອງການກົດປຸ່ມ"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ໄລຍະເວລາຂອງການສັ່ນໃນການກົດປຸ່ມ"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"ລະດັບສຽງຂອງການກົດປຸ່ມ"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ອ່ານໄຟລ໌ວັດຈະນານຸກົມພາຍນອກ"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ບໍ່ມີໄຟລ໌ວັດຈະນານຸກົມໃນໂຟນເດີຂອງການດາວໂຫລດ"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ເລືອກໄຟລ໌ວັດຈະນານຸກົມເພື່ອຕິດຕັ້ງ"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ຕິດຕັ້ງໄຟລ໌ນີ້ສຳລັບ <xliff:g id="LOCALE_NAME">%s</xliff:g> ແທ້ບໍ່?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ຕິດຕັ້ງໄຟລ໌ນີ້ສຳລັບ <xliff:g id="LANGUAGE_NAME">%s</xliff:g> ແທ້ບໍ່??"</string> <string name="error" msgid="8940763624668513648">"ມີຂໍ້ຜິດພາດເກີດຂຶ້ນ"</string> <string name="button_default" msgid="3988017840431881491">"ຄ່າເລີ່ມຕົ້ນ"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"ຍິນດີຕ້ອນຮັບສູ່ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"ດຶງຂໍ້ມູນໃຫມ່"</string> <string name="last_update" msgid="730467549913588780">"ອັບເດດຫຼ້າສຸດ"</string> <string name="message_updating" msgid="4457761393932375219">"ກຳລັງກວດການອັບເດດ"</string> - <string name="message_loading" msgid="8689096636874758814">"ກຳລັງໂຫລດ..."</string> + <string name="message_loading" msgid="5638680861387748936">"ກຳລັງໂຫຼດ..."</string> <string name="main_dict_description" msgid="3072821352793492143">"ວັດຈະນານຸກົມຫຼັກ"</string> <string name="cancel" msgid="6830980399865683324">"ຍົກເລີກ"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ການຕັ້ງຄ່າ"</string> <string name="install_dict" msgid="180852772562189365">"ຕິດຕັ້ງ"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"ຍົກເລີກ"</string> <string name="delete_dict" msgid="756853268088330054">"ລຶບ"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ພາສາທີ່ທ່ານເລືອກໃຊ້ໃນອຸປະກອນຂອງທ່ານນັ້ນ ມີວັດຈະນານຸກົມໃຫ້ໃຊ້ພ້ອມ.<br/> ພວກເຮົາແນະນຳໃຫ້ <b>ດາວໂຫລດ</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> ວັດຈະນານຸກົມດັ່ງກ່າວ ເພື່ອເພີ່ມປະສົບການໃນການພິມຂອງທ່ານ.<br/> <br/> ການດາວໂຫລດອາດຈະໃຊ້ເວລາພຽງໜຶ່ງເຖິງສອງນາທີ ໂດຍການໃຊ້ 3G. ທ່ານອາດຈະເສຍຄ່າບໍລິການສຳລັບອິນເຕີເນັດ ຫາກທ່ານບໍ່ມີ <b>ການນຳໃຊ້ອິນເຕີເນັດແບບບໍ່ຈຳກັດ</b>.<br/> ຫາກທ່ານບໍ່ແນ່ໃຈວ່າຮູບແບບການໃຊ້ໃດທີ່ທ່ານມີຢູ່ ພວກເຮົາແນະນຳໃຫ້ຊອກຫາການເຊື່ອມຕໍ່ Wi-Fi ເພື່ອດາວໂຫລດມັນໂດຍອັດຕະໂນມັດ.<br/> <br/> ເຄັດລັບ: ທ່ານສາມາດດາວໂຫລດ ແລະ ລຶບວັດຈະນານຸກົມໄດ້ທີ່ <b>ພາສາ & ການປ້ອນຂໍ້ມູນ</b> ຢູ່ໃນເມນູ <b>ການຕັ້ງຄ່າ</b> ຂອງອຸປະກອນພົກພາຂອງທ່ານ."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ພາສາທີ່ເລືອກໃນອຸປະກອນມືຖືຂອງທ່ານັ້ນມີວັດຈະນານຸກົມທີ່ສາມາດໃຊ້ໄດ້.<br/> ພວກເຮົາຂໍແນະນຳໃຫ້ <b>ດາວໂຫລດ</b> ວັດຈະນານຸກົມ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ເພື່ອປັບປຸງປະສົບການໃນການພິມຂອງທ່ານ.<br/> <br/> ການດາວໂຫລດອາດໃຊ້ເວລາສອງສາມນາທີຜ່ານເຄືອຂ່າຍ 3G. ທ່ານອາດຖືກຮຽກເກັບຄ່າຂໍ້ມູນໄດ້ຫາກທ່ານບໍ່ໄດ້ໃຊ້ <b>ແພັກເກດຂໍ້ມູນແບບບໍ່ຈຳກັດ</b>.<br/> ຫາກທ່ານບໍ່ແນ່ໃຈວ່າທ່ານໃຊ້ແພັກເກດແບບໃດຢູ່ ພວກເຮົາຂໍແນະນຳໃຫ້ທ່ານເຊື່ອມຕໍ່ເຄືອຂ່າຍ Wi-Fi ໃດນຶ່ງແທນເພື່ອເລີ່ມຕົ້ນການດາວໂຫລດໂດຍອັດຕະໂນມັດ.<br/> <br/> ເຄັດລັບ: ທ່ານສາມາດດາວໂຫລດ ແລະລຶບວັດຈະນານຸກົມອອກໄດ້ໂດຍການໄປທີ່ <b>ພາສາ & ການປ້ອນຂໍ້ມູນ</b> ໃນເມນູ <b>ການຕັ້ງຄ່າ</b> ຂອງອຸປະກອນມືຖືຂອງທ່ານ."</string> <string name="download_over_metered" msgid="1643065851159409546">"ດາວໂຫລດດຽວນີ້ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"ດາວໂຫລດຜ່ານ Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"ວັດຈະນານຸກົມສາມາດໃຊ້ໄດ້ກັບ <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"ມີວັດຈະນານຸກົມທີ່ສາມາດໃຊ້ໄດ້ກັບ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"ກົດທີ່ກວດຄືນ ແລະ ດາວໂຫລດ"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ກຳລັງດາວໂຫລດ: ການແນະນຳສຳລັບ <xliff:g id="LANGUAGE">%1$s</xliff:g> ແລະມັນຈະພ້ອມນຳໃຊ້ໄວໆນີ້"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ກຳລັງດາວໂຫລດ: ການແນະນຳສຳລັບ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ຈະພ້ອມໃນໄວໆນີ້."</string> <string name="version_text" msgid="2715354215568469385">"ເວີຊັນ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ເພີ່ມ"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ເພີ່ມໄປທີ່ວັດຈະນານຸກົມ"</string> diff --git a/java/res/values-lt/strings-action-keys.xml b/java/res/values-lt/strings-action-keys.xml index 39b3894be..f7fa40072 100644 --- a/java/res/values-lt/strings-action-keys.xml +++ b/java/res/values-lt/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Anks."</string> <string name="label_done_key" msgid="7564866296502630852">"Atl."</string> <string name="label_send_key" msgid="482252074224462163">"Siųs."</string> + <string name="label_search_key" msgid="7965186050435796642">"Paieška"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pris."</string> <string name="label_wait_key" msgid="5891247853595466039">"Lauk."</string> </resources> diff --git a/java/res/values-lt/strings-config-important-notice.xml b/java/res/values-lt/strings-config-important-notice.xml new file mode 100644 index 000000000..93c66e0e3 --- /dev/null +++ b/java/res/values-lt/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Mokytis iš ryšių ir įvestų duomenų, siekiant pagerinti pasiūlymus"</string> +</resources> diff --git a/java/res/values-lt/strings-letter-descriptions.xml b/java/res/values-lt/strings-letter-descriptions.xml new file mode 100644 index 000000000..5017ac095 --- /dev/null +++ b/java/res/values-lt/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Moteriškas kelintinis rodiklis"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Ženklas „mikro-“"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Vyriškas kelintinis rodiklis"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Dviguba S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A su cirkumfleksu"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A su trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A su apskritimu viršuje"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E ligatūra"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C sedilė"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E su cirkumfleksu"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E su trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I su cirkumfleksu"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I su trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O su cirkumfleksu"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O su trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O su brūkšniu"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U su cirkumfleksu"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U su trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y su trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A su brūkšniu viršuje"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A su lankeliu"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A nosinė"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C su cirkumfleksu"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C su tašku viršuje"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C su paukšteliu"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D su paukšteliu"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D su brūkšniu"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E su brūkšniu viršuje"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E su lankeliu"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E su tašku viršuje"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E nosinė"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E su paukšteliu"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G su cirkumfleksu"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G su lankeliu"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G su tašku viršuje"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G sedilė"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H su cirkumfleksu"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H su brūkšniu"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I su brūkšniu viršuje"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I su lankeliu"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I nosinė"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I be taško"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J ligatūra"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J su cirkumfleksu"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K sedilė"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L sedilė"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L su paukšteliu"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L su tašku viduryje"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L su brūkšniu"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N sedilė"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N su paukšteliu"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N su apostrofu priekyje"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O su brūkšniu viršuje"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O su lankeliu"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O su dvigubu dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E ligatūra"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R sedilė"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R su paukšteliu"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S su cirkumfleksu"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S sedilė"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S su paukšteliu"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T sedilė"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T su paukšteliu"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T su brūkšniu"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U su brūkšniu viršuje"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U su lankeliu"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U su apskritimu viršuje"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U su dvigubu dešininio kirčio ženklu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U nosinė"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W su cirkumfleksu"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y su cirkumfleksu"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z su dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z su tašku viršuje"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z su paukšteliu"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Ilgoji S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O su rageliu"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U su rageliu"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S su kableliu apačioje"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T su kableliu apačioje"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A su tašku apačioje"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A su kabliu viršuje"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A su cirkumfleksu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A su cirkumfleksu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A su cirkumfleksu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A su cirkumfleksu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A su cirkumfleksu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A su lankeliu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A su lankeliu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A su lankeliu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A su lankeliu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A su lankeliu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E su tašku apačioje"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E su kabliu viršuje"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E su riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E su cirkumfleksu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E su cirkumfleksu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E su cirkumfleksu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E su cirkumfleksu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E su cirkumfleksu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I su kabliu viršuje"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I su tašku apačioje"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O su tašku apačioje"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O su kabliu viršuje"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O su cirkumfleksu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O su cirkumfleksu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O su cirkumfleksu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O su cirkumfleksu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O su cirkumfleksu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O su rageliu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O su rageliu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O su rageliu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O su rageliu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O su rageliu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U su tašku apačioje"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U su kabliu viršuje"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U su rageliu ir dešininiu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U su rageliu ir kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U su rageliu ir kabliu viršuje"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U su rageliu ir riestiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U su rageliu ir tašku apačioje"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y su kairiniu kirčio ženklu"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y su tašku apačioje"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y su kabliu viršuje"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y su riestiniu kirčio ženklu"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Apverstas šauktukas"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Į kairę nukreiptos dvigubos laužtinės kabutės"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Taškas viduryje"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Viršutinis indeksas skaitmuo 1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Į dešinę nukreiptos dvigubos laužtinės kabutės"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Apverstas klaustukas"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Kairiosios viengubos kabutės"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Dešiniosios viengubos kabutės"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Viengubos apatinės kabutės (devynetukai)"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Kairiosios dvigubos kabutės"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dešiniosios dvigubos kabutės"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kryžiaus ženklas"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvigubo kryžiaus ženklas"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promilės ženklas"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Tiesus vertikalus apostrofas"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvigubas tiesus vertikalus apostrofas"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Į kairę nukreiptos viengubos kabutės"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Į dešinę nukreiptos viengubos kabutės"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Viršutinis indeksas skaitmuo 4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Viršutinis indeksas mažoji lotynų k. raidė n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso ženklas"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Perduoti kam kitam"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Rodyklė dešinėn"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Rodyklė žemyn"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tuščioji aibė"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Prieaugis"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mažiau nei arba lygu"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Daugiau nei arba lygu"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Juoda žvaigždutė"</string> +</resources> diff --git a/java/res/values-lt/strings-talkback-descriptions.xml b/java/res/values-lt/strings-talkback-descriptions.xml new file mode 100644 index 000000000..18b09dd7a --- /dev/null +++ b/java/res/values-lt/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Dabartinis tekstas yra %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nėra įvesto teksto"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> pataiso <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> į <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> atlieka automatinį taisymą"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Nežinomas simbolis"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Klavišas „Shift“"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Daugiau simbolių"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Klavišas „Shift“"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboliai"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Klavišas „Shift“"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ištrinti"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simbolių klavišas"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Raidžių klavišas"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Skaičių klavišas"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Nustatymai"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabuliavimo klavišas"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Tarpo klavišas"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Balso įvestis"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Jaustukai"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Grįžti"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Paieška"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Taškas"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Keisti kalbą"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Kitas"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Ankstesnis"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Klavišas „Shift“ įgalintas"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Didžiųjų raidžių klavišas įgalintas"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Simbolių režimas"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Daugiau simbolių režimas"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Raidžių režimas"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonų numerių režimas"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefonų numerių simbolių režimas"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klaviatūra paslėpta"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Klaviatūra rodoma <xliff:g id="KEYBOARD_MODE">%s</xliff:g> režimu"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datos"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datos ir laiko"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"el. pašto"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"susirašinėjimo pranešimais"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"skaičių"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefonų numerių"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teksto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"laiko"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Naujausi"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Žmonės"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objektai"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Gamta"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Vietos"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboliai"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Jaustukai"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Didžioji <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Didžioji I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Didžioji I su tašku viršuje"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Nežinomas simbolis"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Nežinomas jaustukas"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatyvūs ženklai pasiekiami"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatyvūs simboliai atmetami"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatyvūs pasiūlymai pasiekiami"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatyvūs pasiūlymai atmetami"</string> +</resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 1f943944c..cac128751 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Įvesties parinktys"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Tyrinėti žurnalo komandas"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kontaktų vardų paieška"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Rašybos tikrinimo progr. naudoja įrašus, esančius kontaktų sąraše"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibruoti, kai paspaudžiami klavišai"</string> <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="general_category" msgid="1859088467017573195">"Bendra"</string> - <string name="correction_category" msgid="2236750915056607613">"Teksto taisymas"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Teksto vedimas gestais"</string> - <string name="misc_category" msgid="6894192814868233453">"Kitos parinktys"</string> - <string name="advanced_settings" msgid="362895144495591463">"Išplėstiniai nustatymai"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Parinktys ekspertams"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Perj. į kt. įvesties būd."</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Kalbos perjungimo klavišu taip pat perjungiami įvesties būdai"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Kalbos keitimo klavišas"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Sist. numat. nustat."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Siūlyti kontaktų vardus"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Siūlant ir taisant naudoti vardus iš „Kontaktų“"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Suasmeninti pasiūlymai"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Patobulinti „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Tšk. ir tarp. pal. dukart"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dukart palietus tarpo klavišą įterpiamas taškas ir tarpas."</string> <string name="auto_cap" msgid="1719746674854628252">"Automatinis didžiųjų raidžių rašymas"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Rodyti gestų kelią"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinaminė slankioji peržiūra"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Gestikuliuojant peržiūrėti siūlomą žodį"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: išsaugota"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Prijunkite ausines, kad išgirstumėte sakomus slaptažodžio klavišus."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Dabartinis tekstas yra %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nėra įvesto teksto"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> pataiso „<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>“ į „<xliff:g id="CORRECTED">%3$s</xliff:g>“"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> atlieka automatinį taisymą"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Klavišo kodas %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Antrojo lygio klavišas"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Įjungtas antrasis lygis (palieskite, kad išjungtumėte)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Įjungtos didžiosios raidės (palieskite, kad išjungtumėte)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Ištrinti"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboliai"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Raidės"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Skaičiai"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Nustatymai"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Skirtukas"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Tarpas"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Įvestis balsu"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Šypsenėlė"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Grįžti"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Ieškoti"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Taškas"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Keisti kalbą"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Kitas"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Ankstesnis"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Įgalintas antrasis lygis"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Įgalintos didžiosios raidės"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Antrasis lygis išjungtas"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Simbolių režimas"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Raidžių režimas"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefono režimas"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefono simbolių režimas"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klaviatūra paslėpta"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Klaviatūra rodoma <xliff:g id="MODE">%s</xliff:g> režimu"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datos"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datos ir laiko"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"el. pašto"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"susirašinėjimo pranešimais"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"skaičių"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonų numerių"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teksto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"laiko"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frazės gestas"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Atlikdami gestus įveskite tarpus perbraukę tarpo klavišą"</string> <string name="voice_input" msgid="3583258583521397548">"Įvesties balsu klavišas"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Nėra jokių įgalintų įvesties balsu metodų. Patikrinkite kalbos ir įvesties nustatymus."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigūruoti įvesties metodus"</string> <string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string> <string name="send_feedback" msgid="1780431884109392046">"Siųsti atsiliepimą"</string> <string name="select_language" msgid="3693815588777926848">"Įvesties kalbos"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Jei norite išsaugoti, palieskite dar kartą"</string> <string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Padėkite patobulinti šią įvesties metodo redagavimo priemonę automatiškai siųsdami naudojimo statistiką ir strigčių ataskaitas"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Klaviatūros tema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglų k. (JK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglų k. (JAV)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Ispanų k. (JAV)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Angliška (JK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Angliška (JAV) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Ispanų k. (JAV) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicinė)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Anglų (JK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Anglų (JAV) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Ispanų (JAV) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicinė)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kirilica)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (lotynų)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Kalbos nėra (abėcėlė)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abėcėlė (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abėcėlė (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Abėcėlė („Colemak“)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Abėcėlė (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Jaustukai"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Spalvų schema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Balta"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Mėlyna"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Pasirinkti įvesties stilių"</string> <string name="add_style" msgid="6163126614514489951">"Prid. stilių"</string> <string name="add" msgid="8299699805688017798">"Pridėti"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Įgalinti"</string> <string name="not_now" msgid="6172462888202790482">"Ne dabar"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Toks pat įvesties stilius jau yra: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tinkamumo tyrimo režimas"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Klavišo ilgo paspaudimo delsa"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrav. paspaudus mygt. trukmė"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Garso paspaudus mygt. garsumas"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Skaityti išorinį žodyno failą"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Atsisiuntimų aplanke nėra žodyno failų"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pasirinkite diegiamą žodyno failą"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Ar tikrai įdiegti šį failą <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Ar tikrai įdiegti šį failą <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Įvyko klaida"</string> <string name="button_default" msgid="3988017840431881491">"Numatytieji"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Sveiki! Tai „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Atnaujinti"</string> <string name="last_update" msgid="730467549913588780">"Paskutinį kartą atnaujinta"</string> <string name="message_updating" msgid="4457761393932375219">"Ieškoma naujinių"</string> - <string name="message_loading" msgid="8689096636874758814">"Įkeliama..."</string> + <string name="message_loading" msgid="5638680861387748936">"Įkeliama…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Pagrindinis žodynas"</string> <string name="cancel" msgid="6830980399865683324">"Atšaukti"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Nustatymai"</string> <string name="install_dict" msgid="180852772562189365">"Įdiegti"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Atšaukti"</string> <string name="delete_dict" msgid="756853268088330054">"Ištrinti"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Galimas mobiliajame įrenginyje pasirinktos kalbos žodynas.<br/> Rekomenduojame <b>atsisiųsti</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> žodyną, kad būtų patogiau įvesti tekstą.<br/> <br/> Atsisiuntimas per 3G turėtų trukti 1–2 min. Jei neturite <b>neribotų duomenų plano</b>, galite būti apmokestinti.<br/> Jei nežinote, kokį planą turite, rekomenduojame rasti „Wi-Fi“ ryšį, kad atsisiuntimas prasidėtų automatiškai.<br/> <br/> Patarimas: galite atsisiųsti ir pašalinti žodynus mobiliojo įrenginio meniu <b>Nustatymai</b> skiltyje <b>Kalba ir įvestis</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Galimas jūsų mobiliajame įrenginyje pasirinktos kalbos žodynas.<br/> Rekomenduojame <b>atsisiųsti</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> žodyną, kad patobulintumėte teksto įvedimą.<br/> <br/> Naudojant 3G ryšį atsisiuntimas užtruks vieną ar dvi minutes. Jei naudojate ne <b>neribotų duomenų planą</b>, gali būti taikomi mokesčiai.<br/> Jei nesate tikri, kurį duomenų planą naudojate, rekomenduojame rasti „Wi-Fi“ ryšį, kad atsisiuntimas būtų pradėtas automatiškai.<br/> <br/> Patarimas: žodynus galite atsisiųsti ir pašalinti apsilankę mobiliojo įrenginio skiltyje <b>Kalba ir įvestis</b>, esančioje meniu <b>Nustatymai</b>."</string> <string name="download_over_metered" msgid="1643065851159409546">"Atsisiųsti dabar (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Atsisiųsti per „Wi-Fi“"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Galimas <xliff:g id="LANGUAGE">%1$s</xliff:g> žodynas"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Galimas <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> žodynas"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Paspauskite, kad peržiūrėtumėte ir atsisiųstumėte"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Atsisiunčiama. Netrukus bus galimi <xliff:g id="LANGUAGE">%1$s</xliff:g> pasiūlymai."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Atsisiunčiama. Netrukus bus galimi <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> pasiūlymai."</string> <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> versija"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Pridėti"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Pridėti prie žodyno"</string> diff --git a/java/res/values-lv/strings-action-keys.xml b/java/res/values-lv/strings-action-keys.xml index c2fbda26b..69988d733 100644 --- a/java/res/values-lv/strings-action-keys.xml +++ b/java/res/values-lv/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Iepr."</string> <string name="label_done_key" msgid="7564866296502630852">"Gatavs"</string> <string name="label_send_key" msgid="482252074224462163">"Sūtīt"</string> + <string name="label_search_key" msgid="7965186050435796642">"Meklēt"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauze"</string> <string name="label_wait_key" msgid="5891247853595466039">"Gaidīt"</string> </resources> diff --git a/java/res/values-lv/strings-config-important-notice.xml b/java/res/values-lv/strings-config-important-notice.xml new file mode 100644 index 000000000..15dc4b3a1 --- /dev/null +++ b/java/res/values-lv/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Izmantojiet saziņu un ievadītos datus, lai uzlabotu ieteikumus."</string> +</resources> diff --git a/java/res/values-lv/strings-letter-descriptions.xml b/java/res/values-lv/strings-letter-descriptions.xml new file mode 100644 index 000000000..395d9ca16 --- /dev/null +++ b/java/res/values-lv/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Sieviešu dzimtes kārtas skaitļa vārds"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro zīme"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Vīriešu dzimtes kārtas skaitļa vārds"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ligatūra"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A ar gravi"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A ar akcentu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A ar cirkumfleksu"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A ar tildi"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A ar diairēsi"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A ar aplīti virs burta"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A-E ligatūra"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C ar sediļu"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E ar gravi"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E ar akcentu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E ar cirkumfleksu"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E ar diairēsi"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I ar gravi"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I ar akcentu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I ar cirkumfleksu"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I ar diairēsi"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N ar tildi"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O ar gravi"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O ar akcentu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O ar cirkumfleksu"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O ar tildi"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O ar diairēsi"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O ar vilkumu"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U ar gravi"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U ar akcentu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U ar cirkumfleksu"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U ar diairēsi"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y ar akcentu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y ar diairēsi"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A ar garumzīmi"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A ar īsuma zīmi"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A ar ogonek astīti"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C ar akcentu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C ar cirkumfleksu"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C ar punktu virs burta"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D ar vilkumu"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E ar garumzīmi"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E ar īsuma zīmi"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E ar punktu virs burta"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E ar ogonek astīti"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G ar cirkumfleksu"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G ar īsuma zīmi"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G ar punktu virs burta"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G ar sediļu"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H ar cirkumfleksu"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H ar vilkumu"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I ar tildi"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I ar garumzīmi"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I ar īsuma zīmi"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I ar ogonek astīti"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Bezpunkta I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I-J ligatūra"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J ar cirkumfleksu"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K ar sediļu"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L ar akcentu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L ar sediļu"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L ar viduspunktu"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L ar vilkumu"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N ar akcentu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N ar sediļu"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N ar apostrofu pirms burta"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O ar garumzīmi"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O ar īsuma zīmi"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O ar dubultakcentu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O-E ligatūra"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R ar akcentu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R ar sediļu"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S ar akcentu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S ar cirkumfleksu"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S ar sediļu"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T ar sediļu"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T ar vilkumu"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U ar tildi"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U ar garumzīmi"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U ar īsuma zīmi"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U ar aplīti virs burta"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U ar dubultakcentu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U ar ogonek astīti"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W ar cirkumfleksu"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y ar cirkumfleksu"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z ar akcentu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z ar aplīti virs burta"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z ar apgriezto jumtiņu"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Garais S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O ar raga zīmi"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U ar raga zīmi"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S ar komatu zem burta"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T ar komatu zem burta"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Neitrāls patskanis"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A ar punktu zem burta"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A ar āķa zīmi"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A ar cirkumfleksu un akcentu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A ar cirkumfleksu un gravi"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A ar cirkumfleksu un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A ar cirkumfleksu un tildi"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A ar cirkumfleksu un punktu zem burta"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A ar īsuma zīmi un akcentu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A ar īsuma zīmi un gravi"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A ar īsuma zīmi un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A ar īsuma zīmi un tildi"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A ar īsuma zīmi un punktu zem burta"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E ar punktu zem burta"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E ar āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E ar tildi"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E ar cirkumfleksu un akcentu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E ar cirkumfleksu un gravi"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E ar cirkumfleksu un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E ar cirkumfleksu un tildi"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E ar cirkumfleksu un punktu zem burta"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I ar āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I ar punktu zem burta"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O ar punktu zem burta"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O ar āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O ar cirkumfleksu un akcentu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O ar cirkumfleksu un gravi"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O ar cirkumfleksu un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O ar cirkumfleksu un tildi"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O ar cirkumfleksu un punktu zem burta"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O ar raga zīmi un akcentu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O ar raga zīmi un gravi"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O ar raga zīmi un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O ar raga zīmi un tildi"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O ar raga zīmi un punktu zem burta"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U ar punktu zem burta"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U ar āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U ar raga zīmi un akcentu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U ar raga zīmi un gravi"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U ar raga zīmi un āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U ar raga zīmi un tildi"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U ar raga zīmi un punktu zem burta"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y ar gravi"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y ar punktu zem burta"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y ar āķa zīmi virs burta"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y ar tildi"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Apgriezta izsaukuma zīme"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Pa kreisi vērsta dubultā leņķa pēdiņa"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Viduspunkts"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"“Viens” augšrakstā"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Pa labi vērsta dubultā leņķa pēdiņa"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Apgriezta jautājuma zīme"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Viena kreisās puses pēdiņa"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Viena labās puses pēdiņa"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Viena izliekta “9” formas pēdiņa"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Divas kreisās puses pēdiņas"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Divas labās puses pēdiņas"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Krustiņš"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubultkrustiņš"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promiles zīme"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Štrihs"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubultštrihs"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Viena pa kreisi vērsta leņķa pēdiņa"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Viena pa labi vērsta leņķa pēdiņa"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"“Četri” augšrakstā"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Latīņu mazais burts “n” augšrakstā"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso zīme"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"c/o"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pa labi vērsta bultiņa"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Uz leju vērsta bultiņa"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tukša kopa"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Palielinājums"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mazāks par vai vienāds ar"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lielāks par vai vienāds ar"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Melna zvaigzne"</string> +</resources> diff --git a/java/res/values-lv/strings-talkback-descriptions.xml b/java/res/values-lv/strings-talkback-descriptions.xml new file mode 100644 index 000000000..2fe7f9164 --- /dev/null +++ b/java/res/values-lv/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Pievienojiet austiņas, lai dzirdētu paroles rakstzīmes."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Pašreizējais teksts ir %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Teksts nav ievadīts"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Nospiežot taustiņu <xliff:g id="KEY_NAME">%1$s</xliff:g>, “<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>” tiek labots uz “<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>”."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Taustiņam <xliff:g id="KEY_NAME">%1$s</xliff:g> ir automātiskas labošanas funkcija."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Nezināma rakstzīme"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Pārslēgšanas taustiņš"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Citi simboli"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Pārslēgšanas taustiņš"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboli"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Pārslēgšanas taustiņš"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Dzēšanas taustiņš"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simboli"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Burti"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Cipari"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Iestatījumi"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabulēšanas taustiņš"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Atstarpēšanas taustiņš"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Balss ievade"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emocijzīmes"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Ievadīšanas taustiņš"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Meklēšanas taustiņš"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punkta aizzīme"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Valodas mainīšana"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Tālāk"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Atpakaļ"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Pārslēgšanas režīms ir iespējots"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Burtslēgs ir iespējots"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Simbolu režīms"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Citu simbolu režīms"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Burtu režīms"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Tālruņa režīms"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Tālruņa simbolu režīms"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastatūra ir paslēpta"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Tiek rādīts tastatūras režīms: <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datums"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datums un laiks"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-pasts"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ziņojumapmaiņa"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"cipari"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"tālrunis"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teksts"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"laiks"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Pēdējie"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Cilvēki"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objekti"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Daba"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Vietas"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboli"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emocijzīmes"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Lielais burts “<xliff:g id="LOWER_LETTER">%s</xliff:g>”"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Lielais burts “I”"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Lielais burts “I” ar punktu virs tā"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Nezināms simbols"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Nezināma emocijzīme"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ir pieejamas alternatīvas rakstzīmes."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatīvās rakstzīmes netiek rādītas."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ir pieejami alternatīvi ieteikumi."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatīvie ieteikumi netiek rādīti."</string> +</resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 8ea24edb7..798d517e6 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Ievades opcijas"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Izpētes žurnāla komandas"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Meklēt kontaktp. vārdus"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Pareizrakst. pārbaudītājs lieto ierakstus no kontaktp. saraksta."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrēt, nospiežot taustiņu"</string> <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="general_category" msgid="1859088467017573195">"Vispārīgi"</string> - <string name="correction_category" msgid="2236750915056607613">"Teksta korekcija"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Ievade ar žestiem"</string> - <string name="misc_category" msgid="6894192814868233453">"Citas opcijas"</string> - <string name="advanced_settings" msgid="362895144495591463">"Papildu iestatījumi"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opcijas ekspertiem"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Pārsl. uz citām iev. met."</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Valodas pārslēgš. taustiņu var lietot arī citām ievades metodēm."</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Valodas pārslēgšanas taustiņš"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Sistēmas noklusējums"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Ieteikt kontaktp. vārdus"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Izmantot kontaktpersonu vārdus kā ieteikumus un labojumus"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalizēti ieteikumi"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Uzlabot lietotni <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dubultpiesk. = punkts"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Divreiz pieskaroties atst. taustiņam, ievada punktu un atstarpi."</string> <string name="auto_cap" msgid="1719746674854628252">"Automātiska lielo burtu lietošana"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Rādīt žesta pēdas"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamisk. peldošais priekšsk."</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Skatiet ieteikto vārdu, veicot žestu."</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: saglabāts"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Pievienojiet austiņas, lai dzirdētu paroles rakstzīmes."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Pašreizējais teksts ir %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nav ievadīts teksts"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Nospiežot taustiņu <xliff:g id="KEY">%1$s</xliff:g>, “<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>” tiek labots uz “<xliff:g id="CORRECTED">%3$s</xliff:g>”."</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Taustiņam <xliff:g id="KEY">%1$s</xliff:g> ir automātiskas labošanas funkcija."</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Taustiņu kods %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Pārslēgšanas taustiņš"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Pārslēgšanas taustiņš iespējots (pieskarieties, lai atspējotu)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Burtslēgs iespējots (pieskarieties, lai atspējotu)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Dzēšanas taustiņš"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboli"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Burti"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Skaitļi"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Iestatījumi"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulēšanas taustiņš"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Atstarpes taustiņš"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Balss ievade"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smaidoša seja"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Ievadīšanas taustiņš"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Meklēt"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punkts"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Mainīt valodu"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Nākamā"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Iepriekšējā"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Pārslēgšanas režīms iespējots"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Burtslēgs iespējots"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Pārslēgšanas režīms atspējots"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Simbolu režīms"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Burtu režīms"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Tālruņa režīms"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Tālruņa simbolu režīms"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatūra ir paslēpta"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tiek rādīts tastatūras režīms <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datums"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datums un laiks"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pasts"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ziņojumapmaiņa"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"cipari"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"tālrunis"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teksts"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"laiks"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frāzes žests"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Lai ievietotu atstarpi, velciet uz atstarpes taustiņu."</string> <string name="voice_input" msgid="3583258583521397548">"Balss ievades atslēga"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Nav iespējota neviena balss ievades metode. Pārbaudiet valodas un ievades iestatījumus."</string> <string name="configure_input_method" msgid="373356270290742459">"Ievades metožu konfigurēšana"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string> <string name="send_feedback" msgid="1780431884109392046">"Sūtīt atsauksmes"</string> <string name="select_language" msgid="3693815588777926848">"Ievades valodas"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pieskarieties vēlreiz, lai saglabātu."</string> <string name="has_dictionary" msgid="6071847973466625007">"Ir pieejama vārdnīca."</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Iespējot lietotāju atsauksmes"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Palīdziet uzlabot šo ievades metodes redaktoru, automātiski nosūtot lietojuma statistiku un avāriju pārskatus."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tastatūras motīvs"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Angļu valoda (Lielbritānija)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Angļu valoda (ASV)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spāņu (ASV)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Angļu (Lielbritānija) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Angļu (ASV) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spāņu (ASV) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicionālā)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Angļu (Lielbritānija) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Angļu (ASV) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spāņu (ASV) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicionālā)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kirilica)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latīņu)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nav valodas (alfabēts)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabēts (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabēts (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabēts (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabēts (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Japāņu emocijzīmes"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Krāsu shēma"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Balta"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Zila"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Pielāg. ievades stili"</string> <string name="add_style" msgid="6163126614514489951">"Piev. stilu"</string> <string name="add" msgid="8299699805688017798">"Pievienot"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Iespējot"</string> <string name="not_now" msgid="6172462888202790482">"Vēlāk"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Šāds ievades stils jau pastāv: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Lietojamības izpētes režīms"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Taustiņa ilgās nosp. noildze"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Taust. nosp. vibrācijas ilgums"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Taustiņu nosp. skaņas skaļums"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ārējās vārdnīcas faila nolasīšana"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Mapē Lejupielādes nav neviena vārdnīcas faila."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Instalējamā vārdnīcas faila atlasīšana"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vai instalēt šo failu šādai valodai: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vai tiešām instalēt šo failu šādai valodai: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Radās kļūda"</string> <string name="button_default" msgid="3988017840431881491">"Noklusējums"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Laipni lūdzam pakalpojumā <xliff:g id="APPLICATION_NAME">%s</xliff:g>,"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Atsvaidzināt"</string> <string name="last_update" msgid="730467549913588780">"Pēdējo reizi atjaunināts"</string> <string name="message_updating" msgid="4457761393932375219">"Notiek pārbaude, vai ir pieejami atjauninājumi."</string> - <string name="message_loading" msgid="8689096636874758814">"Notiek ielāde..."</string> + <string name="message_loading" msgid="5638680861387748936">"Notiek ielāde…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Galvenā vārdnīca"</string> <string name="cancel" msgid="6830980399865683324">"Atcelt"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Iestatījumi"</string> <string name="install_dict" msgid="180852772562189365">"Instalēt"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Atcelt"</string> <string name="delete_dict" msgid="756853268088330054">"Dzēst"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobilajā ierīcē atlasītajai valodai ir pieejama vārdnīca.<br/>Ieteicams <b>lejupielādēt</b> vārdnīcu (<xliff:g id="LANGUAGE">%1$s</xliff:g>), lai uzlabotu rakstīšanas iespējas.<br/><br/>Lejupielāde, izmantojot 3G tīklu, ilgs dažas minūtes. Ja nelietojat <b>neierobežotu datu plānu</b>, var tikt piemērota maksa.<br/>Ja nezināt, kādu datu plānu lietojat, ieteicams atrast Wi-Fi savienojumu, lai automātiski sāktu lejupielādi.<br/><br/>Padoms. Vārdnīcas var lejupielādēt un noņemt mobilās ierīces izvēlnes <b>Iestatījumi</b> sadaļā <b>Valoda un ievade</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Mobilajā ierīcē atlasītajai valodai ir pieejama vārdnīca.<br/> Ieteicams <b>lejupielādēt</b> šo vārdnīcu (<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>), lai uzlabotu rakstīšanas iespējas.<br/> <br/> Lejupielāde, izmantojot 3G tīklu, ilgs tikai dažas minūtes. Ja nelietojat <b>neierobežotu datu plānu</b>, var tikt piemērota maksa.<br/> Ja nezināt, kādu datu plānu lietojat, ieteicams atrast Wi-Fi savienojumu, lai automātiski sāktu lejupielādi.<br/> <br/> Padoms: vārdnīcas var lejupielādēt un noņemt sadaļā <b>Valoda un ievade</b>, kas atrodas mobilās ierīces izvēlnē <b>Iestatījumi</b>."</string> <string name="download_over_metered" msgid="1643065851159409546">"Lejupielādēt tūlīt (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Lejupielādēt, izmantojot Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Ir pieejama vārdnīca šādai valodai: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Ir pieejama vārdnīca šādai valodai: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Nospiediet, lai pārskatītu un lejupielādētu"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Notiek lejupielāde. Drīz būs pieejami ieteikumi šādai valodai: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Notiek lejupielāde. Drīz būs pieejami ieteikumi šādai valodai: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Versija <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Pievienot"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Pievienot vārdnīcai"</string> diff --git a/java/res/values-mk-rMK/strings-action-keys.xml b/java/res/values-mk-rMK/strings-action-keys.xml new file mode 100644 index 000000000..f4fc9ce7d --- /dev/null +++ b/java/res/values-mk-rMK/strings-action-keys.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for label_go_key (4033615332628671065) --> + <skip /> + <!-- no translation found for label_next_key (5586407279258592635) --> + <skip /> + <!-- no translation found for label_previous_key (1421141755779895275) --> + <skip /> + <!-- no translation found for label_done_key (7564866296502630852) --> + <skip /> + <!-- no translation found for label_send_key (482252074224462163) --> + <skip /> + <string name="label_search_key" msgid="7965186050435796642">"Барај"</string> + <!-- no translation found for label_pause_key (2225922926459730642) --> + <skip /> + <!-- no translation found for label_wait_key (5891247853595466039) --> + <skip /> +</resources> diff --git a/java/res/values-mk-rMK/strings-letter-descriptions.xml b/java/res/values-mk-rMK/strings-letter-descriptions.xml new file mode 100644 index 000000000..be21fc8f7 --- /dev/null +++ b/java/res/values-mk-rMK/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Женски реден индикатор"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак за микро"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Машки реден индикатор"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Остро С"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, со надреден знак"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, со акцент"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, циркумфлекс"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, тилда"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, дијареза"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, со прстен горе"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, лигатура"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, седилја"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, со надреден знак"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, со акцент"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, циркумфлекс"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, дијареза"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, со надреден знак"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, со акцент"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, циркумфлекс"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, дијареза"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ет"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, тилда"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, со надреден знак"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, со акцент"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, циркумфлекс"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, тилда"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, дијареза"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, прецртано"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, со надреден знак"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, со акцент"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, циркумфлекс"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, дијареза"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, со акцент"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Трн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, дијареза"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, макрон"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, бреве"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, огонек"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, со акцент"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, циркумфлекс"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, со точка одозгора"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, карон"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, карон"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, прецртано"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, макрон"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, бреве"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, со точка одозгора"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, огонек"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, карон"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, циркумфлекс"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, бреве"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, со точка одозгора"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, седилја"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, циркумфлекс"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, прецртано"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, тилда"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, макрон"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, бреве"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, огонек"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I без точка"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, лигатура"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, циркумфлекс"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, седилја"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, со акцент"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, седилја"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, карон"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, средната точка"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, прецртано"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, со акцент"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, седилја"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, карон"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, со апостроф"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Енг"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, макрон"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, бреве"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, со двоен акцент"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, лигатура"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, со акцент"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, седилја"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, карон"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, со акцент"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, циркумфлекс"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, седилја"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, карон"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, седилја"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, карон"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, прецртано"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, тилда"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, макрон"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, бреве"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, со прстен горе"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, со двоен акцент"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, огонек"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, циркумфлекс"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, циркумфлекс"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, со акцент"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, со точка одозгора"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, карон"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Долго S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, рог"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, рог"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, запирка подолу"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Т, запирка подолу"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"А, точка подолу"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"А, кука над"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, циркумфлекс и со акцент"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, циркумфлекс и со надреден знак"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, циркумфлекс и кука над"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, циркумфлекс и тилда"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, циркумфлекс и точка подолу"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, бреве и со акцент"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, бреве и со надреден знак"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, бреве и кука над"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, бреве и тилда"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, бреве и точка подолу"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Е, точка подолу"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Е, кука над"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, тилда"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, циркумфлекс и со акцент"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, циркумфлекс и со надреден знак"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, циркумфлекс и кука над"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, циркумфлекс и тилда"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, циркумфлекс и точка подолу"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, кука над"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, точка подолу"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, точка подолу"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, кука над"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, циркумфлекс и со акцент"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, циркумфлекс и со надреден знак"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, циркумфлекс и кука над"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, циркумфлекс и тилда"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, циркумфлекс и точка подолу"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, рог и со акцент"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, рог и со надреден знак"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, рог и кука над"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, рог и тилда"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, рог и точка подолу"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, точка подолу"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, кука над"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, рог и со акцент"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, рог и со надреден знак"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, рог и кука над"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, рог и тилда"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, рог и точка подолу"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, со надреден знак"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, точка подолу"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, кука над"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, тилда"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Превртен извичник"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Леви аглести наводници"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Средна точка"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"На степен еден"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Десни аглести наводници"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Превртен прашалник"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Леви полунаводници"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Десни полунаводници"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Леви 9-полунаводници"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Леви наводници"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Десни наводници"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Крстче"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Дупло крстче"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак за промили"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Прим"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Секундум"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Леви аглести полунаводници"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Десни аглести полунаводници"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"На степен четири"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"На степен n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак пезо"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрелка надесно"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрелка надолу"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Празен сет"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Диференцијал"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Помало или еднакво на"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Поголемо или еднакво на"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Црна ѕвезда"</string> +</resources> diff --git a/java/res/values-mk-rMK/strings-talkback-descriptions.xml b/java/res/values-mk-rMK/strings-talkback-descriptions.xml new file mode 100644 index 000000000..12a64135a --- /dev/null +++ b/java/res/values-mk-rMK/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Непознат знак"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Голема буква <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Голема буква I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Голема буква I, со точка одозгора"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Непознат симбол"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Непозната емотикона"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Достапни се алтернативни знаци"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Алтернативните знаци се отфрлени"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Достапни се алтернативни предлози"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Алтернативните предлози се отфрлени"</string> +</resources> diff --git a/java/res/values-mk-rMK/strings.xml b/java/res/values-mk-rMK/strings.xml new file mode 100644 index 000000000..d7945e300 --- /dev/null +++ b/java/res/values-mk-rMK/strings.xml @@ -0,0 +1,374 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_personalized_dicts (5167396352105467626) --> + <skip /> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Подобри <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- 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 (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- 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_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for gesture_space_aware (2078291600664682496) --> + <skip /> + <!-- no translation found for gesture_space_aware_summary (4371385818348528538) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_disabled_summary (8141750303464726129) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for keyboard_layout (8451164783510487501) --> + <skip /> + <!-- no translation found for subtype_en_GB (88170601942311355) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (510930471167541338) --> + <skip /> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (5638680861387748936) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for go_to_settings (3876892339342569259) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) --> + <skip /> + <!-- no translation found for download_over_metered (1643065851159409546) --> + <skip /> + <!-- no translation found for do_not_download_over_metered (2176209579313941583) --> + <skip /> + <!-- no translation found for dict_available_notification_title (4583842811218581658) --> + <skip /> + <!-- no translation found for dict_available_notification_description (1075194169443163487) --> + <skip /> + <!-- no translation found for toast_downloading_suggestions (6128155879830851739) --> + <skip /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/res/values-mk/strings-talkback-descriptions.xml b/java/res/values-mk/strings-talkback-descriptions.xml new file mode 100644 index 000000000..05b816ab7 --- /dev/null +++ b/java/res/values-mk/strings-talkback-descriptions.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_search (1247236163755920808) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> + <skip /> + <!-- no translation found for spoken_description_action_next (8636078276664150324) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (800872415009336208) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> + <skip /> + <!-- no translation found for keyboard_mode_date (3137520166817128102) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> + <skip /> + <!-- no translation found for keyboard_mode_email (6216248078128294262) --> + <skip /> + <!-- no translation found for keyboard_mode_im (1137405089766557048) --> + <skip /> + <!-- no translation found for keyboard_mode_number (7991623440699957069) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> + <skip /> + <!-- no translation found for keyboard_mode_text (6479436687899701619) --> + <skip /> + <!-- no translation found for keyboard_mode_time (4381856885582143277) --> + <skip /> + <!-- no translation found for keyboard_mode_url (1519819835514911218) --> + <skip /> +</resources> diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml index 6f685d395..ab2f2625a 100644 --- a/java/res/values-mk/strings.xml +++ b/java/res/values-mk/strings.xml @@ -22,7 +22,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for english_ime_input_options (3909945612939668554) --> <skip /> - <!-- no translation found for english_ime_research_log (8492602295696577851) --> <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> <skip /> @@ -126,106 +125,8 @@ <skip /> <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> <skip /> - <!-- no translation found for added_word (8993883354622484372) --> - <skip /> - <!-- no translation found for spoken_use_headphones (896961781287283493) --> - <skip /> - <!-- no translation found for spoken_current_text_is (2485723011272583845) --> - <skip /> - <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> - <skip /> - <!-- no translation found for spoken_auto_correct (8005997889020109763) --> - <skip /> - <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> - <skip /> - <!-- no translation found for spoken_description_unknown (3197434010402179157) --> - <skip /> - <!-- no translation found for spoken_description_shift (244197883292549308) --> - <skip /> - <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> - <skip /> - <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> - <skip /> - <!-- no translation found for spoken_description_delete (8740376944276199801) --> - <skip /> - <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> - <skip /> - <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> - <skip /> - <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> - <skip /> - <!-- no translation found for spoken_description_settings (4627462689603838099) --> - <skip /> - <!-- no translation found for spoken_description_tab (2667716002663482248) --> - <skip /> - <!-- no translation found for spoken_description_space (2582521050049860859) --> - <skip /> - <!-- no translation found for spoken_description_mic (615536748882611950) --> - <skip /> - <!-- no translation found for spoken_description_smiley (2256309826200113918) --> - <skip /> - <!-- no translation found for spoken_description_return (8178083177238315647) --> - <skip /> - <!-- no translation found for spoken_description_search (1247236163755920808) --> - <skip /> - <!-- no translation found for spoken_description_dot (40711082435231673) --> - <skip /> - <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> - <skip /> - <!-- no translation found for spoken_description_action_next (8636078276664150324) --> - <skip /> - <!-- no translation found for spoken_description_action_previous (800872415009336208) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> - <skip /> - <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> - <skip /> - <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> - <skip /> - <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> - <skip /> - <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> - <skip /> - <!-- no translation found for keyboard_mode_date (3137520166817128102) --> - <skip /> - <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> - <skip /> - <!-- no translation found for keyboard_mode_email (6216248078128294262) --> - <skip /> - <!-- no translation found for keyboard_mode_im (1137405089766557048) --> - <skip /> - <!-- no translation found for keyboard_mode_number (7991623440699957069) --> - <skip /> - <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> - <skip /> - <!-- no translation found for keyboard_mode_text (6479436687899701619) --> - <skip /> - <!-- no translation found for keyboard_mode_time (4381856885582143277) --> - <skip /> - <!-- no translation found for keyboard_mode_url (1519819835514911218) --> - <skip /> <!-- no translation found for voice_input (3583258583521397548) --> <skip /> - <!-- 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 configure_input_method (373356270290742459) --> <skip /> <!-- no translation found for language_selection_title (1651299598555326750) --> @@ -238,9 +139,7 @@ <skip /> <!-- no translation found for has_dictionary (6071847973466625007) --> <skip /> - <!-- no translation found for prefs_enable_log (6620424505072963557) --> <skip /> - <!-- no translation found for prefs_description_log (7525225584555429211) --> <skip /> <!-- no translation found for keyboard_layout (8451164783510487501) --> <skip /> @@ -296,7 +195,6 @@ <skip /> <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> <skip /> - <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> <skip /> <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> <skip /> diff --git a/java/res/values-ml-rIN/strings-action-keys.xml b/java/res/values-ml-rIN/strings-action-keys.xml new file mode 100644 index 000000000..46a8cfc94 --- /dev/null +++ b/java/res/values-ml-rIN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"പോകുക"</string> + <string name="label_next_key" msgid="5586407279258592635">"അടുത്തത്"</string> + <string name="label_previous_key" msgid="1421141755779895275">"മുമ്പത്തെ"</string> + <string name="label_done_key" msgid="7564866296502630852">"പൂർത്തിയായി"</string> + <string name="label_send_key" msgid="482252074224462163">"അയയ്ക്കുക"</string> + <string name="label_search_key" msgid="7965186050435796642">"തിരയുക"</string> + <string name="label_pause_key" msgid="2225922926459730642">"താൽക്കാലികമായി നിർത്തുക"</string> + <string name="label_wait_key" msgid="5891247853595466039">"കാത്തിരിക്കുക"</string> +</resources> diff --git a/java/res/values-ml-rIN/strings-appname.xml b/java/res/values-ml-rIN/strings-appname.xml new file mode 100644 index 000000000..940ee819d --- /dev/null +++ b/java/res/values-ml-rIN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android കീബോർഡ് (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android അക്ഷരത്തെറ്റ് പരിശോധന (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android കീബോർഡ് ക്രമീകരണങ്ങൾ (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android അക്ഷരത്തെറ്റ് പരിശോധനാ ക്രമീകരണങ്ങൾ (AOSP)"</string> +</resources> diff --git a/java/res/values-ml-rIN/strings-config-important-notice.xml b/java/res/values-ml-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..7cdc17b93 --- /dev/null +++ b/java/res/values-ml-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"നിർദ്ദേശങ്ങൾ മെച്ചപ്പെടുത്തുന്നതിന് നിങ്ങളുടെ ആശയവിനിമയങ്ങൾ, ടൈപ്പുചെയ്ത ഡാറ്റ എന്നിവയിൽ നിന്നും അറിയുക"</string> +</resources> diff --git a/java/res/values-ml-rIN/strings-letter-descriptions.xml b/java/res/values-ml-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..0a845df77 --- /dev/null +++ b/java/res/values-ml-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ഫെമിനൈൻ ഓർഡിനൽ ഇൻഡിക്കേറ്റർ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"മൈക്രോ ചിഹ്നം"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"മാസ്കുലിൻ ഓർഡിനൽ ഇൻഡിക്കേറ്റർ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ഷാർപ്പ് S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, മുകളിൽ റിംഗ്"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, സെഡില്ലാ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"എത്ത്"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"തോൺ"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, മാക്രോൺ"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, കറോൺ"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, കറോൺ"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, മാക്രോൺ"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, കറോൺ"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, സെഡില്ല"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, ടിൽഡ്"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, മാക്രോൺ"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ബ്രീവ്"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ഡോട്ട് ഇല്ലാത്ത I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, സെഡില്ല"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ക്ര"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, സെഡില്ല"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, കറോൺ"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, മധ്യഭാഗത്തെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, സെഡില്ല"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, കറോൺ"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, വിശ്ലേഷത്തിന് മുമ്പ്"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ഇംഗ്"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, മാക്രോൺ"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, ഇരട്ട അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, സെഡില്ല"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, കറോൺ"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, സെഡില്ല"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, കറോൺ"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, സെഡില്ല"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, കറോൺ"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, ടിൽഡ്"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, മാക്രോൺ"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ബ്രീവ്"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, മുകളിൽ റിംഗ്"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, ഇരട്ട അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, കറോൺ"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"നീളമുള്ള S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ഹോൺ"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ഹോൺ"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, താഴെ കോമ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, താഴെ കോമ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ഷ്വ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ബ്രീവും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ബ്രീവും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ബ്രീവും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ബ്രീവും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ബ്രീവും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, ടിൽഡ്"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ഹോണും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ഹോണും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ഹോണും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ഹോണും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ഹോണും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ഹോണും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ഹോണും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ഹോണും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ഹോണും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ഹോണും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, ടിൽഡ്"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"വിപരീത ആശ്ചര്യ ചിഹ്നം"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ഇടതുഭാഗം സൂചിപ്പിക്കുന്ന ഇരട്ട കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"മദ്ധ്യ ബിന്ദു"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"സൂപ്പർസ്ക്രിപ്റ്റ് വൺ"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"വലതുഭാഗം സൂചിപ്പിക്കുന്ന ഇരട്ട കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"വിപരീത ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ഇടത് ഏക ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"വലത് ഏക ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ഏക ലോ-9 ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ഇടത് ഇരട്ട ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"വലത് ഇരട്ട ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ഡാഗർ"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ഇരട്ട ഡാഗർ"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"പെർ മില്ലി ചിഹ്നം"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"പ്രൈം"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ഇരട്ട പ്രൈം"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ഇടതുഭാഗം സൂചിപ്പിക്കുന്ന ഏക കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"വലതുഭാഗം സൂചിപ്പിക്കുന്ന ഏക കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"സൂപ്പർസ്ക്രിപ്റ്റ് നാല്"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"സൂപ്പർസ്ക്രിപ്റ്റ് ലാറ്റിൻ ചെറിയക്ഷരം n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"പെസോ ചിഹ്നം"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"കെയർ ഓഫ്"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"വലത്തേയ്ക്കുള്ള അമ്പടയാളം"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"താഴേയ്ക്കുള്ള അമ്പടയാളം"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"എംറ്റി സെറ്റ്"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"വർദ്ധന"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ഇതിലും ചെറുത് അല്ലെങ്കിൽ ഇതിന് സമം"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ഇതിലും വലുത് അല്ലെങ്കിൽ ഇതിന് സമം"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ബ്ലാക്ക് സ്റ്റാർ"</string> +</resources> diff --git a/java/res/values-ml-rIN/strings-talkback-descriptions.xml b/java/res/values-ml-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..3577bbb0c --- /dev/null +++ b/java/res/values-ml-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ഉറക്കെ പറയുന്ന പാസ്വേഡ് കീകൾ കേൾക്കുന്നതിന് ഒരു ഹെഡ്സെറ്റ് പ്ലഗ്ഗുചെയ്യുക"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"നിലവിലെ വാചകം %s ആണ്"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"വാചകമൊന്നും നൽകിയിട്ടില്ല"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>, <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> എന്നത് <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> എന്നതായി തിരുത്തുന്നു"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> യാന്ത്രിക-തിരുത്തൽ നിർവഹിക്കുന്നു"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"അജ്ഞാത പ്രതീകം"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"കൂടുതൽ ചിഹ്നങ്ങൾ"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ഇല്ലാതാക്കുക"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"അക്ഷരങ്ങൾ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"നമ്പറുകൾ"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ക്രമീകരണങ്ങൾ"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ടാബ്"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"സ്പെയ്സ്"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"വോയ്സ് ഇൻപുട്ട്"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ഇമോജി"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"മടങ്ങുക"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"തിരയുക"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ഡോട്ട്"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ഭാഷ മാറുക"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"അടുത്തത്"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"മുമ്പത്തേത്"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift പ്രവർത്തനക്ഷമമാക്കി"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"ക്യാപ്സ് ലോക്ക് പ്രവർത്തനക്ഷമമാക്കി"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"കൂടുതൽ ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"അക്ഷര മോഡ്"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ഫോൺ മോഡ്"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ഫോൺ ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"കീബോർഡ് മറച്ചിരിക്കുന്നു"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> കീബോർഡ് കാണിക്കുന്നു"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"തീയതി"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"തീയതിയും സമയവും"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ഇമെയിൽ"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"സന്ദേശമയയ്ക്കൽ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"നമ്പർ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ഫോൺ"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ടെക്സ്റ്റ്"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"സമയം"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"പുതിയവ"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ആളുകൾ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ഒബ്ജക്റ്റുകൾ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"പ്രകൃതി"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"സ്ഥലങ്ങള്"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ഇമോട്ടിക്കോണുകൾ"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"വലിയക്ഷരം <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"വലിയക്ഷരം I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"വലിയക്ഷരം I, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"അജ്ഞാത ചിഹ്നം"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"അജ്ഞാത ഇമോജി"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ഇതര പ്രതീകങ്ങൾ ലഭ്യമാണ്"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ഇതര പ്രതീകങ്ങൾ നിരസിച്ചു"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ഇതര നിർദ്ദേശങ്ങൾ ലഭ്യമാണ്"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ഇതര നിർദ്ദേശങ്ങൾ നിരസിച്ചു"</string> +</resources> diff --git a/java/res/values-ml-rIN/strings.xml b/java/res/values-ml-rIN/strings.xml new file mode 100644 index 000000000..e27df485a --- /dev/null +++ b/java/res/values-ml-rIN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ടൈപ്പുചെയ്യൽ ഓപ്ഷനുകൾ"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"കോൺടാക്റ്റ് പേരുകൾ തിരയുക"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"അക്ഷരത്തെറ്റ് പരിശോധന, നിങ്ങളുടെ കോൺടാക്റ്റ് ലിസ്റ്റിൽ നിന്നുള്ള എൻട്രികൾ ഉപയോഗിക്കുന്നു"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"കീ അമർത്തുമ്പോൾ വൈബ്രേറ്റുചെയ്യുക"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"കീ അമർത്തുമ്പോഴുള്ള ശബ്ദമുണ്ടാക്കുക"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"കീ അമർത്തുമ്പോൾ പോപ്പ്അപ്പ് ചെയ്യുക"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"മറ്റു ടൈപ്പുചെയ്യൽ രീതികളിലേക്ക് മാറുക"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ഭാഷ മാറൽ കീയിൽ മറ്റ് ടൈപ്പുചെയ്യൽ രീതികളും ഉൾപ്പെടുന്നു"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ഭാഷ മാറൽ കീ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"ഒന്നിലധികം ടൈപ്പുചെയ്യൽ ഭാഷകൾ പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ കാണിക്കുക"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"സ്ലൈഡ് ഇൻഡിക്കേറ്റർ കാണിക്കുക"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift അല്ലെങ്കിൽ ചിഹ്ന കീകളിൽ നിന്ന് സ്ലൈഡ് ചെയ്യുമ്പോൾ ദൃശ്യ സൂചകം പ്രദർശിപ്പിക്കുക"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"കീ പോപ്പ്അപ്പ് നിരസിക്കൽ കാലതാമസം"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"കാലതാമസമില്ല"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"സ്ഥിരമായത്"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>മി.സെ"</string> + <string name="settings_system_default" msgid="6268225104743331821">"സ്ഥിരമായ സിസ്റ്റം"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"കോൺടാക്റ്റ് പേരുകൾ നിർദ്ദേശിക്കുക"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"നിർദ്ദേശങ്ങൾക്കും തിരുത്തലുകൾക്കുമായി കോൺടാക്റ്റുകളിൽ നിന്നുള്ള പേരുകൾ ഉപയോഗിക്കുക"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"വ്യക്തിഗതമാക്കിയ നിർദ്ദേശങ്ങൾ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> മെച്ചപ്പെടുത്തുക"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ഇരട്ട-സ്പെയ്സ് വിരാമം"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"സ്പെയ്സ് ബാറിൽ ഇരട്ട ടാപ്പുചെയ്യുന്നത്, ഒരു സ്പെയ്സിന് മുമ്പായി വിരാമം ഇടുന്നു"</string> + <string name="auto_cap" msgid="1719746674854628252">"യാന്ത്രികമായി വലിയക്ഷരമാക്കൽ"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ഓരോ വാക്യത്തിന്റെയും ആദ്യ പദം വലിയക്ഷരമാക്കുക"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"വ്യക്തിഗത നിഘണ്ടു"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"ആഡ്-ഓൺ നിഘണ്ടുക്കൾ"</string> + <string name="main_dictionary" msgid="4798763781818361168">"പ്രധാന നിഘണ്ടു"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"തിരുത്തൽ നിർദ്ദേശങ്ങൾ വായിക്കുക"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ടൈപ്പുചെയ്യുമ്പോൾ നിർദ്ദേശിച്ച വാക്കുകൾ പ്രദർശിപ്പിക്കുക"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"എല്ലായ്പ്പോഴും ദൃശ്യമാക്കുക"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"പോർട്രെയ്റ്റ് മോഡിൽ കാണിക്കുക"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"എല്ലായ്പ്പോഴും മറയ്ക്കുക"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"നിന്ദ്യമായ വാക്കുകൾ തടയുക"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"നിന്ദ്യമാകാനിടയുള്ള വാക്കുകൾ നിർദ്ദേശിക്കരുത്"</string> + <string name="auto_correction" msgid="7630720885194996950">"യാന്ത്രികമായി-തിരുത്തൽ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"തെറ്റായി ടൈപ്പുചെയ്ത വാക്കുകളിൽ സ്പെയ്സ് ബാറും ചിഹ്നവും യാന്ത്രികമായി തിരുത്തുന്നു"</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_aggressive" msgid="7319007299148899623">"നിർബന്ധിതമായി"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"വളരെ നിർബന്ധിതമായി"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"അടുത്ത-പദ നിർദ്ദേശങ്ങൾ"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"നിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കാൻ മുമ്പത്തെ പദം ഉപയോഗിക്കുക"</string> + <string name="gesture_input" msgid="826951152254563827">"ജെസ്റ്റർ ടൈപ്പുചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"അക്ഷരങ്ങളിലൂടെ സ്ലൈഡ് ചെയ്തുകൊണ്ട് ഒരു പദം ടൈപ്പുചെയ്യുക"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"ജെസ്റ്റർ ട്രെയിൽ കാണിക്കുക"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ചലനാത്മക ഫ്ലോട്ടിംഗ് പ്രിവ്യൂ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ജെസ്റ്റർ ചെയ്യുമ്പോൾ നിർദ്ദേശിച്ച പദം കാണുക"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ഫ്രെയ്സ് ജെസ്റ്റർ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"സ്പെയ്സ് കീയിലേക്ക് ഗ്ലൈഡുചെയ്യുന്നതിലൂടെ ജെസ്റ്റർ ചെയ്യുന്നതിനിടെ സ്പെയ്സുകൾ നൽകുക"</string> + <string name="voice_input" msgid="3583258583521397548">"വോയ്സ് ടൈപ്പുചെയ്യൽ കീ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"വോയ്സ് ടൈപ്പുചെയ്യൽ രീതികളൊന്നും പ്രവർത്തനക്ഷമമല്ല. ഭാഷ & ടൈപ്പു ചെയ്യൽ ക്രമീകരണങ്ങൾ പരിശോധിക്കുക."</string> + <string name="configure_input_method" msgid="373356270290742459">"ടൈപ്പുചെയ്യൽ രീതികൾ കോൺഫിഗർ ചെയ്യുക"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ടൈപ്പുചെയ്യൽ ഭാഷകൾ"</string> + <string name="send_feedback" msgid="1780431884109392046">"ഫീഡ്ബാക്ക് അയയ്ക്കുക"</string> + <string name="select_language" msgid="3693815588777926848">"ടൈപ്പുചെയ്യൽ ഭാഷകൾ"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"സംരക്ഷിക്കുന്നതിനായി വീണ്ടും സ്പർശിക്കുക"</string> + <string name="has_dictionary" msgid="6071847973466625007">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"കീബോർഡ് തീം"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ഇംഗ്ലീഷ് (യുകെ)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ഇംഗ്ലീഷ് (യുഎസ്)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"സ്പാനിഷ് (യുഎസ്)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ഇംഗ്ലീഷ് (യുകെ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ഇംഗ്ലീഷ് (യുഎസ്) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"സ്പാനിഷ് (യുഎസ്) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (പരമ്പരാഗതം)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (സിറിലിക്)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ലാറ്റിൻ)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"ഭാഷയില്ല (അക്ഷരമാല)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"അക്ഷരമാല (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"അക്ഷരമാല (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"അക്ഷരമാല (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"അക്ഷരമാല (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"അക്ഷരമാല (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"അക്ഷരമാല (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ഇമോജി"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"ഇഷ്ടാനുസൃത ടൈപ്പുചെയ്യൽ ശൈലികൾ"</string> + <string name="add_style" msgid="6163126614514489951">"ശൈലി ചേർക്കുക"</string> + <string name="add" msgid="8299699805688017798">"ചേര്ക്കുക"</string> + <string name="remove" msgid="4486081658752944606">"നീക്കംചെയ്യുക"</string> + <string name="save" msgid="7646738597196767214">"സംരക്ഷിക്കുക"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ഭാഷ"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"ലേഔട്ട്"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"നിങ്ങളുടെ ഇഷ്ടാനുസൃത ടൈപ്പുചെയ്യൽ ശൈലി ഉപയോഗിക്കാൻ ആരംഭിക്കുന്നതിന് മുമ്പ് അത് പ്രവർത്തനക്ഷമമാക്കേണ്ടതുണ്ട്. ഇപ്പോൾ ഇത് പ്രവർത്തനക്ഷമമാക്കണോ?"</string> + <string name="enable" msgid="5031294444630523247">"പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="not_now" msgid="6172462888202790482">"ഇപ്പോൾ വേണ്ട"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"സമാന ടൈപ്പുചെയ്യൽ ശൈലി ഇതിനകം നിലവിലുണ്ട്: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"കീ ദീർഘനേരം അമർത്തിപ്പിടിക്കൽ കാലതാമസം"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"കീ അമർത്തുമ്പോഴുള്ള വൈബ്രേഷൻ ദൈർഘ്യം"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"കീ അമർത്തുമ്പോഴുള്ള ശബ്ദ വോളിയം"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ബാഹ്യ നിഘണ്ടു ഫയൽ റീഡുചെയ്യുക"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ഡൗൺലോഡുകളുടെ ഫോൾഡറിൽ നിഘണ്ടു ഫയലുകളൊന്നുമില്ല"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനായി ഒരു നിഘണ്ടു ഫയൽ തിരഞ്ഞെടുക്കുക"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> ഭാഷയ്ക്കായി ശരിക്കും ഈ ഫയൽ ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> + <string name="error" msgid="8940763624668513648">"ഒരു പിശകുണ്ടായി"</string> + <string name="button_default" msgid="3988017840431881491">"സ്ഥിരമായത്"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നതിലേക്ക് സ്വാഗതം"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ജെസ്റ്റർ ടൈപ്പുചെയ്യലിനൊപ്പം"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ആരംഭിക്കുക"</string> + <string name="setup_next_action" msgid="371821437915144603">"അടുത്ത ചുവട്"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> സജ്ജമാക്കുന്നു"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"നിങ്ങളുടെ ഭാഷ & ടൈപ്പുചെയ്യൽ ക്രമീകരണങ്ങളിൽ \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" പരിശോധിക്കുക. ഇത് നിങ്ങളുടെ ഉപകരണത്തിൽ പ്രവർത്തിക്കാൻ ഇതിന് അംഗീകാരം നൽകും."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"നിങ്ങളുടെ ഭാഷ & ടൈപ്പുചെയ്യൽ ക്രമീകരണങ്ങളിൽ <xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നത് ഇതിനകം പ്രവർത്തനക്ഷമമാക്കിയതിനാൽ ഈ ഘട്ടം പൂർത്തിയായി. അടുത്ത ഘട്ടത്തിലേക്ക് പോകുക!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"ക്രമീകരണങ്ങളിൽ പ്രവർത്തനക്ഷമമാകുക"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നതിലേക്ക് മാറുക"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"അടുത്തത്, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" എന്നതിനെ നിങ്ങളുടെ സജീവ വാചക-ടൈപ്പുചെയ്യൽ രീതിയായി തിരഞ്ഞെടുക്കുക."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ടൈപ്പുചെയ്യൽ രീതികൾ മാറുക"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"അഭിനന്ദനങ്ങൾ, നിങ്ങൾ എല്ലാം പൂർത്തിയാക്കി!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ഉപയോഗിച്ച് നിങ്ങളുടെ പ്രിയപ്പെട്ട എല്ലാ അപ്ലിക്കേഷനുകളിലും ഇപ്പോൾ ടൈപ്പുചെയ്യാനാകും."</string> + <string name="setup_step3_action" msgid="600879797256942259">"കൂടുതൽ ഭാഷകൾ കോൺഫിഗർ ചെയ്യുക"</string> + <string name="setup_finish_action" msgid="276559243409465389">"പൂർത്തിയായി"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"അപ്ലിക്കേഷൻ ഐക്കൺ കാണിക്കുക"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ലോഞ്ചറിൽ അപ്ലിക്കേഷൻ ഐക്കൺ പ്രദർശിപ്പിക്കുക"</string> + <string name="app_name" msgid="6320102637491234792">"നിഘണ്ടു ദാതാവ്"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"നിഘണ്ടു ദാതാവ്"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"നിഘണ്ടു സേവനം"</string> + <string name="download_description" msgid="6014835283119198591">"നിഘണ്ടു അപ്ഡേറ്റുചെയ്യാനുള്ള വിവരം"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ആഡ്-ഓൺ നിഘണ്ടുക്കൾ"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"നിഘണ്ടുക്കൾക്കായുള്ള ക്രമീകരണങ്ങൾ"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ഉപയോക്തൃ നിഘണ്ടുക്കൾ"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ഉപയോക്തൃ നിഘണ്ടു"</string> + <string name="dictionary_available" msgid="4728975345815214218">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"നിലവിൽ ഡൗൺലോഡുചെയ്യുന്നു"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ഇന്സ്റ്റാളുചെയ്തു"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ഇൻസ്റ്റാളുചെയ്തെങ്കിലും പ്രവർത്തനരഹിതമായി"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"നിഘണ്ടു സേവനത്തിൽ കണക്റ്റുചെയ്യുന്നതിൽ പ്രശ്നം"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"നിഘണ്ടുക്കളൊന്നും ലഭ്യമല്ല"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"പുതുക്കുക"</string> + <string name="last_update" msgid="730467549913588780">"അവസാനം അപ്ഡേറ്റുചെയ്തത്"</string> + <string name="message_updating" msgid="4457761393932375219">"അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു"</string> + <string name="message_loading" msgid="5638680861387748936">"ലോഡുചെയ്യുന്നു..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"പ്രധാന നിഘണ്ടു"</string> + <string name="cancel" msgid="6830980399865683324">"റദ്ദാക്കുക"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ക്രമീകരണങ്ങൾ"</string> + <string name="install_dict" msgid="180852772562189365">"ഇൻസ്റ്റാളുചെയ്യുക"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"റദ്ദാക്കുക"</string> + <string name="delete_dict" msgid="756853268088330054">"ഇല്ലാതാക്കുക"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"നിങ്ങളുടെ മൊബൈലിൽ തിരഞ്ഞെടുത്ത ഭാഷയ്ക്ക് നിഘണ്ടു ലഭ്യമാണ്.<br/> നിങ്ങളുടെ ടൈപ്പുചെയ്യൽ അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനായി <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> നിഘണ്ടു <b>ഡൗൺലോഡുചെയ്യാൻ</b> ഞങ്ങൾ ശുപാർശചെയ്യുന്നു. 3G-യിൽ ഡൗൺലോഡ് ചെയ്യാൻ ഒന്നോ രണ്ടോ മിനിറ്റെടുത്തേക്കാം. നിങ്ങൾക്ക് <b>പരിധിയില്ലാത്ത ഡാറ്റാ പ്ലാൻ</b> ഇല്ലെങ്കിൽ നിരക്കുകൾ ബാധകമാകാം. നിങ്ങൾക്ക് ഏത് ഡാറ്റ പ്ലാനാണ് ഉള്ളതെന്ന് തീർച്ചയില്ലെങ്കിൽ, ഡൗൺലോഡ് യാന്ത്രികമായി ആരംഭിക്കുന്നതിന് ഒരു Wi-Fi കണക്ഷൻ കണ്ടെത്താൻ ഞങ്ങൾ ശുപാർശചെയ്യുന്നു.<br/> <br/> നുറുങ്ങ്: നിങ്ങളുടെ മൊബൈലിലെ <b>ക്രമീകരണങ്ങൾ</b> മെനുവിലുള്ള <b>ഭാഷ & ടൈപ്പുചെയ്യൽ</b> എന്നതിലേക്ക് പോയി നിങ്ങൾക്ക് നിഘണ്ടുക്കൾ ഡൗൺലോഡുചെയ്യാനും നീക്കംചെയ്യാനുമാകും."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ഇപ്പോൾ ഡൗൺലോഡുചെയ്യുക (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi മുഖേന ഡൗൺലോഡ് ചെയ്യുക"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ഭാഷയ്ക്കായി ഒരു നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"അവലോകനം ചെയ്ത് ഡൗൺലോഡ് ചെയ്യാൻ അമർത്തുക"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ഡൗൺലോഡുചെയ്യുന്നു: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ഭാഷയ്ക്കുള്ള നിർദ്ദേശങ്ങൾ ഉടൻതന്നെ തയ്യാറാകും."</string> + <string name="version_text" msgid="2715354215568469385">"പതിപ്പ് <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ചേര്ക്കുക"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"നിഘണ്ടുവിൽ ചേർക്കുക"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"വാക്യം"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"കൂടുതൽ ഓപ്ഷനുകൾ"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"കുറച്ച് ഓപ്ഷനുകൾ"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ശരി"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"പദം:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"കുറുക്കുവഴി:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ഭാഷ:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"ഒരു പദം ടൈപ്പുചെയ്യുക"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ഓപ്ഷണൽ കുറുക്കുവഴി"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"പദം എഡിറ്റുചെയ്യുക"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"എഡിറ്റുചെയ്യുക"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"ഇല്ലാതാക്കുക"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ഉപയോക്തൃ നിഘണ്ടുവിൽ നിങ്ങൾക്ക് പദങ്ങളൊന്നുമില്ല. ചേർക്കൽ (+) ബട്ടൺ സ്പർശിച്ച് ഒരു പദം ചേർക്കുക."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"എല്ലാ ഭാഷകൾക്കുമായി"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"കൂടുതൽ ഭാഷകൾ…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"ഇല്ലാതാക്കുക"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings-action-keys.xml b/java/res/values-ml-rKL/strings-action-keys.xml new file mode 100644 index 000000000..46a8cfc94 --- /dev/null +++ b/java/res/values-ml-rKL/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"പോകുക"</string> + <string name="label_next_key" msgid="5586407279258592635">"അടുത്തത്"</string> + <string name="label_previous_key" msgid="1421141755779895275">"മുമ്പത്തെ"</string> + <string name="label_done_key" msgid="7564866296502630852">"പൂർത്തിയായി"</string> + <string name="label_send_key" msgid="482252074224462163">"അയയ്ക്കുക"</string> + <string name="label_search_key" msgid="7965186050435796642">"തിരയുക"</string> + <string name="label_pause_key" msgid="2225922926459730642">"താൽക്കാലികമായി നിർത്തുക"</string> + <string name="label_wait_key" msgid="5891247853595466039">"കാത്തിരിക്കുക"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings-appname.xml b/java/res/values-ml-rKL/strings-appname.xml new file mode 100644 index 000000000..940ee819d --- /dev/null +++ b/java/res/values-ml-rKL/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android കീബോർഡ് (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android അക്ഷരത്തെറ്റ് പരിശോധന (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android കീബോർഡ് ക്രമീകരണങ്ങൾ (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android അക്ഷരത്തെറ്റ് പരിശോധനാ ക്രമീകരണങ്ങൾ (AOSP)"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings-config-important-notice.xml b/java/res/values-ml-rKL/strings-config-important-notice.xml new file mode 100644 index 000000000..7cdc17b93 --- /dev/null +++ b/java/res/values-ml-rKL/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"നിർദ്ദേശങ്ങൾ മെച്ചപ്പെടുത്തുന്നതിന് നിങ്ങളുടെ ആശയവിനിമയങ്ങൾ, ടൈപ്പുചെയ്ത ഡാറ്റ എന്നിവയിൽ നിന്നും അറിയുക"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings-letter-descriptions.xml b/java/res/values-ml-rKL/strings-letter-descriptions.xml new file mode 100644 index 000000000..0a845df77 --- /dev/null +++ b/java/res/values-ml-rKL/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ഫെമിനൈൻ ഓർഡിനൽ ഇൻഡിക്കേറ്റർ"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"മൈക്രോ ചിഹ്നം"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"മാസ്കുലിൻ ഓർഡിനൽ ഇൻഡിക്കേറ്റർ"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ഷാർപ്പ് S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, മുകളിൽ റിംഗ്"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, സെഡില്ലാ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"എത്ത്"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, ടിൽഡ്"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"തോൺ"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ഡയേറിസിസ്"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, മാക്രോൺ"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, കറോൺ"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, കറോൺ"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, മാക്രോൺ"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, കറോൺ"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, സെഡില്ല"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, ടിൽഡ്"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, മാക്രോൺ"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, ബ്രീവ്"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ഡോട്ട് ഇല്ലാത്ത I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, സെഡില്ല"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ക്ര"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, സെഡില്ല"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, കറോൺ"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, മധ്യഭാഗത്തെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, സെഡില്ല"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, കറോൺ"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, വിശ്ലേഷത്തിന് മുമ്പ്"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ഇംഗ്"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, മാക്രോൺ"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, ബ്രീവ്"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, ഇരട്ട അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ലിഗാച്ചർ"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, സെഡില്ല"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, കറോൺ"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, സെഡില്ല"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, കറോൺ"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, സെഡില്ല"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, കറോൺ"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, സ്ട്രോക്ക്"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, ടിൽഡ്"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, മാക്രോൺ"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, ബ്രീവ്"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, മുകളിൽ റിംഗ്"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, ഇരട്ട അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ഒഗോനെക്"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, സർക്കംഫ്ലെക്സ്"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, അക്യൂട്ട്"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, കറോൺ"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"നീളമുള്ള S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ഹോൺ"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ഹോൺ"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, താഴെ കോമ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, താഴെ കോമ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ഷ്വ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, ബ്രീവും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, ബ്രീവും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, ബ്രീവും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, ബ്രീവും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, ബ്രീവും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, ടിൽഡ്"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, സർക്കംഫ്ലെക്സും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, സർക്കംഫ്ലെക്സും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, സർക്കംഫ്ലെക്സും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, സർക്കംഫ്ലെക്സും ടിൽഡും"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, സർക്കംഫ്ലെക്സും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ഹോണും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ഹോണും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ഹോണും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ഹോണും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ഹോണും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ഹോണും അക്യൂട്ടും"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ഹോണും ഗ്രേവും"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ഹോണും മുകളിൽ ഹുക്കും"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ഹോണും ടിൽഡും"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ഹോണും താഴെ ഡോട്ടും"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, ഗ്രേവ്"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, താഴെ ഡോട്ട്"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, മുകളിൽ ഹുക്ക്"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, ടിൽഡ്"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"വിപരീത ആശ്ചര്യ ചിഹ്നം"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ഇടതുഭാഗം സൂചിപ്പിക്കുന്ന ഇരട്ട കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"മദ്ധ്യ ബിന്ദു"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"സൂപ്പർസ്ക്രിപ്റ്റ് വൺ"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"വലതുഭാഗം സൂചിപ്പിക്കുന്ന ഇരട്ട കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"വിപരീത ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ഇടത് ഏക ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"വലത് ഏക ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ഏക ലോ-9 ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ഇടത് ഇരട്ട ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"വലത് ഇരട്ട ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ഡാഗർ"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ഇരട്ട ഡാഗർ"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"പെർ മില്ലി ചിഹ്നം"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"പ്രൈം"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ഇരട്ട പ്രൈം"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ഇടതുഭാഗം സൂചിപ്പിക്കുന്ന ഏക കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"വലതുഭാഗം സൂചിപ്പിക്കുന്ന ഏക കോൺ ഉദ്ദരണി ചിഹ്നം"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"സൂപ്പർസ്ക്രിപ്റ്റ് നാല്"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"സൂപ്പർസ്ക്രിപ്റ്റ് ലാറ്റിൻ ചെറിയക്ഷരം n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"പെസോ ചിഹ്നം"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"കെയർ ഓഫ്"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"വലത്തേയ്ക്കുള്ള അമ്പടയാളം"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"താഴേയ്ക്കുള്ള അമ്പടയാളം"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"എംറ്റി സെറ്റ്"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"വർദ്ധന"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ഇതിലും ചെറുത് അല്ലെങ്കിൽ ഇതിന് സമം"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ഇതിലും വലുത് അല്ലെങ്കിൽ ഇതിന് സമം"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ബ്ലാക്ക് സ്റ്റാർ"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings-talkback-descriptions.xml b/java/res/values-ml-rKL/strings-talkback-descriptions.xml new file mode 100644 index 000000000..3577bbb0c --- /dev/null +++ b/java/res/values-ml-rKL/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"ഉറക്കെ പറയുന്ന പാസ്വേഡ് കീകൾ കേൾക്കുന്നതിന് ഒരു ഹെഡ്സെറ്റ് പ്ലഗ്ഗുചെയ്യുക"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"നിലവിലെ വാചകം %s ആണ്"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"വാചകമൊന്നും നൽകിയിട്ടില്ല"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>, <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> എന്നത് <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> എന്നതായി തിരുത്തുന്നു"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> യാന്ത്രിക-തിരുത്തൽ നിർവഹിക്കുന്നു"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"അജ്ഞാത പ്രതീകം"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"കൂടുതൽ ചിഹ്നങ്ങൾ"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"ഇല്ലാതാക്കുക"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"അക്ഷരങ്ങൾ"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"നമ്പറുകൾ"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ക്രമീകരണങ്ങൾ"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ടാബ്"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"സ്പെയ്സ്"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"വോയ്സ് ഇൻപുട്ട്"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ഇമോജി"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"മടങ്ങുക"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"തിരയുക"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ഡോട്ട്"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"ഭാഷ മാറുക"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"അടുത്തത്"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"മുമ്പത്തേത്"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift പ്രവർത്തനക്ഷമമാക്കി"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"ക്യാപ്സ് ലോക്ക് പ്രവർത്തനക്ഷമമാക്കി"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"കൂടുതൽ ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"അക്ഷര മോഡ്"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ഫോൺ മോഡ്"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ഫോൺ ചിഹ്നങ്ങളുടെ മോഡ്"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"കീബോർഡ് മറച്ചിരിക്കുന്നു"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> കീബോർഡ് കാണിക്കുന്നു"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"തീയതി"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"തീയതിയും സമയവും"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ഇമെയിൽ"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"സന്ദേശമയയ്ക്കൽ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"നമ്പർ"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ഫോൺ"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ടെക്സ്റ്റ്"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"സമയം"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"പുതിയവ"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ആളുകൾ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ഒബ്ജക്റ്റുകൾ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"പ്രകൃതി"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"സ്ഥലങ്ങള്"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ചിഹ്നങ്ങള്"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ഇമോട്ടിക്കോണുകൾ"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"വലിയക്ഷരം <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"വലിയക്ഷരം I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"വലിയക്ഷരം I, മുകളിൽ ഡോട്ട്"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"അജ്ഞാത ചിഹ്നം"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"അജ്ഞാത ഇമോജി"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ഇതര പ്രതീകങ്ങൾ ലഭ്യമാണ്"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ഇതര പ്രതീകങ്ങൾ നിരസിച്ചു"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ഇതര നിർദ്ദേശങ്ങൾ ലഭ്യമാണ്"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ഇതര നിർദ്ദേശങ്ങൾ നിരസിച്ചു"</string> +</resources> diff --git a/java/res/values-ml-rKL/strings.xml b/java/res/values-ml-rKL/strings.xml new file mode 100644 index 000000000..e27df485a --- /dev/null +++ b/java/res/values-ml-rKL/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ടൈപ്പുചെയ്യൽ ഓപ്ഷനുകൾ"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"കോൺടാക്റ്റ് പേരുകൾ തിരയുക"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"അക്ഷരത്തെറ്റ് പരിശോധന, നിങ്ങളുടെ കോൺടാക്റ്റ് ലിസ്റ്റിൽ നിന്നുള്ള എൻട്രികൾ ഉപയോഗിക്കുന്നു"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"കീ അമർത്തുമ്പോൾ വൈബ്രേറ്റുചെയ്യുക"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"കീ അമർത്തുമ്പോഴുള്ള ശബ്ദമുണ്ടാക്കുക"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"കീ അമർത്തുമ്പോൾ പോപ്പ്അപ്പ് ചെയ്യുക"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"മറ്റു ടൈപ്പുചെയ്യൽ രീതികളിലേക്ക് മാറുക"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"ഭാഷ മാറൽ കീയിൽ മറ്റ് ടൈപ്പുചെയ്യൽ രീതികളും ഉൾപ്പെടുന്നു"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"ഭാഷ മാറൽ കീ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"ഒന്നിലധികം ടൈപ്പുചെയ്യൽ ഭാഷകൾ പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ കാണിക്കുക"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"സ്ലൈഡ് ഇൻഡിക്കേറ്റർ കാണിക്കുക"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift അല്ലെങ്കിൽ ചിഹ്ന കീകളിൽ നിന്ന് സ്ലൈഡ് ചെയ്യുമ്പോൾ ദൃശ്യ സൂചകം പ്രദർശിപ്പിക്കുക"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"കീ പോപ്പ്അപ്പ് നിരസിക്കൽ കാലതാമസം"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"കാലതാമസമില്ല"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"സ്ഥിരമായത്"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>മി.സെ"</string> + <string name="settings_system_default" msgid="6268225104743331821">"സ്ഥിരമായ സിസ്റ്റം"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"കോൺടാക്റ്റ് പേരുകൾ നിർദ്ദേശിക്കുക"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"നിർദ്ദേശങ്ങൾക്കും തിരുത്തലുകൾക്കുമായി കോൺടാക്റ്റുകളിൽ നിന്നുള്ള പേരുകൾ ഉപയോഗിക്കുക"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"വ്യക്തിഗതമാക്കിയ നിർദ്ദേശങ്ങൾ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> മെച്ചപ്പെടുത്തുക"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ഇരട്ട-സ്പെയ്സ് വിരാമം"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"സ്പെയ്സ് ബാറിൽ ഇരട്ട ടാപ്പുചെയ്യുന്നത്, ഒരു സ്പെയ്സിന് മുമ്പായി വിരാമം ഇടുന്നു"</string> + <string name="auto_cap" msgid="1719746674854628252">"യാന്ത്രികമായി വലിയക്ഷരമാക്കൽ"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ഓരോ വാക്യത്തിന്റെയും ആദ്യ പദം വലിയക്ഷരമാക്കുക"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"വ്യക്തിഗത നിഘണ്ടു"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"ആഡ്-ഓൺ നിഘണ്ടുക്കൾ"</string> + <string name="main_dictionary" msgid="4798763781818361168">"പ്രധാന നിഘണ്ടു"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"തിരുത്തൽ നിർദ്ദേശങ്ങൾ വായിക്കുക"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ടൈപ്പുചെയ്യുമ്പോൾ നിർദ്ദേശിച്ച വാക്കുകൾ പ്രദർശിപ്പിക്കുക"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"എല്ലായ്പ്പോഴും ദൃശ്യമാക്കുക"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"പോർട്രെയ്റ്റ് മോഡിൽ കാണിക്കുക"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"എല്ലായ്പ്പോഴും മറയ്ക്കുക"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"നിന്ദ്യമായ വാക്കുകൾ തടയുക"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"നിന്ദ്യമാകാനിടയുള്ള വാക്കുകൾ നിർദ്ദേശിക്കരുത്"</string> + <string name="auto_correction" msgid="7630720885194996950">"യാന്ത്രികമായി-തിരുത്തൽ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"തെറ്റായി ടൈപ്പുചെയ്ത വാക്കുകളിൽ സ്പെയ്സ് ബാറും ചിഹ്നവും യാന്ത്രികമായി തിരുത്തുന്നു"</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_aggressive" msgid="7319007299148899623">"നിർബന്ധിതമായി"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"വളരെ നിർബന്ധിതമായി"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"അടുത്ത-പദ നിർദ്ദേശങ്ങൾ"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"നിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കാൻ മുമ്പത്തെ പദം ഉപയോഗിക്കുക"</string> + <string name="gesture_input" msgid="826951152254563827">"ജെസ്റ്റർ ടൈപ്പുചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"അക്ഷരങ്ങളിലൂടെ സ്ലൈഡ് ചെയ്തുകൊണ്ട് ഒരു പദം ടൈപ്പുചെയ്യുക"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"ജെസ്റ്റർ ട്രെയിൽ കാണിക്കുക"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ചലനാത്മക ഫ്ലോട്ടിംഗ് പ്രിവ്യൂ"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ജെസ്റ്റർ ചെയ്യുമ്പോൾ നിർദ്ദേശിച്ച പദം കാണുക"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ഫ്രെയ്സ് ജെസ്റ്റർ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"സ്പെയ്സ് കീയിലേക്ക് ഗ്ലൈഡുചെയ്യുന്നതിലൂടെ ജെസ്റ്റർ ചെയ്യുന്നതിനിടെ സ്പെയ്സുകൾ നൽകുക"</string> + <string name="voice_input" msgid="3583258583521397548">"വോയ്സ് ടൈപ്പുചെയ്യൽ കീ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"വോയ്സ് ടൈപ്പുചെയ്യൽ രീതികളൊന്നും പ്രവർത്തനക്ഷമമല്ല. ഭാഷ & ടൈപ്പു ചെയ്യൽ ക്രമീകരണങ്ങൾ പരിശോധിക്കുക."</string> + <string name="configure_input_method" msgid="373356270290742459">"ടൈപ്പുചെയ്യൽ രീതികൾ കോൺഫിഗർ ചെയ്യുക"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ടൈപ്പുചെയ്യൽ ഭാഷകൾ"</string> + <string name="send_feedback" msgid="1780431884109392046">"ഫീഡ്ബാക്ക് അയയ്ക്കുക"</string> + <string name="select_language" msgid="3693815588777926848">"ടൈപ്പുചെയ്യൽ ഭാഷകൾ"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"സംരക്ഷിക്കുന്നതിനായി വീണ്ടും സ്പർശിക്കുക"</string> + <string name="has_dictionary" msgid="6071847973466625007">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"കീബോർഡ് തീം"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ഇംഗ്ലീഷ് (യുകെ)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ഇംഗ്ലീഷ് (യുഎസ്)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"സ്പാനിഷ് (യുഎസ്)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ഇംഗ്ലീഷ് (യുകെ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ഇംഗ്ലീഷ് (യുഎസ്) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"സ്പാനിഷ് (യുഎസ്) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (പരമ്പരാഗതം)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (സിറിലിക്)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ലാറ്റിൻ)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"ഭാഷയില്ല (അക്ഷരമാല)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"അക്ഷരമാല (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"അക്ഷരമാല (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"അക്ഷരമാല (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"അക്ഷരമാല (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"അക്ഷരമാല (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"അക്ഷരമാല (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ഇമോജി"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"ഇഷ്ടാനുസൃത ടൈപ്പുചെയ്യൽ ശൈലികൾ"</string> + <string name="add_style" msgid="6163126614514489951">"ശൈലി ചേർക്കുക"</string> + <string name="add" msgid="8299699805688017798">"ചേര്ക്കുക"</string> + <string name="remove" msgid="4486081658752944606">"നീക്കംചെയ്യുക"</string> + <string name="save" msgid="7646738597196767214">"സംരക്ഷിക്കുക"</string> + <string name="subtype_locale" msgid="8576443440738143764">"ഭാഷ"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"ലേഔട്ട്"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"നിങ്ങളുടെ ഇഷ്ടാനുസൃത ടൈപ്പുചെയ്യൽ ശൈലി ഉപയോഗിക്കാൻ ആരംഭിക്കുന്നതിന് മുമ്പ് അത് പ്രവർത്തനക്ഷമമാക്കേണ്ടതുണ്ട്. ഇപ്പോൾ ഇത് പ്രവർത്തനക്ഷമമാക്കണോ?"</string> + <string name="enable" msgid="5031294444630523247">"പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="not_now" msgid="6172462888202790482">"ഇപ്പോൾ വേണ്ട"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"സമാന ടൈപ്പുചെയ്യൽ ശൈലി ഇതിനകം നിലവിലുണ്ട്: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"കീ ദീർഘനേരം അമർത്തിപ്പിടിക്കൽ കാലതാമസം"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"കീ അമർത്തുമ്പോഴുള്ള വൈബ്രേഷൻ ദൈർഘ്യം"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"കീ അമർത്തുമ്പോഴുള്ള ശബ്ദ വോളിയം"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ബാഹ്യ നിഘണ്ടു ഫയൽ റീഡുചെയ്യുക"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ഡൗൺലോഡുകളുടെ ഫോൾഡറിൽ നിഘണ്ടു ഫയലുകളൊന്നുമില്ല"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനായി ഒരു നിഘണ്ടു ഫയൽ തിരഞ്ഞെടുക്കുക"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> ഭാഷയ്ക്കായി ശരിക്കും ഈ ഫയൽ ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> + <string name="error" msgid="8940763624668513648">"ഒരു പിശകുണ്ടായി"</string> + <string name="button_default" msgid="3988017840431881491">"സ്ഥിരമായത്"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നതിലേക്ക് സ്വാഗതം"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ജെസ്റ്റർ ടൈപ്പുചെയ്യലിനൊപ്പം"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ആരംഭിക്കുക"</string> + <string name="setup_next_action" msgid="371821437915144603">"അടുത്ത ചുവട്"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> സജ്ജമാക്കുന്നു"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> പ്രവർത്തനക്ഷമമാക്കുക"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"നിങ്ങളുടെ ഭാഷ & ടൈപ്പുചെയ്യൽ ക്രമീകരണങ്ങളിൽ \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" പരിശോധിക്കുക. ഇത് നിങ്ങളുടെ ഉപകരണത്തിൽ പ്രവർത്തിക്കാൻ ഇതിന് അംഗീകാരം നൽകും."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"നിങ്ങളുടെ ഭാഷ & ടൈപ്പുചെയ്യൽ ക്രമീകരണങ്ങളിൽ <xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നത് ഇതിനകം പ്രവർത്തനക്ഷമമാക്കിയതിനാൽ ഈ ഘട്ടം പൂർത്തിയായി. അടുത്ത ഘട്ടത്തിലേക്ക് പോകുക!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"ക്രമീകരണങ്ങളിൽ പ്രവർത്തനക്ഷമമാകുക"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> എന്നതിലേക്ക് മാറുക"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"അടുത്തത്, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" എന്നതിനെ നിങ്ങളുടെ സജീവ വാചക-ടൈപ്പുചെയ്യൽ രീതിയായി തിരഞ്ഞെടുക്കുക."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ടൈപ്പുചെയ്യൽ രീതികൾ മാറുക"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"അഭിനന്ദനങ്ങൾ, നിങ്ങൾ എല്ലാം പൂർത്തിയാക്കി!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ഉപയോഗിച്ച് നിങ്ങളുടെ പ്രിയപ്പെട്ട എല്ലാ അപ്ലിക്കേഷനുകളിലും ഇപ്പോൾ ടൈപ്പുചെയ്യാനാകും."</string> + <string name="setup_step3_action" msgid="600879797256942259">"കൂടുതൽ ഭാഷകൾ കോൺഫിഗർ ചെയ്യുക"</string> + <string name="setup_finish_action" msgid="276559243409465389">"പൂർത്തിയായി"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"അപ്ലിക്കേഷൻ ഐക്കൺ കാണിക്കുക"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"ലോഞ്ചറിൽ അപ്ലിക്കേഷൻ ഐക്കൺ പ്രദർശിപ്പിക്കുക"</string> + <string name="app_name" msgid="6320102637491234792">"നിഘണ്ടു ദാതാവ്"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"നിഘണ്ടു ദാതാവ്"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"നിഘണ്ടു സേവനം"</string> + <string name="download_description" msgid="6014835283119198591">"നിഘണ്ടു അപ്ഡേറ്റുചെയ്യാനുള്ള വിവരം"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ആഡ്-ഓൺ നിഘണ്ടുക്കൾ"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"നിഘണ്ടുക്കൾക്കായുള്ള ക്രമീകരണങ്ങൾ"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"ഉപയോക്തൃ നിഘണ്ടുക്കൾ"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"ഉപയോക്തൃ നിഘണ്ടു"</string> + <string name="dictionary_available" msgid="4728975345815214218">"നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"നിലവിൽ ഡൗൺലോഡുചെയ്യുന്നു"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ഇന്സ്റ്റാളുചെയ്തു"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ഇൻസ്റ്റാളുചെയ്തെങ്കിലും പ്രവർത്തനരഹിതമായി"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"നിഘണ്ടു സേവനത്തിൽ കണക്റ്റുചെയ്യുന്നതിൽ പ്രശ്നം"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"നിഘണ്ടുക്കളൊന്നും ലഭ്യമല്ല"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"പുതുക്കുക"</string> + <string name="last_update" msgid="730467549913588780">"അവസാനം അപ്ഡേറ്റുചെയ്തത്"</string> + <string name="message_updating" msgid="4457761393932375219">"അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു"</string> + <string name="message_loading" msgid="5638680861387748936">"ലോഡുചെയ്യുന്നു..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"പ്രധാന നിഘണ്ടു"</string> + <string name="cancel" msgid="6830980399865683324">"റദ്ദാക്കുക"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ക്രമീകരണങ്ങൾ"</string> + <string name="install_dict" msgid="180852772562189365">"ഇൻസ്റ്റാളുചെയ്യുക"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"റദ്ദാക്കുക"</string> + <string name="delete_dict" msgid="756853268088330054">"ഇല്ലാതാക്കുക"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"നിങ്ങളുടെ മൊബൈലിൽ തിരഞ്ഞെടുത്ത ഭാഷയ്ക്ക് നിഘണ്ടു ലഭ്യമാണ്.<br/> നിങ്ങളുടെ ടൈപ്പുചെയ്യൽ അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനായി <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> നിഘണ്ടു <b>ഡൗൺലോഡുചെയ്യാൻ</b> ഞങ്ങൾ ശുപാർശചെയ്യുന്നു. 3G-യിൽ ഡൗൺലോഡ് ചെയ്യാൻ ഒന്നോ രണ്ടോ മിനിറ്റെടുത്തേക്കാം. നിങ്ങൾക്ക് <b>പരിധിയില്ലാത്ത ഡാറ്റാ പ്ലാൻ</b> ഇല്ലെങ്കിൽ നിരക്കുകൾ ബാധകമാകാം. നിങ്ങൾക്ക് ഏത് ഡാറ്റ പ്ലാനാണ് ഉള്ളതെന്ന് തീർച്ചയില്ലെങ്കിൽ, ഡൗൺലോഡ് യാന്ത്രികമായി ആരംഭിക്കുന്നതിന് ഒരു Wi-Fi കണക്ഷൻ കണ്ടെത്താൻ ഞങ്ങൾ ശുപാർശചെയ്യുന്നു.<br/> <br/> നുറുങ്ങ്: നിങ്ങളുടെ മൊബൈലിലെ <b>ക്രമീകരണങ്ങൾ</b> മെനുവിലുള്ള <b>ഭാഷ & ടൈപ്പുചെയ്യൽ</b> എന്നതിലേക്ക് പോയി നിങ്ങൾക്ക് നിഘണ്ടുക്കൾ ഡൗൺലോഡുചെയ്യാനും നീക്കംചെയ്യാനുമാകും."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ഇപ്പോൾ ഡൗൺലോഡുചെയ്യുക (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi മുഖേന ഡൗൺലോഡ് ചെയ്യുക"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ഭാഷയ്ക്കായി ഒരു നിഘണ്ടു ലഭ്യമാണ്"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"അവലോകനം ചെയ്ത് ഡൗൺലോഡ് ചെയ്യാൻ അമർത്തുക"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ഡൗൺലോഡുചെയ്യുന്നു: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ഭാഷയ്ക്കുള്ള നിർദ്ദേശങ്ങൾ ഉടൻതന്നെ തയ്യാറാകും."</string> + <string name="version_text" msgid="2715354215568469385">"പതിപ്പ് <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"ചേര്ക്കുക"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"നിഘണ്ടുവിൽ ചേർക്കുക"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"വാക്യം"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"കൂടുതൽ ഓപ്ഷനുകൾ"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"കുറച്ച് ഓപ്ഷനുകൾ"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ശരി"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"പദം:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"കുറുക്കുവഴി:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"ഭാഷ:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"ഒരു പദം ടൈപ്പുചെയ്യുക"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ഓപ്ഷണൽ കുറുക്കുവഴി"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"പദം എഡിറ്റുചെയ്യുക"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"എഡിറ്റുചെയ്യുക"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"ഇല്ലാതാക്കുക"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ഉപയോക്തൃ നിഘണ്ടുവിൽ നിങ്ങൾക്ക് പദങ്ങളൊന്നുമില്ല. ചേർക്കൽ (+) ബട്ടൺ സ്പർശിച്ച് ഒരു പദം ചേർക്കുക."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"എല്ലാ ഭാഷകൾക്കുമായി"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"കൂടുതൽ ഭാഷകൾ…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"ഇല്ലാതാക്കുക"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-mn-rMN/strings-action-keys.xml b/java/res/values-mn-rMN/strings-action-keys.xml index 77b8f2c05..8ebb5bb1f 100644 --- a/java/res/values-mn-rMN/strings-action-keys.xml +++ b/java/res/values-mn-rMN/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Өмнөх"</string> <string name="label_done_key" msgid="7564866296502630852">"Дууссан"</string> <string name="label_send_key" msgid="482252074224462163">"Илгээх"</string> + <string name="label_search_key" msgid="7965186050435796642">"Хайлт"</string> <string name="label_pause_key" msgid="2225922926459730642">"Түр зогсоох"</string> <string name="label_wait_key" msgid="5891247853595466039">"Хүлээх"</string> </resources> diff --git a/java/res/values-mn-rMN/strings-config-important-notice.xml b/java/res/values-mn-rMN/strings-config-important-notice.xml new file mode 100644 index 000000000..386d2e789 --- /dev/null +++ b/java/res/values-mn-rMN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Зөвлөмжүүдийг сайжруулахын тулд таны харилцсан, бичсэн зүйлсээс суралцана"</string> +</resources> diff --git a/java/res/values-mn-rMN/strings-emoji-descriptions.xml b/java/res/values-mn-rMN/strings-emoji-descriptions.xml new file mode 100644 index 000000000..f09a51dd9 --- /dev/null +++ b/java/res/values-mn-rMN/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Зохиогчийн эрхийн тэмдэг"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Бүртгэгдсэн тэмдэг"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Давхар анхаарлын тэмдэг"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Анхаарал, асуултын тэмдэг"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Худалдааны тэмдэг"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Мэдээллийн эх сурвалж"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Зүүн баруун сум"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Дээш доош сум"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Баруун хойд сум"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Зүүн хойд сум"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Зүүн өмнөд сум"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Баруун өмнөд сум"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Зүүн дэгээтэй сум"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Баруун дэгээтэй сум"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Үзэх"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Элсэн цаг"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Баруун заасан хар давхар гурвалжин"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Зүүн заасан хар давхар гурвалжин"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Дээш заасан хар давхар гурвалжин"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Доош заасан хар давхар гурвалжин"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Сэрүүлэгтэй цаг"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Урссан элсэн цаг"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Дугуйлсан латин том m үсэг"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Хар жижиг дөрвөлжин"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Цагаан жижиг дөрвөлжин"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Баруун заасан хар гурвалжин"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Зүүн заасан хар гурвалжин"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Цагаан дунд дөрвөлжин"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Хар дунд дөрвөлжин"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Цагаан дунд жижиг дөрвөлжин"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Хар дунд жижиг дөрвөлжин"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Цацрагтай хар нар"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Үүл"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Хар утас"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Чектэй саналын хайрцаг"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Борооны дусалтай шүхэр"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Халуун ундаа"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Цагаан дээш заасан долоовор"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Цагаан инээмсэглэсэн царай"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Хонины орд"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Үхрийн орд"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Ихрийн орд"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Хавчийн орд"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Арслангийн орд"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Охины орд"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Жинлүүрийн орд"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Хилэнцийн орд"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Нумын орд"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Матрын орд"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Бумбын орд"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Загасны орд"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Хар гил хөзөр"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Хар цэцэг хөзөр"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Хар бундан хөзөр"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Хар дөрвөлжин хөзөр"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Халуун рашаан"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Хар дахин боловсруулах тэмдэг"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Тэргэнцэрийн тэмдэг"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Зангуу"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Сануулга тэмдэг"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Өндөр хүчдэлийн тэмдэг"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Дунд зэргийн цагаан тойрог"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Дунд зэргийн хар тойрог"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Хөлбөмбөгийн бөмбөг"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Бейсбол"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Цасгүй цасан хүн"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Үүлний цаадах нар"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Тэнгэрийн мөрөн орд"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Орохыг хориглоно"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Сүм"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Усан оргилуур"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Нүхэндэх туг"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Далбаат завь"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Майхан"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Түлшний насос"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Хар хайч"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Цагаан хүнд чек тэмдэг"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Онгоц"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Дугтуй"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Өргөсөн нударга"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Өргөсөн гар"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Ялалтын гар"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Харандаа"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Хар хошуу"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Хүнд чек тэмдэг"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Хүнд үржүүлэх х"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Цацраг"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Найман үзүүрт од"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Найман үзүүртэй хар од"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Цасан ширхэг"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Цацраг"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Загалмайн тэмдэг"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Сөрөг квадрат дарах тэмдэг"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Хар асуултын тэмдэгэн чимэглэл"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Цагаан асуултын тэмдэгэн чимэглэл"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Цагаан анхаарлын тэмдэгэн чимэглэл"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Хүнд анхаарлын тэмдэгэн симбол"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Хүнд хар зүрх"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Хүнд нэмэх тэмдэг"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Хүнд хасах тэмдэг"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Хүнд хуваах тэмдэг"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Хар баруун сум"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Нуман гогцоо"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Давхар нуман гогцоо"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Баруун зааж дээш эргэсэн сум"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Баруун зааж доош эргэсэн сум"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Зүүн заасан хар сум"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Дээш заасан хар сум"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Доош заасан хар сум"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Хар том дөрвөлжин"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Цагаан том дөрвөлжин"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Цагаан дунд од"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Хүнд том тойрог"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Долгионт зураас"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Хэсэг шилжих тэмдэг"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Дугуй идеограф баяр хүргэлт"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Дугуй идеограф нууц"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Mahjong -н улаан луу"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Хөзөрийн хар хүн"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Цусны А бүлэг"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Цусны В бүлэг"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Цусны O бүлэг"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Машины зогсоол"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Цусны AB бүлэг"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"Дөрвөлжин CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Дөрвөлжин гоё"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Дөрвөлжин чөлөөтэй"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"Дөрвөлжин ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Дөрвөлжин шинэ"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"Дөрвөлжин N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"Дөрвөлжин OK"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"Дөрвөлжин SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Анхаарлын тэмдэгтэй дөрвөлжин"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Дөрвөлжин vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Энд дөрвөлжин катакана"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Дөрвөлжин катакана үйлчилгээ"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Дөрвөлжин идеограф төлбөргүй"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Дөрвөлжин идеограф захиалсан суудал"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Дөрвөлжин идеограф хориг"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Дөрвөлжин идеограф орон тоо"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Дөрвөлжин идеограф зөвшөөрөл"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Дөрвөлжин идеограф бүрэн эзэлсэн"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Дөрвөлжин идеограф төлсөн"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Дөрвөлжин идеограф сараар"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Дөрвөлжин идеограф аппликешн"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Дөрвөлжин идеограф хөнгөлөлт"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Дөрвөлжин идеограф бизнесийн"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Дугуй идеограф давуу тал"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Дугуй идеограф зөвшөөрөх"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Циклон"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Будантай"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Хаасан шүхэр"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Одтой шөнө"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Уулын дээр нар мандах"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Нар мандах"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Үдшийн хот"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Барилга дээр нар жаргах"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Солонго"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Шөнийн гүүр"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Усны давалгаа"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Галт уул"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Сүүн зам"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Дэлхий бөмбөрцөг Европ Африк"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Дэлхий бөмбөрцөг Америк"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Дэлхий бөмбөрцөг Ази-Австрали"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Меридантай бөмбөрцөг"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Шинэ сарны симбол"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Мандах хавирган сарны тэмдэг"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Эхний улирлын сарны тэмдэг"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Мандах бөгтөр сарны тэмдэг"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Бүтэн сарны тэмдэг"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Жаргах бөгтөр сарны тэмдэг"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Сүүлийн улирлын сарны тэмдэг"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Жаргах хавирган сарны тэмдэг"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Хавирган сар"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Нүүртэй шинэ сар"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Нүүртэй эхний улирлын сар"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Нүүртэй сүүлийн улирлын сар"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Нүүртэй бүтэн сар"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Нүүртэй нар"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Гялалзах од"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Сүүлт од"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Туулайн бөөр"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Суулгац"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Мөнх ногоон мод"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Навчит мод"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Далдуу мод"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Кактус"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Алтанзул"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Интоорын дэлбээ"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Сарнай"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Хибискус"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Наранцэцэг"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Дэлбээ"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Эрдэнэ шишийн түрүү"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Цагаан будааны түрүү"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Ургамал"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Дөрвөн навчит хошоонгор"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Агч модны навч"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Унасан навч"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Сэрчигнэх навч"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Мөөг"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Улаан лооль"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Чэс"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Усан үзэм"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Амтат гуа"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Тарвас"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Мандарин"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Лемон"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Банана"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Хан боргоцой"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Улаан алим"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Ногоон алим"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Лийр"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Тоор"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Интоор"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Гүзээлзгэнэ"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Гамбургер"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Пиццаны зүсэм"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Ястай мах"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Тахианы хөл"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Будааны жигнэмэг"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Будааны бөмбөлөг"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Болгосон будаа"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Кари болон будаа"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Ууран аяга"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Шпагетти"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Талх"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Шарсан төмс"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Шарсан чихэрлэг төмс"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Данго"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oден"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Суши"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Шарсан сам хорхой"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Мушгай загасан бялуу"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Зөөлөн зайрмаг"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Хуссан мөс"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Зайрмаг"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Донат"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Печень"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Шоколад"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Чихэр"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Иштэй чихэр"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Шар тос"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Зөгийн бал"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Үелсэн бялуу"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Хоолны сав"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Хоолны тогоо"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Хоол хийх"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Хутга сэрээ"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Бариулгүй цайны аяг"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Сакены лонх болон хундага"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Виноны хундага"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Коктэйлийн хундага"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Халуун орны ундаа"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Пивоны аяга"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Жингэнэсэн пивоны аяга"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Хүүхдийн лонх"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Тууз"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Боодолтой бэлэг"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Төрсөн өдрийн бялуу"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Жак-O-дэнлүү"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Зул сарын гацуур"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Эцэг Христийн баяр"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Галын наадам"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Бенгалийн гал"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Шаар"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Үдэшлэгийн салют"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Чихрэн бөмбөлөг"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Taнабата мод"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Солисон тугнууд"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Нарс модон чимэглэл"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Япон хүүхэлдэй"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Мөрөг загас стример"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Салхины ая"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Сар харах ёслол"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Сургуулийн үүргэвч"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Төгсөгчийн малгай"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Тойруулгын модон морь"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Чөтгөрийн дугуй"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Галзуу хулгана"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Загасны уураг болон загас"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Микрофон"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Кино зургийн аппарат"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Кино"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Чихэвч"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Зураачийн палет"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Бортого малгай"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Циркийн майхан"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Тасалбар"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Кадрын самбар"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Урлагийн тоглолт"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Видео тоглоом"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Шууд хит"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Слот машин"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Билльярд"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Тоглоомын үхэл"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Боулинг"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Хөзрийн цэцэг"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Хөгжмийн нот"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Олон хөгжмийн нот"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Саксофон"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Гитар"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Хөгжмийн даруул"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Бүрээ"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Хийл"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Хөгжмийн оноо"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Гүйдэг цамц, хүрээ"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Теннисны ракет болон бөмбөг"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Цана болон цанын гутал"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Сагсан бөмбөг болон цагираг"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Шоотой туг"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Сноубордчин"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Гүйгч"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Сөрфер"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Цом"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Морин уралдаан"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Америк хөл бөмбөг"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Регби хөл бөмбөг"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Сэлэгч"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Байшин"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Цэцэрлэгтэй байшин"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Оффисын барилга"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Японы шуудан"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Европын шуудан"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Эмнэлэг"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Банк"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Автомат теллер машин"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Зочид буудал"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Секс буудал"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Ая тухтай дэлгүүр"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Сургууль"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Их дэлгүүр"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Үйлдвэр"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Izakaya дэнлүү"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Японы цайз"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Европын цайз"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Харх"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Хулгана"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Шар"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Усны одос"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Үнээ"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Ирвэс"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Молтогчин"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Муур"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Луу"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Матар"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Халим"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Эмгэн хумс"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Могой"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Морь"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Хуц"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Ямаа"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Хонь"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Сармагчин"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Азарган тахиа"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Тахиа"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Нохой"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Гахай"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Зэрлэг гахай"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Заан"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Наймаалж"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Мушгиа дун"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Цох"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Шоргоолж"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Зөгий"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Алтан тэмээ"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Загас"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Халуун орны загас"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Нохой загас"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Яст мэлхий"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Ангаахай"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Дэгдээхий"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Урдаас харсан дэгдээхэй"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Шувуу"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Пенгвин"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Коала"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Пүүдл"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Нэг бөхт тэмээ"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Хоёр бөхт тэмээ"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Делфин"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Хулганы нүүр"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Үнээний нүүр"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Барын нүүр"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Молтогчны нүүр"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Муурны нүүр"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Лууны нүүр"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Ус оргилуулах халим"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Морины нүүр"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Сармагчны нүүр"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Нохойны нүүр"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Гахайн нүүр"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Мэлхийн нүүр"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Хамстерийн нүүр"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Чонын нүүр"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Баавгайн нүүр"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Пандагийн нүүр"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Гахайн хамар"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Саврын мөр"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Нүд"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Чих"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Хамар"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Ам"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Хэл"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Цагаан дээр дээш заасан долоовор"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Цагаан дээр доош заасан долоовор"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Цагаан дээр зүүн заасан долоовор"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Цагаан дээр баруун заасан долоовор"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Зангидсан гарын тэмдэг"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Даллах гарын тэмдэг"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Ok гарын тэмдэг"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Эрхий дээш тэмдэг"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Эрхий доош тэмдэг"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Алга ташсан тэмдэг"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Нээлттэй гарын тэмдэг"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Титэм"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Эмэгтэй малгай"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Нүдний шил"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Зангиа"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Футболк"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Жинс"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Даашинз"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Кимоно"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Бикини"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Эмэгтэй хувцас"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Цүнх"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Гар цүнх"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Даалин"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Эрэгтэй гутал"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Биеийн тамирын гутал"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Өндөр өсгийт"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Эмэгтэй сандаал"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Эмэгтэй түрийтэй гутал"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Хөлийн мөр"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Сүүдрэн хүн"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Сүүдрэн хүмүүс"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Хөвгүүн"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Охин"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Эр хүн"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Эм хүн"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Гэр бүл"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Гар хөтлөлцсөн эр, эм"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Гар хөтлөлцсөн хоёр эр"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Гар хөтлөлцсөн хоёр эм"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Цагдаа"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Бөжин ээмэгтэй эмэгтэй"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Хуримын нөмрөгтэй бүсгүй"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Шаргал үст"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Тоорцогтой эр"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Турбантай эр"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Настай эр"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Настай эм"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Хүүхэд"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Барилгын ажилчин"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Гүнж"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Японы мангас"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Японы чөтгөр"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Сүнс"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Хүүхдийн элч тэнгэр"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Харь гаригийн хүн"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Харь гаригийн мангас"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Бяцхан чөтгөр"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Гавал"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Мэдээллийн ажилтан"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Харуул"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Бүжигчин"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Уруулын будаг"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Хумсны будаг"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Нүүрний массаж"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Үс засалт"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Үсчний реклам"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Тариур"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Эм"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Үнсэлтийн мөр"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Хайрын захиа"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Бөгж"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Эрдэнийн чулуу"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Үнсэлт"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Цэцгийн баглаа"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Зүрхтэй хосууд"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Хурим"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Цохилох зүрх"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Урагдсан зүрх"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Хоёр зүрх"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Оргилуун зүрх"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Томрох зүрх"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Сумтай зүрх"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Цэнхэр зүрх"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Ногоон зүрх"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Шар зүрх"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Нил ягаан өнгийн зүрх"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Туузтай зүрх"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Эргэлдэх зүрх"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Зүрхний чимэглэл"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Цэгтэй даймонд"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Цахилгаан чийдэнгийн шил"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Уурлах тэмдэг"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Бөмбөг"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Унтах тэмдэг"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Мөргөлдөх тэмдэг"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Цацрах хөлсний тэмдэг"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Дусал"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Налуу тэмдэг"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Овоолсон баас"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Булчинтай гар"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Нойрмог тэмдэг"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Үг хэлэх бөмбөлөг"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Бодлын бөмбөг"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Цагаан цэцэг"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Зуун оноо тэмдэг"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Мөнгөний уут"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Валютын арилжаа"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Хүнд долларын тэмдэг"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Кредит карт"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Иен тэмдэгтэй дэвсгэрт"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Долларын тэмдэгт"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Евро тэмдэгтэй дэвсгэрт"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Фунт тэмдэгтэй дэвсгэрт"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Далавчтай мөнгө"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Иен тэмдэгтэй дээш чиглэсэн граф"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Суудал"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Хувийн компьютер"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Чемодан"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Минидиск"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Уян диск"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Оптик диск"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"Dvd"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Файлын хавтас"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Нээлттэй файлын хавтас"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Хуйларсан хуудас"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Дээшээ харсан хуудас"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Календарь"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Урагдсан календарь"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Картын индекс"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Дээш чиглэсэн граф"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Доош чиглэсэн граф"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Хөндөл граф"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Түр санах ой"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Цаас хатгагч"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Цаас хатгагч"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Цаасны клип"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Шулуун шугам"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Гурвалжин шугам"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Хавчуургын таб"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Булшны чулуу"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Тэмдэглэлийн дэвтэр"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Гоёлтой тэмдэглэлийн дэвтэр"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Хаалттай ном"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Нээлттэй ном"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Ногоон ном"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Цэнхэр ном"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Улбар шар өнгийн хавтастай ном"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Ном"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Нэрний тэмдэг"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Гүйлгэх"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Мемо"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Утас хүлээн авагч"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Пэйжер"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Факс машин"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Хиймэл дагуулын антенн"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Нийтэд зарлах чанга яригч"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Хөгжөөн дэмжлэгийн мегафон"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Явсан бичгийн тавиур"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Ирсэн бичгийн тавиур"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Багц"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"И-мэйл тэмдэг"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Ирж буй дугтуй"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Доош сумтай дугтуй"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Доошлуулсан тугтай шуудангийн хайрцаг"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Босгосон тугтай хаагдсан шуудангийн хайрцаг"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Босгосон тугтай нээлттэй шуудангийн хайрцаг"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Доошлуулсан тугтай нээлттэй шуудангийн хайрцаг"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Шуудангийн хайрцаг"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Шуудангийн бүрээ"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Сонин"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Гар утас"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Зүүн талдаа баруун заасан сумтай гар утас"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Чичирхийллийн горим"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Гар утас унтраах"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Гар утас болохгүй"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Хөндөлтэй антенн"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Камер"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Видео камер"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Телевиз"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Радио"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Видео кассет"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Мушгирсан баруун сум"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Зөв баруун, зүүн эргэсэн дугуй сум"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"зөв баруун, зүүн эргэсэн дугуй сум"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Зөв доош, дээш эргэсэн дугуй сум"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Буруу доош, дээш эргэсэн дугуй сум"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Бага гэрэлтүүлэгтэй тэмдэг"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Их гэрэлтүүлэгтэй тэмдэг"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Дарсан зураастай чанга яригч"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Чанга яригч"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Нэг дууны долгиотой чанга яригч"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Гурван дууны долгиотой чанга яригч"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Батерей"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Цахилгаан залгуур"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Зүүн-заасан томруулагч шил"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Баруун-заасан томруулагч шил"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Бэхэн үзэгтэй түгжээ"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Түлхүүртэй цоожлогдсон цоож"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Түлхүүр"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Түгжих"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Нээлттэй цоож"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Хонх"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Дарсан зураастай хонх"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Хавчуурга"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Холбоосын тэмдэг"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Радио товч"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Дээрээ сумтай буцах тэмдэг"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Дээрээ сумтай төгсгөл"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Дээрээ зүүн сумтай анхаарлын тэмдэг"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Дээрээ баруун сумтай удахгүй"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Дээрээ дээш сумтай дээр"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Арван наймаас бага хүн байхгүй тэмдэг"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Аравтын товчлуур"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Латин том үсэгтэй оруулах симбол"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Латин жижиг үсэгтэй оруулах симбол"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Тоо оруулах тэмдэг"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Символ оруулах тэмдэг"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Латин үсэгтэй оруулах тэмдэг"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Гал"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Цахилгаан бамбар"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Түлхүүр"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Алх"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Эрэг, боолт"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Хутга"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Гар буу"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Микроскоф"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Телескоф"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Кристал бөмбөг"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Цэгтэй зургаан хошуут"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Эхлэн сурагчийн Япон тэмдэг"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Сэрээний эмблем"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Хар дөрвөлжин товч"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Цагаан дөрвөлжин товч"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Том улаан дугуй"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Том цэнхэр тойрог"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Том улбар шар даймонд"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Том цэнхэр даймонд"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Жижиг улбар шар даймонд"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Жижиг цэнхэр даймонд"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Дээш заасан улаан гурвалжин"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Доош заасан улаан гурвалжин"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Дээш заасан жижиг улаан гурвалжин"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Доош заасан жижиг улаан гурвалжин"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Цаг нэг цагийг заасан"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Цаг хоёр цагийг заасан"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Цаг гурван цагийг заасан"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Цаг дөрвөн цагийг заасан"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Цаг таван цагийг заасан"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Цаг зургаан цагийг заасан"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Цаг долоон цагийг заасан"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Цаг найман цагийг заасан"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Цаг есөн цагийг заасан"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Цаг арван цагийг заасан"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Цаг арван нэгийг заасан"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Цаг арван хоёрыг заасан"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Цаг нэг гучийг заасан"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Цаг хоёр гучийг заасан"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Цаг гурав гучийг заасан"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Цаг дөрөв гучийг заасан"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Цаг тав гучийг заасан"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Цаг зургаа гучийг заасан"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Цаг долоо гучийг заасан"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Цаг найм гучийг заасан"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Цаг ес гучийг заасан"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Цаг арав гучийг заасан"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Цаг арван нэг гучийг заасан"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Цаг арван хоёр гучийг заасан"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Фүжи уул"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Токио цамхаг"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Эрх чөлөөний хөшөө"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Японы сүүдэр"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Мояай"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Жуумалзсан царай"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Инээсэн нүдтэй жуумалзсан царай"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Баярын нулимстай царай"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Амаа ангайж инээмсэглэсэн царай"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Амаа ангайж инээсэн нүдтэй царай"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Амаа ангайж хүйтэн хөлстэй инээсэн царай"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Амаа ангайж онийсон нүдтэй инээсэн царай"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Хүрээтэй инээсэн царай"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Эвэртэй инээсэн царай"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Ирмэсэн царай"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Инээсэн нүдтэй инээсэн царай"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Амттай хоол тамшаалсан царай"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Тайвширсан царай"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Зүрхэн нүдтэй инээсэн царай"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Нарны шилтэй инээсэн царай"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Мишээсэн царай"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Төв царай"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Хувиралгүй царай"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Гайхашраагүй царай"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Хүйтэн хөлстэй царай"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Бодлогоширсон царай"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Гайхсан царай"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Сандарсан царай"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Үнсэлттэй царай"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Үнсэлт илгээх царай"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Инээсэн нүдтэй үнсэлт илгээх царай"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Аньсан нүдтэй үнсэлт илгээх царай"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Хэлээ цухуйлгасан царай"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Нүдээ ирмэж хэлээ цухуйлгасан царай"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Онийсон нүдтэй хэлээ цухуйлгасан царай"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Сэтгэл дундуур царай"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Санаа нь зовсон царай"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Ууртай царай"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Дорвогор царай"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Уйлсан царай"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Тэвчсэн царай"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Ялгуусан царай"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Сэтгэл дундуур ч тайван царай"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Амаа ангайж барайсан царай"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Шаналсан царай"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Айсан царай"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Ядарсан царай"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Нойрмог царай"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Ядарсан царай"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Ярвайсан царай"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Чанга уйлсан царай"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Амаа ангайсан царай"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Чимээгүй гэсэн царай"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Амаа ангайсан хүйтэн хөлстэй царай"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Айж хашгирсан царай"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Гайхширсан царай"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Уурссан царай"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Унтсан царай"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Дуниартсан царай"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Амгүй царай"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Эмнэлгийн масктай царай"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Инээсэн нүдтэй жуумалзсан муурын царай"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Баярын нулимстай муурын царай"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Амаа ангайж инээмсэглэсэн муурын царай"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Зүрхэн нүдтэй инээсэн муурын царай"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Муруй инээсэн муурын царай"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Аньсан нүдтэй үнсэлт илгээх муурын царай"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Дорвогор муурын царай"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Уйлсан муурын царай"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Ядарсан муурын царай"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Муу гэсэн зангаатай царай"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Сайн гэсэн зангаатай царай"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Мэхийн ёсолсон хүн"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Мууг харахгүй сармагчин"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Мууг сонсохгүй сармагчин"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Мууг ярихгүй сармагчин"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Нэг гараа өргөсөн жаргалтай хүн"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Баярлаж гараа өргөсөн хүн"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Барайсан хүн"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Дорвогор царайтай хүн"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Цээжээ тэвэрсэн хүн"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Пуужин"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Нисдэг тэрэг"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Уур зүтгүүр"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Төмөр замын вагон"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Хурдан галт тэрэг"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Суман хурдан галт тэрэг"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Галт тэрэг"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Метро"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Хөнгөн төмөр зам"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Буудал"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Трамвай"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Трамвай вагон"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Автобус"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Ирж буй автобус"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Тролейбус"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Автобусны зогсоол"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Минибус"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Түргэн тусламж"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Галын машин"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Цагдаагийн машин"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Ирж буй цагдаагийн машин"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Такси"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Ирж буй такси"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Автомашин"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Ирж автомашин"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Амралтын машин"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Хүргэлтийн ачааны машин"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Цуваа тэргэнцэр"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Трактор"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Moнорейл"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Уулын төмөр зам"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Дүүжин төмөр зам"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Уулын кабль зам"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Агаарын трамвай"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Усан онгоц"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Роу завь"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Хурдны завь"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Хэвтээ замын дохио"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Босоо замын дохио"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Барилгын тэмдэг"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Цагдаагийн машины эргэлдэх дохио"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Шуудан гурвалжин туг"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Хаалга"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Орохыг хориглосон тэмдэг"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Тамхи татах тэмдэг"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Тамхи хориглосон тэмдэг"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Хогийг саванд нь хаях тэмдэг"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Хог хаяхгүй тэмдэг"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Ундны усны тэмдэг"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Ундны бус усны тэмдэг"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Дугуй"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Унадаг дугуй болохгүй"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Унадаг дугуйч"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Уулын унадаг дугуйч"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Явган зорчигч"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Явган зорчигч болохгүй"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Хүүхдийн гарц"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Эрэгтэйчүүдийн тэмдэг"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Эмэгтэйчүүдийн тэмдэг"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Ариун цэврийн өрөө"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Хүүхдийн тэмдэг"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Бие засах газар"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Усны сав"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Шүршүүр"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Ванн"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Ванн"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Паспорт хяналт"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Гааль"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Ачаа авах"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Орхисон ачаа"</string> +</resources> diff --git a/java/res/values-mn-rMN/strings-letter-descriptions.xml b/java/res/values-mn-rMN/strings-letter-descriptions.xml new file mode 100644 index 000000000..b8f8d85e3 --- /dev/null +++ b/java/res/values-mn-rMN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Эм хүйсийн дугаар заагч"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Микро тэмдэг"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Эр хүйсийн дугаар заагч"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Хурц S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"А, зүүн малгайтай"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"А, баруун малгайтай"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"А, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"А, долгионтой"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"А, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, дээрээ цагирагтай"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, залгагдсан"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, дэвсгэртэй"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, зүүн малгайтай"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, баруун малгайтай"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, зүүн малгайтай"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, баруун малгайтай"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Зураастай ди"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, долгионтой"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, зүүн малгайтай"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, баруун малгайтай"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, долгионтой"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, хөндлөн зураастай"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, зүүн малгайтай"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, баруун малгайтай"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, баруун малгайтай"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Гэдэстэй багана"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, хоёр цэгтэй"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, хөндлөн малгайтай"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"А, тавган малгайтай"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"А, сүүлтэй"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, баруун малгайтай"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"С, дээрээ цэгтэй"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, аяган малгайтай"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, аяган малгайтай"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, хөндлөн зураастай"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, хөндлөн малгайтай"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, тавган малгайтай"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, дээрээ цэгтэй"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, сүүлтэй"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, аяган малгайтай"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, тавган малгайтай"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, дээрээ цэгтэй"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, хөндлөн зураастай"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, долгионтой"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, хөндлөн малгайтай"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, тавган малгайтай"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, сүүлтэй"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Цэггүй I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, залгагдсан"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, баруун малгайтай"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, дэвсгэртэй"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, аяган малгайтай"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, дунд цэгтэй"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, хөндлөн зураастай"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, баруун малгайтай"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, аяган малгайтай"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N,"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Инг"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, хөндлөн малгайтай"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, тавган малгайтай"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, давхар баруун малгайтай"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, залгагдсан"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, баруун малгайтай"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, аяган малгайтай"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, баруун малгайтай"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, аяган малгайтай"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, дэвсгэртэй"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, аяган малгайтай"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, хөндлөн зураастай"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, долгионтой"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, хөндлөн малгайтай"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, тавган малгайтай"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, дээрээ цагирагтай"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, давхар баруун малгайтай"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, сүүлтэй"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, дээвэр малгайтай"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, баруун малгайтай"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, дээрээ цэгтэй"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, аяган малгайтай"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Урт S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, эвэртэй"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, эвэртэй"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, доор таслалтай"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, доор таслалтай"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"А, доор цэгтэй"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"А, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, дээвэр болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"А, дээвэр болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"А, дээвэр болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"А, дээвэр болон долгионтой"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"А, дээвэр болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"А, тавган болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"А, тавган болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"А, тавган болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"А, тавган болон долгионтой"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"А, тавган болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, доор цэгтэй"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, долгионтой"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, дээвэр болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, дээвэр болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, дээвэр болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, дээвэр болон долгионтой"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, дээвэр болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, доор цэгтэй"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, доор цэгтэй"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, дээвэр болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, дээвэр болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, дээвэр болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, дээвэр болон долгионтой"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, дээвэр болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, эвэр болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, эвэр болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, эвэр болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, эвэр болон долгионтой"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, эвэр болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, доор цэгтэй"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, эвэр болон баруун малгайтай"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, эвэр болон зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, эвэр болон дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, эвэр болон долгионтой"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, эвэр болон доор цэгтэй"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, зүүн малгайтай"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, доор цэгтэй"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, дээр дэгээтэй"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, долгионтой"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Урвуу анхаарлын тэмдэг"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Зүүн заасан давхар хашилт"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Дунд цэг"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Мөрний дээрх нэг"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Баруун заасан давхар хашилт"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Урвуу асуултын тэмдэг"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Зүүн дан хашилт"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Баруун дан хашилт"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Дан доогуур-9 хашилт"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Зүүн давхар хашилт"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Баруун давхар хашилт"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Чинжаал"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Давхар чинжаал"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Нэг мильд тэмдэг"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Давхар штрих"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Зүүн заасан дан хашилт"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Баруун заасан дан хашилт"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Мөрний дээрх дөрөв"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Мөрний дээрх жижиг латин n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Песо тэмдэг"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Анхааралд"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Баруун сум"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Доош сум"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Хоосон олонлог"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Өсөлт"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Бага буюу тэнцүү"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Их буюу тэнцүү"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Хар од"</string> +</resources> diff --git a/java/res/values-mn-rMN/strings-talkback-descriptions.xml b/java/res/values-mn-rMN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..d2c583e5a --- /dev/null +++ b/java/res/values-mn-rMN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Нууц үгний дуудлагыг сонсох бол чихэвчийг залгана уу."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Одоогийн текст %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст оруулаагүй"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> нь <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-г <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> руу залруулна"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> авто-залруулалт хийдэг"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Үл мэдэгдэх тэмдэгт"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Шифт"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Өөр тэмдэгтүүд"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Шифт"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Симбол"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Шифт"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Устгах"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Симбол"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Үсэгнүүд"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Тоонууд"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Тохиргоо"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Таб"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Хоосон зай"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Дуугаар оруулах"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Эможи"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Оруулах"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Хайх"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Цэг"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Хэл солих"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Дараах"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Өмнөх"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Сэлгэхийг идэвхжүүлсэн"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Томоор бичихийг идэвхжүүлсэн"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Симбол төлөв"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Өөр тэмдэгтийн горим"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Үсэгнүүд төлөв"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Утасны төлөв"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Утасны символ төлөв"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Гарыг нуусан"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> гар харуулж байна"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"огноо"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"огноо болон цаг"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"имэйл"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"зурвас"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"тоо"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"утас"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"зурвас"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"цаг"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Саяхны"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Хүмүүс"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Объект"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Байгалийн"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Газар"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Симбол"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Эмотикон"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Том <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Том I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Том I, дээрээ цэгтэй"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Үл мэдэгдэх симбол"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Үл мэдэгдэх эможи"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Бусад тэмдэгтүүд ашиглах боломжтой"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Бусад тэмдэгтүүдийг хаагдсан"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Бусад санал болголтууд ашиглах боломжтой"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Бусад санал болголтууд хаагдсан"</string> +</resources> diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml index d4175899f..4d47dfe20 100644 --- a/java/res/values-mn-rMN/strings.xml +++ b/java/res/values-mn-rMN/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Оруулах сонголтууд"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Судалгааны протоколын командууд"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Харилцагчийн нэр хайх"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Алдаа шалгагч нь таны харилцагчдын жагсаалтаас ашиглана"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Товч дарахад чичрэх"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Товч дарахад дуу гаргах"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Товч дарахад попап гарна"</string> - <string name="general_category" msgid="1859088467017573195">"Ерөнхий"</string> - <string name="correction_category" msgid="2236750915056607613">"Текст залруулалт"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Зангаагаар бичих"</string> - <string name="misc_category" msgid="6894192814868233453">"Бусад сонголтууд"</string> - <string name="advanced_settings" msgid="362895144495591463">"Дэлгэрэнгүй тохиргоо"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Экспертүүдэд зориулсан тохиргоо"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Оруулгын тохируулга"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Харагдац"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Олон хэлний сонголтууд"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Зангалтын бичих тохируулга"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Текст залруулалт"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Дэлгэрэнгүй"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Оруулах өөр арга руу шилжүүлэх"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Хэл солих түлхүүрт өөр оруулах аргууд мөн багтсан байгаа"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Хэл солих товч"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Системийн үндсэн утга"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Харилцагчдын нэрс санал болгох"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Санал болгох, залруулахда Харилцагчдын нэрсээс ашиглах"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Хувийн тохиргоотой зөвлөмжүүд"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> сайжруулах"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Давхар зайтай цэг"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ардаа зайтай цэг оруулахын тулд Зай авах дээр давхар товшино уу"</string> <string name="auto_cap" msgid="1719746674854628252">"Автоматаар томруулах"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Зангасан мөрийг харуулах"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамик хөвөгчөөр урьдчилан харах"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Зангах явцад санал болгож буй үгийг харах"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Хадгалагдсан"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Нууц үгний товчнуудыг чангаар уншихыг сонсохын тулд чихэвчээ залгана уу."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Одоогийн текст %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст оруулаагүй"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-г <xliff:g id="CORRECTED">%3$s</xliff:g> руу залруулна"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> автоматаар залруулна"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Товчийн код %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Сэлгэх"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Сэлгэхийг идэвхжүүлсэн (товшиж идэвхгүйжүүлнэ үү)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Томоор бичихийг асаасан (товшиж идэвхгүйжүүлнэ үү)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Устгах"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Симбол"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Үсэгнүүд"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Тоонууд"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Тохиргоо"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Таб"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Хоосон зай"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Дуугаар оруулах"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Инээсэн царай"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Буцах"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Хайх"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Цэг"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Хэл солих"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Дараах"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Өмнөх"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Сэлгэхийг идэвхжүүлсэн"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Томоор бичихийг идэвхжүүлсэн"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Сэлгэхийг идэвхжүүлээгүй"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Симбол төлөв"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Үсэгнүүд төлөв"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Утасны төлөв"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Утасны символ төлөв"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Гарыг нуусан"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> гарыг харуулж байна"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"огноо"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"огноо болон цаг"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"и"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"зурвас"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"дугаар"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"утас"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"цаг"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Хэллэгийн зангалт"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Зангалтын явцад зай авах товчин дээр гулсуулах замаар зай оруулах"</string> <string name="voice_input" msgid="3583258583521397548">"Дуун оруулгын товч"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ямар ч дуу оруулах хэрэглүүр идэвхжээгүй байна. Хэл болон оруулалтын тохиргоог шалгана уу."</string> <string name="configure_input_method" msgid="373356270290742459">"Оруулах аргуудын тохиргоо"</string> <string name="language_selection_title" msgid="1651299598555326750">"Оруулах хэл"</string> <string name="send_feedback" msgid="1780431884109392046">"Санал хүсэлт илгээх"</string> <string name="select_language" msgid="3693815588777926848">"Оруулах хэл"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Хадгалахын тулд дахин хүрнэ үү"</string> <string name="has_dictionary" msgid="6071847973466625007">"Толь бичиг байна"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Хэрэглэгчийн санал хүсэлтийг идэвхжүүлэх"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ашиглалтын статистик болон гацалтын репортуудыг автоматаар илгээснээр энэ оруулах арга засагчийг сайжруулахад туслаарай"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Гарын загвар"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Англи (ИБ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Англи (АНУ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Испани (АНУ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Англи (ИБ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Англи (АНУ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Испани (АНУ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Уламжлалт)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Англи (ИБ) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Англи (АНУ) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Испани (АНУ-ын) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (уламжлалт)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Кирилл)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Латин)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Хэл байхгүй (Цагаан толгой)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Цагаан толгой (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Цагаан толгой (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Цагаан толгой (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Цагаан толгой (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Инээмсэглэл"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Өнгөний схем"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Цагаан"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Хөх"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Гарын загвар"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Холо Цагаан"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Холо Цэнхэр"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Материал Бараан"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Материал Цайвар"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Өөрийн оруулах загвар"</string> <string name="add_style" msgid="6163126614514489951">"Загвар нэмэх"</string> <string name="add" msgid="8299699805688017798">"Нэмэх"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Идэвхжүүлэх"</string> <string name="not_now" msgid="6172462888202790482">"Одоо биш"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Ижилхэн оруулах загвар байна: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Ашиглалтын судалгааны горим"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Товч удаан дарах хугацааны тохиргоо"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Товч дарах чичиргээний хугацаа"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Товчны дууны хэмжээ"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Толь бичгийн гадны файлыг унших"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Татаж авсан фолдерт толь бичгийн файл байхгүй байна"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Суулгах толь бичгийн файлыг сонгоно уу"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g>-д зориулсан энэ файлыг үнэхээр суулгах уу?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>-д зориулсан энэ файлыг үнэхээр суулгах уу?"</string> <string name="error" msgid="8940763624668513648">"Алдаа гарсан"</string> <string name="button_default" msgid="3988017840431881491">"Үндсэн"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Та <xliff:g id="APPLICATION_NAME">%s</xliff:g>-д тавтай морилно уу"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Дахин шинэчлэх"</string> <string name="last_update" msgid="730467549913588780">"Сүүлд шинэчлэгдсэн"</string> <string name="message_updating" msgid="4457761393932375219">"Шинэчлэлтийг шалгаж байна"</string> - <string name="message_loading" msgid="8689096636874758814">"Ачаалж байна..."</string> + <string name="message_loading" msgid="5638680861387748936">"Ачаалж байна..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Үндсэн толь бичиг"</string> <string name="cancel" msgid="6830980399865683324">"Цуцлах"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Тохиргоо"</string> <string name="install_dict" msgid="180852772562189365">"Суулгах"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Цуцлах"</string> <string name="delete_dict" msgid="756853268088330054">"Устгах"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Таны мобайль төхөөрөмж дээр сонгосон хэлэнд толь бичиг байна.<br/> Тус <xliff:g id="LANGUAGE">%1$s</xliff:g> толь бичгийг <b>татаж аван</b> зөв бичилтээ сайжруулахыг бид зөвлөж байна.<br/> <br/> Татаж авахад 3G сүлжээгээр нэг хоёр минут болно. Танд <b>хязгааргүй дата эрх</b> байхгүй бол нэмэлт төлбөр гарч болно.<br/> Та дата эрхийнхээ талаар сайн мэдэхгүй байгаа бол Wi-Fi холболттой газар очин автоматаар татаж авахыг зөвлөж байна.<br/> <br/> Зөвлөмж: Та өөрийн мобайль төхөөрөмжийн <b>Тохиргоо</b> цэсний <b>Хэл & оруулах</b> руу очиж толь бичиг татаж авах буюу устгаж болно."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Таны мобайл төхөөрөмж дээр сонгосон хэлний толь бичиг байна. <br/> Бид танд <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> хэлний толь бичиг <b> татаж аван </ б> бичихэд хялбар болгохыг зөвлөж байна. <br/> <br/> Татаж авахад 3G дээр нэг, хоёр минут болж магадгүй. Хэрэв та <b> хязгааргүй дата ашиглах эрхтэй </ б> биш бол нэмэлт төлбөр гарч болно. Хэрэв та өөрийн дата ашиглалтын эрхийг сайн мэдэхгүй байгаа бол Wi-Fi холболт ашиглан автоматаар татан авахыг эхлүүлэхийг зөвлөж байна.<br/> <br/> <br/> Зөвлөмж: Та өөрийн мобайл төхөөрөмжийн <b> тохиргоо </ б> цэсэнд </ б> Хэл & оролт <b> руу очиж толь бичиг татаж авах, устгах боломжтой."</string> <string name="download_over_metered" msgid="1643065851159409546">"Одоо татах (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi-р татаж авах"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> хэлний толь бичигтэй"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> хэлний толь ашиглах боломжтой"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Шалгах болон татаж авахын тулд дарна уу"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Татаж байна: <xliff:g id="LANGUAGE">%1$s</xliff:g> хэлний санал болгох үгс удахгүй бэлэн болно."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>-д зориулсан татан авалтын санал болголтууд удахгүй бэлэн болно."</string> <string name="version_text" msgid="2715354215568469385">"Хувилбар <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Нэмэх"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Толь бичигт нэмэх"</string> diff --git a/java/res/values-mr-rIN/strings-action-keys.xml b/java/res/values-mr-rIN/strings-action-keys.xml new file mode 100644 index 000000000..4dadfea41 --- /dev/null +++ b/java/res/values-mr-rIN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"जा"</string> + <string name="label_next_key" msgid="5586407279258592635">"पुढील"</string> + <string name="label_previous_key" msgid="1421141755779895275">"मागील"</string> + <string name="label_done_key" msgid="7564866296502630852">"पूर्ण झाले"</string> + <string name="label_send_key" msgid="482252074224462163">"पाठवा"</string> + <string name="label_search_key" msgid="7965186050435796642">"शोधा"</string> + <string name="label_pause_key" msgid="2225922926459730642">"विराम द्या"</string> + <string name="label_wait_key" msgid="5891247853595466039">"प्रतीक्षा करा"</string> +</resources> diff --git a/java/res/values-mr-rIN/strings-appname.xml b/java/res/values-mr-rIN/strings-appname.xml new file mode 100644 index 000000000..80f11e715 --- /dev/null +++ b/java/res/values-mr-rIN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android कीबोर्ड (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android शब्दलेखन तपासक (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android कीबोर्ड सेटिंग्ज (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android शब्दलेखन तपासक सेटिंग्ज (AOSP)"</string> +</resources> diff --git a/java/res/values-mr-rIN/strings-config-important-notice.xml b/java/res/values-mr-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..3ec6e26fd --- /dev/null +++ b/java/res/values-mr-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"सूचना सुधारण्यासाठी आपल्या संप्रेषणांमधून आणि टाइप केलेल्या डेटामधून जाणून घ्या"</string> +</resources> diff --git a/java/res/values-mr-rIN/strings-letter-descriptions.xml b/java/res/values-mr-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..995aa2579 --- /dev/null +++ b/java/res/values-mr-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"स्त्रीलिंगी क्रमवाचक सूचक"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"सूक्ष्म चिन्ह"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"पुल्लिंगी क्रमवाचक सूचक"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"अणकुचीदार एस"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ए, अनुदात्त"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ए, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ए, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ए, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ए, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ए, वर रिंग"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ए, ई, जोडाक्षर"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"सी, सेडिला"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ई, अनुदात्त"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ई, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ई, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ई, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"आय, अनुदात्त"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"आय, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"आय, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"आय, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"एन, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ओ, अनुदात्त"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ओ, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ओ, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ओ, नासिक्यत्व खूण"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ओ, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ओ, स्ट्रोक"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"यू, अनुदात्त"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"यू, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"यू, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"यू, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"वाय, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"थॉर्न"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"वाय, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ए, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ए, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ए, ओगोनेक"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"सी, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"सी, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"सी, वर बिंदू"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"सी, कॅरोन"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"डी, कॅरोन"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"डी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ई, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ई, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ई, वर बिंदू"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ई, ओगोनेक"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ई, कॅरोन"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"जी, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"जी, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"जी, वर बिंदू"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"जी, सेडिला"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"एच, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"एच, स्ट्रोक"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"आय, नासिकत्व चिन्ह"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"आय, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"आय, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"आय, ओगोनेक"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"बिंदू नसलेला आय"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"आय, जे जोडाक्षर"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"जे, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"के, सेडिला"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"एल, तीक्ष्ण"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"एल, सेडिला"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"एल, कॅरोन"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"एल, मध्य बिंदू"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"एल, स्ट्रोक"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"एन, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"एन, सेडिला"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"एन, कॅरोन"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"एन, अॅपॉस्ट्रॉफी च्या अगोदर"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ओ, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ओ, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ओ, दुहेरी तीक्ष्ण"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ओ, ई, जोडाक्षर"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"आर, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"आर, सेडिला"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"आर, कॅरोन"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"एस, तीक्ष्ण"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"एस, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"एस, सेडिला"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"एस, कॅरोन"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"टी, सेडिला"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"टी, कॅरोन"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"टी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"यू, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"यू, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"यू, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"यू, वर रिंग"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"यू, दुहेरी तीक्ष्ण"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"यू, ओगोनेक"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"डब्ल्यू, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"वाय, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"झेड, तीक्ष्ण"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"झेड, वर बिंदू"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"झेड, कॅरॉन"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"मोठा एस"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ओ, हॉर्न"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"यू, हॉर्न"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"एस, खाली स्वल्पविराम"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"टी, खाली स्वल्पविराम"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"शॉ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ए, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ए, वर हुक"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ए, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ए, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ए, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ए, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ए, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ए, लघुत्व चिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ए, लघुत्व चिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ए, लघुत्व चिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ए, लघुत्व चिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ए, लघुत्व चिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ई, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ई, वर हुक"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ई, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ई, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ई, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ई, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ई, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ई, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"आय, वर हुक"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"आय, खाली बिंदू"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ओ, खाली बिंदू"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ओ, वर हुक"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ओ, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ओ, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ओ, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ओ, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ओ, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ओ, हॉर्न आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ओ, हॉर्न आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ओ, हॉर्न आणि वर हुक"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ओ, हॉर्न आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ओ, हॉर्न आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"यू, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"यू, वर हुक"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"यू, हॉर्न आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"यू, हॉर्न आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"यू, हॉर्न आणि वर हुक"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"यू, हॉर्न आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"यू, हॉर्न आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"वाय, अनुदात्त"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"वाय, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"वाय, वर हुक"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"वाय, नासिक्यत्व चिन्ह"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"उलटे उद्गार चिन्ह"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"डाव्या-दिशेला दुहेरी कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"मध्य बिंदू"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"शिरोरेखित एक"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"उजव्या-दिशेला दुहेरी कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"उलटे प्रश्न चिन्ह"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"डावे एकल अवतरण चिन्ह"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"उजवे एकल अवतरण चिन्ह"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"एकल निम्न-9 अवतरण चिन्ह"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"डावे दुहेरी अवतरण चिन्ह"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"उजवे दुहेरी अवतरण चिन्ह"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"डॅगर"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"दुहेरी डॅगर"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"प्रति हजारी चिन्ह"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"अविभाज्य"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"दुहेरी अविभाज्य"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"एकल डाव्या-दिशेला कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"एकल उजव्या-दिशेला कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"शिरोरेखित चार"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"शिरोरेखित लॅटिन लहान अक्षर एन"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"पेसो चिन्ह"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"द्वारा"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"उजवीकडे बाण"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"खालच्या दिशेने बाण"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"रिक्त संच"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"वाढ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"पेक्षा-कमी किंवा समान"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"पेक्षा-मोठे किंवा समान"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"काळा तारा"</string> +</resources> diff --git a/java/res/values-mr-rIN/strings-talkback-descriptions.xml b/java/res/values-mr-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..41c64f473 --- /dev/null +++ b/java/res/values-mr-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"मोठ्याने बोललेल्या संकेतशब्द की ऐकण्यासाठी हेडसेट प्लग इन करा."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"वर्तमान मजकूर %s आहे"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"मजकूर प्रविष्ट केला नाही"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ला <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> मध्ये सुधारणा करते"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> स्वयं-सुधारणा करते"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"अज्ञात वर्ण"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"अधिक चिन्हे"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"चिन्हे"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"हटवा"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"चिन्हे"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"अक्षरे"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"नंबर"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"सेटिंग्ज"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"व्हॉइस इनपुट"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"इमोजी"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"परत"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"शोधा"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"बिंदू"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"भाषा स्विच करा"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"पुढील"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"मागील"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift सक्षम"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock सक्षम"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"चिन्हे मोड"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"अधिक चिन्हे मोड"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"अक्षरे मोड"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"फोन मोड"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"फोन चिन्हे मोड"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"कीबोर्ड लपविलेला आहे"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> कीबोर्ड दर्शवित आहे"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"तारीख"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"तारीख आणि वेळ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ईमेल"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"संदेशन"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"नंबर"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"फोन"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"मजकूर पाठवा"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"वेळ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"अलीकडील"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"सहभागी"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ऑब्जेक्टस्"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"निसर्ग"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ठिकाणे"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"चिन्हे"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"इमोटिकॉन"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"कॅपिटल <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"कॅपिटल आय"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"कॅपिटल आय, वर बिंदू"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"अज्ञात प्रतीक"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"अज्ञात इमोजी"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"वैकल्पिक वर्ण उपलब्ध आहेत"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"वैकल्पिक वर्ण डिसमिस केलेले आहेत"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"वैकल्पिक सूचना उपलब्ध आहेत"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"वैकल्पिक सूचना डिसमिस केलेल्या आहेत"</string> +</resources> diff --git a/java/res/values-mr-rIN/strings.xml b/java/res/values-mr-rIN/strings.xml new file mode 100644 index 000000000..3ef3cf223 --- /dev/null +++ b/java/res/values-mr-rIN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट पर्याय"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"संपर्क नावे शोधा"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"शब्दलेखन तपासक आपल्या संपर्क सूचीमधील प्रविष्ट्या वापरतो"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"कीप्रेस करताना होणारे कंपन"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"कीप्रेस करताना होणारा ध्वनी"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"कीप्रेस करताना पॉपअप"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"अन्य इनपुट पद्धतींवर स्विच करा"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"भाषा स्विच की अन्य इनपुट पद्धती देखील समाविष्ट करते"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"भाषा स्विच की"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"एकाधिक इनपुट भाषा सक्षम केलेल्या असताना दर्शवा"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"स्लाइड दर्शक दर्शवा"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift किंवा Symbol की वरून स्लाइड करताना व्हिज्युअल सूचक प्रदर्शित करा"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"की पॉपअप विलंब डिसमिस करते"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"विलंब नाही"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डीफॉल्ट"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>मिसे"</string> + <string name="settings_system_default" msgid="6268225104743331821">"सिस्टम डीफॉल्ट"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नावे सुचवा"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सूचनांसाठी आणि सुधारणांसाठी संपर्कांमधील नावे वापरा"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"वैयक्तिकृत केलेल्या सूचना"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> मध्ये सुधारणा करा"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"डबल-स्पेस पूर्णविरामचिन्ह"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबारवर डबल टॅप केल्याने पूर्णविरामचिन्ह व त्यापाठोपाठ स्पेस घातली जाते"</string> + <string name="auto_cap" msgid="1719746674854628252">"स्वयं-कॅपिटलायझेशन"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"प्रत्येक वाक्याचा पहिला शब्द कॅपिटल करा"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"वैयक्तिक शब्दकोश"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"अॅड-ऑन शब्दकोश"</string> + <string name="main_dictionary" msgid="4798763781818361168">"मु्ख्य शब्दकोश"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"सुधारणा सूचना दर्शवा"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"टाइप करताना सुचविलेले शब्द प्रदर्शित करा"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"नेहमी दर्शवा"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"पोर्ट्रेट मोडमध्ये दर्शवा"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"नेहमी लपवा"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"आक्षेपार्ह शब्द अवरोधित करा"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"संभाव्य आक्षेपार्ह शब्द सुचवू नका"</string> + <string name="auto_correction" msgid="7630720885194996950">"स्वयं-सुधारणा"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"चुकीचे टाइप केलेले शब्द स्पेसबार आणि विरामचिन्हे स्वयंचलितपणे सुधारते"</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_aggressive" msgid="7319007299148899623">"आक्रमक"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"खूप आक्रमक"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"पुढील-शब्द सूचना"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"सूचना करताना मागील शब्द वापरा"</string> + <string name="gesture_input" msgid="826951152254563827">"जेश्चर टायपिंग सक्षम करा"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"अक्षरांमधून स्लायडिंग करून एक शब्द इनपुट करा"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"जेश्चर अनुचिन्ह दर्शवा"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"डायनॅमिक फ्लोटिंग पूर्वावलोकन"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"जेश्चरींग करत असताना सुचविलेले शब्द पहा"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश जेश्चर"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"स्पेस की वर ग्लायडिंग करून जेश्चर दरम्यान स्थाने इनपुट करा"</string> + <string name="voice_input" msgid="3583258583521397548">"व्हॉइस इनपुट की"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"व्हॉइस इनपुट पद्धती सक्षम केल्या नाहीत. भाषा आणि इनपुट सेटिंग्ज तपासा."</string> + <string name="configure_input_method" msgid="373356270290742459">"इनपुट पद्धती कॉन्फिगर करा"</string> + <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषा"</string> + <string name="send_feedback" msgid="1780431884109392046">"अभिप्राय पाठवा"</string> + <string name="select_language" msgid="3693815588777926848">"इनपुट भाषा"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"जतन करण्यासाठी पुन्हा स्पर्श करा"</string> + <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"कीबोर्ड थीम"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"इंग्रजी (यूके)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"इंग्रजी (यूएस)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"स्पॅनिश (यूएस)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"इंग्रजी (यूके) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"इंग्रजी (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"स्पॅनिश (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (पारंपारिक)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (सिरिलिक)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (लॅटिन)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"भाषा नाही (वर्णमाला)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"वर्णमाला (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"वर्णमाला (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"वर्णमाला (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"वर्णमाला (ड्व्होरॅक)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"वर्णमाला (कोलमॅक)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णमाला (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"इमोजी"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"सानुकूल इनपुट शैली"</string> + <string name="add_style" msgid="6163126614514489951">"शैली जोडा"</string> + <string name="add" msgid="8299699805688017798">"जोडा"</string> + <string name="remove" msgid="4486081658752944606">"काढा"</string> + <string name="save" msgid="7646738597196767214">"जतन करा"</string> + <string name="subtype_locale" msgid="8576443440738143764">"भाषा"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"लेआउट"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"आपली सानुकूल इनपुट शैली आपण ती वापरणे प्रारंभ करण्यापूर्वी सक्षम करणे आवश्यक आहे. आपण आता ती सक्षम करू इच्छिता?"</string> + <string name="enable" msgid="5031294444630523247">"सक्षम करा"</string> + <string name="not_now" msgid="6172462888202790482">"आता नाही"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"समान इनपुट शैली आधीपासूनच अस्तित्वात आहे: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"की जास्त दाबण्यात विलंब"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"कीप्रेस कंपन कालावधी"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"कीप्रेस ध्वनी तीव्रता"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाह्य शब्दकोश फाईल वाचा"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फोल्डरमध्ये शब्दकोश फायली नाहीत"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"स्थापित करण्यासाठी शब्दकोश फाईल निवडा"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> साठी ही फाईल खरोखर स्थापित करायची?"</string> + <string name="error" msgid="8940763624668513648">"एक त्रुटी आली"</string> + <string name="button_default" msgid="3988017840431881491">"डीफॉल्ट"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> वर स्वागत आहे"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"जेश्चर टायपिंग करून"</string> + <string name="setup_start_action" msgid="8936036460897347708">"प्रारंभ करा"</string> + <string name="setup_next_action" msgid="371821437915144603">"पुढील चरण"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सेट अप करत आहे"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सक्षम करा"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"कृपया आपल्या भाषेमध्ये आणि इनपुट सेटिंग्जमध्ये \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" तपासा. हे त्याचे आपल्या डिव्हाइसवर चालणे अधिकृत करेल."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> आपल्या भाषेत आणि इनपुट सेटिंग्जमध्ये आधीपासून सक्षम केले आहे, म्हणून हे चरण पूर्ण झाले आहे. पुढच्या चरणावर!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"सेटिंग्जमध्ये सक्षम करा"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> वर स्विच करा"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"पुढे, आपली सक्रिय मजकूर-इनपुट पद्धत म्हणून \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" निवडा."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"इनपुट पद्धती स्विच करा"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"अभिनंदन, आता आपण सज्ज आहात!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"आता आपण <xliff:g id="APPLICATION_NAME">%s</xliff:g> सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता."</string> + <string name="setup_step3_action" msgid="600879797256942259">"अतिरिक्त भाषा कॉन्फिगर करा"</string> + <string name="setup_finish_action" msgid="276559243409465389">"समाप्त"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"अॅप चिन्ह दर्शवा"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"लाँचर मध्ये अनुप्रयोग चिन्ह प्रदर्शित करा"</string> + <string name="app_name" msgid="6320102637491234792">"शब्दकोश प्रदाता"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"शब्दकोश प्रदाता"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"शब्दकोश सेवा"</string> + <string name="download_description" msgid="6014835283119198591">"शब्दकोश अद्यतन माहिती"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"अॅड-ऑन शब्दकोश"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"शब्दकोश उपलब्ध"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"शब्दकोशांसाठी सेटिंग्ज"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"वापरकर्ता शब्दकोश"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"वापरकर्ता शब्दकोश"</string> + <string name="dictionary_available" msgid="4728975345815214218">"शब्दकोश उपलब्ध"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"सध्या डाउनलोड करत आहे"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"स्थापित केले"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"स्थापित केले, अक्षम केले"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"शब्दकोश सेवेस कनेक्ट करताना समस्या"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"कोणतेही शब्दकोश उपलब्ध नाहीत"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"रीफ्रेश करा"</string> + <string name="last_update" msgid="730467549913588780">"अंतिम अद्यतनित"</string> + <string name="message_updating" msgid="4457761393932375219">"अद्यतनांसाठी तपासत आहे"</string> + <string name="message_loading" msgid="5638680861387748936">"लोड करीत आहे..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"मु्ख्य शब्दकोश"</string> + <string name="cancel" msgid="6830980399865683324">"रद्द करा"</string> + <string name="go_to_settings" msgid="3876892339342569259">"सेटिंग्ज"</string> + <string name="install_dict" msgid="180852772562189365">"स्थापित करा"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द करा"</string> + <string name="delete_dict" msgid="756853268088330054">"हटवा"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"आपल्या मोबाईल डिव्हाइसवर निवडलेल्या भाषेमध्ये शब्दकोश उपलब्ध आहे.<br/> आम्ही आपला टायपिंग अनुभव सुधारण्यासाठी <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> शब्दकोश <b>डाउनलोड करण्याची</b> शिफारस करतो.<br/> <br/> डाउनलोड कऱण्यास 3G वर एक किंवा दोन मिनिट लागू शकतात. आपल्याकडे <b>अमर्यादित डेटा योजना</b> नसल्यास शुल्क लागू शकते. आपल्याकडे असलेल्या डेटा योजनेबद्दल आपण सुनिश्चित नसल्यास, डाउनलोड स्वयंचलितपणे प्रारंभ करण्यासाठी Wi-Fi कनेक्शन शोधण्याची शिफारस आम्ही करतो.<br/> <br/> टीप: आपण आपल्या मोबाईल डिव्हाइसच्या <b>सेटिंग्ज</b>मेनूमधील <b>भाषा आणि इनपुट</b> वर जाऊन शब्दकोश डाउनलोड करू आणि काढू शकता."</string> + <string name="download_over_metered" msgid="1643065851159409546">"आता डाउनलोड करा (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi वर डाउनलोड करा"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> साठी शब्दकोश उपलब्ध आहे"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"पुनरावलोकन करण्यासाठी आणि डाउनलोड करण्यासाठी दाबा"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"डाउनलोड करत आहे: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> साठी सूचना लवकरच तयार होतील."</string> + <string name="version_text" msgid="2715354215568469385">"आवृत्ती <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"जोडा"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"शब्दकोशात जोडा"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"वाक्यांश"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"अधिक पर्याय"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"कमी पर्याय"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ठीक"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"शब्द:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"शॉर्टकट:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"भाषा:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"एक शब्द टाईप करा"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"पर्यायी शॉर्टकट"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"शब्द संपादित करा"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"संपादित करा"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"हटवा"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"आपल्याकडे वापरकर्ता शब्दकोशात कोणतेही शब्द नाहीत. जोडा (+) बटणास स्पर्श करून शब्द जोडा."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"सर्व भाषांसाठी"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"अधिक भाषा..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"हटवा"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings-action-keys.xml b/java/res/values-mr-rMH/strings-action-keys.xml new file mode 100644 index 000000000..4dadfea41 --- /dev/null +++ b/java/res/values-mr-rMH/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"जा"</string> + <string name="label_next_key" msgid="5586407279258592635">"पुढील"</string> + <string name="label_previous_key" msgid="1421141755779895275">"मागील"</string> + <string name="label_done_key" msgid="7564866296502630852">"पूर्ण झाले"</string> + <string name="label_send_key" msgid="482252074224462163">"पाठवा"</string> + <string name="label_search_key" msgid="7965186050435796642">"शोधा"</string> + <string name="label_pause_key" msgid="2225922926459730642">"विराम द्या"</string> + <string name="label_wait_key" msgid="5891247853595466039">"प्रतीक्षा करा"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings-appname.xml b/java/res/values-mr-rMH/strings-appname.xml new file mode 100644 index 000000000..80f11e715 --- /dev/null +++ b/java/res/values-mr-rMH/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android कीबोर्ड (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android शब्दलेखन तपासक (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android कीबोर्ड सेटिंग्ज (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android शब्दलेखन तपासक सेटिंग्ज (AOSP)"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings-config-important-notice.xml b/java/res/values-mr-rMH/strings-config-important-notice.xml new file mode 100644 index 000000000..3ec6e26fd --- /dev/null +++ b/java/res/values-mr-rMH/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"सूचना सुधारण्यासाठी आपल्या संप्रेषणांमधून आणि टाइप केलेल्या डेटामधून जाणून घ्या"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings-letter-descriptions.xml b/java/res/values-mr-rMH/strings-letter-descriptions.xml new file mode 100644 index 000000000..995aa2579 --- /dev/null +++ b/java/res/values-mr-rMH/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"स्त्रीलिंगी क्रमवाचक सूचक"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"सूक्ष्म चिन्ह"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"पुल्लिंगी क्रमवाचक सूचक"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"अणकुचीदार एस"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ए, अनुदात्त"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ए, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ए, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ए, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ए, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ए, वर रिंग"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ए, ई, जोडाक्षर"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"सी, सेडिला"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ई, अनुदात्त"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ई, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ई, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ई, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"आय, अनुदात्त"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"आय, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"आय, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"आय, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"एन, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ओ, अनुदात्त"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ओ, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ओ, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ओ, नासिक्यत्व खूण"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ओ, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ओ, स्ट्रोक"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"यू, अनुदात्त"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"यू, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"यू, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"यू, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"वाय, तीक्ष्ण"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"थॉर्न"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"वाय, स्वरवियोग चिन्ह"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ए, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ए, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ए, ओगोनेक"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"सी, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"सी, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"सी, वर बिंदू"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"सी, कॅरोन"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"डी, कॅरोन"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"डी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ई, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ई, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ई, वर बिंदू"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ई, ओगोनेक"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ई, कॅरोन"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"जी, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"जी, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"जी, वर बिंदू"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"जी, सेडिला"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"एच, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"एच, स्ट्रोक"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"आय, नासिकत्व चिन्ह"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"आय, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"आय, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"आय, ओगोनेक"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"बिंदू नसलेला आय"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"आय, जे जोडाक्षर"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"जे, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"के, सेडिला"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"एल, तीक्ष्ण"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"एल, सेडिला"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"एल, कॅरोन"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"एल, मध्य बिंदू"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"एल, स्ट्रोक"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"एन, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"एन, सेडिला"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"एन, कॅरोन"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"एन, अॅपॉस्ट्रॉफी च्या अगोदर"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ओ, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ओ, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ओ, दुहेरी तीक्ष्ण"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ओ, ई, जोडाक्षर"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"आर, तीक्ष्ण"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"आर, सेडिला"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"आर, कॅरोन"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"एस, तीक्ष्ण"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"एस, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"एस, सेडिला"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"एस, कॅरोन"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"टी, सेडिला"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"टी, कॅरोन"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"टी, स्ट्रोक"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"यू, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"यू, गुरुत्व चिन्ह"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"यू, लघुत्व चिन्ह"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"यू, वर रिंग"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"यू, दुहेरी तीक्ष्ण"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"यू, ओगोनेक"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"डब्ल्यू, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"वाय, स्वरितचिन्ह"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"झेड, तीक्ष्ण"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"झेड, वर बिंदू"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"झेड, कॅरॉन"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"मोठा एस"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ओ, हॉर्न"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"यू, हॉर्न"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"एस, खाली स्वल्पविराम"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"टी, खाली स्वल्पविराम"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"शॉ"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ए, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ए, वर हुक"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ए, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ए, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ए, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ए, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ए, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ए, लघुत्व चिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ए, लघुत्व चिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ए, लघुत्व चिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ए, लघुत्व चिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ए, लघुत्व चिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ई, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ई, वर हुक"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ई, नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ई, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ई, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ई, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ई, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ई, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"आय, वर हुक"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"आय, खाली बिंदू"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ओ, खाली बिंदू"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ओ, वर हुक"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ओ, स्वरितचिन्ह आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ओ, स्वरितचिन्ह आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ओ, स्वरितचिन्ह आणि वर हुक"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ओ, स्वरितचिन्ह आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ओ, स्वरितचिन्ह आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ओ, हॉर्न आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ओ, हॉर्न आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ओ, हॉर्न आणि वर हुक"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ओ, हॉर्न आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ओ, हॉर्न आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"यू, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"यू, वर हुक"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"यू, हॉर्न आणि तीक्ष्ण"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"यू, हॉर्न आणि अनुदात्त"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"यू, हॉर्न आणि वर हुक"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"यू, हॉर्न आणि नासिक्यत्व चिन्ह"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"यू, हॉर्न आणि खाली बिंदू"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"वाय, अनुदात्त"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"वाय, खाली बिंदू"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"वाय, वर हुक"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"वाय, नासिक्यत्व चिन्ह"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"उलटे उद्गार चिन्ह"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"डाव्या-दिशेला दुहेरी कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"मध्य बिंदू"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"शिरोरेखित एक"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"उजव्या-दिशेला दुहेरी कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"उलटे प्रश्न चिन्ह"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"डावे एकल अवतरण चिन्ह"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"उजवे एकल अवतरण चिन्ह"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"एकल निम्न-9 अवतरण चिन्ह"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"डावे दुहेरी अवतरण चिन्ह"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"उजवे दुहेरी अवतरण चिन्ह"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"डॅगर"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"दुहेरी डॅगर"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"प्रति हजारी चिन्ह"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"अविभाज्य"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"दुहेरी अविभाज्य"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"एकल डाव्या-दिशेला कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"एकल उजव्या-दिशेला कोन अवतरण चिन्ह"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"शिरोरेखित चार"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"शिरोरेखित लॅटिन लहान अक्षर एन"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"पेसो चिन्ह"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"द्वारा"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"उजवीकडे बाण"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"खालच्या दिशेने बाण"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"रिक्त संच"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"वाढ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"पेक्षा-कमी किंवा समान"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"पेक्षा-मोठे किंवा समान"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"काळा तारा"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings-talkback-descriptions.xml b/java/res/values-mr-rMH/strings-talkback-descriptions.xml new file mode 100644 index 000000000..41c64f473 --- /dev/null +++ b/java/res/values-mr-rMH/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"मोठ्याने बोललेल्या संकेतशब्द की ऐकण्यासाठी हेडसेट प्लग इन करा."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"वर्तमान मजकूर %s आहे"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"मजकूर प्रविष्ट केला नाही"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ला <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> मध्ये सुधारणा करते"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> स्वयं-सुधारणा करते"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"अज्ञात वर्ण"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"अधिक चिन्हे"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"चिन्हे"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"हटवा"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"चिन्हे"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"अक्षरे"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"नंबर"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"सेटिंग्ज"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"व्हॉइस इनपुट"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"इमोजी"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"परत"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"शोधा"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"बिंदू"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"भाषा स्विच करा"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"पुढील"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"मागील"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift सक्षम"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock सक्षम"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"चिन्हे मोड"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"अधिक चिन्हे मोड"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"अक्षरे मोड"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"फोन मोड"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"फोन चिन्हे मोड"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"कीबोर्ड लपविलेला आहे"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> कीबोर्ड दर्शवित आहे"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"तारीख"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"तारीख आणि वेळ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ईमेल"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"संदेशन"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"नंबर"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"फोन"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"मजकूर पाठवा"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"वेळ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"अलीकडील"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"सहभागी"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ऑब्जेक्टस्"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"निसर्ग"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ठिकाणे"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"चिन्हे"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"इमोटिकॉन"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"कॅपिटल <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"कॅपिटल आय"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"कॅपिटल आय, वर बिंदू"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"अज्ञात प्रतीक"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"अज्ञात इमोजी"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"वैकल्पिक वर्ण उपलब्ध आहेत"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"वैकल्पिक वर्ण डिसमिस केलेले आहेत"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"वैकल्पिक सूचना उपलब्ध आहेत"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"वैकल्पिक सूचना डिसमिस केलेल्या आहेत"</string> +</resources> diff --git a/java/res/values-mr-rMH/strings.xml b/java/res/values-mr-rMH/strings.xml new file mode 100644 index 000000000..3ef3cf223 --- /dev/null +++ b/java/res/values-mr-rMH/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट पर्याय"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"संपर्क नावे शोधा"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"शब्दलेखन तपासक आपल्या संपर्क सूचीमधील प्रविष्ट्या वापरतो"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"कीप्रेस करताना होणारे कंपन"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"कीप्रेस करताना होणारा ध्वनी"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"कीप्रेस करताना पॉपअप"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"अन्य इनपुट पद्धतींवर स्विच करा"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"भाषा स्विच की अन्य इनपुट पद्धती देखील समाविष्ट करते"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"भाषा स्विच की"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"एकाधिक इनपुट भाषा सक्षम केलेल्या असताना दर्शवा"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"स्लाइड दर्शक दर्शवा"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift किंवा Symbol की वरून स्लाइड करताना व्हिज्युअल सूचक प्रदर्शित करा"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"की पॉपअप विलंब डिसमिस करते"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"विलंब नाही"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डीफॉल्ट"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>मिसे"</string> + <string name="settings_system_default" msgid="6268225104743331821">"सिस्टम डीफॉल्ट"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नावे सुचवा"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सूचनांसाठी आणि सुधारणांसाठी संपर्कांमधील नावे वापरा"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"वैयक्तिकृत केलेल्या सूचना"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> मध्ये सुधारणा करा"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"डबल-स्पेस पूर्णविरामचिन्ह"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबारवर डबल टॅप केल्याने पूर्णविरामचिन्ह व त्यापाठोपाठ स्पेस घातली जाते"</string> + <string name="auto_cap" msgid="1719746674854628252">"स्वयं-कॅपिटलायझेशन"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"प्रत्येक वाक्याचा पहिला शब्द कॅपिटल करा"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"वैयक्तिक शब्दकोश"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"अॅड-ऑन शब्दकोश"</string> + <string name="main_dictionary" msgid="4798763781818361168">"मु्ख्य शब्दकोश"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"सुधारणा सूचना दर्शवा"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"टाइप करताना सुचविलेले शब्द प्रदर्शित करा"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"नेहमी दर्शवा"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"पोर्ट्रेट मोडमध्ये दर्शवा"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"नेहमी लपवा"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"आक्षेपार्ह शब्द अवरोधित करा"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"संभाव्य आक्षेपार्ह शब्द सुचवू नका"</string> + <string name="auto_correction" msgid="7630720885194996950">"स्वयं-सुधारणा"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"चुकीचे टाइप केलेले शब्द स्पेसबार आणि विरामचिन्हे स्वयंचलितपणे सुधारते"</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_aggressive" msgid="7319007299148899623">"आक्रमक"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"खूप आक्रमक"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"पुढील-शब्द सूचना"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"सूचना करताना मागील शब्द वापरा"</string> + <string name="gesture_input" msgid="826951152254563827">"जेश्चर टायपिंग सक्षम करा"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"अक्षरांमधून स्लायडिंग करून एक शब्द इनपुट करा"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"जेश्चर अनुचिन्ह दर्शवा"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"डायनॅमिक फ्लोटिंग पूर्वावलोकन"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"जेश्चरींग करत असताना सुचविलेले शब्द पहा"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश जेश्चर"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"स्पेस की वर ग्लायडिंग करून जेश्चर दरम्यान स्थाने इनपुट करा"</string> + <string name="voice_input" msgid="3583258583521397548">"व्हॉइस इनपुट की"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"व्हॉइस इनपुट पद्धती सक्षम केल्या नाहीत. भाषा आणि इनपुट सेटिंग्ज तपासा."</string> + <string name="configure_input_method" msgid="373356270290742459">"इनपुट पद्धती कॉन्फिगर करा"</string> + <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषा"</string> + <string name="send_feedback" msgid="1780431884109392046">"अभिप्राय पाठवा"</string> + <string name="select_language" msgid="3693815588777926848">"इनपुट भाषा"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"जतन करण्यासाठी पुन्हा स्पर्श करा"</string> + <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"कीबोर्ड थीम"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"इंग्रजी (यूके)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"इंग्रजी (यूएस)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"स्पॅनिश (यूएस)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"इंग्रजी (यूके) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"इंग्रजी (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"स्पॅनिश (यूएस) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (पारंपारिक)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (सिरिलिक)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (लॅटिन)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"भाषा नाही (वर्णमाला)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"वर्णमाला (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"वर्णमाला (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"वर्णमाला (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"वर्णमाला (ड्व्होरॅक)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"वर्णमाला (कोलमॅक)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णमाला (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"इमोजी"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"सानुकूल इनपुट शैली"</string> + <string name="add_style" msgid="6163126614514489951">"शैली जोडा"</string> + <string name="add" msgid="8299699805688017798">"जोडा"</string> + <string name="remove" msgid="4486081658752944606">"काढा"</string> + <string name="save" msgid="7646738597196767214">"जतन करा"</string> + <string name="subtype_locale" msgid="8576443440738143764">"भाषा"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"लेआउट"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"आपली सानुकूल इनपुट शैली आपण ती वापरणे प्रारंभ करण्यापूर्वी सक्षम करणे आवश्यक आहे. आपण आता ती सक्षम करू इच्छिता?"</string> + <string name="enable" msgid="5031294444630523247">"सक्षम करा"</string> + <string name="not_now" msgid="6172462888202790482">"आता नाही"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"समान इनपुट शैली आधीपासूनच अस्तित्वात आहे: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"की जास्त दाबण्यात विलंब"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"कीप्रेस कंपन कालावधी"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"कीप्रेस ध्वनी तीव्रता"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाह्य शब्दकोश फाईल वाचा"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फोल्डरमध्ये शब्दकोश फायली नाहीत"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"स्थापित करण्यासाठी शब्दकोश फाईल निवडा"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> साठी ही फाईल खरोखर स्थापित करायची?"</string> + <string name="error" msgid="8940763624668513648">"एक त्रुटी आली"</string> + <string name="button_default" msgid="3988017840431881491">"डीफॉल्ट"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> वर स्वागत आहे"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"जेश्चर टायपिंग करून"</string> + <string name="setup_start_action" msgid="8936036460897347708">"प्रारंभ करा"</string> + <string name="setup_next_action" msgid="371821437915144603">"पुढील चरण"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सेट अप करत आहे"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सक्षम करा"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"कृपया आपल्या भाषेमध्ये आणि इनपुट सेटिंग्जमध्ये \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" तपासा. हे त्याचे आपल्या डिव्हाइसवर चालणे अधिकृत करेल."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> आपल्या भाषेत आणि इनपुट सेटिंग्जमध्ये आधीपासून सक्षम केले आहे, म्हणून हे चरण पूर्ण झाले आहे. पुढच्या चरणावर!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"सेटिंग्जमध्ये सक्षम करा"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> वर स्विच करा"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"पुढे, आपली सक्रिय मजकूर-इनपुट पद्धत म्हणून \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" निवडा."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"इनपुट पद्धती स्विच करा"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"अभिनंदन, आता आपण सज्ज आहात!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"आता आपण <xliff:g id="APPLICATION_NAME">%s</xliff:g> सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता."</string> + <string name="setup_step3_action" msgid="600879797256942259">"अतिरिक्त भाषा कॉन्फिगर करा"</string> + <string name="setup_finish_action" msgid="276559243409465389">"समाप्त"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"अॅप चिन्ह दर्शवा"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"लाँचर मध्ये अनुप्रयोग चिन्ह प्रदर्शित करा"</string> + <string name="app_name" msgid="6320102637491234792">"शब्दकोश प्रदाता"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"शब्दकोश प्रदाता"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"शब्दकोश सेवा"</string> + <string name="download_description" msgid="6014835283119198591">"शब्दकोश अद्यतन माहिती"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"अॅड-ऑन शब्दकोश"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"शब्दकोश उपलब्ध"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"शब्दकोशांसाठी सेटिंग्ज"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"वापरकर्ता शब्दकोश"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"वापरकर्ता शब्दकोश"</string> + <string name="dictionary_available" msgid="4728975345815214218">"शब्दकोश उपलब्ध"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"सध्या डाउनलोड करत आहे"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"स्थापित केले"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"स्थापित केले, अक्षम केले"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"शब्दकोश सेवेस कनेक्ट करताना समस्या"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"कोणतेही शब्दकोश उपलब्ध नाहीत"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"रीफ्रेश करा"</string> + <string name="last_update" msgid="730467549913588780">"अंतिम अद्यतनित"</string> + <string name="message_updating" msgid="4457761393932375219">"अद्यतनांसाठी तपासत आहे"</string> + <string name="message_loading" msgid="5638680861387748936">"लोड करीत आहे..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"मु्ख्य शब्दकोश"</string> + <string name="cancel" msgid="6830980399865683324">"रद्द करा"</string> + <string name="go_to_settings" msgid="3876892339342569259">"सेटिंग्ज"</string> + <string name="install_dict" msgid="180852772562189365">"स्थापित करा"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द करा"</string> + <string name="delete_dict" msgid="756853268088330054">"हटवा"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"आपल्या मोबाईल डिव्हाइसवर निवडलेल्या भाषेमध्ये शब्दकोश उपलब्ध आहे.<br/> आम्ही आपला टायपिंग अनुभव सुधारण्यासाठी <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> शब्दकोश <b>डाउनलोड करण्याची</b> शिफारस करतो.<br/> <br/> डाउनलोड कऱण्यास 3G वर एक किंवा दोन मिनिट लागू शकतात. आपल्याकडे <b>अमर्यादित डेटा योजना</b> नसल्यास शुल्क लागू शकते. आपल्याकडे असलेल्या डेटा योजनेबद्दल आपण सुनिश्चित नसल्यास, डाउनलोड स्वयंचलितपणे प्रारंभ करण्यासाठी Wi-Fi कनेक्शन शोधण्याची शिफारस आम्ही करतो.<br/> <br/> टीप: आपण आपल्या मोबाईल डिव्हाइसच्या <b>सेटिंग्ज</b>मेनूमधील <b>भाषा आणि इनपुट</b> वर जाऊन शब्दकोश डाउनलोड करू आणि काढू शकता."</string> + <string name="download_over_metered" msgid="1643065851159409546">"आता डाउनलोड करा (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi वर डाउनलोड करा"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> साठी शब्दकोश उपलब्ध आहे"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"पुनरावलोकन करण्यासाठी आणि डाउनलोड करण्यासाठी दाबा"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"डाउनलोड करत आहे: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> साठी सूचना लवकरच तयार होतील."</string> + <string name="version_text" msgid="2715354215568469385">"आवृत्ती <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"जोडा"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"शब्दकोशात जोडा"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"वाक्यांश"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"अधिक पर्याय"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"कमी पर्याय"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ठीक"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"शब्द:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"शॉर्टकट:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"भाषा:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"एक शब्द टाईप करा"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"पर्यायी शॉर्टकट"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"शब्द संपादित करा"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"संपादित करा"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"हटवा"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"आपल्याकडे वापरकर्ता शब्दकोशात कोणतेही शब्द नाहीत. जोडा (+) बटणास स्पर्श करून शब्द जोडा."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"सर्व भाषांसाठी"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"अधिक भाषा..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"हटवा"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-ms-rMY/strings-action-keys.xml b/java/res/values-ms-rMY/strings-action-keys.xml index f1a75d2ef..b839960c0 100644 --- a/java/res/values-ms-rMY/strings-action-keys.xml +++ b/java/res/values-ms-rMY/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Sblm"</string> <string name="label_done_key" msgid="7564866296502630852">"Siap"</string> <string name="label_send_key" msgid="482252074224462163">"Hntr"</string> + <string name="label_search_key" msgid="7965186050435796642">"Carian"</string> <string name="label_pause_key" msgid="2225922926459730642">"Jeda"</string> <string name="label_wait_key" msgid="5891247853595466039">"Tggu"</string> </resources> diff --git a/java/res/values-ms-rMY/strings-config-important-notice.xml b/java/res/values-ms-rMY/strings-config-important-notice.xml new file mode 100644 index 000000000..705d34ec3 --- /dev/null +++ b/java/res/values-ms-rMY/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Perbaik cadangan berdasarkan komunikasi anda dan data yang ditaip"</string> +</resources> diff --git a/java/res/values-ms-rMY/strings-emoji-descriptions.xml b/java/res/values-ms-rMY/strings-emoji-descriptions.xml new file mode 100644 index 000000000..1595a99a7 --- /dev/null +++ b/java/res/values-ms-rMY/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Tanda hak cipta"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Tanda berdaftar"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Tanda seruan berkembar"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Tanda tanya seruan"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Tanda cap dagangan"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Sumber maklumat"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Anak panah kiri kanan"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Anak panah atas bawah"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Anak panah barat laut"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Anak panah timur laut"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Anak panah tenggara"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Anak panah barat daya"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Anak panah hala kiri dengan cangkuk"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Anak panah hala kanan dengan cangkuk"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Jam"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Jam pasir"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Segi tiga kembar arah kanan hitam"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Segi tiga kembar arah kiri hitam"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Segi tiga kembar arah atas hitam"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Segi tiga kembar arah bawah hitam"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Jam penggera"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Jam pasir dengan pasir mengalir"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Huruf m besar latin dalam bulatan"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Empat segi kecil hitam"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Empat segi kecil putih"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Segi tiga arah kanan hitam"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Segi tiga arah kiri hitam"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Empat segi sederhana putih"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Empat segi sederhana hitam"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Empat segi sederhana kecil putih"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Empat segi sederhana kecil hitam"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Matahari dengan sinar hitam"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Awan"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Telefon hitam"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Peti undi dengan tanda semak"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Payung dengan titisan hujan"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Minuman panas"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Indeks putih menunjuk ke atas"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Muka tersenyum putih"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Aries"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Taurus"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gemini"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Cancer"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leo"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Virgo"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Libra"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Scorpius"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Sagittarius"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricorn"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquarius"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Pisces"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Daun sped hitam"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Daun kelawar hitam"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Daun hati hitam"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Daun berlian hitam"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Air panas"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Simbol kitar semula universal hitam"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Simbol kerusi roda"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Sauh"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Tanda amaran"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Tanda voltan tinggi"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Bulatan putih sederhana"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Bulatan hitam sederhana"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Bola sepak"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Besbol"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Orang salji tanpa salji"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Matahari di sebalik awan"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Dilarang masuk"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Gereja"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Air pancut"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Bendera dalam lubang"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Kapal layar"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Khemah"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Pam minyak"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Gunting hitam"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Tanda semak tebal putih"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Kapal terbang"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Sampul surat"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Penumbuk"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Tangan diangkat"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Tanda menang"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Pensel"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Mata pen hitam"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Tanda semak tebal"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"X darab tebal"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Kilauan"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Asterisk berbucu lapan"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Bintang hitam berbucu lapan"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Emping salji"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Kilauan"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Tanda silang"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Tanda silang empat segi negatif"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Perhiasan tanda tanya hitam"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Perhiasan tanda tanya putih"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Perhiasan tanda seruan putih"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Simbol tanda seruan tebal"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Hati hitam tebal"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Tanda tambah tebal"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Tanda tolak tebal"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Tanda bahagi tebal"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Anak panah hala kanan hitam"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Gelung bergulung"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Gelung bergulung kembar"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Anak panah menghala ke kanan kemudian melengkung ke atas"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Anak panah menghala ke kanan kemudian melengkung ke bawah"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Anak panah hitam hala kiri"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Anak panah hitam hala atas"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Anak panah hitam hala bawah"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Empat segi besar hitam"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Empat segi besar putih"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Bintang sederhana putih"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Bulatan besar tebal"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Sengkang beralun"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Tanda perselangan silih"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Ideograf tahniah bulat"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Ideograf rahsia bulat"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Naga merah jubin mahjong"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Joker hitam daun terup"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Jenis darah A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Jenis darah B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Jenis darah O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Tempat letak kereta"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Jenis darah AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"CL empat segi"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"Tenang empat segi"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"Percuma empat segi"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"ID empat segi"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"Baharu empat segi"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"NG empat segi"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"OK empat segi"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"SOS empat segi"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"Naik dengan tanda seruan empat segi"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"Lawan empat segi"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Katakana di sini empat segi"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Perkhidmatan katakana empat segi"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Ideograf percuma empat segi"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Ideograf tempat duduk yang ditempah empat segi"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Ideograf larangan empat segi"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Ideograf jawatan kosong empat segi"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Ideograf penerimaan empat segi"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Ideograf penuh empat segi"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Ideograf dibayar empat segi"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Ideograf bulanan empat segi"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Ideograf permohonan empat segi"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Ideograf diskaun empat segi"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Ideograf perniagaan dibuka empat segi"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Ideograf kelebihan bulat"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Ideograf terima bulat"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Puting beliung"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Berkabut"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Payung tertutup"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Malam dengan bintang"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Matahari terbit di atas gunung"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Sunrise"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Skap bandar raya waktu senja"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Matahari terbenam di atas bangunan"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Pelangi"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Jambatan pada waktu malam"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Gelombang air"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Gunung Berapi"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Bima sakti"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Glob bumi eropah-afrika"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Glob bumi amerika"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Glob bumi asia-australia"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Glob dengan meridian"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Simbol bulan baharu"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Simbol bulan sabit mengambang"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Simbol bulan suku pertama"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Simbol bulan hampir purnama mengambang"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Simbol bulan purnama"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Simbol bulan hampir purnama surut"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Simbol bulan suku akhir"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Simbol bulan sabit surut"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Bulan sabit"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Bulan baharu dengan muka"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Bulan suku pertama dengan muka"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Bulan suku akhir dengan muka"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Bulan purnama dengan muka"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Matahari dengan muka"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Bintang bersinar"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Tahi bintang"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Buah berangan"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Anak benih"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Pokok malar hijau"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Pokok daun luruh"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Pokok palma"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Kaktus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Tulip"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Bunga sakura"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Ros"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Bunga raya"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Bunga matahari"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Bunga"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Tongkol jagung"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Pokok padi"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Herba"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Empat daun semanggi"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Daun mapel"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Daun gugur"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Daun ditiup angin"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Cendawan"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tomato"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Terung"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Anggur"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Tembikai"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Tembikai"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Oren Tangerin"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Lemon"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Kuning Pisang"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Nanas"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Epal merah"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Epal hijau"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pear"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Pic"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Ceri"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Strawberi"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamburger"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Sepotong piza"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Daging pada tulang"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Kaki ayam"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Keropok beras"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Bebola beras"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Nasi"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Kari dan nasi"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Mangkuk mengukus"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spageti"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Roti"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Kentang goreng"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Ubi keledek panggang"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Udang goreng"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Kek ikan dengan corak pusaran"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Aiskrim lembut"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Ais kisar"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Aiskrim"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Donat"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Biskut"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Bar coklat"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Kandi"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Lolipop"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Kastad"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Bekas madu"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Kek rapuh"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Kotak Bento"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Seperiuk makanan"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Masakan"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Garpu dan pisau"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Cawan tanpa pemegang"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Botol Sake dan cawan"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Gelas wain"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Gelas koktel"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Minuman tropika"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Kole bir"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Kole bir dihantukkan"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Botol bayi"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Reben"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Hadiah berbalut"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Kek hari lahir"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack-o-lantern"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Pokok Krismas"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Santa Klaus"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Bunga api"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Bunga api berlian"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Belon"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Peletus konfeti"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Bola Konfeti"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Pokok Tanabata"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Bendera berpalang"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Hiasan pain"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Anak patung Jepun"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Ular-ular kap"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Loceng angin"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Majlis melihat bulan"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Beg galas sekolah"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Topi graduasi"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Kuda karusel"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Roda Ferris"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Roller-coaster"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Joran dan ikan"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Mikrofon"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Kamera filem"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Pawagam"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Fon kepala"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Palet Artis"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Topi"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Khemas sarkas"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Tiket"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Papan ketap"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Seni persembahan"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Permainan video"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Tepat pada sasaran"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Mesin slot"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Biliard"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Dadu"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Boling"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Daun terup bunga"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Nota muzik"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Pelbagai nota muzik"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saksofon"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Gitar"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Papan nada muzik"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trompet"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Biola"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Skor muzik"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Baju berlari dengan selempang"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Raket dan bola tenis"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Ski dan but ski"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Bola keranjang dan gelung"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Bendera kotak-kotak"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Peluncur salji"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Pelari"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Peluncur"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Trofi"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Lumba kuda"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Bola sepak Amerika"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Bola sepak ragbi"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Perenang"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Bangunan rumah"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Rumah dengan taman"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Bangunan pejabat"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Pejabat pos Jepun"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Pejabat pos Eropah"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Hospital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Bank"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Mesin teler automatik"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Hotel cinta"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Kedai serbaneka"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Sekolah"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Gedung beli-belah"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Kilang"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Tanglung izakaya"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Istana Jepun"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Istana Eropah"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Tikus"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Tikus"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Lembu jantan"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Kerbau"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Lembu"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Harimau Bintang"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Arnab"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Kucing"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Naga"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Buaya"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Ikan paus"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Siput"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Ular"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Kuda"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Biri-biri jantan"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Kambing"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Biri-biri"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Monyet"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Ayam jantan"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Ayam"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Anjing"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Babi"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Babi hutan"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Gajah"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Kurita"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Cengkerang berpusar"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Pepijat"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Semut"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Lebah madu"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Kumbang kura-kura"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Ikan"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Ikan tropika"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Ikan buntal"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Penyu"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Anak ayam menetas"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Anak ayam"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Anak ayam menghadap depan"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Burung"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Penguin"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Poodle"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Unta dromedaris"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Unta Bactrian"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Dolfin"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Muka tikus"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Muka lembu"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Muka harimau"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Muka arnab"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Muka kucing"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Muka naga"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Ikan paut memancutkan air"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Muka kuda"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Muka monyet"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Muka anjing"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Muka babi"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Muka katak"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Muka hamster"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Muka serigala"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Muka beruang"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Muka panda"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Hidung babi"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Kesan tapak"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Mata"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Telinga"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Hidung"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Mulut"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Lidah"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Tangan putih menunjuk ke atas"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Tangan putih menunjuk ke bawah"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Tangan putih menunjuk ke kiri"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Tangan putih menunjuk ke kanan"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Isyarat enumbuk"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Isyarat tangan melambai"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Isyarat ok"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Isyarat bagus"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Isyarat tidak bagus"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Isyarat bertepuk tangan"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Isyarat tangan terbuka"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Mahkota"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Topi wanita"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Cermin mata"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Tali leher"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Kemeja T"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Jean"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Gaun"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikini"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Pakaian wanita"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Beg duit"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Beg tangan"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Dompet"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Kasut lelaki"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Kasut sukan"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Kasut tumit tinggi"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Sandal wanita"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"But wanita"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Tapak kaki"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Bayang patung"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Bayang patung"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Budak lelaki"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Budak perempuan"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Lelaki"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Wanita"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Keluarga"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Lelaki dan wanita berpegangan tangan"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Dua lelaki berpegangan tangan"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Dua wanita berpegangan tangan"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Pegawai polis"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Wanita dengan telinga arnab"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Pengantin dengan vel"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Orang berambut perang"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Lelaki dengan gua pi mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Lelaki berserban"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Lelaki lebih tua"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Wanita lebih tua"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Bayi"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Buruh binaan"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Puteri"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Gergasi Jepun"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Jembalang Jepun"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Bebayang"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Malaikat kecil"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Makhluk asing"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Raksasa asing"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Imp"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Tengkorak"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Orang meja maklumat"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Pengawal"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Penari"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Gincu"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Pengilat kuku"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Urutan muka"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Gunting rambut"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Jalur Tukang Gunting Rambut"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Picagari"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pil"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Tanda ciuman"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Surat cinta"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Cincin"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Batu permata"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Ciuman"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Jambak bunga"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Pasangan dengan hati"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Perkahwinan"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Jantung berdegup"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Patah hati"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Dua hati"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Hati berkilauan"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Hati berkembang"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Hati dengan anak panah"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Hati biru"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Hati hijau"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Hati kuning"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Hati ungu"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Hati dengan riben"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Hati berputar"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Hiasan hati"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Bentuk berlian dengan titik di dalam"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Mentol elektrik"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Simbol kemarahan"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bom"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Simbol tidur"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Simbol pelanggaran"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Simbol peluh memercik"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Titik kecil"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Simbol sengkang"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Timbunan najis"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Biseps dilenturtegang"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Simbol pening"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Belon pertuturan"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Belon pemikiran"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Bunga putih"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Simbol seratus mata"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Beg wang"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Pertukaran mata wang"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Isyarat dolar tebal"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Kad kredit"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Wang kertas dengan tanda yen"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Wang kertas dengan tanda dolar"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Wang kertas dengan tanda euro"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Wang kertas dengan tanda pound"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Wang dengan sayap"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Carta dengan aliran ke atas dan tanda yen"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Tempat duduk"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Komputer peribadi"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Beg bimbit"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minicakera"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Cakera liut"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Cakera optik"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"Dvd"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Folder fail"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Buka folder fail"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Halaman bergulung"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Halaman menghadap ke atas"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Kalendar"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Kalendar koyak"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Kad indeks"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Carta dengan aliran ke atas"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Carta dengan aliran ke bawah"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Carta bar"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Papan Keratan"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Pin tekan"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Pin tekan bulat"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Klip kertas"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Pembaris lurus"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Pembaris segi tiga"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Tab penanda halaman"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Lejar"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Buku Nota"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Buku nota dengan kulit bercorak"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Buku tertutup"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Buku terbuka"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Buku hijau"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Buku biru"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Buku jingga"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Buku"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Lencana nama"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Skrol"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memo"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Gagang telefon"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Alat kelui"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Mesin faks"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Antena satelit"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Pembesar suara pengumuman awam"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Megafon sorakan"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Dulang peti keluar"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Dulang peti masuk"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Pakej"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Simbol e-mel"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Sampul surat masuk"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Sampul surat dengan anak panah ke bawah di atas"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Peti mel tertutup dengan bendera diturunkan"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Peti mel tertutup dengan bendera dinaikkan"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Peti mel terbuka dengan bendera dinaikkan"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Peti mel terbuka dengan bendera diturunkan"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Peti surat"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Hon pos"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Surat khabar"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Telefon mudah alih"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Telefon mudah alih dengan anak panah hala kanan di sebelah kiri"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Mod getaran"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Telefon mudah alih dimatikan"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Tiada telefon mudah alih"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antena dengan bar"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Kamera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Kamera video"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Televisyen"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Kaset Video"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Anak panah hala kanan berpintal"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Anak panah bulatan terbuka hala kanan dan hala kiri mengikut arah jam"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Anak panah bulatan terbuka hala kanan dan hala kiri mengikut arah jam dengan tindihan satu dalam bulatan"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Anak panah bulatan terbuka menurun dan menaik mengikut arah jam"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Anak panah bulatan terbuka menurun dan menaik lawan arah jam"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Simbol cahaya rendah"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Simbol cahaya tinggi"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Pembesar suara dengan garisan pembatalan"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Pembesar suara"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Pembesar suara dengan satu gelombang bunyi"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Pembesar suara dengan tiga gelombang bunyi"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Bateri"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Palam elektrik"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Kanta pembesar menunjuk ke kiri"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Kata pembesar menunjuk ke kanan"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Mangga dengan pen dakwat"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Mangga tertutup dengan kunci"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Anak kunci"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Mangga"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Mangga terbuka"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Loceng"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Loceng dengan garisan pembatalan"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Penanda halaman"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Simbol pautan"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Butang radio"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Kembali dengan anak panah hala kiri di atas"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"Akhir dengan anak panah hala kiri di atas"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"Hidup dengan tanda seruan dengan anak panah kiri kanan di atas"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Tidak lama lagi dengan anak panah hala kiri di atas"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Atas dengan anak panah hala atas di atas"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Simbol tiada sesiapa di bawah umur 18 tahun"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Butang kekunci sepuluh"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Simbol input huruf besar latin"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Simbol input huruf kecil latin"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Simbol input nombor"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Simbol input untuk simbol"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Simbol input huruf latin"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Api"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Lampu suluh"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Sepana"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Tukul"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Nat dan bolt"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hocho"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistol"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Mikroskop"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Teleskop"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Bola kristal"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Bintang berbucu enam dengan titik tengah"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Simbol Jepun untuk perantis"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Lambang trisula"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Butang empat segi hitam"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Butang empat segi putih"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Bulatan merah besar"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Bulatan biru besar"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Berlian oren besar"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Berlian biru besar"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Berlian oren kecil"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Berlian biru kecil"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Segi tiga merah menunjuk ke atas"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Segi tiga merah menunjuk ke bawah"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Segi tiga merah kecil menunjuk ke atas"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Segi tiga merah kecil menunjuk ke bawah"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Muka jam pukul satu"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Muka jam pukul dua"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Muka jam pukul tiga"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Muka jam pukul empat"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Muka jam pukul lima"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Muka jam pukul enam"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Muka jam pukul tujuh"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Muka jam pukul lapan"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Muka jam pukul sembilan"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Muka jam pukul sepuluh"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Muka jam pukul sebelas"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Muka jam pukul dua belas"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Muka jam pukul satu setengah"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Muka jam pukul dua setengah"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Muka jam pukul tiga setengah"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Muka jam pukul empat setengah"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Muka jam pukul lima setengah"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Muka jam pukul enam setengah"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Muka jam pukul tujuh setengah"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Muka jam pukul lapan setengah"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Muka jam pukul sembilan setengah"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Muka jam pukul sepuluh setengah"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Muka jam pukul sebelas setengah"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Muka jam pukul dua belas setengah"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Gunung fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Menara Tokyo"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Patung Liberty"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Bebayang jepun"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Muka tersengih"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Muka tersengih dengan mata tersenyum"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Muka dengan air mata kegembiraan"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Muka tersenyum dengan mulut terbuka"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Muka tersenyum dengan mulut terbuka dan mata tersenyum"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Muka tersenyum dengan mulut terbuka dan peluh dingin"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Muka tersenyum dengan mulut terbuka dan mata terpejam rapat"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Muka tersenyum dengan halo"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Muka tersenyum dengan tanduk"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Muka mengenyit mata"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Muka tersenyum dengan mata tersenyum"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Muka menikmati makanan lazat"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Muka lega"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Muka tersenyum dengan mata berbentuk hati"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Muka tersenyum dengan cermin mata hitam"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Muka mencebik"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Muka neutral"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Muka tanpa perasaan"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Muka tidak hairan"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Muka dengan peluh dingin"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Muka termenung"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Muka keliru"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Muka bingung"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Muka bercium"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Muka melayangkan ciuman"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Muka bercium dengan mata tersenyum"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Muka bercium dengan mata tertutup"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Muka dengan lidah terjelir"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Muka dengan lidah terjelir dan mengenyitkan mata"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Muka dengan lidah terjelir dan mata tertutup rapat"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Muka kecewa"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Muka bimbang"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Muka marah"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Muka muncung"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Muka menangis"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Muka bersungguh-sungguh"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Muka dengan rupa kemenangan"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Muka kecewa tetapi lega"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Muka muram dengan mulut terbuka"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Muka sedih"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Muka takut"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Muka letih"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Muka mengantuk"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Muka penat"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Muka berkerut"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Muka menangis kuat"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Muka dengan mulut terbuka"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Muka diam"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Muka dengan mulut terbuka dan peluh dingin"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Muka menjerit ketakutan"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Muka terperanjat"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Muka merah"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Muka tidur"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Muka pening"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Muka tanpa mulut"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Muka dengan topeng perubatan"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Muka kucing tersengih dengan mata tersenyum"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Muka kucing dengan air mata kegembiraan"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Muka kucing tersenyum dengan mulut terbuka"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Muka kucing tersenyum dengan mata berbentuk hati"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Muka kucing dengan senyuman sinis"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Muka kucing bercium dengan mata tertutup"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Muka kucing muncung"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Muka kucing menangis"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Muka kucing letih"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Muka tanpa gerak isyarat baik"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Muka dengan gerak isyarat ok"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Orang menunduk lama"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Monyet menutup mata"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Monyet menutup telinga"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Monyet menutup mulut"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Orang gembira mengangkat satu tangan"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Orang mengangkat kedua-dua tangan untuk meraikan"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Orang muram"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Orang dengan muka muncung"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Orang dengan tangan bersilang"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Roket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helikopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Kepala kereta api wap"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Kereta api"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Kereta api kelajuan tinggi"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Kereta api kelajuan tinggi dengan muncung peluru"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Kereta api"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Aliran ringan"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Stesen"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Trem"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Kereta trem"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bas"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Bas dari arah depan"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Bas elektrik"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Perhentian bas"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Bas mini"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulans"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Kereta bomba"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Kereta polis"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Kereta polis dari arah depan"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Teksi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Teksi dari arah depan"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Kereta"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Kereta dari arah depan"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Kenderaan rekreasi"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Trak penghantaran"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Lori sambung sendi"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Traktor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorel"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Kereta api gunung"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Kereta api tergantung"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Kereta kabel gunung"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Trem udara"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Kapal"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Perahu dayung"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Bot laju"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Lampu isyarat mendatar"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Lampu isyarat menegak"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Tanda pembinaan"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Lampu berputar kereta polis"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Bendera segi tiga pada tiang"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Pintu"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Isyarat dilarang masuk"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Simbol merokok"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Simbol dilarang merokok"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Simbol buang sampah di tempatnya"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Simbol jangan buang sampah"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Simbol air boleh diminum"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Simbol air tidak boleh diminum"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Basikal"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Tiada basikal"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Penunggang basikal"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Penunggang basikal gunung"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pejalan kaki"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Tiada pejalan kaki"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Kanak-kanak melintas"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Simbol lelaki"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Simbol wanita"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Tandas"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Simbol bayi"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Tandas"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Tandas"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Pancuran"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bilik mandi"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Tab mandi"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Kawalan pasport"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Kastam"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Tuntutan bagasi"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Bagasi kiri"</string> +</resources> diff --git a/java/res/values-ms-rMY/strings-letter-descriptions.xml b/java/res/values-ms-rMY/strings-letter-descriptions.xml new file mode 100644 index 000000000..3af5ea247 --- /dev/null +++ b/java/res/values-ms-rMY/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Penunjuk ordinal feminin"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Tanda mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Penunjuk ordinal maskulin"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S tajam"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grava"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akut"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, sirkumfleks"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, gelung di atas"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, huruf kembar"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedila"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grava"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akut"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, sirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grava"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akut"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, sirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grava"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akut"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, sirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, strok"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grava"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akut"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, sirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akut"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brif"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akut"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, sirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, titik di atas"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, strok"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brif"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, titik di atas"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, sirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brif"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, titik di atas"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedila"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, sirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, strok"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brif"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I tanpa titik"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, huruf kembar"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, sirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedila"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akut"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedila"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, titik tengah"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, strok"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akut"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedila"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, didahului oleh koma terbalik"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brif"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, akut berganda"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, huruf kembar"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akut"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedila"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akut"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, sirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedila"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedila"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, strok"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brif"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, gelung di atas"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, akut berkembar"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, sirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, sirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akut"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, titik di atas"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S Panjang"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, tanduk"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, tanduk"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, koma di bawah"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, koma di bawah"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, titik di bawah"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, cangkuk di atas"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, sirkumfleks dan akut"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, sirkumfleks dan grava"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, sirkumfleks dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, sirkumfleks dan tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, sirkumfleks dan titik di bawah"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brif dan akut"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brif dan grava"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brif dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brif dan tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brif dan titik di bawah"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, titik di bawah"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, cangkuk di atas"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, sirkumfleks dan akut"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, sirkumfleks dan grava"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, sirkumfleks dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, sirkumfleks dan tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, sirkumfleks dan titik di bawah"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, cangkuk di atas"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, titik di bawah"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, titik di bawah"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, cangkuk di atas"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, sirkumfleks dan akut"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, sirkumfleks dan grava"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, sirkumfleks dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, sirkumfleks dan tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, sirkumfleks dan titik di bawah"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, tanduk dan akut"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, tanduk dan grava"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, tanduk dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, tanduk dan tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, tanduk dan titik di bawah"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, titik di bawah"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, cangkuk di atas"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, cangkuk dan akut"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, tanduk dan grafa"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, tanduk dan cangkuk di atas"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, tanduk dan tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, tanduk dan titik di bawah"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, titik di bawah"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, titik di atas"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Tanda seru terbalik"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Tanda petikan sudut berkembar menunjuk ke kiri"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Titik tengah"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superskrip satu"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Tanda petikan sudut berkembar menunjuk ke kanan"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Tanda soal terbalik"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Tanda petikan tunggal kiri"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Tanda petikan tunggal kanan"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tanda petikan 9 rendah tunggal"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Tanda petikan berkembar kiri"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Tanda petikan berkembar kanan"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Badik"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Badik berkembar"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Tanda per mille"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prima"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prima berkembar"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Tanda petikan sudut menunjuk ke kiri tunggal"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Tanda petikan sudut menunjuk ke kanan tunggal"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superskrip empat"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Huruf kecil n superskrip latin"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Tanda Peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dengan alamat"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Anak panah hala kanan"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Anak panah hala bawah"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Set kosong"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Kenaikan"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kurang daripada atau sama dengan"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lebih besar daripada atau sama dengan"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Bintang hitam"</string> +</resources> diff --git a/java/res/values-ms-rMY/strings-talkback-descriptions.xml b/java/res/values-ms-rMY/strings-talkback-descriptions.xml new file mode 100644 index 000000000..d5ae63713 --- /dev/null +++ b/java/res/values-ms-rMY/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebut dengan kuat."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Teks semasa adalah %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Tiada teks dimasukkan"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> membetulkan <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> melakukan auto pembetulan"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Aksara yang tidak diketahui"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Lagi simbol"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simbol"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Padam"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simbol"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Huruf"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Nombor"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Tetapan"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"{0}<td class=\"shortcuts\">{/0} Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Input suara"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Kembali"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Carian"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Titik"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Tukar bahasa"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Slps"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Sebelumnya"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Kunci anjak didayakan"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Kunci huruf besar didayakan"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Mod simbol"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Lagi mod simbol"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Mod huruf"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Mod telefon"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Mod simbol telefon"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Papan kekunci tersembunyi"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Menunjukkan papan kekunci <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"tarikh"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"tarikh dan masa"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mel"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"pemesejan"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"nombor"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teks"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"masa"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Terkini"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Orang"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objek"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Alam Semula Jadi"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tempat"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbol"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikon"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Huruf besar <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I huruf besar"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I huruf besar, titik di atas"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol yang tidak diketahui"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji yang tidak dikethui"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Aksara alternatif adalah tersedia"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Aksara alternatif diketepikan"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Cadangan alternatif tersedia"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Cadangan alternatif diketepikan"</string> +</resources> diff --git a/java/res/values-ms-rMY/strings.xml b/java/res/values-ms-rMY/strings.xml index c9b4a0359..1abe4fc4d 100644 --- a/java/res/values-ms-rMY/strings.xml +++ b/java/res/values-ms-rMY/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Pilihan input"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Arahan Log Penyelidikan"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cari nama kenalan"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Penyemak ejaan menggunakan entri dari senarai kenalan anda"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar pada tekanan kekunci"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Bunyi pada tekanan kekunci"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop timbul pada tekanan kunci"</string> - <string name="general_category" msgid="1859088467017573195">"Umum"</string> - <string name="correction_category" msgid="2236750915056607613">"Pembetulan teks"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Taipan gerak isyarat"</string> - <string name="misc_category" msgid="6894192814868233453">"Pilihan lain"</string> - <string name="advanced_settings" msgid="362895144495591463">"Tetapan lanjutan"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Pilihan untuk pakar"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Pilihan input"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Tampilan"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Pilihan berbilang bahasa"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Plhn taipan gerak isyarat"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Pembetulan teks"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Lanjutan"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Tukar ke kaedah input lain"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Kunci pertukaran bahasa meliputi kaedah masukan lain juga"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Kekunci tukar bahasa"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Tetapan asal sistem"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Cadangkan nama Kenalan"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama daripada Kenalan untuk cadangan dan pembetulan"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Cadangan diperibadikan"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Perbaik <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Titik ruang berganda"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetik 2X pada bar ruang memasukkan titik diikuti dengan ruang"</string> <string name="auto_cap" msgid="1719746674854628252">"Autopenghurufbesaran"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Tunjukkan jejak gerak isyarat"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratonton terapung dinamik"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat perkataan yang dicadangkan semasa membuat gerak isyarat"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Pasangkan set kepala untuk mendengar kekunci kata laluan disebut dengan kuat."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Teks semasa adalah %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Tiada teks dimasukkan"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> membetulkan <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> melakukan auto pembetulan"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kod kunci %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Kunci anjak dihidupkan (ketik untuk melumpuhkan)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Kunci huruf besar dihidupkan (ketik untuk melumpuhkan)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Padam"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simbol"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Huruf"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Numbers"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Tetapan"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Ruang"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Input suara"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Muka senyum"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Kembali"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Cari"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Titik"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Tukar bahasa"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Seterusnya"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Sebelumnya"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift didayakan"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Kunci huruf besar didayakan"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Kunci anjak dilumpuhkan"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mod simbol"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mod huruf"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mod telefon"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mod simbol telefon"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Papan kekunci tersembunyi"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Menunjukkan <xliff:g id="MODE">%s</xliff:g> papan kekunci"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"tarikh"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarikh dan masa"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mel"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"pemesejan"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"nombor"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teks"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"masa"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gerak isyarat frasa"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Luncur ke kekunci ruang untuk masukkan ruang semasa gerak isyarat"</string> <string name="voice_input" msgid="3583258583521397548">"Kunci input suara"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Pada papan kekunci utama"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Pada papan kekunci simbol"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Dimati"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon pada papan kekunci utama"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon pada papan kekunci simbol"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Tiada kaedah input suara didayakan. Semak Bahasa & tetapan input."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan kaedah input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string> <string name="send_feedback" msgid="1780431884109392046">"Hantar maklum balas"</string> <string name="select_language" msgid="3693815588777926848">"Bahasa input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Dayakan maklum balas pengguna"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Bantu memperbaik editor kaedah input ini dengan menghantar statistik penggunaan dan laporan ranap secara automatik"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema papan kekunci"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Bahasa Inggeris (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Bahasa Inggeris (Australia)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Bahasa Sepanyol (AS)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Bahasa Inggeris (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Bahasa Inggeris (AS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Bahasa Sepanyol (AS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Tradisional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Bahasa Inggeris (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Bahasa Inggeris (AS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Bahasa Sepanyol (AS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradisional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyril)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Tiada bahasa (Abjad)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Abjad (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Abjad (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Abjad (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Abjad (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Skim warna"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Putih"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Biru"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Tema papan kekunci"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Putih Halo"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Biru Halo"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Gelap Fizikal"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Terang Fizikal"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Gaya input peribadi"</string> <string name="add_style" msgid="6163126614514489951">"Tambah gaya"</string> <string name="add" msgid="8299699805688017798">"Tambah"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Dayakan"</string> <string name="not_now" msgid="6172462888202790482">"Bukan sekarang"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"The same input style already exists: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Mod kajian kebolehgunaan"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Kelewatan tekan lama kekunci"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Tempoh getaran tekan kekunci"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Kelantangan bunyi tekan kekunci"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Baca fail kamus luaran"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Tiada fail kamus dalam folder Muat Turun"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih fail kamus untuk dipasang"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Betul-betul pasang fail ini untuk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Betul-betul pasang fail ini untuk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Berlaku ralat"</string> <string name="button_default" msgid="3988017840431881491">"Lalai"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Selamat datang ke <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Muatkan semula"</string> <string name="last_update" msgid="730467549913588780">"Kali terakhir dikemas kini"</string> <string name="message_updating" msgid="4457761393932375219">"Menyemak kemas kini"</string> - <string name="message_loading" msgid="8689096636874758814">"Memuatkan..."</string> + <string name="message_loading" msgid="5638680861387748936">"Memuatkan…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Kamus utama"</string> <string name="cancel" msgid="6830980399865683324">"Batal"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Tetapan"</string> <string name="install_dict" msgid="180852772562189365">"Pasang"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Batal"</string> <string name="delete_dict" msgid="756853268088330054">"Padam"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Bahasa pilihan pada peranti mudah alih anda mempunyai kamus tersedia.<br/> Kami mengesyorkan <b>memuat turun</b> kamus <xliff:g id="LANGUAGE">%1$s</xliff:g> untuk memperbaik pengalaman menaip anda.<br/> <br/> Muat turun boleh mengambil masa seminit atau dua melalui 3G. Caj mungkin dikenakan jika anda tidak mempunyai <b>pelan data tanpa had</b>.<br/> Jika anda tidak pasti jenis pelan data yang anda miliki, kami mengesyorkan agar anda mencari sambungan Wi-Fi untuk mula memuat turun secara automatik.<br/> <br/> Petua: Anda boleh memuat turun dan mengalih keluar kamus dengan pergi ke menu <b>Bahasa & input</b> dalam <b>Tetapan</b> peranti mudah alih anda."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Bahasa pilihan pada peranti mudah alih anda sudah mempunyai kamus yang tersedia.<br/> Kami mengesyorkan <b>memuat turun</b> kamus <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> untuk memperbaik pengalaman menaip anda.<br/> <br/> Muat turun boleh mengambil masa satu atau dua minit melalui 3G. Caj mungkin dikenakan jika anda tidak mempunyai <b>pelan data tanpa had</b>.<br/> Jika anda tidak pasti jenis pelan data yang anda gunakan, kami mengesyorkan agar anda mencari sambungan Wi-Fi untuk mula memuat turun secara automatik.<br/> <br/> Petua: Anda boleh memuat turun dan mengalih keluar kamus dengan pergi ke menu <b>Bahasa& input</b> dalam <b>Tetapan</b> peranti mudah alih anda."</string> <string name="download_over_metered" msgid="1643065851159409546">"Muat turun sekarang (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Muat turun melalui Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamus tersedia untuk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Kamus tersedia untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Tekan untuk mengulas dan memuat turun"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Memuat turun: cadangan untuk <xliff:g id="LANGUAGE">%1$s</xliff:g> akan sedia tidak lama lagi."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Memuat turun: cadangan untuk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> akan sedia tidak lama lagi."</string> <string name="version_text" msgid="2715354215568469385">"Versi <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"tambah"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Tambah ke kamus"</string> diff --git a/java/res/values-my-rMM/strings-action-keys.xml b/java/res/values-my-rMM/strings-action-keys.xml new file mode 100644 index 000000000..888f55162 --- /dev/null +++ b/java/res/values-my-rMM/strings-action-keys.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for label_go_key (4033615332628671065) --> + <skip /> + <!-- no translation found for label_next_key (5586407279258592635) --> + <skip /> + <!-- no translation found for label_previous_key (1421141755779895275) --> + <skip /> + <!-- no translation found for label_done_key (7564866296502630852) --> + <skip /> + <!-- no translation found for label_send_key (482252074224462163) --> + <skip /> + <string name="label_search_key" msgid="7965186050435796642">"ရှာဖွေရန်"</string> + <!-- no translation found for label_pause_key (2225922926459730642) --> + <skip /> + <!-- no translation found for label_wait_key (5891247853595466039) --> + <skip /> +</resources> diff --git a/java/res/values-my-rMM/strings-letter-descriptions.xml b/java/res/values-my-rMM/strings-letter-descriptions.xml new file mode 100644 index 000000000..6dabe0f7a --- /dev/null +++ b/java/res/values-my-rMM/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ဣထိလိင် အစဉ်ပြ အညွှန်း"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"မိုက်ခရို သင်္ကေတ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ပုလိင် အစဉ်ပြ အညွှန်း"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ပြတ်သားသည့် S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A၊ စူးရှသော"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A၊ diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A၊ အပေါ်မှာ ကွင်း"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A၊ E၊ ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C၊ cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E၊ စူးရှသော"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E၊ diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I၊ စူးရှသော"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I၊ diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N၊ tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O၊ စူးရှသော"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O၊ tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O၊ diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O၊ stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U၊ စူးရှသော"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U၊ diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y။ စူးရှသော"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y၊ diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A၊ macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A၊ breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A၊ ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C၊ စူးရှသော"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C၊ အပေါ်မှာ အစက်"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C၊ caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D၊ caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D၊ stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E၊ macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E၊ breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E၊ အပေါ်မှာ အစက်"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E၊ ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E၊ caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G၊ breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G၊ အပေါ်မှာ အစက်"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G၊ cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H၊ stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I၊ tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I၊ macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I၊ breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I၊ ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"အစက်မပါ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I၊ J၊ ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K၊ cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L၊ စူးရှသော"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L၊ cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L၊ caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L၊ အလယ် အစက်"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L၊ stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N၊ စူးရှသော"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N၊ cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N၊ caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N၊ ရှေ့မှာ apostrophe ပါ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O၊ macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O၊ breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O၊ နှစ်ဆ စူးရှသော"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O၊ E၊ ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R၊ စူးရှသော"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R၊ cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R၊ caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S၊ စူးရှသော"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S၊ cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S၊ caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T၊ cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T၊ caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T၊ stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U၊ tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U၊ macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U၊ breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U၊ အပေါ်မှာ ကွင်း"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U၊ နှစ်ဆ စူးရှသော"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U၊ ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y၊ သရသံသင်္ကေတ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z၊ စူးရှသော"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z အစက် အပေါ်မှာ"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z၊ caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S အရှည်"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O၊ horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U၊ horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S၊ အောက်မှာ ကော်မာ"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T၊ အောက်မှာ ကော်မာ"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A၊ သရသံသင်္ကေတ နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A၊ သရသံသင်္ကေတ နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A၊ သရသံသင်္ကေတ နှင့် အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A၊ သရသံသင်္ကေတ နှင့် tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A,၊ သရသံသင်္ကေတ နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A၊ တည်ငြိမ်သော နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A၊ breve နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A၊ breve နှင့် အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A၊ breve နှင့် tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A၊ breve နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E၊ အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E၊ tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E၊ သရသံသင်္ကေတ နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E၊ သရသံသင်္ကေတ နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E၊ သရသံသင်္ကေတ နှင့် ချိတ် အပေါ်မှာ"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E၊ သရသံသင်္ကေတ နှင့် tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E၊ သရသံသင်္ကေတ နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I၊ အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O၊ အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O၊ သရသံသင်္ကေတ နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O၊ သရသံသင်္ကေတ နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O၊ သရသံသင်္ကေတ နှင့် အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O၊ သရသံသင်္ကေတ နှင့် tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O၊ သရသံသင်္ကေတ နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O၊ horn နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O၊ horn နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O၊ horn နှင့် အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O၊ horn နှင့် tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O၊ horn နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U၊ အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U၊ horn နှင့် စူးရှသော"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U၊ horn နှင့် တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U၊ horn နှင့် အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U၊ horn နှင့် tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U၊ horn နှင့် အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y၊ တည်ငြိမ်သော"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y၊ အောက်မှာ အစက်"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y၊ အပေါ်မှာ ချိတ်"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y၊ tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"အာမေဍိတ်သံ ပြောင်းပြန်"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ဘယ်ညွှန်း double angle quotation သင်္ကေတ"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"အလယ် အစက်"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript တစ်"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ညာညွှန်း double angle quotation သင်္ကေတ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"မေးခွန်း သင်္ကေတ ပြောင်းပြန်"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ဘယ် single quotation သင်္ကေတ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"ညာ single quotation သင်္ကေတ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation သင်္ကေတ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ဘယ် double quotation သင်္ကေတ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"ညာ double quotation သင်္ကေတ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille သင်္ကေတ"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ဘယ်ညွှန်း angle quotation သင်္ကေတ တစ်ခု"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ညာညွှန်း angle quotation သင်္ကေတ တစ်ခု"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript လေး"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin စာလုံးသေး n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso သင်္ကေတ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ညာညွှန်း မြား"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"အောက်ညွှန်း မြား"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"ပလာ set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"ထက်နည်း သို့မဟုတ် တူညီ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"ထက်ကြီး သို့မဟုတ် တူညီ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"အနက်ရောင် ကြယ်"</string> +</resources> diff --git a/java/res/values-my-rMM/strings-talkback-descriptions.xml b/java/res/values-my-rMM/strings-talkback-descriptions.xml new file mode 100644 index 000000000..6908b58ef --- /dev/null +++ b/java/res/values-my-rMM/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"မသိရ စာလုံး"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"စာလုံးကြီး <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I အကြီး"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I အကြီး၊ အပေါ်မှာ အစက်"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"မသိရ သင်္ကေတ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"မသိရ အီမိုဂျီ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"အစားထိုးစရာ စာလုံးများ ရှိနိုင်"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"အစားထိုးစရာ စာလုံးများကို ပယ်ထား"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"အစားထိုးစရာ အကြံပေးချက်များ ရှိနိုင်"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"အစားထိုးစရာ အကြံပေးချက်များကို ပယ်ထား"</string> +</resources> diff --git a/java/res/values-my-rMM/strings.xml b/java/res/values-my-rMM/strings.xml new file mode 100644 index 000000000..63cbca334 --- /dev/null +++ b/java/res/values-my-rMM/strings.xml @@ -0,0 +1,374 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_personalized_dicts (5167396352105467626) --> + <skip /> + <string name="enable_metrics_logging" msgid="5506372337118822837">"မြှင့်တင်ပါ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- 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 (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- 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_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for gesture_space_aware (2078291600664682496) --> + <skip /> + <!-- no translation found for gesture_space_aware_summary (4371385818348528538) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_disabled_summary (8141750303464726129) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for keyboard_layout (8451164783510487501) --> + <skip /> + <!-- no translation found for subtype_en_GB (88170601942311355) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (510930471167541338) --> + <skip /> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (5638680861387748936) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for go_to_settings (3876892339342569259) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) --> + <skip /> + <!-- no translation found for download_over_metered (1643065851159409546) --> + <skip /> + <!-- no translation found for do_not_download_over_metered (2176209579313941583) --> + <skip /> + <!-- no translation found for dict_available_notification_title (4583842811218581658) --> + <skip /> + <!-- no translation found for dict_available_notification_description (1075194169443163487) --> + <skip /> + <!-- no translation found for toast_downloading_suggestions (6128155879830851739) --> + <skip /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/res/values-nb/strings-action-keys.xml b/java/res/values-nb/strings-action-keys.xml index d4acd36c9..0586ce02f 100644 --- a/java/res/values-nb/strings-action-keys.xml +++ b/java/res/values-nb/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Forrige"</string> <string name="label_done_key" msgid="7564866296502630852">"Ferdig"</string> <string name="label_send_key" msgid="482252074224462163">"Send"</string> + <string name="label_search_key" msgid="7965186050435796642">"Søk"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Vent"</string> </resources> diff --git a/java/res/values-nb/strings-config-important-notice.xml b/java/res/values-nb/strings-config-important-notice.xml new file mode 100644 index 000000000..01a774c7e --- /dev/null +++ b/java/res/values-nb/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Bruk kommunikasjonen og inndataene dine for å få bedre forslag"</string> +</resources> diff --git a/java/res/values-nb/strings-letter-descriptions.xml b/java/res/values-nb/strings-letter-descriptions.xml new file mode 100644 index 000000000..ea563a5b1 --- /dev/null +++ b/java/res/values-nb/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminin ordensindikator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikrotegn"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Maskulin ordensindikator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A med grav aksent"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A med akutt aksent"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A med cirkumfleks"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A med tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A med trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Å"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Æ"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C med cedille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E med grav aksent"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E med akutt aksent"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E med cirkumfleks"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E med trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I med grav aksent"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I med akutt aksent"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I med cirkumfleks"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I med trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Edd"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N med tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O med grav aksent"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O med akutt aksent"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O med cirkumfleks"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O med tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O med trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Ø"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U med grav aksent"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U med akutt aksent"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U med cirkumfleks"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U med trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y med akutt aksent"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y med trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A med makron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A med breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A med kvist"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C med akutt aksent"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C med cirkumfleks"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C med prikk over"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C med hake"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D med hake"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D med strek gjennom"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E med makron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E med breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E med prikk over"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E med kvist"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E med hake"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G med cirkumfleks"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G med breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G med prikk over"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G med cedille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H med cirkumfleks"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H med strek gjennom"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I med tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I med makron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I med breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I med kvist"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I uten prikk"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J med cirkumfleks"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K med cedille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L med akutt aksent"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L med cedille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L med hake"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L med flyvende prikk"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L med strek gjennom"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N med akutt aksent"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N med cedille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N med hake"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N med apostrof foran"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O med makron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O med breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O med dobbel akutt aksent"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R med akutt aksent"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R med cedille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R med hake"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S med akutt aksent"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S med cirkumfleks"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S med cedille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S med hake"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T med cedille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T med hake"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T med strek gjennom"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U med tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U med makron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U med breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U med ring over"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U med dobbel akutt aksent"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U med kvist"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W med cirkumfleks"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y med cirkumfleks"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z med akutt aksent"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z med prikk over"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z med hake"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Lang s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O med horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U med horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S-komma"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T-komma"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A med prikk under"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A med krok over"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A med cirkumfleks og akutt aksent"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A med cirkumfleks og grav aksent"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A med cirkumfleks og krok over"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A med cirkumfleks og prikk under"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A med breve og akutt aksent"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A med breve og grav aksent"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A med breve og krok over"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A med breve og tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A med breve og prikk under"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E med prikk under"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E med krok over"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E med tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E med cirkumfleks og akutt aksent"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E med cirkumfleks og grav aksent"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E med cirkumfleks og krok over"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E med cirkumfleks og prikk under"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I med krok over"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I med prikk under"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O med prikk under"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O med krok over"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O med cirkumfleks og akutt aksent"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O med cirkumfleks og grav aksent"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O med cirkumfleks og krok over"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O med cirkumfleks og tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O med cirkumfleks og prikk under"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O med horn og akutt aksent"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O med horn og grav aksent"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O med horn og krok over"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O med horn og tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O med horn og prikk under"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U med prikk under"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U med krok over"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U med horn og akutt aksent"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U med horn og grav aksent"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U med horn og krok over"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U med horn og tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U med horn og prikk under"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y med grav aksent"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y med prikk under"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y med krok over"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y med tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Omvendt utropstegn"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Sjevron, venstre"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Flyvende prikk"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Hevet skrift, én"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Sjevron, høyre"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Omvendt spørsmålstegn"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Enkelt anførselstegn, venstre"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Enkelt anførselstegn, høyre"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkelt lavt 9-anførselstegn"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dobbelt anførselstegn, venstre"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dobbelt anførselstegn, høyre"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kors"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dobbeltkors"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promilletegn"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primtegn"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dobbelt primtegn"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkel sjevron, venstre"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkel sjevron, høyre"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Hevet skrift, fire"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Hevet skrift, liten bokstav n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Pesotegn"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"c/o"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pil til høyre"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pil ned"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tom mengde"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Økning"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mindre enn eller lik"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Større enn eller lik"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Svart stjerne"</string> +</resources> diff --git a/java/res/values-nb/strings-talkback-descriptions.xml b/java/res/values-nb/strings-talkback-descriptions.xml new file mode 100644 index 000000000..cdb685852 --- /dev/null +++ b/java/res/values-nb/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Koble til hodetelefoner for å høre opplesing av tegnene i passordet."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Gjeldende tekst er %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ingen tekst er skrevet inn"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> utfører automatisk retting"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Ukjent tegn"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Flere symboler"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboler"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Slett"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboler"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Bokstaver"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Tall"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Innstillinger"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Mellomromstasten"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Stemmedata"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Søk"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Prikk"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Bytt språk"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Neste"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Forrige"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift er aktivert"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock er aktivert"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbolmodus"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modus for flere symboler"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Bokstavmodus"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Ringemodus"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Ringemodus med symboler"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastaturet er skjult"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Viser <xliff:g id="KEYBOARD_MODE">%s</xliff:g>-tastatur"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"dato"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dato og klokkeslett"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-post"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"tekstmeldinger"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"tall"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"klokkeslett"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"nettadresse"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Nylige"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personer"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objekter"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Steder"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboler"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Smilefjes"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Stor <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Stor I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Stor I med prikk over"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ukjent symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Ukjent emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative tegn er tilgjengelige"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative tegn fjernes"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative forslag er tilgjengelige"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative forslag fjernes"</string> +</resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 00aa10da7..29fd367a3 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Inndataalternativer"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Kommandoer for undersøkelseslogging"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Slå opp kontaktnavn"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruker oppføringer fra kontaktlisten din"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrer ved tastetrykk"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Lyd ved tastetrykk"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Hurtigvindu ved tastetrykk"</string> - <string name="general_category" msgid="1859088467017573195">"Generelt"</string> - <string name="correction_category" msgid="2236750915056607613">"Tekstkorrigering"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Ordføring"</string> - <string name="misc_category" msgid="6894192814868233453">"Andre alternativer"</string> - <string name="advanced_settings" msgid="362895144495591463">"Avanserte innstillinger"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Alternativer for eksperter"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Bytt inndatametode"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tasten for språkbytte dekker også andre inndatametoder"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Nøkkel for språkskifte"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Systemstandard"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Foreslå kontaktnavn"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Bruk navn fra Kontakter til forslag og korrigeringer"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Spesialtilpassede forslag"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Forbedre <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Punktum ved doble mellomrom"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dobbeltrykk på mellomromstasten for punktum etterfulgt av mellomrom"</string> <string name="auto_cap" msgid="1719746674854628252">"Stor forbokstav"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Vis bevegelsesspor"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamisk flytende forhåndsvsn."</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Se det foreslåtte ordet mens du utfører bevegelser"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Lagret"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Koble til hodetelefoner for å høre opplesing av bokstavene i passordet."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Gjeldende tekst er %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ingen tekst er skrevet inn"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> retter <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> til <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> utfører automatisk retting"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Tastaturkode %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift er på (trykk for å deaktivere)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock er på (trykk for å deaktivere)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Slett"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboler"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Bokstaver"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Tall"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Innstillinger"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulator"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Mellomrom"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Taleinndata"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smilefjes"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Søk"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Prikk"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Bytt språk"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Neste"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Forrige"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift er aktivert"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock er aktivert"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift er deaktivert"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbolmodus"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bokstavmodus"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Ringemodus"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Ringemodus med symboler"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastaturet er skjult"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Viser <xliff:g id="MODE">%s</xliff:g>-tastatur"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"dato"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"dato og klokkeslett"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"tekstmeldinger"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"tall"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"tid"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"Nettadresse"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frasebevegelse"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Sett inn mellomrom ved å dra fingeren til mellomromstasten"</string> <string name="voice_input" msgid="3583258583521397548">"Tast for taleinndata"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ingen taleinndatametoder er aktivert. Sjekk Språk og inndata-innstillingene."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inndatametoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string> <string name="send_feedback" msgid="1780431884109392046">"Send tilbakemelding"</string> <string name="select_language" msgid="3693815588777926848">"Inndataspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Trykk på nytt for å lagre"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tastaturtema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engelsk (Storbritannia)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engelsk (USA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spansk (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engelsk (Storbritannia) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engelsk (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spansk (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradisjonell)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelsk (Storbritannia) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelsk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spansk (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradisjonelt)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillisk)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Ingen språk (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Fargetema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Hvit"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blå"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Egendefinerte inndata"</string> <string name="add_style" msgid="6163126614514489951">"Legg til stil"</string> <string name="add" msgid="8299699805688017798">"Legg til"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktiver"</string> <string name="not_now" msgid="6172462888202790482">"Ikke nå"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Inndatastilen finnes allerede: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Bruksstudiemodus"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Forsinkelse lange tastetrykk"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrasjonstid ved tastetrykk"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Lydstyrke ved tastetrykk"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Bruk en ekstern ordlistefil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Det ligger ingen ordboksfiler i Nedlastinger-mappen"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Velg ordboksfilen du vil installere"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vil du virkelig installere denne filen for <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vil du virkelig installere denne filen for <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Det oppsto en feil"</string> <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Velkommen til <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Last inn på nytt"</string> <string name="last_update" msgid="730467549913588780">"Sist oppdatert"</string> <string name="message_updating" msgid="4457761393932375219">"Ser etter oppdateringer ..."</string> - <string name="message_loading" msgid="8689096636874758814">"Laster inn …"</string> + <string name="message_loading" msgid="5638680861387748936">"Laster inn …"</string> <string name="main_dict_description" msgid="3072821352793492143">"Hovedordliste"</string> <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Innstillinger"</string> <string name="install_dict" msgid="180852772562189365">"Installer"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string> <string name="delete_dict" msgid="756853268088330054">"Slett"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det valgte språket på mobilenheten din har en tilgjengelig ordliste.<br/> Vi anbefaler å <b>laste ned</b> ordlisten for <xliff:g id="LANGUAGE">%1$s</xliff:g>. Dette forbedrer skriveopplevelsen din.<br/> <br/> Nedlastingen kan ta fra ett til to minutter via 3G. Belastninger kan påløpe hvis du ikke har et abonnement med <b>ubegrenset databruk</b>.<br/> Hvis du er usikker på hvilken abonnementstype du har, anbefaler vi deg å finne en Wi-Fi-tilkobling for å starte nedlastingen automatisk.<br/> <br/> Tips: Du kan laste ned og fjerne ordlister ved å gå til <b>Språk og inndata</b> i menyen for <b>Innstillinger</b> på mobilenheten din."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det valgte språket på mobilenheten din har en tilgjengelig ordliste.<br/> Vi anbefaler å <b>laste ned</b> ordlisten for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>. Dette forbedrer skriveopplevelsen din.<br/> <br/> Nedlastingen kan ta fra ett til to minutter via 3G. Belastninger kan påløpe hvis du ikke har et abonnement med <b>ubegrenset databruk</b>.<br/> Hvis du er usikker på hvilken abonnementstype du har, anbefaler vi deg å finne en Wi-Fi-tilkobling for å starte nedlastingen automatisk.<br/> <br/> Tips: Du kan laste ned og fjerne ordlister ved å gå til <b>Språk og inndata</b> i menyen for <b>Innstillinger</b> på mobilenheten din."</string> <string name="download_over_metered" msgid="1643065851159409546">"Last ned nå (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Last ned via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"En ordliste er tilgjengelig for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"En ordliste er tilgjengelig for <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Trykk for å se gjennom og laste ned"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Laster ned: Forslag blir snart tilgjengelige for <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Laster ned: forslag til <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> er snart klare"</string> <string name="version_text" msgid="2715354215568469385">"Versjon <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Legg til"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Legg til i ordlisten"</string> diff --git a/java/res/values-ne-rNP/strings-action-keys.xml b/java/res/values-ne-rNP/strings-action-keys.xml new file mode 100644 index 000000000..354f8ee28 --- /dev/null +++ b/java/res/values-ne-rNP/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"जानु"</string> + <string name="label_next_key" msgid="5586407279258592635">"अर्को"</string> + <string name="label_previous_key" msgid="1421141755779895275">"पहिलो"</string> + <string name="label_done_key" msgid="7564866296502630852">"भयो"</string> + <string name="label_send_key" msgid="482252074224462163">"पठाउनुहोस्"</string> + <string name="label_search_key" msgid="7965186050435796642">"खोजी गर्नुहोस्"</string> + <string name="label_pause_key" msgid="2225922926459730642">"रोक्नुहोस्"</string> + <string name="label_wait_key" msgid="5891247853595466039">"पर्खनुहोस्"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings-appname.xml b/java/res/values-ne-rNP/strings-appname.xml new file mode 100644 index 000000000..8b967e8d7 --- /dev/null +++ b/java/res/values-ne-rNP/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"एन्ड्रोइड किबोर्ड (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"एन्ड्रोइड हिज्जे जाँचकी (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"एन्ड्रोइड किबोर्ड सेटिङ्हरू (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"एन्ड्रोइड हिज्जे परीक्षक सेटिङ्हरू(AOSP)"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings-config-important-notice.xml b/java/res/values-ne-rNP/strings-config-important-notice.xml new file mode 100644 index 000000000..8816da773 --- /dev/null +++ b/java/res/values-ne-rNP/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"सुझावहरू सुधार गर्न सञ्चारहरू र टाइप गरिएको डेटाबाट जान्नुहोस्"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings-emoji-descriptions.xml b/java/res/values-ne-rNP/strings-emoji-descriptions.xml new file mode 100644 index 000000000..a3419b86d --- /dev/null +++ b/java/res/values-ne-rNP/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"प्रतिलिपि अधिकार चिन्ह"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"दर्ता चिन्ह"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"दोहोरो उद्गार मार्क"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"विस्मयादिबोधक प्रश्न चिन्ह"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"व्यापार प्रतिक चिन्ह"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"सूचना स्रोत"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"दायाँ तीर बाँयामा"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"तल तीर माथिमा"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"उत्तर पश्चिम तीर"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"उत्तर पूर्वी तीर"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"दक्षिण पूर्व तीर"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"दक्षिण पश्चिम तीर"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"बायाँ हुक साथ तीर"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"दाँया हुक साथ तीर"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"हेर्नु"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"बलौटे घडी"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"कालो दाँया देखाउने डबल त्रिकोण"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"कालो बायाँ-इशारा डबल त्रिकोण"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"कालो माथि देखाउने डबल त्रिकोण"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"कालो तल-इशारा डबल त्रिकोण"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"सचेतक घडी"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"बग्ने बालुवा साथ बालुवा घडी"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"बृताकार भित्र ठुलो ल्याटिन अक्षर m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"कालो सानो वर्ग"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"श्वेत सानो वर्ग"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"कालो दाँया देखाउने त्रिकोण"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"कालो बायाँ-इशारा त्रिकोण"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"श्वेत मध्यम वर्ग"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"कालो मध्यम वर्ग"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"श्वेत मध्यम सानो वर्ग"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"कालो मध्यम सानो वर्ग"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"किरण साथ कालो सूर्य"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"बादल"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"कालो टेलिफोन"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"जाँच साथ मतदान बक्स"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"वर्षा थोपा साथ छाता"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"तातो पेय"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"श्वेत अप सूचकांक इशारा"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"श्वेत हँसिलो अनुहार"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"मेष"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"वृष"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"मिथुन"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"कर्कट"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"सिंह"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"कन्या"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"तुला"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"वृष"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"धनु"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"मकर"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"कुंभ"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"मीन"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"कालो कुदाल सुट"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"कालो क्लब सुट"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"कालो हृदय सुट"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"कालो हीरा सुट"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"तातो स्प्रिंग्स"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"कालो विश्वव्यापी रिसाइकिलिंग चिन्ह"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"ह्वीलचेयर चिन्ह"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"अंकुश"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"चेतावनी चिन्ह"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"उच्च भोल्टेज चिन्ह"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"मध्यम सफेद वृत्त"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"मध्यम कालो वृत्त"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"फुटबल"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"बेसबल"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"बिना हिउँ हिममानब"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"बादलको पछाडी सूर्य"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"तारामंडल Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"प्रवेश निषेध"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"चर्च"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"फोहरा"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"प्वालमा झण्डा"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"जहाजयात्रा"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"पाल"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"इन्धन पम्प"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"कालो कैंची"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"श्वेत भारी चेक मार्क"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"हवाइजहाज"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"खाम"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"उठेको मुट्ठी"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"उठाएको हात"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"विजयी हात"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"शिसाकलम"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"कालो निब"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"भारी चेक मार्क"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"भारी गुणन x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"झिल्काहरु"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"आठधर्के तारांकन"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"आठ चुच्चे कालो तारा"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"हिमपात"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"चमक"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"क्रस चिन्ह"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"उल्टो चारपाते काटिएको चिन्ह"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"कालो प्रश्न चिन्ह आभूषण"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"श्वेत प्रश्न चिन्ह आभूषण"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"श्वेत उद्गार चिन्ह आभूषण"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"भारी उद्गार चिन्ह प्रतिक"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"दह्रो कालो हृदय"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"भारी प्लस चिन्ह"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"भारी ऋण चिन्ह"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"भारी विभाजन चिन्ह"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"कालो दाँयातीर तीर"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"घुम्रिएको फेरो"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"दोहोरो घुम्रिएको फेरो"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"दाँयातीर इशारा तीर त्यसपछि माथिको घुमाँइ"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"दाँयातीर इशारा तीर त्यसपछि तलको घुमाँइ"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"कालोतीर बायाँतर्फ"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"कालो तीर माथि तर्फ"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"कालो तीर तल तर्फ"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"कालो ठूलो वर्ग"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"सेतो ठूलो वर्ग"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"सेतो मध्यम तारा"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"भारी ठूलो वृत्त"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"तरंग ड्यास"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"खण्ड बैकल्पिक मार्क"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"बृताकार भाबाङ्कन बधाई"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"बृताकार भाबाङ्कन रहस्य"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"माजोङ टाइल रातो ड्रागन"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"खेल्ने तास कालो जोकर"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"रक्त प्रकार A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"रक्त प्रकार B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"रक्त प्रकार O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"पार्क्ङिग स्थल"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"रक्त प्रकार AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"चारपाटे CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"चारपाते सुन्दर"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"चारपाते मुक्त"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"चारपाते ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"चारपाते नयाँ"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"चारपाते N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"चारपाते ठीक"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"चारपाते SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"उद्गार चिन्ह साथ चारपाते"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"चारपाते बिरुद्ध"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"यहाँ चारपाते काताकाना"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"चारपाते काताकाना सेवा"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"चारपाते भाबाङ्कन -निःशुल्क"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"चारपाते भाबाङ्कन सुरक्षित-सीट"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"चारपाते भाबाङ्कन निषेध"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"चारपाते भाबाङ्कन रिक्तता"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"चारपाते भाबाङ्कन स्वीकृति"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"चारपाते भाबाङ्कन पूर्ण अधिभोग"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"चारपाते भाबाङ्कन भुक्तानी"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"चारपाते भाबाङ्कन मासिक"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"चारपाते भाबाङ्कन अनुप्रयोग"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"चारपाते भाबाङ्कन छूट"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"व्यापारमा चारपाते भाबाङ्कन"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"बृताकार भाबाङ्कन लाभ"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"बृताकार भाबाङ्कन स्वीकार"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"चक्रवात"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"धुवाँदार"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"बन्द छाता"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"ताराहरूका साथ रात"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"पहाडमा सूर्योदय"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"सूर्योदय"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"धुलो रहित शहर"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"भवनहरुमा सूर्यास्त"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"ईन्द्रेणी"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"रातमा पुल"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"जल लहर"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"ज्वालामुखी"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"दुधेली बाटो"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"पृथ्बी विश्व युरोप-अफ्रिका"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"पृथ्बी विश्व अमेरीकास"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"पृथ्बी विश्व एशिया-अस्ट्रेलिया"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"मेरीडियन साथ विश्व"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"नयाँ चन्द्रमाको चिन्ह"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"पहेँलो अर्धचन्द्राकार चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"पहिलो चौथाई चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"पहेँलो बाँदर चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"पूर्ण चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"थकित बाँदर चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"अन्तिम चौथाई चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"चेतावनी अर्धचन्द्राकार चन्द्र प्रतीक"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"अर्धचन्द्राकार चन्द्र"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"नयाँ चन्द्रामुहार"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"पहिलो चौथाइ चन्द्रामुहार"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"अन्तिम चौथाइ चन्द्रामुहार"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"पूर्ण चन्द्रामुहार"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"सूर्यामुहार"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"चमकिलो तारा"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"सुटिङ तारा"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"ओखर"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"सिडिङ"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"सदाबहार रूख"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"पतझड रूख"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"ताड रूख"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"सिउँडी"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"तुलिप"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"चेरी फूल"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"गुलाब"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"जाभाकुसुम"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"सूर्यमुखी"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"फूल"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"काने मकै"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"काने धान"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"जडिबुटी"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"चार पाते क्लोभर"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"मेपल पातको"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"झरेको पात"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"पात हावामा उड्दै"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"च्याँउ"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"गोलभेंडा"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"डल्लो भन्टा"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"अंगूर"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"तरबूजा"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"खरबूजा"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"सुन्तले रङ"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"लेमन"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"केरा"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"भुईंकतहर"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"रातो स्याउ"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"हरियो स्याउ"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"नाशपाती"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"बयर"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"चेरी"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"स्ट्रबेरी"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"ह्यामबर्गर"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"पिज्जा टुक्रा"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"हड्डीमा मासु"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"कुखुराको खुट्टा"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"चामलको पातलो बिस्कुट"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"भातको बल"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"पकाएको भात"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"करी र भात"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"उमालेको कचौरा"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"स्पैगेट्टी"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"रोटी"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"फ्रान्सेली फ्राइज"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"रोस्ट गरेको मिठो आलु"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"जापानी मिठाई"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ओदेन (जापानी खाना)"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"भात र काँचो माछा"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"तारेको सानो माछा"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"घुमाउरो डिजाइनमा माछा केक"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"नरम आइसक्रिम"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"चुर्ण बरफ"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"आइसक्रीम"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"डोनट"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"कुकीज"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"चकलेट बार"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"क्यान्डी"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"लालीपप"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"कस्तार्ड"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"महदानी"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"सर्टकेक"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"टिफिन बट्टा"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"खानाको भाँडो"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"पकाउँदै"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"काँटा र चक्कु"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"ह्यान्डल बिनाको चियाकप"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"शाके (जापानी रक्सी) बोतल र प्याला"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"रक्सी गिलास"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"ककटेल गिलास"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"ट्रपिकल पेयपदार्थ"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"बियर मग"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"बियर मग छुआएको"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"बच्चाको बोतल"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"रिबन"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"बेरिएको उपहार"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"जन्मदिनको केक"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"ज्याक-o-लालटिन"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"क्रिसमस रूख"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"सान्ताक्लस"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"आतसबाजी"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"आतसबाजी झिल्का"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"बेलुन"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"पार्टी भंडुवा"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"रङगिन बल"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"तानाबाता रूख"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"क्रस झण्डा"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"पाइन सजावट"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"जापानी गुडिया"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"कार्प तोरण"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"हावा झंकार"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"चन्द्र अबलोकन समारोह"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"स्कूल झोला"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"दिक्षान्त समारोह टोपी"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"खेलाची घोडा"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"रोटेपिङ्"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"रोलर कोस्टर"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"माछामार्ने पोल र माछा"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"माइक्रोफोन"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"चलचित्र क्यामेरा"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"चलचित्र"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"हेडफोन"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"कलाकार रङदानी"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"शीर्ष टोपी"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"सर्कस पाल"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"टिकट"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"क्लापर बोर्ड"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"कला प्रदर्शन"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"भिडियो खेल"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"प्रत्यक्ष निशाना"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"स्लट मिसिन"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"बिलियर्ड्स"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"पोट"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"बलिङ"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"फूलछापे तास"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"साङ्गीतिक अक्षर"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"बहु साङ्गीतिक अक्षर"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"सेक्सोफोन"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"गितार"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"साङ्गीतिक कुञ्जीपाटी"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"बिगुल"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"भ्वायलिन"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"साङ्गीतिक स्कोर"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"तेर्सो धर्के जर्सी"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"टेनिस रैकेट र बल"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"स्की र स्की बुट"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"बास्केटबल र रिंग"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"चेकढाँचा झण्डा"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"स्नोबोर्दर"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"धावक"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"सर्फ़र"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"शिल"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"घोडा दौड"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"अमेरिकी फुटबल"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"रग्बी फुटबल"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"पौडीबाज"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"घर निर्माण"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"बगैचा सहित घर"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"कार्यालय भवन"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"जापानी हुलाक"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"युरोपेली हुलाक"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"अस्पताल"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"बैंक"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"स्वचालित पारंगत मिसिन"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"होटल"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"मायालु होटल"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"सुविधाजनक स्टोर"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"स्कूल"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"डिपार्टमेन्ट स्टोर"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"कारखाना"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"इजाकाया लालटेन"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"जापानी किल्ला"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"युरोपेली किल्ला"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"मुसा"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"घरेलु मुसा"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"साँढे"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"जल भैंसी"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"गाई"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"चितुवा"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"खरायो"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"बिरालो"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"ड्रागन"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"गोही"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"ह्वेल"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"घोंघा"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"साँप"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"घोडा"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"मेष"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"बाख्रा"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"भेडा"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"बाँदर"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"रोस्टर कुखुरा"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"कुखुरा"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"कुकुर"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"सुँगुर"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"बँदेल"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"हात्ती"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"अक्टोपस"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"शंख"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"कनसुत्लो"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"कमिला"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"माहुरी"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"खपटे कीरा"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"माछा"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"ट्रपिकल माछा"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"फुगु"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"कछुवा"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"चल्ला कोरल्नु"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"सानोचल्ला"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"अधोमुख सानोचल्ला"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"चरा"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"पेंगुइन"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"कोआल"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"पूडल"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"अरेबि उँट"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"दुईजुरे उँट"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"डल्फिन"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"मुसा अनुहार"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"गाई अनुहार"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"बाघ अनुहार"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"खरायो अनुहार"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"बिरालो अनुहार"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"ड्रागन अनुहार"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"ह्वेल पानीफाल्दै"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"घोडा अनुहार"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"बाँदर अनुहार"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"कुकुर अनुहार"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"सुँगुर अनुहार"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"भ्यागुतो अनुहार"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"लोखर्के अनुहार"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"ब्वाँसो अनुहार"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"भालु अनुहार"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"पाण्डा अनुहार"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"सुँगुर नाक"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"पंजा छाप"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"आँखाहरु"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"कान"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"नाक"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"मुख"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"जिब्रो"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"ठडाएको औंला पछाडिबाट सूचकांक इशारा"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"घोप्ताएको औंला पछाडिबाट सूचकांक इशारा"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"औंला इशारा पछाडिबाट सूचकांक बायाँ"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"औंला इशारा पछाडिबाट सूचकांक दायाँ"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"मुठी चिन्ह"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"हल्लाएको हात चिन्ह"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"ठीक हात चिन्ह"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"औंठा माथी चिन्ह"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"औंठा तल चिन्ह"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"ताली चिन्ह"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"खुला हात चिन्ह"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"श्रीपेच"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"महिला टोपी"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"चश्मा"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"टाई"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"टी-शर्ट"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"जीन्स"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"पोशाक"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"किमोनो"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"बिकिनी"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"महिला लुगा"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"बटुआ"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"हैंडबैग"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"थैली"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"केटा जुत्ता"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"खेलाडी जुत्ता"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"अग्लो हिलको जुत्ता"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"महिला जुत्ता"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"महिला बूट"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"पैताला छाप"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"छाँया चित्र"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"छाँया चित्रहरू"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"केटा"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"केटी"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"मान्छे"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"महिला"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"परिवार"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"स्त्री र पुरुष हातसमात्दै"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"दुई पुरुष हातसमात्दै"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"दुई महिला हातसमात्दै"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"प्रहरी अधिकारी"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"खरायो काने महिला"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"घुम्टोमा दुलही"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"खैरो कपाल व्यक्ति"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"गुआपी माओ पहिरनमा मानिस"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"फेटाधारी मानिस"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"बृढमान्छे"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"बृढा महिला"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"बच्चा"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"निर्माण कामदार"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"राजकुमारी"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"जापानी राक्षस"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"जापानी लुटेरा"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"भूत"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"सानोपरी"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"अन्य ग्रहबासी"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"अन्य ग्रहबासी राक्षस"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"सानो शैतान"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"खोपडी"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"सोधपुछको व्यक्ति"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"पहरेदार"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"नर्तक"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"लिपस्टिक"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"नेल पलिश"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"अनुहार मालिश"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"सैलुन"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"नाई पोल"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"सुई"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"गोली"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"चुम्बन चिन्ह"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"प्रेमपत्र"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"औंठी"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"रत्न पत्थर"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"चुम्बन"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"फूलगुच्छा"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"युगलजोडी"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"विवाह"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"हृदय धड्कन"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"टुटेको हृदय"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"दुई हृदय"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"चम्केको हृदय"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"बढ्दो हृदय"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"तीर सहित हृदय"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"नीलो हृदय"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"हरियो हृदय"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"पहेंलो हृदय"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"बैजनी हृदय"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"रिबन साथ हृदय"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"परिक्रामी हृदय"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"हृदय सजावट"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"भित्र बिन्दु साथ हीरा आकार"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"इलेक्ट्रिक चिम"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"रिस प्रतीक"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"बम"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"सुताहा प्रतीक"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"टकराव प्रतीक"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"उछिट्टिएको पसिना प्रतीक"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"सानो थोपा"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"ड्यास प्रतीक"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"थुप्रो गु"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"पाखुरा प्रदर्शन"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"तारा प्रतीक"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"भाषण बेलुन"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"बैचारिक बेलुन"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"सेतो फूल"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"सय अंक प्रतीक"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"पैसाको थैली"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"मुद्रा विनिमय"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"मोटो डलर चिन्ह"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"क्रेडिट कार्ड"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"येन चिन्ह साथ नोट"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"डलर चिन्ह सहित बैकनोट"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"यूरो चिन्ह साथ नोट"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"पाउन्ड चिन्ह साथ नोट"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"पखेटाली मुद्रा"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"माथिको प्रवृत्ति र येन चिन्ह साथ चित्रपाती"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"सिट"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"निजी कम्प्यूटर"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ब्रिफकेस"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"सानो डिस्क"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"फ्लपी डिस्क"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"सी डि चक्का"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"डिभिडी"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"फाइल फोल्डर"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"फाइल फोल्डर खोल्नुहोस्"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"दोब्र्याइएको पृष्ठ"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"माथि पत्याएको पृष्ठ"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"पात्रो"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"च्यातेर पठाउने पात्रो"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"कार्ड सूचकांक"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"माथिको प्रवृत्ति साथ चित्रपाती"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"तल प्रवृत्ति साथ चित्रपाती"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"बार चार्ट"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"क्लिपबोर्ड"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"पुस पिन"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"गोल पुस पिन"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"क्लिप"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"फुट"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"त्रिकोणात्मक फुट"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"किताबी ट्याबहरू"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"लेजर"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"नोटबुक"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"सजावटी खोल सहित नोटबुक"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"बन्द पुस्तक"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"खुला पुस्तक"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"हरियो पुस्तक"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"नीलो पुस्तक"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"सुन्तला पुस्तक"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"पुस्तकहरू"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"बिल्ला नाम"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"स्क्रोल"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"मेमो"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"टेलिफोन रिसीभर"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"पेजर"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"फ्याक्स मेसिन"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"स्याटलाइट एंटीना"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"आकाशबाणी"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"ढ्वांग फुक्नु"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"आउटबक्स ट्रे"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"इनबक्समा ट्रे"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"प्याकेज"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"इमेल प्रतीक"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"आगमन खाम"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"माथि तीर तल देखाइएको साथ खाम"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"माथि झण्डा साथ बन्द मेलबक्स"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"उठाएको झन्डा साथ बन्द मेलबक्स"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"उठाएको झन्डा साथ खुला मेलबक्स"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"तल झण्डा साथ खुला मेलबक्स"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"पत्र पेटिका"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"पोस्टल सीङ"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"अखबार"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"मोबाइल फोन"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"दाँया तीर साथ मोबाइल फोन बायाँ"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"कम्पन ढाँचाः"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"मोबाइल फोन बन्द"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"बिना मोबाइल फोनहरु"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"बारहरू साथ एंटीना"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"क्यामेरा"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"भिडियो क्यामेरा"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"टेलिभिजन"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"रेडियो"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"भिडियोक्यासेट"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"दाँया बटारिएको तीर"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"दाँया र बायाँ खुला वृत्त तीर घडीकोदिशामा"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"वृत्त दोबारेको साथ दाँया र बायाँ खुला वृत्त तीर घडीकोदिशामा"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"घडीको दिशामा तल र माथिको तर्फ खुला वृत्त तीर"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"उल्टा घडीको दिशामा तल र माथिको तर्फ खुला वृत्त तीर"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"कम चमक प्रतीक"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"उच्च चमक प्रतीक"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"ध्वोंनी निषेध स्ट्रोक"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"स्पिकर"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"एक तरङ्ग साथ स्पिकर"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"तीन ध्वनि लहरहरु साथ स्पिकर"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"ब्याट्री"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"बिद्धुतीय प्लग"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"बाँया-इशारा आबर्धक लेन्स"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"दायाँ इशारा आबर्धक लेन्स"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"मसी कलमले बन्द"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"साँचो साथ बन्द ताला"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"साँचो"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"लक गर्नुहोस्"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"खुला ताला"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"घन्टी"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"रद्द स्ट्रोक साथ घन्टी"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"बुकमार्क"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"संपर्क प्रतीक"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"रेडियो बटन"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"बायाँ माथि तीर साथ फर्काएको"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"बायाँ माथि तीर साथ अन्त्य"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"बायाँ साथ उद्गार चिन्हले दाँया माथि तीर"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"दाँया माथि तीर साथ चाँडै"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"माथिको माथि तीर साथ माथि"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"अठार मुनिका प्रतीक निषेधित"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"किक्याप दस"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"ठुलो ल्याटिन अक्षरका आगत प्रतीक"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"सानो ल्याटिन अक्षरका आगत प्रतीक"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"संख्याका लागि आगत प्रतीक"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"प्रतीकको लागि प्रतीक प्रविष्ट गर्नुहोस्"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"ल्याटिन अक्षरका आगत प्रतीक"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"आगो"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"बिजुली बत्ती"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"रेंच"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"हथौडा"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"नट बोल्ट"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"जापानी चक्कु होचो"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"पिस्तौल"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"माइक्रोस्कोप"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"टेलिस्कोप"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"क्रिस्टल बल"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"बीचमा थोप्ला निहित छ चुच्चे तारा"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"शुरुवातको लागि जापानी प्रतीक"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"त्रिशूल प्रतीक"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"कालो वर्ग बटन"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"सेतो वर्ग बटन"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"ठूलो लाल वृत्त"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"ठूलो नीलो वृत्त"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"ठूलो सुन्तला हीरा"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"ठूलो नीलो हीरा"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"लघु सुन्तला हीरा"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"लघु नीलो हीरा"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"माथी-इशारा रातो त्रिकोण"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"तल-इशारा रातो त्रिकोण"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"माथी इशारा सानो रातो त्रिकोण"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"तल-इशारा सानो रातो त्रिकोण"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"घडी अनुहार एक बजे"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"घडी अनुहार दुई बजे"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"घडी अनुहार तीन बजे"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"घडी अनुहार चार बजे"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"घडी अनुहार पाँच बजे"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"घडी अनुहार छ बजे"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"घडी अनुहार सात बजे"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"घडी अनुहार आठ बजे"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"घडी अनुहार नौ बजे"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"घडी अनुहार दश बजे"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"घडी अनुहार एघार बजे"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"घडी अनुहार बाह्र बजे"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"घडी अनुहार एक-तिस"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"घडी अनुहार दुई-तिस"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"घडी अनुहार तीन तीस"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"घडी अनुहार चार-तिस"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"घडी अनुहार पाँच-तिस"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"घडी अनुहार छ-तिस"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"घडी अनुहार सात-तिस"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"घडी अनुहार आठ-तिस"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"घडी अनुहार नौ-तिस"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"घडी अनुहार दश-तिस"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"घडी अनुहार एघार-तिस"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"घडी अनुहार बाह्र-तिस"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"माउन्ट फुजी"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"टोकियो टावर"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"स्वतन्त्रताको प्रतिमा"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"जापानको छान्य मुर्ति"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"मोयै"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"अनुहार ङिच्च हँसाइ"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"हँसिल आँखाको साथ ङिच्च हँसाइ"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"आनन्द आँसुको साथ अनुहार"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"खुला मुखको साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"खुला मुखको र हँसिलो आँखा साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"खुला मुख र चिसो पसिना साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"खुला मुख र बन्द आँखाको साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"हेलो साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"सिंगहरु साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"आँखा झिम्काएको अनुहार"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"हँसिलो आँखाले साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"स्वादिष्ट भोजन savoring अनुहार"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"ढुक्क अनुहार"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"हृदय आकारको आँखाले हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"घाम साथ हँसिलो अनुहार"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"स्वाँग पारेको अनुहार"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"सामान्य अनुहार"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"भाबबिहिन अनुहार"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"निराश अनुहार"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"चिसो पसिना साथ अनुहार"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"चिंताग्रस्त अनुहार"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"गोलमाल अनुहार"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"आघातको अवस्थामा अनुहार"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"चुम्बन अनुहार"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"चुम्बन फालिएको अनुहार"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"हँसिलो आँखा साथ चुम्बन अनुहार"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"बन्द आँखा साथ चुम्बन अनुहार"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"बाहिर जिब्रो साथ अनुहार"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"बाहिर जिब्रो र झिम्काएको आँखा साथ अनुहार"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"बाहिर जिब्रो र बेस्सरी बन्द आँखा साथ अनुहार"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"निराश अनुहार"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"चिन्तित अनुहार"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"आक्रोशित अनुहार"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"दुखी अनुहार"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"कराएको अनुहार"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"संरक्षित अनुहार"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"विजय नजर अनुहार"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"निराश तर राहत अनुहार"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"खुला मुखको साथ निन्याउरो अनुहार"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"विचलित अनुहार"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"डराएको अनुहार"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"थकित अनुहार"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"निदाएको अनुहार"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"थकित अनुहार"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"कित्किताएको अनुहार"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"चर्को सोरले कराएको अनुहार"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"खुला मुख अनुहार"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"चुप अनुहार"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"खुला मुख र चिसो पसिना अनुहार"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"डरमा चिल्लाएको अनुहार"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"छक्क अनुहार"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"निर्लज्ज अनुहार"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"निन्द्रे अनुहार"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"चक्करलागेको अनुहार"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"मुख नभएको अनुहार"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"चिकित्सक माक्स लगाएको अनुहार"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"हँसिलो आँखा साथ ङीच्च बिरालो अनुहार"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"आनन्द आँसु झार्दै बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"खुला मुखले हँसिलो बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"हृदय आकारको आँखाले हँसिलो बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"छट्टु मुस्कान साथ बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"बन्द आँखा साथ चुम्बन बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"दुखी बिरालो अनुहार"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"कराएको बिरालो अनुहार"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"वाक्क भइसकेको बिरालो अनुहार"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"कुनै राम्रो सङ्केत बिना साथ अनुहार"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"ठीक इशारा साथ अनुहार"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"गहिरो निहुरेको व्यक्ति"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"हेर्नुहोस्-कुनै-दुष्ट बाँदर"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"सुन-कुनै-दुष्ट बाँदर"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"बोल्नु-कुनै-दुष्ट बाँदर"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"खुसी व्यक्ति एक हात उठाउँदै"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"उत्सवमा दुवै हात उठाँउदैको व्यक्ति"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"निराश व्यक्ति"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"दुखी अनुहार व्यक्ति"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"नतमस्तक व्यक्ति"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"रकेट"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"हेलिकोप्टर"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"भापद्वारा चल्ने यातायात"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"रेलवे कार"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"उच्च गति रेल"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"गोली नाक साथ उच्च गतिमा रेल"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"रेल"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"मेट्रो"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"प्रकाश रेल"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"स्टेशन"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"ट्राम"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"ट्राम कार"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"बस"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"आउदैको बस"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"ट्रलीबस"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"बस बिसौना"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"सानो बस"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"एम्बुलेन्स"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"दमकल"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"प्रहरी कार"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"आऊदैको प्रहरी कार"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"ट्याक्सी"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"आऊदैको ट्याक्सी"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"अटोमोबाइल"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"आऊदैको गाडी"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"मनोरंजन वाहन"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"वितरण ट्रक"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"जोडिएको ठूलोगाडी"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"ट्रयाक्टर"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"एकतर्फी रेल"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"पहाडी रेलवे"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"सस्पेंशन रेलवे"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"पहाडी केवलवे"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"हवाई ट्रामगाडी"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"पानीजहाज"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"डुंगा"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"द्रुत डुंगा"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"तेर्सो यातायात बत्ती"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"ठाडो यातायात प्रकाश"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"निर्माण चिन्ह"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"प्रहरी कारको परिक्रामी प्रकाश"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"पोस्टमा त्रिकोणात्मक झण्डा"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"ढोका"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"प्रवेश निषेध चिन्ह"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"धूम्रपान चिन्ह"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"धुम्रपान निषेधित चिन्ह"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"फोहर राख्ने ठाउँ चिन्ह"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"फोहर फाल्न निषेधित चिन्ह"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"पेय जल चिन्ह"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"गैह्र पिउने पानी चिन्ह"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"साइकल"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"साइकल निषेध"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"साइकल यात्री"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"पहाडी साइकल् यात्री"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"पैदल यात्री"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"पैदल यात्री निषेध"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"बच्चाहरु बाटो काट्दै"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"पुरुष चिन्ह"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"महिला चिन्ह"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"शौचालय"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"बच्चा चिन्ह"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"शौचालय"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"कम्बोथ"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"फोहरा"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"स्नान"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"बाथटब"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"राहदानी नियन्त्रण"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"भन्सार"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"सामान दाबी"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"छुटेको सामान"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings-letter-descriptions.xml b/java/res/values-ne-rNP/strings-letter-descriptions.xml new file mode 100644 index 000000000..46708b3f8 --- /dev/null +++ b/java/res/values-ne-rNP/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, Caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less-than or equal to"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater-than or equal to"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings-talkback-descriptions.xml b/java/res/values-ne-rNP/strings-talkback-descriptions.xml new file mode 100644 index 000000000..2bbd1783e --- /dev/null +++ b/java/res/values-ne-rNP/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"पासवर्ड कुञ्जीहरू ठूलो स्वरमा बोलेको आवाज सुन्नका लागि हेडसेट जोड्नुहोस्।"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"वर्तमान पाठ %s हो"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"कुनै पाठ प्रविष्टि गरिएको छैन"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ले <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> लाई <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> मा सच्याउँछ"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ले स्वतः सच्याउने गर्छ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"अज्ञात वर्ण"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"सिफ्ट"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"थप प्रतीकहरु"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"सिफ्ट"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"प्रतीकहरू"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"सिफ्ट"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"मेटाउनुहोस्"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"प्रतिकहरू"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"अक्षरहरू"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"नम्बरहरू"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"सेटिङ्हरू"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ट्याब"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"स्पेस"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"आवाज निवेश"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"इमोजी"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"फर्कनुहोस्"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"खोजी गर्नुहोस्"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"डट्"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"भाषा स्विच गर्नुहोस्"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"अर्को"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"अघिल्लो"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"सिफ्ट सक्षम पारिएको छ"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"क्याप्स लक सक्षम पारिएको छ"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"प्रतिक ढाँचा"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"थप प्रतीक मोड"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"अक्षर ढाँचा"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"फोन ढाँचा"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"फोन प्रतिक मोड"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"किबोर्ड लुकाइएको छ"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> किबोर्ड देखाउँदै"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"मिति"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"मिति र समय"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"इमेल"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"सन्देश पठाइदै"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"सङ्ख्या"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"फोन"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"पाठ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"समय"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"हालैका"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"मानिसहरू"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"वस्तुहरू"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"प्रकृति"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"स्थानहरू"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"प्रतिकहरू"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ईमोटिकन्स"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"अज्ञात प्रतीक"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"अज्ञात इमोजी"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"वैकल्पिक वर्णहरू उपलब्ध छन्"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"वैकल्पिक वर्णहरू खारेज गरियो"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"वैकल्पिक सुझावहरू उपलब्ध छन्"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"वैकल्पिक सुझावहरू खारिज गरियो"</string> +</resources> diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml new file mode 100644 index 000000000..322016902 --- /dev/null +++ b/java/res/values-ne-rNP/strings.xml @@ -0,0 +1,199 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट विकल्पहरू"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"सम्पर्क नामहरू हेर्नुहोस्"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"तपाईँको सम्पर्क सूचीबाट हिज्जे परीक्षकले प्रविष्टिहरूको प्रयोग गर्छ"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"कुञ्जी थिच्दा भाइब्रेट"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"कुञ्जी थिच्दा आवाज"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"कुञ्जी दबाउँदा पपअप"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"निवेश प्राथमिकता"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"उपस्थिति"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"बहुभाषी विकल्प"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"इशारा टाइप प्राथमिकता"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"पाठ सुधार"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"उन्नत"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"अन्य इनपुट विधिमा स्विच गर्नुहोस्"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"भाषा स्विच किले अन्य इनपुट विधि पनि समेट्छ"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"भाषा स्विच कुञ्जी"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"जब बहुसङ्ख्यक इनपुट भाषाहरू सक्षम भएपछि देखाउनुहोस्"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"स्लाइड सूचक देखाउनुहोस्"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"सिफ्ट वा प्रतिक कुञ्जीमा स्लाइड गर्ने बेला दृश्य सङ्केत देखाउनुहोस्"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"कि पपअप खारेजी ढिलाइ"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ढिलाइ छैन"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"पूर्वनिर्धारित"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> मिलिसेकेन्ड"</string> + <string name="settings_system_default" msgid="6268225104743331821">"प्रणाली पूर्वनिर्धारित"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"सम्पर्क नामहरू सुझाव गर्नुहोस्"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव र सुधारका लागि सम्पर्कबाट नामहरू प्रयोग गर्नुहोस्"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"निजीकृत सुझावहरू"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>सुधार गर्नुहोस्"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"डबल-स्पेस पूर्णविराम"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"स्पेसबारमा डबल ट्याप गर्नाले पूर्णविरामपछि स्पेस राख्दछ"</string> + <string name="auto_cap" msgid="1719746674854628252">"स्वतः पूँजिकरण"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"प्रत्येक वाक्यको पहिलो शब्द क्यापिटल गर्नुहोस्"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"व्यक्तिगत शब्दकोश"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"एड-अन शब्दकोश"</string> + <string name="main_dictionary" msgid="4798763781818361168">"मुख्य शब्दकोश"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"सुधार सुझावहरू देखाउने"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"टाइप गर्ने बेलामा सुझाव शब्दहरू देखाउनुहोस्"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"सधैँ देखाउने"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"चित्र मोडमा देखाउनुहोस्"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"सधैँ लुकाउने"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"आपत्तिजनक शब्दहरूलाई रोक्नुहोस्"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"सम्भावित आपत्तिजनक शब्दहरू सुझाव नगर्नुहोस्"</string> + <string name="auto_correction" msgid="7630720885194996950">"स्वतः सुधार"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"गल्ती टाइप भएका शब्दहरूलाई स्पेसबार र पङ्चुएसनले स्वचालित रूपमा सच्याउँछन्।"</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_aggressive" msgid="7319007299148899623">"आक्रामक"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"ज्यादै आक्रामक"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"अर्को शब्द सुझाव"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"सुझावहरू निर्माण गर्न अघिल्लो शब्द प्रयोग गर्नुहोस्"</string> + <string name="gesture_input" msgid="826951152254563827">"इशारा टाइप गर्ने सक्षम पार्नुहोस्"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"अक्षर स्लाइड गरी शब्द इनपुट गर्नुहोस्"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"इशारा ट्रेल देखाउनुहोस्"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"गतिशील फ्लोटिङ पूर्वावलोकन"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"इशारा गर्दा सुझाव दिइएको शब्द हेर्नुहोस्"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"वाक्यांश इशारा"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"इशाराको बखतमा स्पेस कुञ्जीमा ग्लाईडिंग द्वारा आगत खाली ठाउँहरू"</string> + <string name="voice_input" msgid="3583258583521397548">"आवाज इनपुट कुञ्जी"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"कुनै आवाज इनपुट विधिहरू सक्षम गरिएका छैनन्। भाषा र इनपुट सेटिङहरूको जाँच गर्नुहोस्।"</string> + <string name="configure_input_method" msgid="373356270290742459">"इनपुट विधिहरू कन्फिगर गर्नुहोस्"</string> + <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषाहरू"</string> + <string name="send_feedback" msgid="1780431884109392046">"प्रतिक्रिया पठाउनुहोस्"</string> + <string name="select_language" msgid="3693815588777926848">"इनपुट भाषाहरू"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"बचत गर्न पुनः छुनुहोस्"</string> + <string name="has_dictionary" msgid="6071847973466625007">"उपलब्ध शब्दकोश"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"किबोर्ड थिम"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"अंग्रेजी (युके)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"अंग्रेजी (युएस्)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"स्पेनिस (युएस्)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"अंग्रेजी (बेलायत) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"अंग्रेजी (अमेरिका) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"स्पेनेली (अमेरिका) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (परम्परागत)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (सिरिलिक)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ल्याटिन)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"कुनै भाषा होइन (वर्णमाला)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"वर्णमाला (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"वर्णमाला (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"वर्णमाला (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"वर्णमाला (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"वर्णमाला (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"वर्णमाला (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"इमोजी"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"किबोर्ड थिम"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"होलो सेतो"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"होलो नीलो"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"सामाग्री कालो"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"सामाग्री प्रकाश"</string> + <string name="custom_input_styles_title" msgid="8429952441821251512">"अनुकूलन इनपुट शैली"</string> + <string name="add_style" msgid="6163126614514489951">"शैली थप्नुहोस्"</string> + <string name="add" msgid="8299699805688017798">"थप्नुहोस्"</string> + <string name="remove" msgid="4486081658752944606">"हटाउनुहोस्"</string> + <string name="save" msgid="7646738597196767214">"बचत गर्नुहोस्"</string> + <string name="subtype_locale" msgid="8576443440738143764">"भाषा"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"लेआउट"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"तपाईँले प्रयोग गर्न सुरु गर्न अघि तपाईँको अनुकूलन इनपुट शैली सक्षम पारिनु पर्छ। के तपाईँ यसलाई अहिले सक्षम पार्न चाहनु हुन्छ?"</string> + <string name="enable" msgid="5031294444630523247">"सक्षम पार्नुहोस्"</string> + <string name="not_now" msgid="6172462888202790482">"अहिले होइन"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"यस्तो इनपुट शैली पहिले नै अवस्थित छ: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"कुञ्जी लामो थिचाइ ढिलाइ"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"कुञ्जी थिचाइ भाइब्रेसन अवधि"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"कुञ्जी थिचाइ आवाज भोल्युम"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाह्य शब्दकोश फाइल पढ्नुहोस्"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फोल्डरमा कुनै शब्दकोश फाइलहरू छैनन्।"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"स्थापना गर्न कुनै शब्दकोश फाइल चयन गर्नुहोस्"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"वास्तवमै <xliff:g id="LANGUAGE_NAME">%s</xliff:g> को लागि यो फाइल स्थापना गर्नुहुन्छ?"</string> + <string name="error" msgid="8940763624668513648">"कुनै त्रुटि भयो"</string> + <string name="button_default" msgid="3988017840431881491">"पूर्वनिर्धारित"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"तपाईँलाई स्वागत छ<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"इशारा टाइप गर्नेसँग"</string> + <string name="setup_start_action" msgid="8936036460897347708">"सुरु गरौं"</string> + <string name="setup_next_action" msgid="371821437915144603">"अर्को चरण"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"स्थापना गर्दै <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"सक्षम पार्नुहोस् <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"कृपया जाँच गर्नुहोस् \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" तपाईँको भाषा र इनपुट सेटिङमा। यसले तपाईँलाई तपाईँको उपकरणमा सञ्चालन गर्न आधिकारिकता प्रदान गर्छ।"</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> पहिले नै तपाईँको भाषा र इनपुट सेटिङमा सक्षम पारिएको छ, त्यसैले यो कदम सकिसकिएको छ। अर्कोमा जानुहोस्!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"सेटिङहरूमा सक्षम पार्नुहोस्"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>मा स्विच गर्नुहोस्"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"त्यसपछि, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" लाई तपाईँको सक्रिय पाठ इनपुट विधिका रूपमा चयन गर्नुहोस्।"</string> + <string name="setup_step2_action" msgid="1660330307159824337">"इनपुट विधि स्विच गर्नुहोस्"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"बधाई छ, तपाईँले सेट पुरा गर्नुभयो!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"अब तपाईँ <xliff:g id="APPLICATION_NAME">%s</xliff:g>का साथ तपाईँका सम्पूर्ण मनपर्ने अनुप्रयोगहरू टाइप गर्न सक्नुहुन्छ।"</string> + <string name="setup_step3_action" msgid="600879797256942259">"थप भाषाहरू कन्फिगर गर्नुहोस्"</string> + <string name="setup_finish_action" msgid="276559243409465389">"समाप्त भयो"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"अनुप्रयोग आइकन देखाउनुहोस्"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"लन्चरमा अनुप्रयोग आइकन देखाउनुहोस्"</string> + <string name="app_name" msgid="6320102637491234792">"शब्दकोश प्रदायक"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"शब्दकोश प्रदायक"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"शब्दकोश सेवा"</string> + <string name="download_description" msgid="6014835283119198591">"शब्दकोश अद्यावधिक जानकारी"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"एड-अन शब्दकोश"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"उपलब्ध शब्दकोश"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"शब्दकोशहरूका लागि सेटिङहरू"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"प्रयोगकर्ता शब्दकोशहरू"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"प्रयोगकर्ता शब्दकोश"</string> + <string name="dictionary_available" msgid="4728975345815214218">"उपलब्ध शब्दकोश"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"हाल डाउनलोड गर्दै"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"स्थापित"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"स्थापित, असक्षम पारिएको"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"शब्दकोश सेवासँग जोड्न समस्या"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"शब्दकोशहरू उपलब्ध छैनन्"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"पुनः ताजा गर्नुहोस्"</string> + <string name="last_update" msgid="730467549913588780">"पछिल्लो अद्यावधिक"</string> + <string name="message_updating" msgid="4457761393932375219">"अद्यावधिकको लागि जाँच गर्दै"</string> + <string name="message_loading" msgid="5638680861387748936">"लोड हुँदै..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"मुख्य शब्दकोश"</string> + <string name="cancel" msgid="6830980399865683324">"रद्द गर्नुहोस्"</string> + <string name="go_to_settings" msgid="3876892339342569259">"सेटिङ्हरू"</string> + <string name="install_dict" msgid="180852772562189365">"स्थापना गर्नुहोस्"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द गर्नुहोस्"</string> + <string name="delete_dict" msgid="756853268088330054">"मेट्नुहोस्"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"तपाईँको मोबाइल उपकरणमा चयन गरिएको भाषाको शब्दकोश उपलब्ध छ। <br/> तपाईँको टाइप गर्ने अनुभव सुधार गर्न हामी <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>को शब्दकोश <b> डाउनलोड गर्न </b> सिफारिस गर्दछौँ। यो डाउनलोड गर्न 3G मा एक वा दुई मिनेट लिन सक्छ। तपाईँ एक <b> तपाईँको असीमित डेटा योजना </b> छैन भने शुल्क लागू हुन सक्छ। तपाईँसँग कुन डेटा योजना छ भन्ने निश्चित छैन भने Wi-Fi जडान गरेर स्वचालित डाउनलोड गर्न हामी सिफारिस गर्दछौँ। युक्ति: तपाईँ आफ्नो मोबाइल उपकरणको </b> भाषा र इनपुट <b> <b>सेटिङ </b> मेनुमा गएर शब्दकोशलाई डाउनलोड र हटाउन सक्नुहुन्छ।"</string> + <string name="download_over_metered" msgid="1643065851159409546">"(अब डाउनलोड गर्नुहोस्<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"वाइ-फाइको माध्ययमद्वार डाउनलोड गर्नुहोस्"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>को लागि एउटा शब्दकोश उपलब्ध छ"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"समीक्षा गर्न थिच्नुहोस् र डाउनलोड गर्नुहोस्"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"डाउनलोड गर्दै: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>को लागि सुझावहरू चाँडै नै तयार हुने छ।"</string> + <string name="version_text" msgid="2715354215568469385">"संस्करण <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"थप्नुहोस्"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"शब्दकोशमा थप्नुहोस्"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"पदावली"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"थप विकल्पहरू"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"कम विकल्पहरू"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ठीक छ"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"शब्द:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"सर्टकट:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"भाषा:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"एउटा शब्द टाइप गर्नुहोस्"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"वैकल्पिक सर्टकट"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"शब्द सम्पादन गर्नुहोस्"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"सम्पादन गर्नुहोस्"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"मेट्नुहोस्"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"तपाईँसँग प्रयोगकर्ता शब्दकोशमा कुनै शब्द छैन।\"थप्नुहोस्\"(+) बटनमा छोएर एउटा शब्द थप्नुहोस्।"</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"सबै भाषाहरूका लागि"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"थप भाषाहरू..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"मेट्नुहोस्"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-nl/strings-action-keys.xml b/java/res/values-nl/strings-action-keys.xml index c1ce25acf..4dd5349c8 100644 --- a/java/res/values-nl/strings-action-keys.xml +++ b/java/res/values-nl/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Vorig"</string> <string name="label_done_key" msgid="7564866296502630852">"Klaar"</string> <string name="label_send_key" msgid="482252074224462163">"Verz."</string> + <string name="label_search_key" msgid="7965186050435796642">"Zoeken"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauze"</string> <string name="label_wait_key" msgid="5891247853595466039">"Wacht"</string> </resources> diff --git a/java/res/values-nl/strings-config-important-notice.xml b/java/res/values-nl/strings-config-important-notice.xml new file mode 100644 index 000000000..a340c99f9 --- /dev/null +++ b/java/res/values-nl/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Suggesties verbeteren met uw communicatie en getypte gegevens"</string> +</resources> diff --git a/java/res/values-nl/strings-letter-descriptions.xml b/java/res/values-nl/strings-letter-descriptions.xml new file mode 100644 index 000000000..8bd3aafdc --- /dev/null +++ b/java/res/values-nl/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Superscript a"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro-teken"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Superscript o"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Scherpe S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent aigu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accent circonflexe"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring erboven"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatuur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedille"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent aigu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accent circonflexe"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent aigu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accent circonflexe"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent aigu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accent circonflexe"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, schuine streep"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent aigu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accent circonflexe"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent aigu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, lengteteken"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, boogje"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent aigu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accent circonflexe"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punt erboven"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, schuine streep"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, lengteteken"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, boogje"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punt erboven"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accent circonflexe"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, boogje"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punt erboven"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedille"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accent circonflexe"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, schuine streep"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, lengteteken"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, boogje"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I zonder punt"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatuur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accent circonflexe"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedille"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent aigu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedille"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, midden-punt"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, schuine streep"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent aigu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedille"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, voorafgegaan door apostrof"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, lengteteken"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, boogje"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dubbel accent aigu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatuur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent aigu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedille"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent aigu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accent circonflexe"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedille"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedille"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, schuine streep"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, lengteteken"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, boogje"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring erboven"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dubbel accent aigu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accent circonflexe"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accent circonflexe"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent aigu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punt erboven"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Lange S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, hoorntje"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, hoorntje"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, komma eronder"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, komma eronder"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punt eronder"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, haakje erboven"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accent circonflexe en accent aigu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accent circonflexe en accent grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accent circonflexe en haakje erboven"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accent circonflexe en tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accent circonflexe en punt eronder"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, boogje en accent aigu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, boogje en accent grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, boogje en haakje erboven"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, boogje en tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, boogje en punt eronder"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punt eronder"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, haakje erboven"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accent circonflexe en accent aigu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accent circonflexe en accent grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accent circonflexe en haakje erboven"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accent circonflexe en tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accent circonflexe en punt eronder"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, haakje erboven"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punt eronder"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punt eronder"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, haakje erboven"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accent circonflexe en accent aigu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accent circonflexe en accent grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accent circonflexe en haakje erboven"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accent circonflexe en tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accent circonflexe en punt eronder"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, hoorntje en accent aigu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, hoorntje en accent grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, hoorntje en haakje erboven"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, hoorntje en tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, hoorntje en punt eronder"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punt eronder"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, haakje erboven"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, hoorntje en accent aigu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, hoorntje en accent grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, hoorntje en haakje erboven"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, hoorntje en tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, hoorntje en punt eronder"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punt eronder"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, haakje erboven"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Omgekeerd uitroepteken"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dubbel aanhalingsteken naar links"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Midden-punt"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript 1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dubbel aanhalingsteken naar rechts"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Omgekeerd vraagteken"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Enkel aanhalingsteken links"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Enkel aanhalingsteken rechts"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkel omgekeerd laag aanhalingsteken"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dubbel aanhalingsteken links"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dubbel aanhalingsteken rechts"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kruisje"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubbel kruisje"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per duizend-teken"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Accent"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubbel accent"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkel aanhalingsteken naar links"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkel aanhalingsteken naar rechts"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript 4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript Latijnse kleine letter N"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Teken voor Peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ten attentie van"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pijl naar rechts"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pijl omlaag"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Lege verzameling"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Verhoging"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kleiner dan of gelijk aan"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Groter dan of gelijk aan"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Zwarte ster"</string> +</resources> diff --git a/java/res/values-nl/strings-talkback-descriptions.xml b/java/res/values-nl/strings-talkback-descriptions.xml new file mode 100644 index 000000000..c59f3f2fd --- /dev/null +++ b/java/res/values-nl/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Sluit een headset aan om wachtwoordtoetsen hardop te laten voorlezen."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Huidige tekst is %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Geen tekst ingevoerd"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Met <xliff:g id="KEY_NAME">%1$s</xliff:g> wordt <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> gecorrigeerd naar <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Met <xliff:g id="KEY_NAME">%1$s</xliff:g> voert u automatische correctie uit"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Onbekend teken"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Meer symbolen"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbolen"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Verwijderen"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbolen"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letters"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Cijfers"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Instellingen"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Spatiebalk"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Spraakinvoer"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Zoeken"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Taal wijzigen"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Volgende"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Vorige"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ingeschakeld"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock ingeschakeld"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbolen"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modus voor meer symbolen"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Alfanumeriek toetsenbord"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Toetsenbord telefoon"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefoonsymbolen"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Toetsenbord verborgen"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Toetsenbord voor <xliff:g id="KEYBOARD_MODE">%s</xliff:g> wordt weergegeven"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum en tijd"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"berichten"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"nummer"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefoon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"tijd"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recent"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Mensen"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objecten"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natuur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Plaatsen"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbolen"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Hoofdletter <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Hoofdletter I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Hoofdletter I, punt erboven"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Onbekend symbool"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Onbekende emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatieve tekens zijn beschikbaar"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatieve tekens worden verwijderd"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatieve suggesties zijn beschikbaar"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatieve suggesties worden verwijderd"</string> +</resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index dcbf2c09c..33350b1bd 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropties"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Opdrachten in onderzoekslogbestand"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Contactnamen opzoeken"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"De spellingcontrole gebruikt items uit uw contactenlijst"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij toetsaanslag"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij toetsaanslag"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up bij toetsaanslag"</string> - <string name="general_category" msgid="1859088467017573195">"Algemeen"</string> - <string name="correction_category" msgid="2236750915056607613">"Tekstcorrectie"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Typen via tekenen"</string> - <string name="misc_category" msgid="6894192814868233453">"Andere opties"</string> - <string name="advanced_settings" msgid="362895144495591463">"Geavanceerde instellingen"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opties voor experts"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Invoermeth. overschakelen"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Schakelknop voor taal ook van toepassing op andere invoermethoden"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Schakelknop voor taal"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Systeemstandaard"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Contactnamen suggereren"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Namen uit Contacten gebruiken voor suggesties en correcties"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Gepersonaliseerde suggesties"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> verbeteren"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dubbeltik is punt, spatie"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbeltik op spatiebalk voor een punt gevolgd door een spatie"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Gebarenspoor weergeven"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamisch zwevend voorbeeld"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Het voorgestelde woord weergeven tijdens het tekenen"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Sluit een headset aan om wachtwoordtoetsen hardop te laten voorlezen."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Huidige tekst is %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Geen tekst ingevoerd"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Met <xliff:g id="KEY">%1$s</xliff:g> wordt <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> gecorrigeerd naar <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Met <xliff:g id="KEY">%1$s</xliff:g> voert u automatische correctie uit"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Toetscode %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift aan (tik om uit te schakelen)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock aan (tik om uit te schakelen)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Verwijderen"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbolen"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letters"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Cijfers"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Instellingen"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spatie"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Spraakinvoer"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley-gezichtje"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Zoeken"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Stip"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Taal wijzigen"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Volgende"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Vorige"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ingeschakeld"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock ingeschakeld"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift uitgeschakeld"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbolen"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Alfanumeriek toetsenbord"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Toetsenbord telefoon"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefoonsymbolen"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Toetsenbord verborgen"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> toetsenbord wordt weergegeven"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum en tijd"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"berichten"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"nummer"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefoon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"tijd"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gebaar voor woordgroep"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Spaties invoeren bij gebaren door naar de spatietoets te bewegen"</string> <string name="voice_input" msgid="3583258583521397548">"Toets voor spraakinvoer"</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">"Microfoon op hoofdtoetsenbord"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Geen spraakinvoermethoden ingeschakeld. Ga naar \'Instellingen voor taal en invoer\'."</string> <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string> <string name="send_feedback" msgid="1780431884109392046">"Feedback verzenden"</string> <string name="select_language" msgid="3693815588777926848">"Invoertalen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak nogmaals aan om op te slaan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen te verzenden."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Toetsenbordthema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engels (GB)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engels (VS)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spaans (VS)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engels (VK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engels (VS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spaans (VS) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditioneel)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engels (VK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engels (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spaans (VS) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditioneel)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyrillisch)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latijns)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Geen taal (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (pc)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Kleurenschema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Wit"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blauw"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Aangep. invoerstijlen"</string> <string name="add_style" msgid="6163126614514489951">"Stijl toev."</string> <string name="add" msgid="8299699805688017798">"Toevoegen"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Inschakelen"</string> <string name="not_now" msgid="6172462888202790482">"Niet nu"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Dezelfde invoerstijl bestaat al: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus voor gebruiksvriendelijkheidsonderzoek"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Vertraging toets lang indrukkn"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Trilingsduur bij toetsgebruik"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Geluidsvolume bij toetsgebruik"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Extern woordenboekbestand lezen"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordenboekbestanden in de map \'Downloads\'"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecteer een woordenboekbestand om te installeren"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Wilt u dit bestand voor <xliff:g id="LOCALE_NAME">%s</xliff:g> echt installeren?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Wilt u dit bestand voor het <xliff:g id="LANGUAGE_NAME">%s</xliff:g> echt installeren?"</string> <string name="error" msgid="8940763624668513648">"Er is een fout opgetreden"</string> <string name="button_default" msgid="3988017840431881491">"Standaard"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Welkom bij <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Vernieuwen"</string> <string name="last_update" msgid="730467549913588780">"Laatst bijgewerkt"</string> <string name="message_updating" msgid="4457761393932375219">"Controleren op updates"</string> - <string name="message_loading" msgid="8689096636874758814">"Wordt geladen…"</string> + <string name="message_loading" msgid="5638680861387748936">"Laden…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Algemeen woordenboek"</string> <string name="cancel" msgid="6830980399865683324">"Annuleren"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Instellingen"</string> <string name="install_dict" msgid="180852772562189365">"Installeren"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Annuleren"</string> <string name="delete_dict" msgid="756853268088330054">"Verwijderen"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Er is een woordenboek voor de geselecteerde taal beschikbaar op uw mobiele apparaat.<br/> We raden u aan het woordenboek voor het <xliff:g id="LANGUAGE">%1$s</xliff:g> te <b>downloaden</b> om uw typvaardigheid te verbeteren.<br/> <br/> De download kan één of twee minuten duren via 3G. Er kunnen kosten worden berekend als u geen <b>onbeperkt gegevensabonnement</b> heeft.<br/> Als u niet zeker weet welk gegevensabonnement u heeft, raden we u aan een wifi-verbinding te zoeken om de download automatisch te starten.<br/> <br/> Tip: u kunt woordenboeken downloaden en verwijderen via <b>Taal en invoer</b> in het menu <b>Instellingen</b> van uw mobiele apparaat."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Er is een woordenboek beschikbaar voor de geselecteerde taal op uw mobiele apparaat.<br/> We raden u aan het woordenboek voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> te <b>downloaden</b> om uw typvaardigheid te verbeteren.<br/> <br/> De download kan één of twee minuten duren via 3G. Er kunnen kosten worden berekend als u geen <b>onbeperkt gegevensabonnement</b> heeft.<br/> Als u niet zeker weet welk gegevensabonnement u heeft, raden we u aan een wifi-verbinding te zoeken om de download automatisch te starten.<br/> <br/> Tip: u kunt woordenboeken downloaden en verwijderen via <b>Taal en invoer</b> in het menu <b>Instellingen</b> van uw mobiele apparaat."</string> <string name="download_over_metered" msgid="1643065851159409546">"Nu downloaden (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Downloaden via wifi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Er is een woordenboek beschikbaar voor het <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Er is een woordenboek beschikbaar voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te controleren en te downloaden"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloaden: suggesties voor het <xliff:g id="LANGUAGE">%1$s</xliff:g> zijn straks beschikbaar."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Downloaden: suggesties voor het <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> zijn straks beschikbaar."</string> <string name="version_text" msgid="2715354215568469385">"Versie <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Toevoegen"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Toevoegen aan woordenboek"</string> diff --git a/java/res/values-pl/strings-action-keys.xml b/java/res/values-pl/strings-action-keys.xml index 2984b98b8..6ca0b0cbe 100644 --- a/java/res/values-pl/strings-action-keys.xml +++ b/java/res/values-pl/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Wróć"</string> <string name="label_done_key" msgid="7564866296502630852">"Gotowe"</string> <string name="label_send_key" msgid="482252074224462163">"Wyślij"</string> + <string name="label_search_key" msgid="7965186050435796642">"Szukaj"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string> <string name="label_wait_key" msgid="5891247853595466039">"Czekaj"</string> </resources> diff --git a/java/res/values-pl/strings-config-important-notice.xml b/java/res/values-pl/strings-config-important-notice.xml new file mode 100644 index 000000000..315a61bc2 --- /dev/null +++ b/java/res/values-pl/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Analizuj wiadomości i wpisywane dane, by ulepszać podpowiedzi"</string> +</resources> diff --git a/java/res/values-pl/strings-letter-descriptions.xml b/java/res/values-pl/strings-letter-descriptions.xml new file mode 100644 index 000000000..7b1463c79 --- /dev/null +++ b/java/res/values-pl/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Wskaźnik rodzaju żeńskiego liczebnika porządkowego"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Wskaźnik rodzaju męskiego liczebnika porządkowego"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostre S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A z odwrotną kreską"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A z kreską"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A z daszkiem"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A z tyldą"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A z dwiema kropkami"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A z kółkiem"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C z haczykiem"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E z odwrotną kreską"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E z kreską"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E z daszkiem"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E z dwiema kropkami"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I z odwrotną kreską"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I z kreską"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I z daszkiem"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I z dwiema kropkami"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N z tyldą"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O z odwrotną kreską"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O z kreską"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O z daszkiem"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O z tyldą"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O z dwiema kropkami"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O z przekreśleniem"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U z odwrotną kreską"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U z kreską"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U z daszkiem"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U z dwiema kropkami"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y z kreską"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y z dwiema kropkami"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A z makronem"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A z łuczkiem"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A z ogonkiem"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C z kreską"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C z daszkiem"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C z kropką"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C z ptaszkiem"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D z ptaszkiem"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D z przekreśleniem"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E z makronem"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E z łuczkiem"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E z kropką u góry"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E z ogonkiem"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E z ptaszkiem"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G z daszkiem"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G z łuczkiem"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G z kropką u góry"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G z haczykiem"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H z daszkiem"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H z przekreśleniem"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I z tyldą"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I z makronem"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I z łuczkiem"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I z ogonkiem"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez kropki"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J z daszkiem"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K z haczykiem"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L z kreską"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L z haczykiem"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L z ptaszkiem"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L z kropką pośrodku"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L z przekreśleniem"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N z kreską"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N z haczykiem"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N z ptaszkiem"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N poprzedzone apostrofem"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O z makronem"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O z łuczkiem"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O z podwójną kreską"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R z kreską"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R z haczykiem"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R z ptaszkiem"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S z kreską"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S z daszkiem"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S z haczykiem"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S z ptaszkiem"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T z haczykiem"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T z ptaszkiem"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T z przekreśleniem"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U z tyldą"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U z makronem"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U z łuczkiem"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U z kółkiem"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U z podwójną kreską"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U z ogonkiem"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W z daszkiem"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y z daszkiem"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z z kreską"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z z kropką"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z z ptaszkiem"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Długie S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O z rogiem"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U z rogiem"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S z przecinkiem u dołu"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T z przecinkiem u dołu"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Szwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A z kropką u dołu"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A z zawijasem u góry"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A z daszkiem i kreską"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A z daszkiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A z daszkiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A z daszkiem i tyldą"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A z daszkiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A z łuczkiem i kreską"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A z łuczkiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A z łuczkiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A z łuczkiem i tyldą"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A z łuczkiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E z kropką u dołu"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E z zawijasem u góry"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E z tyldą"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E z daszkiem i kreską"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E z daszkiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E z daszkiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E z daszkiem i tyldą"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E z daszkiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I z zawijasem u góry"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I z kropką u dołu"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O z kropką u dołu"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O z zawijasem u góry"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O z daszkiem i kreską"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O z daszkiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O z daszkiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O z daszkiem i tyldą"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O z daszkiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O z rogiem i kreską"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O z rogiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O z rogiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O z rogiem i tyldą"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O z rogiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U z kropką u dołu"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U z zawijasem u góry"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U z rogiem i kreską"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U z rogiem i odwrotną kreską"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U z rogiem i zawijasem u góry"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U z rogiem i tyldą"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U z rogiem i kropką u dołu"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y z odwrotną kreską"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y z kropką u dołu"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y z zawijasem u góry"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y z tyldą"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Odwrócony wykrzyknik"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Lewy cudzysłów kątowy"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Kropka pośrodku"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Pierwsza potęga"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Prawy cudzysłów kątowy"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Odwrócony pytajnik"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Lewy cudzysłów definicyjny"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Prawy cudzysłów definicyjny"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Cudzysłów pojedynczy"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Lewy cudzysłów apostrofowy"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Prawy cudzysłów apostrofowy"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Krzyżyk"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Podwójny krzyżyk"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promil"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prim"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Bis"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Lewy francuski cudzysłów pojedynczy"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Prawy francuski cudzysłów pojedynczy"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Czwarta potęga"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Małe n w górnym indeksie"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Znak „przez grzeczność”"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Strzałka w prawo"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Strzałka w dół"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Zbiór pusty"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Przyrost"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mniejsze lub równe"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Większe lub równe"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Czarna gwiazdka"</string> +</resources> diff --git a/java/res/values-pl/strings-talkback-descriptions.xml b/java/res/values-pl/strings-talkback-descriptions.xml new file mode 100644 index 000000000..43fca5f34 --- /dev/null +++ b/java/res/values-pl/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Podłącz zestaw słuchawkowy, by usłyszeć znaki hasła wypowiadane na głos."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Aktualny tekst: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nie wpisano tekstu"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> poprawia <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> wykonuje autokorektę"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Nieznany znak"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Więcej symboli"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symbole"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Usuń"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symbole"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Litery"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Liczby"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ustawienia"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Karta"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Spacja"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Rozpoznawanie mowy"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emotikony"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Szukaj"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Kropka"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Przełącz język"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Dalej"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Wstecz"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift włączony"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock włączony"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Tryb symboli"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Tryb dodatkowych symboli"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Tryb liter"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Tryb telefonu"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Tryb symboli telefonu"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klawiatura ukryta"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Pokazuję klawiaturę w trybie <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data i godzina"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"SMS"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"liczba"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"tekst"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"godzina"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"adres URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Niedawne"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Osoby"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Obiekty"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Przyroda"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Miejsca"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbole"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikony"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Wielka litera <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Wielka litera I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Wielka litera I z kropką"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Nieznany symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Nieznany emotikon"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatywne znaki są dostępne"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatywne znaki zostały zamknięte"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatywne propozycje są dostępne"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatywne propozycje zostały zamknięte"</string> +</resources> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index c78674a9b..af1d2ce5c 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -21,19 +21,24 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcje wprowadzania"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Polecenia dziennika badań"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Przeszukaj kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Sprawdzanie pisowni bierze pod uwagę wpisy z listy kontaktów."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Wibracja przy naciśnięciu"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Dźwięk przy naciśnięciu"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Powiększ po naciśnięciu"</string> - <string name="general_category" msgid="1859088467017573195">"Ogólne"</string> - <string name="correction_category" msgid="2236750915056607613">"Poprawianie tekstu"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Pisanie gestami"</string> - <string name="misc_category" msgid="6894192814868233453">"Inne opcje"</string> - <string name="advanced_settings" msgid="362895144495591463">"Ustawienia zaawansowane"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opcje dla ekspertów"</string> - <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Włącz inne metody wprowadzania"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Inne metody wprowadzania"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Klawisz zmiany języka obejmuje też inne metody wprowadzania"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Klawisz zmiany języka"</string> <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Pokaż, gdy włączonych jest kilka języków wprowadzania"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Ustawienie domyślne"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Proponuj osoby z kontaktów"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"W propozycjach i poprawkach użyj nazwisk z kontaktów"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Spersonalizowane sugestie"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Popraw aplikację <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Szybka kropka ze spacją"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dwukrotne kliknięcie spacji wstawia kropkę ze spacją"</string> <string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Pokazuj ślad gestu"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamiczny podgląd słowa"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Podczas gestykulacji będzie widoczne podpowiadane słowo"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Zapisano"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Podłącz zestaw słuchawkowy, aby usłyszeć znaki hasła wypowiadane na głos."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktualny tekst: %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nie wprowadzono tekstu"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> poprawia <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> wykonuje autokorektę"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kod klawisza: %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift włączony (kliknij, by wyłączyć)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock włączony (kliknij, by wyłączyć)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Usuń"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symbole"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Litery"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Liczby"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Ustawienia"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spacja"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Rozpoznawanie mowy"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Uśmiechnięta buźka"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Szukaj"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punkt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Przełącz język"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Dalej"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Wstecz"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift włączony"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock włączony"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift wyłączony"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Tryb symboli"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Tryb liter"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Tryb telefonu"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Tryb symboli telefonu"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klawiatura ukryta"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Pokazuję klawiaturę w trybie <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"data i godzina"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"SMS"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"liczba"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"tekst"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"godzina"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gest wyrażenia"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Wpisuj spacje podczas gestów, przesuwając palec do klawisza spacji"</string> <string name="voice_input" msgid="3583258583521397548">"Klawisz rozpoznawania mowy"</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">"Rozpoznawanie mowy jest wyłączone"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nie włączono żadnych metod wprowadzania głosowego. Sprawdź ustawienia języka i wprowadzania."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguruj metody wprowadzania"</string> <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string> <string name="send_feedback" msgid="1780431884109392046">"Prześlij opinię"</string> <string name="select_language" msgid="3693815588777926848">"Języki wprowadzania"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotknij ponownie, aby zapisać"</string> <string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Pomóż ulepszyć edytor wprowadzania tekstu, automatycznie wysyłając statystyki użycia i raporty o awariach."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Motyw klawiatury"</string> <string name="subtype_en_GB" msgid="88170601942311355">"angielski (Wielka Brytania)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"angielski (Stany Zjednoczone)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"hiszpański (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"angielski (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"angielski (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"hiszpański (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradycyjny)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Angielski (Wielka Brytania) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Angielski (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Hiszpański (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradycyjny)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cyrylica)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (alfabet łaciński)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Bez języka (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emotikony"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Schemat kolorów"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Biały"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Niebieski"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Style niestandardowe"</string> <string name="add_style" msgid="6163126614514489951">"Dodaj styl"</string> <string name="add" msgid="8299699805688017798">"Dodaj"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Włącz"</string> <string name="not_now" msgid="6172462888202790482">"Nie teraz"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Taki styl wprowadzania już istnieje: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Tryb badania przydatności"</string> - <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Opóźn. przy przytrzym. przycisku"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Czas wibr. przy naciśn. przycisku"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Głośność przy naciśn. przycisku"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Opóźnienie przy długim naciśnięciu"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Wibracja przy naciśniętym klawiszu"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Głośność przy naciśniętym klawiszu"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Odczyt zewnętrznego pliku słownika"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Brak plików słownika w folderze Pobrane pliki"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wybierz plik słownika do zainstalowania"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Czy na pewno zainstalować ten plik dla języka: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Czy na pewno zainstalować ten plik dla języka: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Wystąpił błąd"</string> <string name="button_default" msgid="3988017840431881491">"Domyślne"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Witamy w aplikacji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Odśwież"</string> <string name="last_update" msgid="730467549913588780">"Ostatnia aktualizacja"</string> <string name="message_updating" msgid="4457761393932375219">"Sprawdzanie dostępności aktualizacji"</string> - <string name="message_loading" msgid="8689096636874758814">"Wczytuję..."</string> + <string name="message_loading" msgid="5638680861387748936">"Wczytuję…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Słownik główny"</string> <string name="cancel" msgid="6830980399865683324">"Anuluj"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ustawienia"</string> <string name="install_dict" msgid="180852772562189365">"Zainstaluj"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Anuluj"</string> <string name="delete_dict" msgid="756853268088330054">"Usuń"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Dla języka, którego używasz na swoim urządzeniu przenośnym, jest dostępny słownik.<br/> Warto <b>pobrać</b> ten słownik <xliff:g id="LANGUAGE">%1$s</xliff:g>, by ułatwić sobie pisanie.<br/> <br/> Pobieranie trwa do dwóch minut (przez 3G). Jeśli nie masz <b>abonamentu z nieograniczoną transmisją danych</b>, operator może naliczyć opłatę.<br/> Jeśli nie wiesz, jaki masz abonament, połącz się z Wi-Fi, by automatycznie rozpocząć pobieranie.<br/> <br/> Wskazówka: słowniki możesz pobierać i usuwać na urządzeniu w sekcji <b>Język, klawiatura, głos</b> w menu <b>Ustawienia</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Do języka, którego używasz na swoim urządzeniu przenośnym, jest dostępny słownik.<br/> Warto <b>pobrać</b> ten słownik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>, by ułatwić sobie pisanie.<br/> <br/> Pobieranie trwa do dwóch minut (przez 3G). Jeśli nie masz <b>abonamentu z nieograniczoną transmisją danych</b>, operator może naliczyć opłatę.<br/> Jeśli nie wiesz, jaki masz abonament, połącz się z Wi-Fi, by automatycznie rozpocząć pobieranie.<br/> <br/> Wskazówka: słowniki możesz pobierać i usuwać w sekcji <b>Język, klawiatura, głos</b> w menu <b>Ustawienia</b> na urządzeniu."</string> <string name="download_over_metered" msgid="1643065851159409546">"Pobierz teraz (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Pobierz przez Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Dostępny jest słownik <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Dostępny jest słownik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Naciśnij, by sprawdzić i pobrać"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Pobieranie – wkrótce będą dostępne sugestie w tym języku: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Pobieranie – wkrótce będą dostępne sugestie w tym języku: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Wersja <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodaj"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj do słownika"</string> diff --git a/java/res/values-port/setup-dimens-small-phone-port.xml b/java/res/values-port/setup-dimens-small-phone-port.xml index 8ac72ea7c..cf2751f1b 100644 --- a/java/res/values-port/setup-dimens-small-phone-port.xml +++ b/java/res/values-port/setup-dimens-small-phone-port.xml @@ -20,7 +20,6 @@ <dimen name="setup_welcome_description_text_size">20sp</dimen> <dimen name="setup_step_bullet_text_size">18sp</dimen> <dimen name="setup_step_triangle_indicator_height">18dp</dimen> - <dimen name="setup_step_indicator_height">18dp</dimen> <dimen name="setup_step_title_text_size">18sp</dimen> <dimen name="setup_step_instruction_text_size">14sp</dimen> <dimen name="setup_step_action_text_size">16sp</dimen> diff --git a/java/res/values-pt-rPT/strings-action-keys.xml b/java/res/values-pt-rPT/strings-action-keys.xml index 7a7559fea..73a6c498f 100644 --- a/java/res/values-pt-rPT/strings-action-keys.xml +++ b/java/res/values-pt-rPT/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string> <string name="label_done_key" msgid="7564866296502630852">"Conc."</string> <string name="label_send_key" msgid="482252074224462163">"Env."</string> + <string name="label_search_key" msgid="7965186050435796642">"Pesquisar"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string> </resources> diff --git a/java/res/values-pt-rPT/strings-config-important-notice.xml b/java/res/values-pt-rPT/strings-config-important-notice.xml new file mode 100644 index 000000000..38e2499d4 --- /dev/null +++ b/java/res/values-pt-rPT/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprender com comunicações e dados introd. para melhorar sugestões"</string> +</resources> diff --git a/java/res/values-pt-rPT/strings-letter-descriptions.xml b/java/res/values-pt-rPT/strings-letter-descriptions.xml new file mode 100644 index 000000000..377b1578f --- /dev/null +++ b/java/res/values-pt-rPT/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Sinal de micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S curto"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diérese"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anel sobreposto"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilha"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diérese"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diérese"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diérese"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, traço"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diérese"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diérese"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, mácron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ponto sobreposto"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, traço"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, mácron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ponto sobreposto"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ponto sobreposto"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilha"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, traço"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, mácron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sem ponto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilha"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilha"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ponto intermédio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, traço"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilha"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedido de apóstrofe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, mácron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, duplo agudo"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilha"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilha"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilha"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, traço"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, mácron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anel sobreposto"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, duplo agudo"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ponto sobreposto"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, chifre"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, chifre"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, vírgula subposta"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, vírgula subposta"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ponto subposto"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho sobreposto"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho sobreposto"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e ponto subposto"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancho sobreposto"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e til"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e ponto subposto"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ponto subposto"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho sobreposto"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho sobreposto"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e ponto subposto"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho sobreposto"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ponto subposto"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ponto subposto"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho sobreposto"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho sobreposto"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e ponto subposto"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, chifre e agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, chifre e grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, chifre e gancho sobreposto"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, chifre e til"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, chifre e ponto subposto"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ponto subposto"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho sobreposto"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, chifre e agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, chifre e grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, chifre e gancho sobreposto"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, chifre e til"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, chifre e ponto subposto"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ponto subposto"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho sobreposto"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ponto de exclamação invertido"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Aspas angulares duplas esquerdas"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ponto intermédio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Um sobrescrito"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Aspas angulares duplas direitas"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ponto de interrogação invertido"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Aspa simples esquerda"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Aspa simples direita"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Aspa simples subposta"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Aspas duplas esquerdas"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Aspas duplas direitas"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Adaga"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Adaga dupla"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Sinal de permilagem"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Plica"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Plica dupla"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Aspa angular simples esquerda"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Aspa angular simples direita"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Quatro sobrescrito"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"N latino minúsculo sobrescrito"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Sinal de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ao cuidado de"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Seta para a direita"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Seta para baixo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vazio"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Delta"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor do que ou igual a"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior do que ou igual a"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela negra"</string> +</resources> diff --git a/java/res/values-pt-rPT/strings-talkback-descriptions.xml b/java/res/values-pt-rPT/strings-talkback-descriptions.xml new file mode 100644 index 000000000..30bbd3fb3 --- /dev/null +++ b/java/res/values-pt-rPT/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Ligar auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"O texto atual é %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nenhum texto digitado"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa a correção automática"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caráter desconhecido"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mais símbolos"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Símbolos"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Eliminar"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Símbolos"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letras"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Números"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Definições"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Separador"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espaço"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrada de voz"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Voltar"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Pesquisar"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Ponto"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Mudar de idioma"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Seguinte"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Anterior"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ativado"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ativado"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modo de símbolos"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modo Mais símbolos"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modo de letras"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modo de telemóvel"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modo de símbolos de telemóvel"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teclado oculto"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"A mostrar o teclado de <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data e hora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mensagens"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"números"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telemóvel"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"hora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recentes"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Pessoas"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objetos"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natureza"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locais"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Ícones expressivos"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúsculo"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúsculo"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúsculo, ponto sobreposto"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconhecido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconhecido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Os carateres alternativos estão disponíveis"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Os carateres alternativos são ignorados"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"As sugestões alternativas estão disponíveis"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"As sugestões alternativas são ignoradas"</string> +</resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index c27758116..4c7f4864b 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de introdução"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos de Reg. Invest."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Procurar nomes de contac."</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corretor ortográfico utiliza entradas da sua lista de contactos"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao primir as teclas"</string> <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="general_category" msgid="1859088467017573195">"Geral"</string> - <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Escrita por toque"</string> - <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string> - <string name="advanced_settings" msgid="362895144495591463">"Definições avançadas"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opções para especialistas"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Mudar p/ outros mét. ent."</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"A tecla de mudança de idioma abrange outros métodos de entrada"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla alterar idioma"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Predef. do sistema"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nomes de Contactos"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nomes dos Contactos para sugestões e correções"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestões personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Melhorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Ponto de espaço duplo"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocar duas vezes na barra espaço insere ponto seguido de espaço"</string> <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pré-visual. flutuante dinâmica"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver palavra sugerida enquanto toca"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Ligar auscultadores com microfone integrado para ouvir as teclas da palavra-passe."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"O texto atual é %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nenhum texto digitado"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> executa correção automática"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Código da tecla %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ativado (tocar para desativar)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock ativado (tocar para desativar)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbolos"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letras"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Definições"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espaço"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de voz"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Cara sorridente"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Pesquisar"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Ponto"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Mudar de idioma"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Seguinte"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Anterior"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ativado"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock ativado"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift desativado"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modo de símbolos"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de letras"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de telemóvel"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de telemóvel"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"A mostrar teclado de <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e hora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mensagens"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"números"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telemóvel"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URLs"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Toque de expressão"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Deslize p/ a tecla de espaço p/ introduzir espaços durante toques"</string> <string name="voice_input" msgid="3583258583521397548">"Chave de entrada de voz"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Nenhum método de entrada de texto por voz ativado. Verifique as definições de Idioma e introdução."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introdução"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="send_feedback" msgid="1780431884109392046">"Enviar comentários"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de introdução"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para guardar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentários do utilizador"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Envie automaticamente estatísticas de utilização e relatórios de falhas e ajude-nos a melhorar este editor do método de introdução."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Inglês (RU)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Inglês (EUA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Espanhol (EUA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglês (RU) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglês (EUA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Espanhol (EUA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Tradicional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglês (RU) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglês (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Espanhol (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cirílico)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latim)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Sem idioma (alfabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Esquema de cor"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Branco"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Azul"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos entrada pers."</string> <string name="add_style" msgid="6163126614514489951">"Adic. estilo"</string> <string name="add" msgid="8299699805688017798">"Adicionar"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Ativar"</string> <string name="not_now" msgid="6172462888202790482">"Agora não"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Já existe o mesmo estilo de introdução: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudo da capacidade de utilização"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Atraso ao manter tecla premida"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duração vibr. ao premir teclas"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume do som ao premir teclas"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler ficheiro de dicionário externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Não há ficheiros de dicionário na pasta Transferências"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um ficheiro de dicionário para instalar"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Instalar mesmo este ficheiro para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Instalar mesmo este ficheiro para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Ocorreu um erro"</string> <string name="button_default" msgid="3988017840431881491">"Predefinido"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Bem-vindo(a) a <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Atualizar"</string> <string name="last_update" msgid="730467549913588780">"Última atualização"</string> <string name="message_updating" msgid="4457761393932375219">"A verificar existência de atualizações"</string> - <string name="message_loading" msgid="8689096636874758814">"A carregar..."</string> + <string name="message_loading" msgid="5638680861387748936">"A carregar…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Dicionário principal"</string> <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Definições"</string> <string name="install_dict" msgid="180852772562189365">"Instalar"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"O idioma selecionado no dispositivo móvel tem um dicionário disponível.<br/> Recomendamos que <b>transfira</b> o dicionário de <xliff:g id="LANGUAGE">%1$s</xliff:g> para melhorar a sua experiência de introdução de texto.<br/> <br/> A transferência pode demorar um ou dois minutos acima de 3G. Poderão ser aplicadas taxas se não tiver um <b>plano de dados ilimitado</b>.<br/> Se não tiver a certeza do plano de dados que tem, recomendamos que localize uma ligação Wi-Fi para começar a transferência automaticamente.<br/> <br/> Sugestão: pode transferir e remover dicionários acedendo a <b>Idioma e introdução</b> no menu <b>Definições</b> do disp. móvel."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"O idioma selecionado no disp. móvel tem um dicionário disponível.<br/> Recomendamos que <b>transfira</b> o dicionário de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para melhorar a sua experiência de introdução de texto.<br/> <br/> A transferência pode demorar um ou dois minutos através de 3G. Poderão ser aplicadas taxas se não tiver um <b>plano de dados ilimitado</b>.<br/> Se não tiver a certeza do plano de dados que tem, recomendamos que procure uma ligação Wi-Fi para começar a transferência automaticamente.<br/> <br/> Sugestão: Pode transferir e remover dicionários acedendo a <b>Idioma e introdução</b> no menu <b>Definições</b> do disp. móvel."</string> <string name="download_over_metered" msgid="1643065851159409546">"Transferir agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Transferir via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Está disponível um dicionário para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Está disponível um dicionário de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Prima para consultar e transferir"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"A transferir: as sugestões para <xliff:g id="LANGUAGE">%1$s</xliff:g> estarão prontas em breve."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"A transferir: as sugestões para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estarão prontas em breve"</string> <string name="version_text" msgid="2715354215568469385">"Versão <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Adicionar"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Adicionar ao dicionário"</string> diff --git a/java/res/values-pt/strings-action-keys.xml b/java/res/values-pt/strings-action-keys.xml index 1d8e760e7..5c836651f 100644 --- a/java/res/values-pt/strings-action-keys.xml +++ b/java/res/values-pt/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string> <string name="label_done_key" msgid="7564866296502630852">"Conc."</string> <string name="label_send_key" msgid="482252074224462163">"Env."</string> + <string name="label_search_key" msgid="7965186050435796642">"Pesquisar"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string> </resources> diff --git a/java/res/values-pt/strings-config-important-notice.xml b/java/res/values-pt/strings-config-important-notice.xml new file mode 100644 index 000000000..86af5ff6d --- /dev/null +++ b/java/res/values-pt/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Aprender com mensagens e dados digitados para melhorar sugestões"</string> +</resources> diff --git a/java/res/values-pt/strings-emoji-descriptions.xml b/java/res/values-pt/strings-emoji-descriptions.xml new file mode 100644 index 000000000..84e2cc08c --- /dev/null +++ b/java/res/values-pt/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Símbolo de copyright"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Símbolo de marca registrada"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Ponto de exclamação duplo"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Ponto de exclamação e ponto de interrogação"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Símbolo de marca comercial"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Fonte de informação"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Seta para esquerda e para direita"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Seta para cima e para baixo"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Seta para o noroeste"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Seta para o nordeste"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Seta para o sudeste"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Seta para o sudoeste"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Seta para a esquerda com gancho"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Seta para a direita com gancho"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Relógio de pulso"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Ampulheta"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Triângulo duplo preto para a direita"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Triângulo duplo preto para a esquerda"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Triângulo duplo preto para cima"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Triângulo duplo preto para baixo"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Despertador"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Ampulheta com areia correndo"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Letra M maiúscula contida em círculo"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Quadrado pequeno preto"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Quadrado pequeno branco"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Triângulo preto para a direita"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Triângulo preto para a esquerda"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Quadrado médio branco"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Quadrado médio preto"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Quadrado médio branco"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Quadrado médio preto"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Sol preto com raios"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Nuvem"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Telefone preto"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Urna de votação com marca de verificação"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Guarda-chuva com gotas de chuva"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Bebida quente"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Dedo indicador branco apontando para cima de frente"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Rosto sorridente branco"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Áries"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Touro"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gêmeos"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Câncer"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leão"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Virgem"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Libra"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Escorpião"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Sagitário"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricórnio"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Aquário"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Peixes"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Naipe preto de espadas"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Naipe preto de paus"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Naipe preto de copas"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Naipe preto de ouros"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Águas termais"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Símbolo de reciclagem universal preto"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Símbolo de cadeira de rodas"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Âncora"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Sinal de aviso"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Sinal de alta tensão"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Círculo branco médio"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Círculo preto médio"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Bola de futebol"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Bola de beisebol"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Boneco de neve sem neve"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Sol atrás da nuvem"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Serpentário"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Entrada proíbida"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Igreja"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fonte"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Bandeira no buraco"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Barco a vela"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Barraca"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Bomba de combustível"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Tesoura preta"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Marca de verificação grossa branca"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Avião"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Envelope"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Punho levantado"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Mão levantada"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Mão de vitória"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Lápis"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Ponta de caneta-tinteiro preta"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Marca de verificação grossa"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Sinal de multiplicação x grosso"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Brilhos"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Asterisco de oito pontas"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Estrela preta de oito pontas"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Floco de neve"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Brilho"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Sinal de cruzamento"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"egativo de sinal de cruzamento contido em quadrado"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Ornamento de ponto de interrogação preto"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Ornamento de ponto de interrogação branco"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Ornamento de ponto de exclamação branco"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Símbolo de ponto de exclamação grosso"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Coração preto grosso"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Sinal de adição grosso"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Sinal de subtração grosso"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Sinal de divisão grosso"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Seta para a direita preta"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Laçada"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Laçada dupla"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Seta para a direita com curva para cima"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Seta para a direita com curva para baixo"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Seta preta para a esquerda"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Seta preta para cima"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Seta preta para baixo"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Quadrado grande preto"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Quadrado grande branco"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Estrela média branca"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Círculo grande grosso"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Traço ondulado"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Marca de alternação de parte"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Ideograma \"parabéns\" contido em círculo"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Ideograma \"segredo\" contido em círculo"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Pedra de mahjong do dragão vermelho"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Curinga preto de baralho"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Tipo sanguíneo A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Tipo sanguíneo B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Tipo sanguíneo O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Estacionamento"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Tipo sanguíneo AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"\"CL\" em letras de fôrma"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"\"COOL\" em letras de fôrma"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"\"‘FREE\" em letras de fôrma"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"\"ID\" em letras de fôrma"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"\"NEW\" em letras de fôrma"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"\"NG\" em letras de fôrma"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"\"OK\" em letras de fôrma"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"\"SOS\" em letras de fôrma"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"\"UP!\" em letras de fôrma"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"\"VS\" em letras de fôrma"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"Caracteres koko em katakana contidos em quadrado"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"Caractere sa em katakana contido em quadrado"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Ideograma \"gratuito\" contido em quadrado"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Ideograma \"lugar reservado\" contido em quadrado"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Ideograma \"proibição\" contido em quadrado"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Ideograma \"vaga\" contido em quadrado"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Ideograma \"aceitação\" contido em quadrado"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Ideograma \"lotação esgotada\" contido em quadrado"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Ideograma \"pago\" contido em quadrado"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Ideograma \"mensal\" contido em quadrado"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Ideograma \"aplicação\" contido em quadrado"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Ideograma \"desconto\" contido em quadrado"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Ideograma \"em atividade\" contido em quadrado"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Ideograma \"vantagem\" contido em círculo"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Ideograma \"aceitar\" contido em círculo"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Ciclone"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Enevoado"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Guarda-chuva fechado"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Noite estrelada"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Nascer do sol nas montanhas"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Nascer do sol"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Cidade ao entardecer"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Pôr do sol nos prédios"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Arco-íris"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Ponte à noite"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Onda do mar"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Vulcão"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Via Láctea"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Globo terrestre Europa/África"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Globo terrestre Américas"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Globo terrestre Ásia/Austrália"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Globo com meridianos"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Símbolo da lua nova"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Símbolo da lua crescente"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Símbolo da lua em quarto crescente"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Símbolo da lua crescente gibosa"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Símbolo da lua cheia"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Símbolo da lua minguante gibosa"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Símbolo da lua em quarto minguante"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Símbolo da lua minguante"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Lua crescente"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Lua nova com rosto"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Lua em quarto crescente com rosto"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Lua em quarto minguante com rosto"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Lua cheia com rosto"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Sol com rosto"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Estrela brilhante"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Estrela cadente"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Castanha"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Muda"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Árvore perenifólia"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Árvore decídua"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palmeira"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Cacto"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Tulipa"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Flor de cerejeira"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Rosa"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Hibisco"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Girassol"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Florescência"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Espiga de milho"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Espiga de arroz"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Erva"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Trevo de quatro folhas"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Folha de bordo"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Folha caída"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Folha ao sabor do vento"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Cogumelo"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Tomate"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Berinjela"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Uvas"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Melão"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Melancia"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Tangerina"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Limão"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banana"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Abacaxi"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Maçã vermelha"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Maçã verde"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pera"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Pêssego"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Cerejas"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Morango"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hambúrguer"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Fatia de pizza"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Carne com osso"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Coxa de frango"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Biscoito de arroz japonês"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Bolinho de arroz japonês"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Arroz cozido"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Arroz com curry"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Tigela quente"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Espaguete"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Pão"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Batatas fritas"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Batata doce assada"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Camarão frito"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Kamaboko com design de espiral"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Sorvete de massa"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Raspadinha"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Sorvete"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Rosquinha"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Cookie"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Barra de chocolate"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Doce"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Pirulito"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Flan"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Pote de mel"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Torta"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Marmiteira bento"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Tigela de comida"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Cozinha"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Garfo e faca"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Xícara sem asa"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Garrafa e copo para saquê"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Copo para vinho"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Copo para coquetel"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Bebida tropical"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Caneca de cerveja"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Canecas de cerveja brindando"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Mamadeira"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Fita de presente"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Presente embrulhado"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Bolo de aniversário"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack Lanterna"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Árvore de Natal"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Papai Noel"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Fogos de artifício"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Estrelinha"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Balão"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Lança confetes"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Bola de confetes"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Árvore de Tanabata"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Bandeiras cruzadas"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Decoração Kadomatsu"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Bonecas japonesas"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Biruta de carpa Koinobori"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Sinos de vento"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Cerimônia de contemplação da lua Otsukimi"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Mochila escolar"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Capelo"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Carrossel de cavalinho"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Roda-gigante"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Montanha russa"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Vara de pescar e peixe"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Microfone"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Câmera cinematográfica"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Cinema"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Fone de ouvido"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Aquarela"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Cartola"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Tenda de circo"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Ingresso"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Claquete"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Artes cênicas"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Videogame"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Bela pontaria"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Caça-níqueis"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Bilhar"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Dados"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Boliche"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Baralho temático de flores"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Nota musical"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Várias notas musicais"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saxofone"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Guitarra"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Teclado musical"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trompete"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Violino"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Partitura"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Camiseta de corrida com faixa"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Raquete e bola de tênis"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Esqui e bota de esqui"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Bola de basquete e cesto"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Bandeira xadrez"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Snowboarder"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Corredor"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Surfista"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Troféu"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Corridas de cavalos"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Futebol americano"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Bola de rugby"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Nadador"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Construção de casas"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Casa com jardim"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Edifício comercial"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Correio japonês"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Correio europeu"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Hospital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Banco"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Caixa eletrônico"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Motel"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Loja de conveniência"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Escola"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Loja de departamentos"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Fábrica"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Luminária izakaya"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Castelo japonês"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Castelo europeu"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Rato"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Camundongo"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Boi"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Búfalo asiático"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Vaca"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopardo"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Coelho"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Gato"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Dragão"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Crocodilo"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Baleia"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Caracol"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Serpente"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Cavalo"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Carneiro"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Cabra"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Ovelha"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Macaco"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Galo"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Galinha"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Cachorro"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Porco"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Javali"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Elefante"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Polvo"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Concha espiral"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Inseto"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Formiga"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Abelha"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Joaninha"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Peixe"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Peixe tropical"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Peixe-balão"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Tartaruga"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Pintinho nascendo"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Pintinho"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Pintinho de frente"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Pássaro"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Pinguim"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Coala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Poodle"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Dromedário"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Camelo bactriano"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Golfinho"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Smiley de rato"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Smiley de vaca"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Smiley de tigre"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Smiley de coelho"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Smiley de gato"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Smiley de dragão"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Baleia jorrando água"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Smiley de cavalo"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Smiley de macaco"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Smiley de cachorro"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Smiley de porco"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Smiley de sapo"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Smiley de porquinho-da-índia"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Smiley de lobo"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Smiley de urso"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Smiley de panda"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Focinho de porco"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Pegadas de patas"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Olhos"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Orelha"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nariz"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Boca"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Língua"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Dedo indicador branco apontando para cima"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Dedo indicador branco apontando para baixo"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Dedo indicador branco apontando para a esquerda"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Dedo indicador branco apontando para a direita"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Sinal de mão em punho"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Sinal de mão acenando"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Sinal de mão indicando OK"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Sinal com polegar para cima"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Sinal com polegar para baixo"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Sinal de bater palmas"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Sinal de mãos abertas"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Coroa"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Chapéu de mulher"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Óculos de grau"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Gravata"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Camiseta"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Calça jeans"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Vestido"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Quimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Biquíni"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Roupas de mulher"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Bolsinha"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Bolsa"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Bolsa saco"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Sapato masculino"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Tênis"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Sapato de salto alto"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Sandália feminina"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Botas femininas"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Pegadas"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Busto em silhueta"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Bustos em silhueta"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Menino"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Menina"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Homem"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Mulher"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Família"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Homem e mulher de mãos dadas"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Dois homens de mãos dadas"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Duas mulheres de mãos dadas"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Policial"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Mulher com orelhas de coelho"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Noiva com véu"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Pessoa loira"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Homem com gua pi mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Homem com turbante"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Idoso"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Idosa"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Bebê"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Operário de construção civil"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Princesa"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Ogro japonês"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Gnomo japonês"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Fantasma"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Anjo bebê"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Alienígena"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Monstro alienígena"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Duende"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Caveira"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Recepcionista de balcão de informações"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Guarda"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Dançarina"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Batom"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Esmalte"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Massagem facial"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Corte de cabelo"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Poste de barbearia"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Seringa"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Comprimido"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Marca de beijo"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Carta de amor"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Anel"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Gema"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Beijo"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Buquê"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Casal com coração"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Casamento"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Coração batendo"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Coração partido"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Dois corações"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Coração brilhando"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Coração crescendo"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Coração com flecha"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Coração azul"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Coração verde"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Coração amarelo"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Coração roxo"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Coração com fita"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Corações em círculo"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Decoração de coração"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Forma de losango com ponto interno"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Lâmpada elétrica"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Símbolo de raiva"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bomba"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Símbolo de sono"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Símbolo de colisão"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Símbolo da gota de suor"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Gota"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Símbolo de traço"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Cocô"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Bíceps contraídos"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Símbolo de tontura"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Balão de fala"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Balão de pensamento"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Flor branca"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Símbolo de cem pontos"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Saco de dinheiro"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Câmbio de moeda"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Sinal de cifrão grosso"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Cartão de crédito"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Nota bancária com sinal de iene"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Nota bancária com sinal de dólar"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Nota bancária com sinal de euro"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Nota bancária com sinal de libra"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Dinheiro com asas"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Gráfico com tendência ascendente e símbolo de iene"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Assento"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Computador pessoal"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Valise"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisco"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Disquete"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Disco óptico"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Pasta de arquivos"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Pasta de arquivos aberta"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Página com curva"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Página voltada para cima"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Calendário"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Calendário destacável"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Índice de cartões"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Gráfico com tendência ascendente"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Gráfico com tendência descendente"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Gráfico de barras"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Prancheta"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Alfinete"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Alfinete redondo"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Clipe de papel"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Régua reta"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Régua triangular"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Guias de marca-página"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Livro-razão"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Bloco de anotações"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Bloco de anotações com capa decorativa"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Livro fechado"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Livro aberto"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Livro verde"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Livro azul"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Livro laranja"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Livros"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Crachá"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Pergaminho"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memorando"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Telefone"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Pager"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Aparelho de fax"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Antena de satélite"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Alto-falante para discursos públicos"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Megafone em uso"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Bandeja da caixa de saída"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Bandeja da caixa de entrada"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Pacote"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Símbolo de e-mail"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Envelope recebido"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Envelope com seta para baixo"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Caixa de correio fechada com bandeira abaixada"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Caixa de correio fechada com bandeira levantada"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Caixa de correio aberta com bandeira levantada"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Caixa de correio aberta com bandeira abaixada"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Caixa de correio"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Corneta de correio"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Jornal"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Celular"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Celular com seta para a direita"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Modo de vibração"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Celular desligado"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Proibido usar celular"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antena com barras"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Câmera"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Filmadora"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Televisão"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Rádio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videocassete"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Setas entrelaçadas para a direita"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Setas para a esquerda e para a direita em sentido horário"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Setas para a esquerda e para a direita em sentido horário com \"1\""</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Setas para baixo e para cima em sentido horário"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Setas para baixo e para cima em sentido anti-horário"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Símbolo de baixo brilho"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Símbolo de alto brilho"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Alto-falante cortado"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Alto-falante"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Alto-falante com onda sonora"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Alto-falante com três ondas sonoras"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Bateria"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Tomada elétrica"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Lente de aumento virada para a esquerda"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Lente de aumento virada para a direita"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Cadeado com caneta-tinteiro"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Cadeado fechado com chave"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Chave"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Cadeado"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Cadeado aberto"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Sino"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Sino cortado"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Marca-página"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Símbolo de link"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Botão de opção"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"\"Back\" com seta para a esquerda"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"\"End\" com seta para a esquerda"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"\"On!\" com seta para a esquerda e para a direita"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"\"Soon\" com seta para a direita"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"\"Top\" com seta para cima"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Símbolo de proibido para menores de 18"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Tecla do dez"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Símbolo de entrada de letras latinas maiúsculas"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Símbolo de entrada de letras latinas minúsculas"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Símbolo de entrada de números"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Símbolo de entrada de símbolos"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Símbolo de entrada de letras latinas"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Fogo"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Tocha elétrica"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Chave inglesa"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Martelo"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Porca e parafuso"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Facão"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistola"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Microscópio"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Telescópio"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Bola de cristal"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Estrela de seis pontas com ponto central"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Símbolo japonês para iniciante"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Emblema de tridente"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Botão quadrado preto"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Botão quadrado branco"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Círculo grande vermelho"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Círculo grande azul"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Losango grande laranja"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Losango grande azul"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Losango pequeno laranja"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Losango pequeno azul"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Triângulo vermelho apontando para cima"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Triângulo vermelho apontando para baixo"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Triângulo pequeno vermelho apontando para cima"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Triângulo pequeno vermelho apontando para baixo"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Relógio mostrando 01h00"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Relógio mostrando 02h00"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Relógio mostrando 03h00"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Relógio mostrando 04h00"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Relógio mostrando 05h00"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Relógio mostrando 06h00"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Relógio mostrando 07h00"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Relógio mostrando 08h00"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Relógio mostrando 09h00"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Relógio mostrando 10h00"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Relógio mostrando 11h00"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Relógio mostrando 12h00"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Relógio mostrando 01h30"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Relógio mostrando 02h30"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Relógio mostrando 03h30"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Relógio mostrando 04h30"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Relógio mostrando 05h30"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Relógio mostrando 06h30"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Relógio mostrando 07h30"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Relógio mostrando 08h30"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Relógio mostrando 09h30"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Relógio mostrando 10h30"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Relógio mostrando 11h30"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Relógio mostrando 12h30"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Monte Fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Torre de Tóquio"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Estátua da Liberdade"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Silhueta do Japão"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Rosto mostrando os dentes"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Rosto mostrando os dentes com olhos sorridentes"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Rosto com lágrimas de alegria"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Rosto sorridente com boca aberta"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Rosto sorridente com boca aberta e olhos sorridentes"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Rosto sorridente com boca aberta e suando frio"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Rosto sorridente com boca aberta e olhos bem fechados"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Rosto sorridente com auréola"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Rosto sorridente com chifres"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Rosto com olho piscando"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Rosto sorridente com olhos sorridentes"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Rosto saboreando comida deliciosa"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Rosto aliviado"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Rosto sorridente com olhos de coração"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Rosto sorridente com óculos de sol"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Rosto com meio sorriso"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Rosto neutro"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Rosto sem expressão"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Rosto de desinteressado"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Rosto suando frio"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Rosto pensativo"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Rosto confuso"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Rosto desconcertado"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Rosto beijando"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Rosto jogando beijo"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Rosto beijando com olhos sorridentes"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Rosto beijando com olhos fechados"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Rosto com língua de fora"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Rosto com língua de fora e piscando"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Rosto com língua de fora e olhos bem fechados"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Rosto de frustrado"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Rosto preocupado"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Rosto nervoso"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Rosto de desaprovação"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Rosto chorando"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Rosto de perseverante"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Rosto com aparência de triunfo"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Rosto com misto de decepção e alívio"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Rosto franzido com boca aberta"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Rosto angustiado"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Rosto temeroso"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Rosto fatigado"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Rosto sonolento"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Rosto cansado"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Rosto mostrando os dentes"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Rosto chorando alto"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Rosto com boca aberta"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Rosto silenciado"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Rosto com boca aberta e suando frio"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Rosto gritando de medo"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Rosto surpreso"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Rosto enrubescido"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Rosto dormindo"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Rosto tonto"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Rosto sem boca"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Rosto com máscara hospitalar"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Smiley de gato feliz com olhos sorridentes"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Smiley de gato com lágrimas de alegria"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Smiley de gato sorridente com boca aberta"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Smiley de gato sorridente com olhos de coração"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Smiley de gato com sorriso maroto"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Smiley de gato beijando com olhos fechados"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Smiley de gato de desaprovação"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Smiley de gato chorando"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Smiley de gato fatigado"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Smiley com gesto de reprovação"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Smiley com gesto de ok"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Pessoa curvando-se bastante"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Macaco cego"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Macaco surdo"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Macaco mudo"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Pessoa feliz levantando uma mão"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Pessoa levantando as mãos em comemoração"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Pessoa franzindo a testa"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Pessoa com rosto de desaprovação"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Pessoa com mãos unidas em oração"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Foguete"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helicóptero"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Locomotiva a vapor"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Vagão"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Trem de alta velocidade"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Trem-bala de alta velocidade"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Trem"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metrô"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Metrô leve"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Estação"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Bonde"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Elétrico"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Ônibus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Ônibus de frente"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Trólebus"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Ponto de ônibus"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Micro-ônibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulância"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Caminhão de bombeiros"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Viatura policial"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Viatura policial de frente"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Táxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Táxi de frente"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automóvel"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Automóvel de frente"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Veículo recreativo"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Caminhão de entrega"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Caminhão articulado"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Trator"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monotrilho"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Trem de montanha"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Trem suspenso"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Bondinho"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Teleférico"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Navio"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Barco a remo"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Lancha"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Semáforo horizontal"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Semáforo vertical"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Sinal de construção"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Giroflex de viaturas policiais"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Bandeira triangular em poste"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Porta"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Sinal de entrada proibida"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Símbolo de permitido fumar"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Símbolo de proibido fumar"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Símbolo de \"jogue o lixo no lixo\""</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Símbolo de proibido jogar lixo"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Símbolo de água potável"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Símbolo de água não potável"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicicleta"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Proibido bicicletas"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Ciclista"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Ciclista de montanha"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pedestre"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Proibido pedestres"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Travessia de crianças"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Símbolo masculino"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Símbolo feminino"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Banheiro"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Símbolo de bebê"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Vaso sanitário"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"WC"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Chuveiro"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Banho"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Banheira"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Controle de passaportes"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Alfândega"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Esteira de bagagem"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Bagagem abandonada"</string> +</resources> diff --git a/java/res/values-pt/strings-letter-descriptions.xml b/java/res/values-pt/strings-letter-descriptions.xml new file mode 100644 index 000000000..d49d5f674 --- /dev/null +++ b/java/res/values-pt/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, crase"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ångström"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilha"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, crase"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, crase"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, crase"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, traço"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, crase"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, mácron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, bráquia"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ponto acima"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, traço"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, mácron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, bráquia"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ponto acima"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, bráquia"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ponto acima"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilha"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, traço"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, mácron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, bráquia"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sem ponto"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilha"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilha"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ponto médio"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, traço"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilha"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida por apóstrofe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, mácron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, bráquia"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, agudo duplo"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilha"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilha"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilha"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, traço"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, mácron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"L, bráquia"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ångström"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, agudo duplo"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ponto acima"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, chifre"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, chifre"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, vírgula abaixo"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, vírgula abaixo"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ponto abaixo"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho acima"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e crase"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho acima"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e ponto abaixo"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Um, bráquia e agudo"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, bráquia e crase"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, bráquia e gancho acima"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, bráquia e til"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, bráquia e ponto abaixo"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ponto abaixo"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho acima"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e crase"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho acima"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e ponto abaixo"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho acima"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ponto abaixo"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ponto abaixo"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho acima"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e crase"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho acima"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e ponto abaixo"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, chifre e agudo"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, chifre e crase"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, chifre e gancho acima"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, chifre e til"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, chifre e ponto abaixo"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ponto abaixo"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho acima"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, chifre e agudo"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, chifre e crase"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, chifre e gancho acima"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, chifre e til"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, chifre e ponto abaixo"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, crase"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ponto abaixo"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho acima"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ponto de exclamação invertido"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Aspa dupla angular esquerda"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ponto médio"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Um sobrescrito"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Aspa dupla angular direita"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ponto de interrogação invertido"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Aspa simples esquerda"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Aspa simples direita"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Aspa baixa simples"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Aspa dupla esquerda"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Aspa dupla direita"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Adaga"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Adaga dupla"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Sinal de \"por mil\""</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Símbolo de minutos"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Símbolo de segundos"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Aspa simples angular esquerda"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Aspa simples angular direita"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Quatro sobrescrito"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latina minúscula sobrescrita"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Símbolo de peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Aos cuidados de"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Seta para a direita"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Seta para baixo"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vazio"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Incremento"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor ou igual a"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior ou igual a"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela preta"</string> +</resources> diff --git a/java/res/values-pt/strings-talkback-descriptions.xml b/java/res/values-pt/strings-talkback-descriptions.xml new file mode 100644 index 000000000..f4e28fc37 --- /dev/null +++ b/java/res/values-pt/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Conecte um fone de ouvido para ouvir as chaves de senha."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"O texto atual é %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nenhum texto digitado"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> realiza correção automática"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caractere desconhecido"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mais símbolos"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Símbolos"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Excluir"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Símbolos"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Letras"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Números"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Configurações"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Espaço"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Entrada de texto por voz"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emojis"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Pesquisar"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Ponto"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Alterar idioma"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Próximo"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Anterior"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift ativado"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock ativado"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modo de símbolos"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modo mais símbolos"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modo de letras"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modo de telefone"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modo de símbolos do telefone"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Teclado oculto"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Mostrando teclado <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"data e hora"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mensagens"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"número"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefone"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"texto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"hora"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recentes"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Pessoas"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Objetos"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natureza"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Lugares"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúscula"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúscula"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúscula, ponto acima"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconhecido"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconhecido"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Caracteres alternativos estão disponíveis"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Caracteres alternativos foram descartados"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sugestões alternativas estão disponíveis"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Sugestões alternativas foram descartadas"</string> +</resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index f98ef8cd6..c819ff3b5 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -21,43 +21,44 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de entrada"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Pesq. comandos de reg."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Buscar nomes de contatos"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"O corretor ortográfico usa entradas de sua lista de contatos"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar ao tocar a tecla"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Som ao tocar a tecla"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string> - <string name="general_category" msgid="1859088467017573195">"Geral"</string> - <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Escrita com gestos"</string> - <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string> - <string name="advanced_settings" msgid="362895144495591463">"Configurações avançadas"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opções para especialistas"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Preferências de entrada"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Aparência"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Opções multilíngues"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Pref. da entr. por gestos"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Correção de texto"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Avançadas"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Outros métodos de entrada"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"A tecla p/ mudar o idioma também cobre outros métodos de entrada"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tecla de seleção de idioma"</string> <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Mostrar quando vários idiomas de entrada estiverem ativados"</string> <string name="sliding_key_input_preview" msgid="6604262359510068370">"Mostrar indicador de deslize"</string> <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Mostrar indicação visual ao deslizar teclas Shift ou de símbolos"</string> - <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Dispens. atraso chave princ."</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Duração de popup da tecla"</string> <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Sem atraso"</string> <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Padrão"</string> <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g> ms"</string> <string name="settings_system_default" msgid="6268225104743331821">"Padrão do sistema"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nomes de contato"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Usar nomes dos Contatos para sugestões e correções"</string> - <string name="use_double_space_period" msgid="8781529969425082860">"Duplo espaço p/ ponto"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestões personalizadas"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Melhorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Duplo espaço para ponto"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Toque duplo na barra de espaço insere um ponto seguido de espaço"</string> - <string name="auto_cap" msgid="1719746674854628252">"Capitaliz. automática"</string> + <string name="auto_cap" msgid="1719746674854628252">"Capitalização automática"</string> <string name="auto_cap_summary" msgid="7934452761022946874">"Iniciar a primeira palavra de cada frase com letra maiúscula"</string> <string name="edit_personal_dictionary" msgid="3996910038952940420">"Dicionário pessoal"</string> <string name="configure_dictionaries_title" msgid="4238652338556902049">"Dicionários complementares"</string> <string name="main_dictionary" msgid="4798763781818361168">"Dicionário principal"</string> - <string name="prefs_show_suggestions" msgid="8026799663445531637">"Exibir sugestões de correção"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugestões de correção"</string> <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Exibir sugestões de palavras durante a digitação"</string> <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar sempre"</string> <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Mostrar em modo retrato"</string> - <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Sempre ocultar"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Não mostrar"</string> <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Bloquear palavras ofensivas"</string> <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Não sugerir palavras potencialmente ofensivas"</string> <string name="auto_correction" msgid="7630720885194996950">"Correção automática"</string> @@ -66,79 +67,33 @@ <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Moderado"</string> <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Agressivo"</string> <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Muito agressivo"</string> - <string name="bigram_prediction" msgid="1084449187723948550">"Sugestões para a palavra seguinte"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Sugerir palavra seguinte"</string> <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar a palavra anterior ao fazer sugestões"</string> <string name="gesture_input" msgid="826951152254563827">"Ativar a escrita com gestos"</string> <string name="gesture_input_summary" msgid="9180350639305731231">"Inserir uma palavra deslizando os dedos pelas letras"</string> <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string> - <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visualizaç. dinâmica flutuante"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Previsão dinâmica flutuante"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ver a palavra sugerida ao usar gestos"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Salvo"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Conecte um fone de ouvido para ouvir as chaves de senha em voz alta."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"O texto atual é %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nenhum texto digitado"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> realiza correção automática"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Código de tecla %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift ativado (toque para desativar)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock ativado (toque para desativar)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Excluir"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Símbolos"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Letras"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Números"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Configurações"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Espaço"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de voz"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Carinha sorridente"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Voltar"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Pesquisar"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Ponto"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Alterar idioma"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Próximo"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Anterior"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift ativado"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock ativado"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift desativado"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modo de símbolos"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modo de cartas"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modo de telefone"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modo de símbolos de telefone"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Teclado oculto"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Mostrando teclado <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"data"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"data e hora"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mensagens"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"número"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefone"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"texto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"hora"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> - <string name="voice_input" msgid="3583258583521397548">"Chave de entrada de texto por voz"</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 de símb."</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Desativado"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mic. no teclado"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mic. no teclado"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gesto de frase"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Inserir espaços durante gestos deslizando até a tecla de espaço"</string> + <string name="voice_input" msgid="3583258583521397548">"Tecla p/ inserir texto por voz"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Nenhum método de entrada de texto por voz ativado. Verifique as configurações \"Idioma e entrada\"."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> <string name="send_feedback" msgid="1780431884109392046">"Enviar comentários"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para salvar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ajude a melhorar este editor de método de entrada enviando automaticamente estatísticas de uso e relatórios de falhas."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema do teclado"</string> <string name="subtype_en_GB" msgid="88170601942311355">"inglês (Reino Unido)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"inglês (EUA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"espanhol (EUA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Inglês (Reino Unido) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Inglês (EUA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"espanhol (EUA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Inglês (Reino Unido) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Inglês (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Espanhol (EUA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cirílico)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latino)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nenhum idioma (alfabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeto (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Esquema de cores"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Branco"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Azul"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Tema do teclado"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Holo branco"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Holo azul"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Material escuro"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Material claro"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Estilos personalizados"</string> <string name="add_style" msgid="6163126614514489951">"Adic. estilo"</string> <string name="add" msgid="8299699805688017798">"Adicionar"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Ativar"</string> <string name="not_now" msgid="6172462888202790482">"Agora não"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"O estilo de entrada já existe: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modo de estudo de utilização"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Atraso ao pressionar teclas"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Duração da vibração ao tocar"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume ao tocar na tela"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler arquivo de dicionário externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nenhum arquivo de dicionário na pasta Downloads"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um arquivo de dicionário para instalar"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Deseja instalar este arquivo para <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Deseja instalar este arquivo para <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Ocorreu um erro"</string> <string name="button_default" msgid="3988017840431881491">"Padrão"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Bem-vindo ao <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Atualizar"</string> <string name="last_update" msgid="730467549913588780">"Última atualização"</string> <string name="message_updating" msgid="4457761393932375219">"Verificando atualizações"</string> - <string name="message_loading" msgid="8689096636874758814">"Carregando..."</string> + <string name="message_loading" msgid="5638680861387748936">"Carregando…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Dicionário principal"</string> <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Configurações"</string> <string name="install_dict" msgid="180852772562189365">"Instalar"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> <string name="delete_dict" msgid="756853268088330054">"Excluir"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"O idioma selecionado em seu dispositivo móvel tem um dicionário disponível.<br/> Recomendamos <b>fazer o download</b> do dicionário de <xliff:g id="LANGUAGE">%1$s</xliff:g> para melhorar sua experiência de digitação.<br/> O download pode levar um ou dois minutos por conexão 3G. Tarifas podem ser aplicáveis caso você não tenha um <b>plano de dados ilimitado</b>.<br/> Se você não tem certeza quanto a seu plano de dados, recomendamos encontrar uma conexão Wi-Fi para iniciar o download automaticamente.<br/> Dica: você pode fazer o download de dicionários e removê-los acessando <b>Idioma e entrada</b> no menu <b>Configurações</b> de seu dispositivo móvel."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"O idioma selecionado em seu dispositivo móvel tem um dicionário disponível.<br/> Recomendamos <b>fazer o download</b> do dicionário de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> para melhorar sua experiência de digitação.<br/> O download pode levar um ou dois minutos por conexão 3G. Tarifas podem ser aplicáveis caso você não tenha um <b>plano de dados ilimitado</b>.<br/> Se você não tem certeza quanto a seu plano de dados, recomendamos encontrar uma conexão Wi-Fi para iniciar o download automaticamente.<br/> Dica: você pode fazer o download de dicionários e removê-los acessando <b>Idioma e entrada</b> no menu <b>Configurações</b> do dispositivo móvel."</string> <string name="download_over_metered" msgid="1643065851159409546">"Fazer o download agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Fazer o download por Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Há um dicionário disponível para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Há um dicionário disponível para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pressione para consultar e fazer o download"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download em andamento: as sugestões para <xliff:g id="LANGUAGE">%1$s</xliff:g> estarão prontas em breve."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Download em andamento: as sugestões para <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> estarão disponíveis em breve."</string> <string name="version_text" msgid="2715354215568469385">"Versão <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Adicionar"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Adicionar ao dicionário"</string> diff --git a/java/res/values-rm/strings-talkback-descriptions.xml b/java/res/values-rm/strings-talkback-descriptions.xml new file mode 100644 index 000000000..05b816ab7 --- /dev/null +++ b/java/res/values-rm/strings-talkback-descriptions.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_search (1247236163755920808) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> + <skip /> + <!-- no translation found for spoken_description_action_next (8636078276664150324) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (800872415009336208) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> + <skip /> + <!-- no translation found for keyboard_mode_date (3137520166817128102) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> + <skip /> + <!-- no translation found for keyboard_mode_email (6216248078128294262) --> + <skip /> + <!-- no translation found for keyboard_mode_im (1137405089766557048) --> + <skip /> + <!-- no translation found for keyboard_mode_number (7991623440699957069) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> + <skip /> + <!-- no translation found for keyboard_mode_text (6479436687899701619) --> + <skip /> + <!-- no translation found for keyboard_mode_time (4381856885582143277) --> + <skip /> + <!-- no translation found for keyboard_mode_url (1519819835514911218) --> + <skip /> +</resources> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 3f0bab963..526ec73bd 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -22,7 +22,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- no translation found for english_ime_input_options (3909945612939668554) --> <skip /> - <!-- no translation found for english_ime_research_log (8492602295696577851) --> <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> <skip /> @@ -122,105 +121,8 @@ <skip /> <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> <skip /> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Memorisà"</string> - <!-- no translation found for spoken_use_headphones (896961781287283493) --> - <skip /> - <!-- no translation found for spoken_current_text_is (2485723011272583845) --> - <skip /> - <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> - <skip /> - <!-- no translation found for spoken_auto_correct (8005997889020109763) --> - <skip /> - <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> - <skip /> - <!-- no translation found for spoken_description_unknown (3197434010402179157) --> - <skip /> - <!-- no translation found for spoken_description_shift (244197883292549308) --> - <skip /> - <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> - <skip /> - <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> - <skip /> - <!-- no translation found for spoken_description_delete (8740376944276199801) --> - <skip /> - <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> - <skip /> - <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> - <skip /> - <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> - <skip /> - <!-- no translation found for spoken_description_settings (4627462689603838099) --> - <skip /> - <!-- no translation found for spoken_description_tab (2667716002663482248) --> - <skip /> - <!-- no translation found for spoken_description_space (2582521050049860859) --> - <skip /> - <!-- no translation found for spoken_description_mic (615536748882611950) --> - <skip /> - <!-- no translation found for spoken_description_smiley (2256309826200113918) --> - <skip /> - <!-- no translation found for spoken_description_return (8178083177238315647) --> - <skip /> - <!-- no translation found for spoken_description_search (1247236163755920808) --> - <skip /> - <!-- no translation found for spoken_description_dot (40711082435231673) --> - <skip /> - <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> - <skip /> - <!-- no translation found for spoken_description_action_next (8636078276664150324) --> - <skip /> - <!-- no translation found for spoken_description_action_previous (800872415009336208) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> - <skip /> - <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> - <skip /> - <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> - <skip /> - <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> - <skip /> - <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> - <skip /> - <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> - <skip /> - <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> - <skip /> - <!-- no translation found for keyboard_mode_date (3137520166817128102) --> - <skip /> - <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> - <skip /> - <!-- no translation found for keyboard_mode_email (6216248078128294262) --> - <skip /> - <!-- no translation found for keyboard_mode_im (1137405089766557048) --> - <skip /> - <!-- no translation found for keyboard_mode_number (7991623440699957069) --> - <skip /> - <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> - <skip /> - <!-- no translation found for keyboard_mode_text (6479436687899701619) --> - <skip /> - <!-- no translation found for keyboard_mode_time (4381856885582143277) --> - <skip /> - <!-- no translation found for keyboard_mode_url (1519819835514911218) --> - <skip /> <!-- no translation found for voice_input (3583258583521397548) --> <skip /> - <!-- 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 configure_input_method (373356270290742459) --> <skip /> <string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string> @@ -231,8 +133,6 @@ <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> <skip /> <string name="has_dictionary" msgid="6071847973466625007">"Dicziunari disponibel"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Activar il feedback da l\'utilisader"</string> - <!-- no translation found for prefs_description_log (7525225584555429211) --> <skip /> <!-- no translation found for keyboard_layout (8451164783510487501) --> <skip /> @@ -288,7 +188,6 @@ <skip /> <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> <skip /> - <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> <skip /> <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> <skip /> diff --git a/java/res/values-ro/strings-action-keys.xml b/java/res/values-ro/strings-action-keys.xml index 51aa82f9c..1a1541529 100644 --- a/java/res/values-ro/strings-action-keys.xml +++ b/java/res/values-ro/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Înap."</string> <string name="label_done_key" msgid="7564866296502630852">"Gata"</string> <string name="label_send_key" msgid="482252074224462163">"Trim."</string> + <string name="label_search_key" msgid="7965186050435796642">"Căutați"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauză"</string> <string name="label_wait_key" msgid="5891247853595466039">"Așt."</string> </resources> diff --git a/java/res/values-ro/strings-config-important-notice.xml b/java/res/values-ro/strings-config-important-notice.xml new file mode 100644 index 000000000..f481e8972 --- /dev/null +++ b/java/res/values-ro/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Utilizează mesajele și datele introduse pt. a îmbunătăți sugestiile"</string> +</resources> diff --git a/java/res/values-ro/strings-emoji-descriptions.xml b/java/res/values-ro/strings-emoji-descriptions.xml new file mode 100644 index 000000000..f44a0b974 --- /dev/null +++ b/java/res/values-ro/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"Semnul Copyright"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"Semnul Marcă înregistrată"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Semn de exclamare dublu"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Semn de exclamare și întrebare"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Semn marcă înregistrată"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Sursă de informații"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Săgeată stânga-dreapta"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Săgeată sus-jos"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"Săgeată nord-vest"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"Săgeată nord-est"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"Săgeată sud-est"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"Săgeată sud-vest"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Săgeată încovoiată spre stânga"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Săgeată încovoiată spre dreapta"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"Ceas de mână"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Clepsidră"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"Triunghi dublu, negru, orientat spre dreapta"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"Triunghi dublu, negru, orientat spre stânga"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"Triunghi dublu, negru, orientat în sus"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"Triunghi dublu, negru, orientat în jos"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"Ceas deşteptător"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Clepsidră cu nisip"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"Majuscula „M”, din alfabetul latin, încercuită"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"Pătrat mic negru"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"Pătrat mic alb"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"Triunghi negru, orientat spre dreapta"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"Triunghi negru, orientat spre stânga"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"Pătrat mediu alb"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"Pătrat negru mediu"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"Pătrat alb, mijlociu spre mic"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"Pătrat negru, mijlociu spre mic"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"Soare negru cu raze"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"Nor"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"Telefon negru"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"Casetă cu bifă"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"Umbrelă cu picături de ploaie"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"Băuturi calde"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"Deget arătător alb, orientat în sus"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"Față zâmbitoare albă"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"Berbec"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"Taur"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"Gemeni"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"Rac"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"Leu"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"Fecioară"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"Balanţă"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"Scorpion"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"Săgetător"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"Capricorn"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"Vărsător"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"Peşti"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"Pică neagră"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"Treflă neagră"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"Inimă neagra"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"Romb negru"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"Izvoare termale"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"Simbol negru, universal, de reciclare"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"Simbol pentru scaun cu rotile"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"Ancoră"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"Semn de avertizare"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"Semn de înaltă tensiune"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"Cerc alb mediu"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"Cerc negru mediu"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"Minge de fotbal"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"Minge de baseball"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"Om de zăpadă fără zăpadă"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"Soare în spatele unui nor"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"Ophiuchus"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"Intrarea interzisă"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"Biserică"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"Fântână"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"Steag în gaură"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"Barcă cu pânze"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"Cort"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"Pompă de combustibil"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"Foarfece negru"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"Bifă albă îngroșată"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"Avion"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"Plic"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"Pumn ridicat"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"Mână ridicată"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"Mână cu semnul victoriei"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"Creion"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"Peniță neagră"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"Bifă îngroșată"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"Înmulțire complexă x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"Scântei"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"Asterisc cu opt colțuri"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"Stea neagră, cu opt colțuri"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"Fulg de nea"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"Scânteie"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"Semn x"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"Semn x alb pe fond negru în pătrat"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"Semn de întrebare ornamental negru"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"Semn de întrebare ornamental alb"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"Semn de exclamare ornamental alb"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"Semn de exclamare îngroșat"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"Inimă neagră îngroșată"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"Semn plus îngroșat"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"Semn minus îngroșat"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"Semn de împărțire îngroșat"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"Săgeată neagră, spre dreapta"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"Buclă ondulată"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"Buclă ondulată dublă"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"Săgeată orientată spre dreapta, apoi curbată în sus"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"Săgeată orientată spre dreapta, apoi curbată în jos"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"Săgeată neagră orientată spre stânga"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"Săgeată neagră orientată în sus"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"Săgeată neagră orientată în jos"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"Pătrat negru mare"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"Pătrat alb mare"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"Stea albă medie"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"Cerc îngroșat, mare"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"Liniuță ondulată"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"Semn de modificare"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"Ideogramă încercuită - felicitări"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"Ideogramă încercuită - secret"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"Piesă Mahjong dragon roșu"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"Carte de joc joker negru"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"Grupa de sânge A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"Grupa de sânge B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"Grupa de sânge O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"Parcare"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"Grupa de sânge AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"„CL” în pătrat"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"„COOL” în pătrat"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"„FREE” în pătrat"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"„ID” în pătrat"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"„NEW” în pătrat"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"„N G” în pătrat"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"„OK” în pătrat"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"„SOS” în pătrat"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"„UP” cu semn de exclamare în pătrat"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"„VS” în pătrat"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"„Katakana” în pătrat"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"„Servicii Katakana” în pătrat"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"Caracter ideografic „Gratuit” în pătrat"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"Caracter ideografic „Loc rezervat” în pătrat"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"Caracter ideografic „Interzis” în pătrat"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"Caracter ideografic „Loc liber” în pătrat"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"Caracter ideografic „Aprobare” în pătrat"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"Caracter ideografic „Nu sunt locuri libere” în pătrat"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"Caracter ideografic „Cu plată” în pătrat"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"Caracter ideografic „Lunar” în pătrat"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Caracter ideografic „Înscriere” în pătrat"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Caracter ideografic „Reducere” în pătrat"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Caracter ideografic „În activitate” în pătrat"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Caracter ideografic „Avantaj” în pătrat"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Caracter ideografic „Acord” în pătrat"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"Ciclon"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"Ceaţă"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"Umbrelă închisă"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"Noapte cu stele"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"Răsărit peste munți"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"Răsărit"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"Peisaj urban la asfințit"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"Apus de soare deasupra clădirilor"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"Curcubeu"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"Pod noaptea"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"Val"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"Vulcan"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"Calea Lactee"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"Globul pământesc: Europa-Africa"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"Globul pământesc: continentul american"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"Globul pământesc: Asia-Australia"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"Glob pământesc cu meridiane"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"Simbolul Lună nouă"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"Simbolul Lună nouă"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"Simbolul Primul pătrar"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"Simbolul Înainte de lună plină"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"Simbolul Lună plină"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"Simbolul După lună plină"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"Simbolul Ultimul pătrar"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"Simbolul Înainte de lună nouă"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"Semilună"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"Lună nouă, cu chip"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"Lună în primul pătrar, cu chip"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"Lună în ultimul pătrar, cu chip"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"Lună plină, cu chip"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"Soare cu chip"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"Stea strălucitoare"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"Stea căzătoare"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"Castană"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"Puiet"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"Copac veșnic verde"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"Copac cu frunze căzătoare"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"Palmier"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"Cactus"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"Lalea"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"Floare de cireș"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"Trandafir"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"Hibiscus"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"Floarea-soarelui"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"Floare"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"Spic de porumb"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"Spic de orez"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"Plantă"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"Trifoi cu patru foi"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"Frunză de arțar"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"Frunză căzută"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"Frunză în vânt"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"Ciupercă"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"Roșie"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"Vânătă"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"Struguri"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"Pepene galben"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"Pepene verde"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"Mandarină"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"Lămâie"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"Banană"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"Ananas"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"Măr roșu"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"Măr verde"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"Pară"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"Piersic"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"Cireșe"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"Căpșună"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"Hamburger"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"Felie de pizza"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"Carne pe os"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"Picior de pasăre"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"Biscuite de orez"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"Chiftea de orez"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"Orez gătit"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"Orez cu curry"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"Castron aburind"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"Spaghete"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"Pâine"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"Cartofi prăjiți"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"Cartof dulce copt"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"Dango"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"Oden"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"Sushi"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"Creveți prăjiți"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"Plăcintă de pește cu model ondulat"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"Cornet de înghețată"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"Fulgi de gheață"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"Înghețată"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"Gogoașă"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"Biscuit"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"Ciocolată"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"Bomboane"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"Acadea"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"Budincă"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"Oală de miere"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"Prăjitură"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"Cutie Bento"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"Oală cu mâncare"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"Gătit"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"Furculiță și cuțit"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"Ceașcă fără toartă"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"Sticlă și ceașcă de sake"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"Pahar de vin"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"Pahar de cocktail"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"Băutură tropicală"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"Halbă de bere"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"Halbe de bere ciocnindu-se"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"Biberon"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"Panglică"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"Cadou ambalat"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"Tort"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Felinar din dovleac"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"Pom de Crăciun"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Moș Crăciun"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"Focuri de artificii"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"Artificiu"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"Balon"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"Tun de confetti"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"Minge de confetti"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"Copac Tanabata"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"Steaguri încrucișate"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"Decorațiune de Crăciun"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"Păpuși japoneze"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"Steaguri în formă de pește"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"Clopoței de vânt"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"Ceremonia contemplării lunii"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"Ghiozdan"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"Tocă de absolvire"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"Cal de carusel"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"Roata mare"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"Montaigne-russe"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"Undiță și pește"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"Microfon"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"Cameră video"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"Cinema"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"Căști"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"Paletă de pictură"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"Joben"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"Cort de circ"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"Bilet"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"Clachetă"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"Arta spectacolului"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"Joc video"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"Lovitură drept la țintă"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"Jocuri mecanice"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"Biliard"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"Zaruri"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Popice"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"Cărți de joc cu flori"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"Notă muzicală"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"Mai multe note muzicale"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"Saxofon"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"Chitară"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"Claviatură"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"Trompetă"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"Vioară"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"Partitură"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"Maieu de sport cu dungă"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"Rachetă de tenis și minge"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"Schi și gheată de schi"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"Minge și inel de baschet"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"Steag în carouri"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"Practicant de snowboard"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"Alergător"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Practicant de surf"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Trofeu"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"Curse de cai"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"Fotbal american"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"Rugby"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"Înnotător"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"Clădire"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"Casă cu grădină"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"Clădire de birouri"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"Oficiu poștal japonez"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"Oficiu poștal european"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"Spital"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"Bancă"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"Bancomat"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"Hotel"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"Hoteluri pentru îndrăgostiți"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"Alimentară"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"Şcoală"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"Magazin universal"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"Fabrică"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"Felinar Izakaya"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"Castel japonez"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Castel european"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"Șobolan"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"Șoarece"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"Bou"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"Bivol de apă"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"Vacă"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"Leopard"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"Iepure"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"Pisică"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"Dragon"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"Crocodil"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"Balenă"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"Melc"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"Șarpe"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"Cal"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"Berbec"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"Capră"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"Oaie"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"Maimuţă"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"Cocoș"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"Pui"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"Câine"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"Porc"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"Porc mistreț"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"Elefant"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"Caracatiță"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"Scoică spiralată"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"Insectă"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"Furnică"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"Albină"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"Buburuză"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"Pești"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"Pești tropicali"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"Pește lună"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"Broască țestoasă"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"Pui ieșind din ou"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"Pui de găină"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"Pui văzut din față"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Pasăre"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"Pinguin"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"Urs koala"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"Pudel"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"Dromader"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"Cămilă cu două cocoașe"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"Delfin"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"Cap de șoarece"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"Cap de vacă"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"Cap de tigru"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"Cap de iepure"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"Cap de pisică"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"Cap de dragon"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"Balenă cenușie"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"Cap de cal"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"Cap de maimuță"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"Cap de câine"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"Cap de porc"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"Cap de broască"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"Cap de hamster"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"Cap de lup"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"Cap de urs"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"Cap de urs panda"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"Rât de porc"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"Urme de labe"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"Ochi"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"Ureche"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"Nas"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"Gură"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"Limbă scoasă"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"Deget arătător alb, orientat în sus"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Deget arătător alb, orientat în jos"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Deget arătător alb, orientat la stânga"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Deget arătător alb, orientat la dreapta"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"Semn pumn strâns"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"Semn palmă deschisă"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"Semn OK"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"Semn de aprobare"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"Semn de dezaprobare"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"Semn Aplauze"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"Semn Palme deschise"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"Coroană"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"Pălărie de damă"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"Ochelari"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"Cravată"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"Tricou"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"Blugi"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"Rochie"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"Kimono"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"Bikini"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"Haine de damă"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"Poșetă"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"Geantă"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"Borsetă"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"Pantofi bărbătești"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"Încălțăminte sport"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"Pantof cu toc înalt"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"Sandale de damă"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"Cizme de damă"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"Urme de pași"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"Bust siluetă"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"Busturi siluetă"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"Băiat"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"Fată"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"Bărbat"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"Femeie"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"Familie"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"Bărbat și femeie ținându-se de mână"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"Doi bărbați ținându-se de mână"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"Două femei ținându-se de mână"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"Polițist"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"Femeie cu urechi de iepure"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"Mireasă cu voal"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"Persoană cu păr blond"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"Bărbat cu gua pi mao"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"Bărbat cu turban"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"Bătrân"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"Bătrână"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"Bebeluș"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"Muncitor în construcții"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"Prinţesă"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"Căpcăun japonez"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"Goblin japonez"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"Fantomă"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"Îngeraș"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"Extraterestru"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"Monstru extraterestru"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Demon"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"Craniu"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"Persoană la ghișeul de informații"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"Paznic"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"Dansator"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"Ruj"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Lac de unghii"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Masaj facial"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"Tunsoare"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"Simbol pentru bărbier"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"Seringă"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"Pilulă"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"Semn de sărut"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"Scrisoare de dragoste"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"Inel"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"Piatră prețioasă"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"Sărut"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"Buchet"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"Cuplu cu inimă"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"Nuntă"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"Inimă bătând"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"Inimă zdrobită"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"Două inimi"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"Inimă strălucitoare"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"Inimă care crește"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"Inimă cu sageată"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"Inimă albastră"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"Inimă verde"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"Inimă galbenă"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"Inimă violet"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"Inimăcu panglică"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"Inimi care se rotesc"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"Ornament inimă"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"Formă romboidală cu un punct înăuntru"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"Bec electric"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"Simbol pentru furie"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"Bombă"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"Simbol pentru somn"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"Simbol pentru accident"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"Simbol stropi de transpirație"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"Picătură"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"Simbol liniuță"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"Excremente"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"Biceps flexat"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"Simbol pentru amețeală"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"Balon de dialog"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"Balon de gândire"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"Floare albă"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"Simbol pentru o sută de puncte"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"Sac cu bani"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"Schimb valutar"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"Semn dolar îngroșat"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"Card de credit"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"Bancnotă cu simbolul yen"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"Bancnotă cu simbolul dolar"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"Bancnotă cu simbolul euro"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"Bancnotă cu simbolul liră"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"Bani cu aripi"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"Diagramă reprezentând o tendință crescătoare și simbolul yen"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"Loc"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"Computer"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"Servietă"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"Minidisc"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"Dischetă"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"Disc optic"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"DVD"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"Dosar cu fișiere"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"Dosar deschis"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"Pagină îndoită"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"Pagină orientată în sus"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"Calendar"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"Calendar cu file detașabile"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"Index cărți de vizită"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"Diagramă reprezentând o tendință crescătoare"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"Diagramă reprezentând o tendință descrescătoare"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"Diagramă cu bare"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"Clipboard"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Piuneză"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Piuneză rotundă"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Agrafă de birou"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Riglă dreaptă"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Riglă triunghiulară"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"File de marcaj"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"Registru"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"Blocnotes"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Blocnotes cu copertă decorativă"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Carte închisă"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Carte deschisă"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Carte verde"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Carte albastră"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Carte portocalie"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"Cărți"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Insignă cu numele"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"Sul"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Notă"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Receptor de telefon"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"Pager"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Fax"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Antenă satelit"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Megafon"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Megafon"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Tavă de ieșiri"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Tavă de intrări"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"Pachet"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"Simbolul E-mail"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Plic primit"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Plic cu săgeată în jos deasupra"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Cutie poștală închisă cu steag coborât"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Cutie poștală închisă cu steag ridicat"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Cutie poștală deschisă cu steag ridicat"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Cutie poștală deschisă cu steag coborât"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Cutie poștală"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Simbolul poștal"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Ziar"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Telefon mobil"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Telefon mobil cu săgeată spre dreapta la stânga"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Modul vibrații"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Telefon mobil închis"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"Telefoanele mobile interzise"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"Antenă cu bare"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"Cameră foto"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Cameră video"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"Emisiuni TV"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"Radio"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Casetă video"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Săgeți răsucite spre dreapta"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Săgeți în formă de cerc deschis, orientate spre dreapta și spre stânga, în sensul acelor de ceasornic"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Săgeți în formă de cerc deschis, orientate spre dreapta și spre stânga, în sensul acelor de ceasornic, cu suprapunerea cifrei 1 într-un cerc"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Săgeți în formă de cerc deschis, orientate în sus și în jos, în sens orar"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"Săgeți în formă de cerc deschis, orientate în sus și în jos, în sens antiorar"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Simbol de luminozitate scăzută"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"Simbol de luminozitate ridicată"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Difuzor cu simbol de anulare"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"Difuzor"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Difuzor cu un val de sunet"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Difuzor cu trei valuri de sunet"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"Baterie"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Alimentare electrică"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Lupă orientată spre stânga"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Lupă orientată spre dreapta"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lacăt cu stilou"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Lacăt închis cu cheie"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Cheie"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"Lacăt"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Lacăt deschis"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Clopoțel"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Clopoțel cu simbol de anulare"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Marcaj"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Simbol lanț"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Buton radio"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"„BACK” cu săgeată spre stânga deasupra"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"„END” cu săgeată spre stânga deasupra"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"„ON” cu semn de exclamare și cu săgeată stânga-dreapta deasupra"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"„SOON” cu săgeată spre dreapta deasupra"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"„TOP” cu săgeată în sus deasupra"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"Simbolul „Interzis sub optsprezece ani”"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Tastă zece"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Simbol de introducere a majusculelor latine"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Simbol de introducere a literelor mici latine"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Simbol de introducere a cifrelor"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"Simbol de introducere a simbolurilor"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Simbol de introducere a literelor latine"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"Foc"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Lanternă"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Cheie"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Ciocan"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Piuliță și șurub"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hocho"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistol"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Microscop"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Telescop"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Glob de cristal"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"Stea cu șase colțuri cu punct în mijloc"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"Simbolul japonez pentru începători"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Emblemă trident"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"Buton negru pătrat"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"Buton alb pătrat"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Cerc mare roșu"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Cerc mare albastru"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Romb mare portocaliu"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Romb mare albastru"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Romb mic portocaliu"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Romb mic albastru"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Triunghi roșu, îndreptat în sus"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Triunghi roșu, îndreptat în jos"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Triunghi mic roșu, îndreptat în sus"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Triunghi mic roșu, îndreptat în jos"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Ceas cu ora unu"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Ceas cu ora două"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Ceas cu ora trei"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Ceas cu ora patru"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Ceas cu ora cinci"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Ceas cu ora șase"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Ceas cu ora șapte"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Ceas cu ora opt"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Ceas cu ora nouă"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Ceas cu ora zece"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Ceas cu ora unsprezece"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Ceas cu ora douăsprezece"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Ceas cu ora unu și jumătate"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Ceas cu ora două și jumătate"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Ceas cu ora trei și jumătate"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Ceas cu ora patru și jumătate"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Ceas cu ora cinci și jumătate"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Ceas cu ora șase și jumătate"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Ceas cu ora șapte și jumătate"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Ceas cu ora opt și jumătate"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Ceas cu ora nouă și jumătate"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Ceas cu ora zece și jumătate"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Ceas cu ora unsprezece și jumătate"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Ceas cu ora douăsprezece și jumătate"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Muntele Fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Turnul Tokyo"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Statuia Libertății"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Conturul Japoniei"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Față rânjind"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Față rânjind cu ochi zâmbitori"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"Față cu lacrimi de bucurie"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Față zâmbitoare cu gura deschisă"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Față zâmbitoare cu gura deschisă și ochi zâmbitori"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Față zâmbitoare, cu gura deschisă și sudoare rece"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Față zâmbitoare cu gura deschisă și ochii închiși"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Față zâmbitoare cu aură"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Față zâmbitoare cu coarne"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Față care face cu ochiul"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Față zâmbitoare, cu ochii zâmbitori"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"Față savurând mâncare delicioasă"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Față ușurată"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Față zâmbitoare, cu ochii în formă de inimă"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Față zâmbitoare cu ochelari de soare"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Față zâmbind șiret"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Față neutră"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Față fără expresie"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Față serioasă"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"Față cu sudoare rece"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Față meditativă"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Față confuză"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Față confuză"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Față care sărută"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"Față care trimite bezele"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Față care sărută cu ochi zâmbitori"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Față care sărută cu ochii închiși"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"Față care scoate limba"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Față care scoate limba și face cu ochiul"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Față care scoate limba, cu ochii închiși"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Față dezamăgită"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Față îngrijorată"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Față furioasă"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Față bosumflată"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Față care plânge"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Față perseverentă"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"Față cu privire triumfătoare"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Față dezamăgită dar ușurată"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Față încruntată cu gura deschisă"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Față chinuită"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Față înfricoșată"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Față obosită"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Față somnoroasă"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Față obosită"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Față cu grimasă"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Față plângând în hohote"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"Față cu gura deschisă"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Față redusă la tăcere"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"Față cu gura deschisă și sudoare rece"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"Față țipând de frică"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Față uimită"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Față congestionată"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Față care doarme"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Față amețită"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"Față fără gura"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"Față cu mască medicală"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Față de pisică rânjind, cu ochi zâmbitori"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"Față de pisică cu lacrimi de bucurie"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Față zâmbitoare de pisică, cu gura deschisă"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Față zâmbitoare pisică, cu ochii în formă de inimă"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"Față de pisică cu zâmbet crispat"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Față de pisică sărutând cu ochii închiși"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Față de pisică bosumflată"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Față de pisică plângând"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Față de pisică obosită"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"Față cu gest „nu are niciun rost”"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"Față cu gest „OK”"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Persoană care face plecăciuni"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"Maimuță care-și acoperă ochii"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Maimuță care-și acoperă urechile"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Maimuță care-și acoperă gura"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Persoană fericită, ridicând o mână"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"Persoană fericită ridicând ambele mâini de bucurie"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Persoană încruntată"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Persoană cu fața bosumflată"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Persoană cu mâinile împreunate"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Rachetă"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Elicopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Locomotivă cu abur"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Vagon de tren"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"Tren de mare viteză"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"Tren de mare viteză cu vârf ascuțit"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Tren"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metrou"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Metrou ușor"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Stație"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tramvai"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Vagon de tramvai"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Autobuz"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Autobuz sosind din față"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Troleibuz"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Stație de autobuz"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Maxi-taxi"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulanță"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Mașină de pompieri"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Mașină de poliție"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Mașină de poliție sosind din față"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Taxi sosind din față"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automobil"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Automobil sosind din față"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Vehicul de agrement"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Camion pentru livrări"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"Camion cu remorcă"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Tractor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monoșină"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Cale ferată montană"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Cale ferată suspendată"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Teleferic montan"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Tramvai aerian"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Vapor"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Barcă cu vâsle"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Barcă cu motor"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"Semafor orizontal"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Semafor vertical"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Semn de construcție"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Sirena de la mașina de poliție"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Stâlp cu steag triunghiular"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Ușă"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"Semn Intrarea oprită"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Simbol Fumatul permis"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"Simbol Fumatul interzis"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Simbol Aruncați gunoiul în locuri amenajate"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Simbol Păstrați curățenia"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Simbol Apă potabilă"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Simbol Apă care nu este potabilă"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicicletă"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"Interzis accesul cu bicicleta"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Biciclist"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Biciclist pe trasee montane"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pieton"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"Accesul pietonilor interzis"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Copii traversând"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Simbol Bărbați"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Simbol Femei"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Toaletă"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Simbol Bebeluș"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toaletă"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"WC"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Duș"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Baie"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Cadă"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Control pașapoarte"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Vamă"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Revendicarea bagajului"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Bagaj în custodie"</string> +</resources> diff --git a/java/res/values-ro/strings-letter-descriptions.xml b/java/res/values-ro/strings-letter-descriptions.xml new file mode 100644 index 000000000..cb4252928 --- /dev/null +++ b/java/res/values-ro/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicator de ordine feminin"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Semnul miu"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicator de ordine masculin"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ascuțit"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent grav"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent ascuțit"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accent circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tildă"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, tremă"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, cerc deasupra"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatură"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedilă"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent grav"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent ascuțit"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accent circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, tremă"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent grav"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent ascuțit"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accent circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, tremă"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tildă"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent grav"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent ascuțit"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accent circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tildă"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, tremă"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, tăiat cu linie"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent grav"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent ascuțit"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accent circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, tremă"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent ascuțit"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, tremă"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, căciulă"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent ascuțit"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accent circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punct deasupra"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, tăiat cu linie"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, căciulă"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punct deasupra"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accent circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, căciulă"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punct deasupra"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedilă"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accent circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, tăiat cu linie"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tildă"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, căciulă"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I fără punct"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatură"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accent circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedilă"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent ascuțit"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedilă"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punct la mijloc"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, tăiat cu linie"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent ascuțit"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedilă"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedat de apostrof"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, căciulă"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent ascuțit dublu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatură"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent ascuțit"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedilă"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent ascuțit"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accent circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedilă"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedilă"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, tăiat cu linie"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tildă"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, căciulă"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, cerc deasupra"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent ascuțit dublu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accent circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accent circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent ascuțit"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punct deasupra"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S lung"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, virgulă dedesubt"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, virgulă dedesubt"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punct dedesubt"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, cârlig deasupra"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accent circumflex și ascuțit"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accent circumflex și grav"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accent circumflex și cârlig deasupra"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accent circumflex și tildă"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accent circumflex și punct dedesubt"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, căciulă și accent ascuțit"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, căciulă și accent grav"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, căciulă și cârlig deasupra"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, căciulă și tildă"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, căciulă și punct dedesubt"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punct dedesubt"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, cârlig deasupra"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tildă"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accent circumflex și ascuțit"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accent circumflex și grav"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accent circumflex și cârlig deasupra"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accent circumflex și tildă"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accent circumflex și punct dedesubt"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, cârlig deasupra"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punct dedesubt"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punct dedesubt"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, cârlig deasupra"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accent circumflex și ascuțit"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accent circumflex și grav"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accent circumflex și cârlig deasupra"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accent circumflex și tildă"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accent circumflex și punct dedesubt"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corn și accent ascuțit"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corn și accent grav"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corn și cârlig deasupra"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corn și tildă"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corn și punct dedesubt"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punct dedesubt"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, cârlig deasupra"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corn și accent ascuțit"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corn și accent grav"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corn și cârlig deasupra"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corn și tildă"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corn și punct dedesubt"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent grav"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punct dedesubt"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, cârlig deasupra"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tildă"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Semnul exclamării inversat"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ghilimele unghiulare duble la stânga"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punct la mijloc"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Unu exponent"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Ghilimele unghiulare duble la dreapta"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Semnul întrebării inversat"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ghilimele simple la stânga"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Ghilimele simple la dreapta"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ghilimele simple jos"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ghilimele duble la stânga"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Ghilimele duble la dreapta"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruce"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruce dublă"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Semnul la mie"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prim"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prim dublu"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ghilimele unghiulare simple la stânga"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Ghilimele unghiulare simple la dreapta"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Patru exponent"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latin exponent"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Semnul peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"În atenția"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Săgeată la dreapta"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Săgeată în jos"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Mulțime vidă"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mai mic sau egal cu"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Mai mare sau egal cu"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Stea neagră"</string> +</resources> diff --git a/java/res/values-ro/strings-talkback-descriptions.xml b/java/res/values-ro/strings-talkback-descriptions.xml new file mode 100644 index 000000000..7a901624d --- /dev/null +++ b/java/res/values-ro/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Conectați un set căști-microfon pentru a auzi tastele apăsate când introduceți parola."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Textul curent este %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nu a fost introdus text"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corectează <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> cu <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> efectuează corectare automată"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Caracter necunoscut"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mai multe simboluri"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboluri"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ștergeți"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simboluri"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Litere"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Cifre"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Setări"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Tasta Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Intrare vocală"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoticonuri"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Căutați"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Bulină"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Schimbați limba"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Înai."</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Înapoi"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Tasta Shift a fost activată"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Tasta Caps Lock este activată"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Modul Simboluri"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Modul Mai multe simboluri"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Modul Alfanumeric"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Modul Telefon"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Modul Telefon cu simboluri"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tastatura este ascunsă"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Se afișează tastatura pentru <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"data"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"date și ore"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"adrese de e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mesaje"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"numere"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefoane"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ore"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"adrese URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Recente"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Persoane"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Obiecte"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natură"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locații"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboluri"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticonuri"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> mare"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I mare"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I mare, punct deasupra"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol necunoscut"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji necunoscut"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Sunt disponibile caractere alternative"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"S-au închis caracterele alternative"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sunt disponibile sugestii alternative"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"S-au închis sugestiile alternative"</string> +</resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index 147f83e61..985a81ee6 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -21,18 +21,17 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Opţiuni de introducere text"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Comenzi jurnal cercetare"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Verificare nume în agendă"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Verificatorul ortografic utilizează intrări din lista de contacte"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrare la apăsarea tastei"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Sunet la apăsarea tastei"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Pop-up la apăsarea tastei"</string> - <string name="general_category" msgid="1859088467017573195">"General"</string> - <string name="correction_category" msgid="2236750915056607613">"Corectare text"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Tastare gestuală"</string> - <string name="misc_category" msgid="6894192814868233453">"Alte opţiuni"</string> - <string name="advanced_settings" msgid="362895144495591463">"Setări avansate"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Opţiuni pentru experţi"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"Preferințe pentru intrare"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"Aspect"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"Opțiuni pt. diverse limbi"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"Prefer. tastare gestuală"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"Corectare text"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"Setări avansate"</string> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Comut. alte metode de introd."</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tasta de comutare între limbi include şi alte metode de introd."</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tastă comutare limbi"</string> @@ -46,6 +45,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Valoare prestabilită"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sugeraţi nume din Agendă"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizaţi numele din Agendă pentru sugestii şi corecţii"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestii personalizate"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Îmbunătățiți <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Inserează punct spațiu"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubla atingere a barei de spațiu inserează punct urmat de spațiu"</string> <string name="auto_cap" msgid="1719746674854628252">"Scriere automată cu majuscule"</string> @@ -73,72 +74,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Se afişează urma gestului"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Sugestie flotantă dinamică"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afişaţi cuvântul sugerat când utilizaţi gesturi"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: salvat"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Conectaţi un set căşti-microfon pentru a auzi tastele apăsate când introduceţi parola."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Textul curent este %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nu a fost introdus text"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> corectează <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> cu <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> efectuează corectare automată"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Tasta cu codul %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Tasta Shift este activată (apăsaţi pentru a o dezactiva)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Tasta Caps Lock este activată (apăsaţi pentru a o dezactiva)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboluri"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Litere"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Cifre"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Setări"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Spaţiu"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Intrare vocală"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Faţă zâmbitoare"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Căutaţi"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punct"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Schimbaţi limba"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Înainte"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Înapoi"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Tasta Shift a fost activată"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Tasta Caps Lock a fost activată"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Tasta Shift a fost dezactivată"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Modul Simboluri"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Modul Alfanumeric"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Modul Telefon"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Modul Telefon cu simboluri"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tastatura este ascunsă"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Se afișează tastatura pentru <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"date"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"date și ore"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"adrese de e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mesaje"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"numere"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefoane"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ore"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"adrese URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Gest expresie"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Introduceți spații în timpul gesturilor, glisând pe tasta spațiu"</string> <string name="voice_input" msgid="3583258583521397548">"Tastă pentru intrarea vocală"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Nicio metodă de intrare vocală activată. Verificați setările pentru limbă și introducere de text."</string> <string name="configure_input_method" msgid="373356270290742459">"Configuraţi metodele de intrare"</string> <string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string> <string name="send_feedback" msgid="1780431884109392046">"Trimiteți feedback"</string> <string name="select_language" msgid="3693815588777926848">"Limbi de introducere de text"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Atingeţi din nou pentru a salva"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Ajutați la îmbunătățirea acestui instrument de editare a metodelor de introducere a textului trimițând în mod automat statistici de utilizare și rapoarte de blocare."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Temă pentru tastatură"</string> <string name="subtype_en_GB" msgid="88170601942311355">"engleză (Regatul Unit)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"engleză (S.U.A.)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"spaniolă (S.U.A.)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engleză (Regatul Unit) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engleză (S.U.A.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spaniolă (S.U.A.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradițional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engleză (Regatul Unit) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engleză (S.U.A.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spaniolă (S.U.A.) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradițională)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Chirilică)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latină)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Nicio limbă (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +102,11 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Schemă de culori"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Alb"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Albastru"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"Temă pentru tastatură"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"Holo White"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"Holo Blue"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"Material Dark"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"Material Light"</string> <string name="custom_input_styles_title" msgid="8429952441821251512">"Stiluri personalizate"</string> <string name="add_style" msgid="6163126614514489951">"Stil"</string> <string name="add" msgid="8299699805688017798">"Adăugaţi"</string> @@ -161,14 +118,13 @@ <string name="enable" msgid="5031294444630523247">"Activaţi"</string> <string name="not_now" msgid="6172462888202790482">"Nu acum"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Acelaşi stil de introducere există deja: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modul Studiu privind utilizarea"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Timpul apăsării lungi a tastei"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrare după apăsarea tastei"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Sunet la apăsarea tastelor"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Citiți fișierul de dicționar extern"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nu există fișiere dicționar în dosarul Descărcări"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selectați un fișier dicționar de instalat"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Doriți să instalați acest fișier pentru <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Doriți să instalați acest fișier pentru <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"A apărut o eroare"</string> <string name="button_default" msgid="3988017840431881491">"Prestabilit"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Bun venit la <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +163,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizați"</string> <string name="last_update" msgid="730467549913588780">"Data ultimei modificări"</string> <string name="message_updating" msgid="4457761393932375219">"Se verifică existența actualizărilor"</string> - <string name="message_loading" msgid="8689096636874758814">"Se încarcă..."</string> + <string name="message_loading" msgid="5638680861387748936">"Se încarcă..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Dicționar principal"</string> <string name="cancel" msgid="6830980399865683324">"Anulaţi"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Setări"</string> <string name="install_dict" msgid="180852772562189365">"Instalați"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Anulați"</string> <string name="delete_dict" msgid="756853268088330054">"Ștergeți"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Limba selectată pe dispozitivul mobil are un dicționar disponibil.<br/> Vă recomandăm să <b>descărcați</b> dicționarul de <xliff:g id="LANGUAGE">%1$s</xliff:g> pentru a vă îmbunătăți experiența la introducerea textului.<br/> <br/> Descărcarea prin 3G poate dura un minut sau două. Se pot aplica taxe dacă nu aveți un <b>plan de date nelimitat</b>.<br/> Dacă nu știți sigur ce plan de date aveți, găsiți o conexiune Wi-Fi și descărcați automat.<br/> <br/> Sfat: puteți să descărcați și să eliminați dicționare accesând <b>Limbă și introducere de text</b> din meniul <b>Setări</b>, pe dispozitivul mobil."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Pentru limba selectată pe dispozitivul dvs. mobil este disponibil un dicționar.<br/> Vă recomandăm să <b>descărcați</b> dicționarul de <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> pentru o mai bună experiență a introducerii de text.<br/> <br/> Descărcarea poate dura un minut sau două prin 3G. Dacă nu aveți un <b>plan de date nelimitat</b>, se pot aplica taxe.<br/> Dacă nu știți sigur ce plan de date aveți, vă recomandăm să căutați o conexiune Wi-Fi pentru a începe automat descărcarea.<br/> <br/> Sfat: puteți să descărcați și să ștergeți dicționare accesând opțiunea <b>Limbă și introducere de text</b> din meniul <b>Setări</b> al dispozitivului mobil."</string> <string name="download_over_metered" msgid="1643065851159409546">"Descărcați acum (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descărcați prin Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Este disponibil un dicționar pentru <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Este disponibil un dicționar pentru <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Apăsați pentru examinare și descărcare"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Se descarcă: sugestiile pentru <xliff:g id="LANGUAGE">%1$s</xliff:g> vor fi gata în curând."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Se descarcă: sugestiile pentru <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> vor fi gata în curând."</string> <string name="version_text" msgid="2715354215568469385">"Versiunea <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Adăugați"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Adăugați în dicționar"</string> diff --git a/java/res/values-ru/strings-action-keys.xml b/java/res/values-ru/strings-action-keys.xml index d5080ceb5..d276384cd 100644 --- a/java/res/values-ru/strings-action-keys.xml +++ b/java/res/values-ru/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"Готово"</string> <string name="label_send_key" msgid="482252074224462163">"Отправить"</string> + <string name="label_search_key" msgid="7965186050435796642">"Поиск"</string> <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string> <string name="label_wait_key" msgid="5891247853595466039">"Пауза"</string> </resources> diff --git a/java/res/values-ru/strings-config-important-notice.xml b/java/res/values-ru/strings-config-important-notice.xml new file mode 100644 index 000000000..5e6999c1f --- /dev/null +++ b/java/res/values-ru/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Устройство будет запоминать то, что вы вводите чаще всего"</string> +</resources> diff --git a/java/res/values-ru/strings-letter-descriptions.xml b/java/res/values-ru/strings-letter-descriptions.xml new file mode 100644 index 000000000..bbc497477 --- /dev/null +++ b/java/res/values-ru/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Женский порядковый индикатор."</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак микро."</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Мужской порядковый индикатор."</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Эсцет."</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Латинская A с грависом."</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Латинская A с акутом."</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Латинская A с циркумфлексом."</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Латинская A с тильдой."</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"Латинская A с умляутом."</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Латинская A с кружком сверху."</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Лигатура из латинских A и E."</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Латинская C с седилью."</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Латинская E с грависом."</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Латинская E с акутом."</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Латинская E с циркумфлексом."</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Латинская E с умляутом."</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Латинская I с грависом."</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Латинская I с акутом."</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Латинская I с циркумфлексом."</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Латинская I с умляутом."</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth."</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Латинская N с тильдой."</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Латинская O с грависом."</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Латинская O с акутом."</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Латинская O с циркумфлексом."</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Латинская O с тильдой."</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Латинская O с умляутом."</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Латинская O, диагонально перечеркнутая."</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Латинская U с грависом."</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Латинская U с акутом."</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Латинская U с циркумфлексом."</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Латинская U с умляутом."</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Латинская Y с акутом."</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн."</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Латинская Y с умляутом."</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Латинская A с макроном."</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Латинская A с бревисом."</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"Латинская A с огонэком."</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Латинская C с акутом."</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Латинская C с циркумфлексом."</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Латинская C с точкой сверху."</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Латинская C с гачеком."</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Латинская D с гачеком."</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Латинская D с чертой."</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Латинская E с макроном."</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Латинская E с бревисом."</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Латинская E с точкой сверху."</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Латинская E с огонэком."</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Латинская E с гачеком."</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Латинская G с циркумфлексом."</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Латинская G с бревисом."</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Латинская G с точкой сверху."</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Латинская G с седилью."</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Латинская H с циркумфлексом."</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Латинская H с чертой."</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Латинская I с тильдой."</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Латинская I с макроном."</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Латинская I с бревисом."</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Латинская I с огонэком."</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Латинская I без точки."</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Лигатура из латинских I и J."</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Латинская J с циркумфлексом."</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Латинская K с седилью."</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Латинская L с акутом."</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Латинская L с седилью."</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Латинская L с гачеком."</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"Латинская L с точкой сбоку."</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Латинская L с чертой."</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Латинская N с акутом."</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Латинская N с седилью."</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Латинская N с гачеком."</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Латинская N с апострофом слева."</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Энг"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Латинская O с макроном."</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Латинская O с бревисом."</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Латинская O с двойным акутом."</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Лигатура из латинских O и E"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Латинская R с акутом"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Латинская R с седилью."</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Латинская R с гачеком."</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Латинская S с акутом."</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Латинская S с циркумфлексом."</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Латинская S с седилью."</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Латинская S с гачеком."</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Латинская T с седилью."</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Латинская T с гачеком."</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Латинская T с чертой."</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Латинская U с тильдой."</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Латинская U с макроном."</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Латинская U с бревисом."</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"Латинская U с кружком сверху."</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Латинская U с двойным акутом."</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Латинская U с огонэком."</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Латинская W с циркумфлексом."</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Латинская Y с циркумфлексом."</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Латинская Z с акутом."</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Латинская Z с точкой сверху."</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Латинская Z с гачеком."</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Латинская S длинная."</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Латинская O с крючком."</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"Латинская U с крючком."</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"Латинская S с запятой снизу."</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Латинская T с запятой снизу."</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва."</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Латинская A с точкой снизу."</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"Латинская A с крючком сверху."</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"Латинская A с циркумфлексом и акутом."</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"Латинская A с циркумфлексом и грависом."</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"Латинская A с крючком сверху и циркумфлексом."</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"Латинская A с циркумфлексом и тильдой."</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"Латинская A с точкой снизу и циркумфлексом."</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Латинская A с бревисом и акутом."</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"Латинская A с бревисом и грависом."</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"Латинская A с крючком сверху и бревисом."</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"Латинская A с бревисом и тильдой."</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"Латинская A с точкой снизу и бревисом."</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Латинская E с точкой снизу."</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Латинская E с крючком сверху."</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Латинская E с тильдой."</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Латинская E с циркумфлексом и акутом."</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Латинская E с циркумфлексом и грависом."</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Латинская E с крючком сверху и циркумфлексом."</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Латинская E с циркумфлексом и тильдой."</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Латинская E с точкой снизу и циркумфлексом."</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"Латинская I с крючком сверху."</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"Латинская I с точкой снизу."</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Латинская O с точкой снизу."</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"Латинская O с крючком сверху."</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Латинская O с циркумфлексом и акутом."</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"Латинская O с циркумфлексом и грависом."</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"Латинская O с крючком сверху и циркумфлексом."</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"Латинская O с циркумфлексом и тильдой."</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Латинская O с точкой снизу и циркумфлексом."</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Латинская O с рожком и акутом."</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"Латинская O с рожком и грависом."</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"Латинская O с крючком сверху и рожком."</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"Латинская O с крючком и тильдой."</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"Латинская O с точкой снизу и крючком."</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Латинская U с точкой снизу."</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Латинская U с крючком сверху."</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Латинская U с крючком и акутом."</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Латинская U с крючком и грависом."</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Латинская U с крючком и крючком сверху."</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Латинская U с крючком и тильдой."</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Латинская U с точкой снизу и крючком."</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Латинская Y с грависом."</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Латинская Y с точкой снизу."</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Латинская Y с крючком сверху."</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Латинская Y с тильдой."</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Перевернутый восклицательный знак."</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Открывающая двойная французская кавычка."</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Интерпункт."</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Единица в надстрочном начертании."</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Закрывающая двойная французская кавычка."</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Перевернутый вопросительный знак."</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Открывающая одиночная английская кавычка."</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Закрывающая одиночная английская кавычка."</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Одиночная нижняя кавычка."</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Открывающая двойная английская кавычка."</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Закрывающая двойная английская кавычка."</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Типографский крестик."</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Двойной крестик."</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак промилле."</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих."</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Двойной штрих."</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Открывающая одиночная угловая кавычка."</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Закрывающая одиночная угловая кавычка."</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Четверка в надстрочном начертании."</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Строчная латинская n в надстрочном начертании."</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак песо."</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Знак Care of."</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрелка вправо."</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрелка вниз."</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Знак пустого множества."</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Дельта."</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Меньше или равно."</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Больше или равно."</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Черная звезда."</string> +</resources> diff --git a/java/res/values-ru/strings-talkback-descriptions.xml b/java/res/values-ru/strings-talkback-descriptions.xml new file mode 100644 index 000000000..b23d40df3 --- /dev/null +++ b/java/res/values-ru/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Подключите гарнитуру, чтобы услышать пароль."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Введенный текст: %s."</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст не введен."</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"При нажатии клавиши <xliff:g id="KEY_NAME">%1$s</xliff:g> слово <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> будет исправлено на <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Клавиша <xliff:g id="KEY_NAME">%1$s</xliff:g> выполняет автоисправление."</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Неизвестный символ."</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Клавиша верхнего регистра."</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Дополнительные символы."</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Клавиша верхнего регистра."</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Символы."</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Клавиша верхнего регистра."</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Удалить."</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Символы."</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Буквы."</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Цифры."</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Настройки."</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Клавиша Tab."</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Пробел."</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Голосовой ввод."</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Смайлики."</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Ввод."</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Поиск."</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Маркер списка."</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Сменить язык."</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Далее."</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Назад."</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Верхний регистр включен."</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock включен."</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Режим добавления символов."</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Режим дополнительных символов."</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Режим ввода текста."</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Режим набора номера."</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Режим телефонных символов."</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Клавиатура скрыта."</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Включен режим <xliff:g id="KEYBOARD_MODE">%s</xliff:g>."</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ввода даты"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ввода даты и времени"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ввода адреса электронной почты"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ввода сообщения"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"ввода цифр"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"набора номера"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ввода текста"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ввода времени"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"ввода URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Недавно использованные."</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Люди."</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Объекты."</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Природа."</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Места."</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Символы."</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Смайлики."</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Заглавная <xliff:g id="LOWER_LETTER">%s</xliff:g>."</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Заглавная латинская I."</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Заглавная латинская I с точкой сверху."</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Неизвестный символ."</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Неизвестный смайлик."</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Доступны дополнительные символы."</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Дополнительные символы скрыты."</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Доступны дополнительные подсказки."</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Дополнительные подсказки скрыты."</string> +</resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 8bbaead0a..cac186517 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Настройки"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Все команды"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Поиск контактов"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Обращаться к списку контактов при проверке правописания"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Виброотклик клавиш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук клавиш"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Увеличение нажатых"</string> - <string name="general_category" msgid="1859088467017573195">"Общие"</string> - <string name="correction_category" msgid="2236750915056607613">"Исправление текста"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Непрерывный ввод"</string> - <string name="misc_category" msgid="6894192814868233453">"Другие варианты"</string> - <string name="advanced_settings" msgid="362895144495591463">"Расширенные настройки"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Для опытных пользователей"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Смена способов ввода"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Клавиша переключения языков также служит для смены способа ввода"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Клавиша смены языка"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"По умолчанию"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Подсказывать имена"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Подсказывать исправления на основе имен из списка контактов"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Пользовательские словари"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Помочь улучшить <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Ставить точки автоматически"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Вводить точку с пробелом двойным нажатием кнопки \"Пробел\"."</string> <string name="auto_cap" msgid="1719746674854628252">"Заглавные автоматически"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Рисовать линию"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Показывать подсказки"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показывать подсказки при вводе текста"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Подключите гарнитуру, чтобы услышать пароль."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Введенный текст: %s."</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст не введен"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"При нажатии клавиши \"<xliff:g id="KEY">%1$s</xliff:g>\" слово \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" будет исправлено на \"<xliff:g id="CORRECTED">%3$s</xliff:g>\""</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Для клавиши \"<xliff:g id="KEY">%1$s</xliff:g>\" назначена функция автоисправления"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Код клавиши:%d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Клавиша верхнего регистра"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Верхний регистр включен (нажмите, чтобы отключить)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock включен (нажмите, чтобы отключить)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Клавиша удаления"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Клавиша символов"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Буквы"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Цифры"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Настройки"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Клавиша табуляции"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Пробел"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Голосовой ввод"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Смайлик"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Клавиша \"Ввод\""</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Поиск"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Точка"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Сменить язык"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Далее"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Назад"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Верхний регистр включен"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock включен"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Верхний регистр отключен"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Режим добавления символов"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим ввода текста"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим набора номера"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим телефонных символов"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавиатура скрыта"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Включен режим <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ввода даты"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ввода даты и времени"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"ввода адреса электронной почты"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ввода сообщения"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"ввода цифр"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"набора номера"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"ввода текста"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ввода времени"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"ввода URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Непрерывный ввод фраз"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Проводите по клавише пробела после каждого слова"</string> <string name="voice_input" msgid="3583258583521397548">"Кнопка голосового ввода"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Голосовой способ ввода не включен. Проверьте раздел настроек \"Язык и ввод\"."</string> <string name="configure_input_method" msgid="373356270290742459">"Настройка способов ввода"</string> <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string> <string name="send_feedback" msgid="1780431884109392046">"Отправить отзыв"</string> <string name="select_language" msgid="3693815588777926848">"Языки ввода"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Нажмите, чтобы сохранить"</string> <string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Тема клавиатуры"</string> <string name="subtype_en_GB" msgid="88170601942311355">"английский (Великобритания)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"английский (США)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Испанский (США)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Английская (Великобр.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Английская (США) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Испанский (США): <xliff:g id="LAYOUT">%s</xliff:g>"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (традиционный)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Английский (Великобритания, <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Английский (США, <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Испанский (США, <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (классическая)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (кириллица)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (латиница)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Язык не определен (латиница)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Латиница (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Латиница (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Латиница (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Латиница (ПК)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Эмодзи"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Цветовая гамма"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Белый"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Синий"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Персонализированные стили"</string> <string name="add_style" msgid="6163126614514489951">"Добавить стиль"</string> <string name="add" msgid="8299699805688017798">"Добавить"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Включить"</string> <string name="not_now" msgid="6172462888202790482">"Не сейчас"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Такой стиль ввода уже существует: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим проверки удобства использования"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Долгое нажатие"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Вибросигнал при нажатии клавиш"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Звук при нажатии клавиш"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Загрузить словарь из файла"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"В папке \"Загрузки\" нет словарей"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Выберите файл словаря"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Установить этот файл для следующего языка: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Установить этот файл для следующего языка: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Ошибка"</string> <string name="button_default" msgid="3988017840431881491">"По умолчанию"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Представляем приложение \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Обновить"</string> <string name="last_update" msgid="730467549913588780">"Последнее обновление"</string> <string name="message_updating" msgid="4457761393932375219">"Проверка обновлений…"</string> - <string name="message_loading" msgid="8689096636874758814">"Загрузка..."</string> + <string name="message_loading" msgid="5638680861387748936">"Загрузка…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Основной словарь"</string> <string name="cancel" msgid="6830980399865683324">"Отмена"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Настройки"</string> <string name="install_dict" msgid="180852772562189365">"Установить"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Отмена"</string> <string name="delete_dict" msgid="756853268088330054">"Удалить"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Доступен <xliff:g id="LANGUAGE">%1$s</xliff:g> словарь для проверки правописания.<br/>Рекомендуем <b>установить</b> его, чтобы быстрее вводить текст.<br/><br/>Если вашим тарифом предусмотрена <b>безлимитная передача данных</b>, словарь можно загрузить через сеть 3G (это займет всего пару минут).<br/>Если вы не помните подробностей своего тарифного плана, лучше подключитесь к сети Wi-Fi (загрузка начнется автоматически).<br/><br/>Совет. Чтобы добавить, удалить или настроить словарь, откройте раздел <b>Язык и ввод</b> в настройках своего устройства."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Доступен словарь для проверки правописания (<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>).<br/>Рекомендуем <b>установить</b> его, чтобы быстрее вводить текст.<br/><br/>Если вашим тарифом предусмотрена <b>безлимитная передача данных</b>, словарь можно загрузить через сеть 3G (это займет всего пару минут).<br/>Если вы не помните подробностей своего тарифного плана, лучше подключитесь к сети Wi-Fi (загрузка начнется автоматически).<br/><br/>Совет. Чтобы добавлять, удалять и настраивать словари, откройте раздел <b>Язык и ввод</b> в настройках устройства."</string> <string name="download_over_metered" msgid="1643065851159409546">"Загрузить (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> МБ)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Загрузить через Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Доступен словарь: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Доступен словарь: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Нажмите, чтобы просмотреть и загрузить"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Загрузка словаря: <xliff:g id="LANGUAGE">%1$s</xliff:g>…"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Загрузка словаря (<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>)…"</string> <string name="version_text" msgid="2715354215568469385">"Версия <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Добавить"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Добавление в словарь"</string> diff --git a/java/res/values-si-rLK/strings-action-keys.xml b/java/res/values-si-rLK/strings-action-keys.xml new file mode 100644 index 000000000..2271ce956 --- /dev/null +++ b/java/res/values-si-rLK/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"යන්න"</string> + <string name="label_next_key" msgid="5586407279258592635">"මීළඟ"</string> + <string name="label_previous_key" msgid="1421141755779895275">"පෙර"</string> + <string name="label_done_key" msgid="7564866296502630852">"හරි"</string> + <string name="label_send_key" msgid="482252074224462163">"යවන්න"</string> + <string name="label_search_key" msgid="7965186050435796642">"සොයන්න"</string> + <string name="label_pause_key" msgid="2225922926459730642">"විරාමය"</string> + <string name="label_wait_key" msgid="5891247853595466039">"රැඳීම"</string> +</resources> diff --git a/java/res/values-si-rLK/strings-appname.xml b/java/res/values-si-rLK/strings-appname.xml new file mode 100644 index 000000000..108104872 --- /dev/null +++ b/java/res/values-si-rLK/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android යතුරු පුවරුව (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android අක්ෂර වින්යාස පරීක්ෂක (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android යතුරු පුවරු සැකසීම් (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android අක්ෂර වින්යාස පරීක්ෂක සැකසීම් (AOSP)"</string> +</resources> diff --git a/java/res/values-si-rLK/strings-config-important-notice.xml b/java/res/values-si-rLK/strings-config-important-notice.xml new file mode 100644 index 000000000..b13f724d3 --- /dev/null +++ b/java/res/values-si-rLK/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"යෝජනා දියුණුවට, ඔබගේ සන්නිවේදන සහ ටයිප් කළ දත්තවලින් ඉගෙන ගන්න"</string> +</resources> diff --git a/java/res/values-si-rLK/strings-emoji-descriptions.xml b/java/res/values-si-rLK/strings-emoji-descriptions.xml new file mode 100644 index 000000000..14187a6d9 --- /dev/null +++ b/java/res/values-si-rLK/strings-emoji-descriptions.xml @@ -0,0 +1,851 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_emoji_00A9" msgid="2859822817116803638">"ප්රකාශන හිමිකම් ලකුණ"</string> + <string name="spoken_emoji_00AE" msgid="7708335454134589027">"ලියාපදිංචි කළ ලකුණ"</string> + <string name="spoken_emoji_203C" msgid="153340916701508663">"Double exclamation mark"</string> + <string name="spoken_emoji_2049" msgid="4877256448299555371">"Exclamation question mark"</string> + <string name="spoken_emoji_2122" msgid="9188440722954720429">"Trade mark සලකුණ"</string> + <string name="spoken_emoji_2139" msgid="9114342638917304327">"Information source"</string> + <string name="spoken_emoji_2194" msgid="8055202727034946680">"Left right ඊතලය"</string> + <string name="spoken_emoji_2195" msgid="8028122253301087407">"Up down ඊතලය"</string> + <string name="spoken_emoji_2196" msgid="4019164898967854363">"North west ඊතලය"</string> + <string name="spoken_emoji_2197" msgid="4255723717709017801">"North east ඊතලය"</string> + <string name="spoken_emoji_2198" msgid="1452063451313622090">"South east ඊතලය"</string> + <string name="spoken_emoji_2199" msgid="6942722693368807849">"South west ඊතලය"</string> + <string name="spoken_emoji_21A9" msgid="5204750172335111188">"Leftwards ඊතලය සමඟ hook"</string> + <string name="spoken_emoji_21AA" msgid="3950259884359247006">"Rightwards ඊතලය සමඟ hook"</string> + <string name="spoken_emoji_231A" msgid="6751448803233874993">"නරඹන්න"</string> + <string name="spoken_emoji_231B" msgid="5956428809948426182">"Hourවීදුරුව"</string> + <string name="spoken_emoji_23E9" msgid="4022497733535162237">"කළු right-pointing double triangle"</string> + <string name="spoken_emoji_23EA" msgid="2251396938087774944">"කළු left-pointing double triangle"</string> + <string name="spoken_emoji_23EB" msgid="3746885195641491865">"කළු up-pointing double triangle"</string> + <string name="spoken_emoji_23EC" msgid="7852372752901163416">"කළු down-pointing double triangle"</string> + <string name="spoken_emoji_23F0" msgid="8474219588750627870">"සීනු ඔරලෝසුව"</string> + <string name="spoken_emoji_23F3" msgid="166900119581024371">"Hourවීදුරුව සමඟ flowing sසහ"</string> + <string name="spoken_emoji_24C2" msgid="3948348737566038470">"කව කළ latin capital letter m"</string> + <string name="spoken_emoji_25AA" msgid="7865181015100227349">"කළු small square"</string> + <string name="spoken_emoji_25AB" msgid="6446532820937381457">"සුදු small square"</string> + <string name="spoken_emoji_25B6" msgid="2423897708496040947">"කළු right-pointing triangle"</string> + <string name="spoken_emoji_25C0" msgid="3595083440074484934">"කළු left-pointing triangle"</string> + <string name="spoken_emoji_25FB" msgid="4838691986881215419">"සුදු මධ්යම square"</string> + <string name="spoken_emoji_25FC" msgid="7008859564991191050">"කළු මධ්යම square"</string> + <string name="spoken_emoji_25FD" msgid="7673439755069217479">"සුදු මධ්යම small square"</string> + <string name="spoken_emoji_25FE" msgid="6782214109919768923">"කළු මධ්යමකුඩා"</string> + <string name="spoken_emoji_2600" msgid="2272722634618990413">"රැස් සමඟ කළු ඉරු"</string> + <string name="spoken_emoji_2601" msgid="6205136889311537150">"වලාකුළ"</string> + <string name="spoken_emoji_260E" msgid="8670395193046424238">"කළු දුරකථනය"</string> + <string name="spoken_emoji_2611" msgid="4530550203347054611">"හරි සමඟ ඡන්ද පෙට්ටිය"</string> + <string name="spoken_emoji_2614" msgid="1612791247861229500">"වැහි බිංදු සමඟ කුඩය"</string> + <string name="spoken_emoji_2615" msgid="3320562382424018588">"උණුසුම් බීම"</string> + <string name="spoken_emoji_261D" msgid="4690554173549768467">"ඉහළට දිගුකර සිටින සුචිය"</string> + <string name="spoken_emoji_263A" msgid="3170094381521989300">"සුදු සිනාසෙන මුහුණ"</string> + <string name="spoken_emoji_2648" msgid="4621241062667020673">"මේෂ"</string> + <string name="spoken_emoji_2649" msgid="7694461245947059086">"වෘෂභ"</string> + <string name="spoken_emoji_264A" msgid="1258074605878705030">"මිථුන"</string> + <string name="spoken_emoji_264B" msgid="4409219914377810956">"කටක"</string> + <string name="spoken_emoji_264C" msgid="6520255367817054163">"සිංහ"</string> + <string name="spoken_emoji_264D" msgid="1504758945499854018">"කන්යා"</string> + <string name="spoken_emoji_264E" msgid="2354847104530633519">"තුලා"</string> + <string name="spoken_emoji_264F" msgid="5822933280406416112">"වෘශ්චික"</string> + <string name="spoken_emoji_2650" msgid="4832481156714796163">"ධනු"</string> + <string name="spoken_emoji_2651" msgid="840953134601595090">"මකර"</string> + <string name="spoken_emoji_2652" msgid="3586925968718775281">"කුම්භ"</string> + <string name="spoken_emoji_2653" msgid="8420547731496254492">"මීන"</string> + <string name="spoken_emoji_2660" msgid="4541170554542412536">"කළු ඉස්කෝප්ප කට්ටළය"</string> + <string name="spoken_emoji_2663" msgid="3669352721942285724">"කළු කලාබර කට්ටළය"</string> + <string name="spoken_emoji_2665" msgid="6347941599683765843">"කළු හරත කට්ටළය"</string> + <string name="spoken_emoji_2666" msgid="8296769213401115999">"කළු දියමන්ති කට්ටළය"</string> + <string name="spoken_emoji_2668" msgid="7063148281053820386">"උණුසුම් දුනු"</string> + <string name="spoken_emoji_267B" msgid="21716857176812762">"කළු පොදු ප්රතිචක්රකරණය කිරීමේ සංකේතය"</string> + <string name="spoken_emoji_267F" msgid="8833496533226475443">"රෝද පුටුවේ සංකේතය"</string> + <string name="spoken_emoji_2693" msgid="7443148847598433088">"නැංගුරම"</string> + <string name="spoken_emoji_26A0" msgid="6272635532992727510">"අනතුරු ඇඟවීමේ සලකුණ"</string> + <string name="spoken_emoji_26A1" msgid="5604749644693339145">"ඉහළ වෝල්ටියතා සලකුණ"</string> + <string name="spoken_emoji_26AA" msgid="8005748091690377153">"මධ්යම සුදු කවය"</string> + <string name="spoken_emoji_26AB" msgid="1655910278422753244">"මධ්යම කළු කවය"</string> + <string name="spoken_emoji_26BD" msgid="1545218197938889737">"පාපන්දුබෝලය"</string> + <string name="spoken_emoji_26BE" msgid="8959760533076498209">"බේස්බෝල්"</string> + <string name="spoken_emoji_26C4" msgid="3045791757044255626">"හිම නොමැතිව හිමෙන් සෑදු මිනිසා"</string> + <string name="spoken_emoji_26C5" msgid="5580129409712578639">"වලාකුළු වලට පිටුපසින් ඉර"</string> + <string name="spoken_emoji_26CE" msgid="8963656417276062998">"ඔෆිචුස්"</string> + <string name="spoken_emoji_26D4" msgid="2231451988209604130">"ඇතුළත් වීමට බෑ"</string> + <string name="spoken_emoji_26EA" msgid="7513319636103804907">"දේවස්ථානය"</string> + <string name="spoken_emoji_26F2" msgid="7134115206158891037">"ජලාශය"</string> + <string name="spoken_emoji_26F3" msgid="4912302210162075465">"හිල තුළ කොඩිය"</string> + <string name="spoken_emoji_26F5" msgid="4766328116769075217">"රුවල් බෝට්ටුව"</string> + <string name="spoken_emoji_26FA" msgid="5888017494809199037">"කූඩාරම"</string> + <string name="spoken_emoji_26FD" msgid="2417060622927453534">"ඉන්ධන පොම්පය"</string> + <string name="spoken_emoji_2702" msgid="4005741160717451912">"කළු කතුර"</string> + <string name="spoken_emoji_2705" msgid="164605766946697759">"සුදු විශාල හරි ලකුණ"</string> + <string name="spoken_emoji_2708" msgid="7153840886849268988">"ගුවන් යානය"</string> + <string name="spoken_emoji_2709" msgid="2217319160724311369">"ලියුම් කවරය"</string> + <string name="spoken_emoji_270A" msgid="508347232762319473">"ඉහළට එසවූ අතේ මිට"</string> + <string name="spoken_emoji_270B" msgid="6640562128327753423">"ඉහළට එසවූ අත"</string> + <string name="spoken_emoji_270C" msgid="1344288035704944581">"ජයග්රහි අත"</string> + <string name="spoken_emoji_270F" msgid="6108251586067318718">"පැන්සල"</string> + <string name="spoken_emoji_2712" msgid="6320544535087710482">"කළු තුඩ"</string> + <string name="spoken_emoji_2714" msgid="1968242800064001654">"විශාල හරි x"</string> + <string name="spoken_emoji_2716" msgid="511941294762977228">"විශාල වැඩි කිරීමේ x"</string> + <string name="spoken_emoji_2728" msgid="5650330815808691881">"දිලිසෙනවා"</string> + <string name="spoken_emoji_2733" msgid="8915809595141157327">"ගරාදිය අටක් ඇති තරු ලකුණ"</string> + <string name="spoken_emoji_2734" msgid="4846583547980754332">"ලක්ෂ අටක් ඇති කළු තුරු"</string> + <string name="spoken_emoji_2744" msgid="4350636647760161042">"හිම මල්"</string> + <string name="spoken_emoji_2747" msgid="3718282973916474455">"දිලිසෙනවා"</string> + <string name="spoken_emoji_274C" msgid="2752145886733295314">"හරස් ලකුණ"</string> + <string name="spoken_emoji_274E" msgid="4262918689871098338">"ඍණ සමචතුරස්රගත හරස් ලකුණ"</string> + <string name="spoken_emoji_2753" msgid="6935897159942119808">"කළු ප්රශ්නාර්ථ ලකුණු සැරසිල්ල"</string> + <string name="spoken_emoji_2754" msgid="7277504915105532954">"සුදු ප්රශ්නාර්ථ ලකුණු සැරසිල්ල"</string> + <string name="spoken_emoji_2755" msgid="6853076969826960210">"සුදු විශාල අසිර්වද ලකුණු සැරසිල්ල"</string> + <string name="spoken_emoji_2757" msgid="3707907828776912174">"විශාල අසිර්වද ලකුණු සංකේතය"</string> + <string name="spoken_emoji_2764" msgid="4214257843609432167">"අධික කළු හෘදය"</string> + <string name="spoken_emoji_2795" msgid="6563954833786162168">"විශාල ධන සංඥාව"</string> + <string name="spoken_emoji_2796" msgid="5990926508250772777">"විශාල ඍණ සංඥාව"</string> + <string name="spoken_emoji_2797" msgid="24694184172879174">"විශාල බෙදීමේ සංඥාව"</string> + <string name="spoken_emoji_27A1" msgid="3513434778263100580">"කළු දකුණට ඇති ඊතලය"</string> + <string name="spoken_emoji_27B0" msgid="203395646864662198">"වක්ර ලූපය"</string> + <string name="spoken_emoji_27BF" msgid="4940514642375640510">"ද්විත්ව වක්ර ලූපය"</string> + <string name="spoken_emoji_2934" msgid="9062130477982973457">"ඊතලය දකුණට ඉලක්කගතව ඉන් පසු ඉහළට වක්රවේ"</string> + <string name="spoken_emoji_2935" msgid="6198710960720232074">"ඊතලය දකුණට ඉලක්කගතව ඉන් පසු පහළට වක්රවේ"</string> + <string name="spoken_emoji_2B05" msgid="4813405635410707690">"වමට කළු ඊතලය"</string> + <string name="spoken_emoji_2B06" msgid="1223172079106250748">"ඉහළට කළු ඊතලය"</string> + <string name="spoken_emoji_2B07" msgid="1599124424746596150">"පහළට ඇති කළු ඊතලය"</string> + <string name="spoken_emoji_2B1B" msgid="3461247311988501626">"කළු විශාල කොටුව"</string> + <string name="spoken_emoji_2B1C" msgid="5793146430145248915">"සුදු විශාල කොටුව"</string> + <string name="spoken_emoji_2B50" msgid="3850845519526950524">"සුදු මධ්යම තුරු"</string> + <string name="spoken_emoji_2B55" msgid="9137882158811541824">"බර විශාල රවුම"</string> + <string name="spoken_emoji_3030" msgid="4609172241893565639">"රැලි ඉර"</string> + <string name="spoken_emoji_303D" msgid="2545833934975907505">"කොටස් ප්රත්යාවර්තන ලකුණ"</string> + <string name="spoken_emoji_3297" msgid="928912923628973800">"කව කළ භාවලේඛය සතුට පළ කිරීම"</string> + <string name="spoken_emoji_3299" msgid="3930347573693668426">"කව කළ භාවලේඛය රහස"</string> + <string name="spoken_emoji_1F004" msgid="1705216181345894600">"මහ්ජෝන් ටයිල් රතු මකරා"</string> + <string name="spoken_emoji_1F0CF" msgid="7601493592085987866">"කළු කවටයා කාඩ් ක්රීඩා කරමින්"</string> + <string name="spoken_emoji_1F170" msgid="3817698686602826773">"ලේ වර්ගය A"</string> + <string name="spoken_emoji_1F171" msgid="3684218589626650242">"ලේ වර්ගය B"</string> + <string name="spoken_emoji_1F17E" msgid="2978809190364779029">"ලේ වර්ගය O"</string> + <string name="spoken_emoji_1F17F" msgid="463634348668462040">"වාහන නැවැත් වීමේ තැන"</string> + <string name="spoken_emoji_1F18E" msgid="1650705325221496768">"ලේ වර්ගය AB"</string> + <string name="spoken_emoji_1F191" msgid="5386969264431429221">"සමචතුරස්රගත CL"</string> + <string name="spoken_emoji_1F192" msgid="8324226436829162496">"සමචතුරස්රගත සිසිල්"</string> + <string name="spoken_emoji_1F193" msgid="4731758603321515364">"සමචතුරස්රගත නිදහස්"</string> + <string name="spoken_emoji_1F194" msgid="4903128609556175887">"සමචතුරස්රගත ID"</string> + <string name="spoken_emoji_1F195" msgid="1433142500411060924">"සමචතුරස්රගත අලුත්"</string> + <string name="spoken_emoji_1F196" msgid="8825160701159634202">"සමචතුරස්රගත N G"</string> + <string name="spoken_emoji_1F197" msgid="7841079241554176535">"සමචතුරස්රගත හරි"</string> + <string name="spoken_emoji_1F198" msgid="7020298909426960622">"සමචතුරස්රගත SOS"</string> + <string name="spoken_emoji_1F199" msgid="5971252667136235630">"කෑගැසීමේ ලකුණ සමඟ සමචතුරස්රගත ඉහළ"</string> + <string name="spoken_emoji_1F19A" msgid="4557270135899843959">"සමචතුරස්රගත vs"</string> + <string name="spoken_emoji_1F201" msgid="7000490044681139002">"මෙතැන සමචතුරස්රගත කටකන"</string> + <string name="spoken_emoji_1F202" msgid="8560906958695043947">"සමචතුරස්රගත කටකන සේවාව"</string> + <string name="spoken_emoji_1F21A" msgid="1496435317324514033">"සමචතුරස්රගත භාවලේඛය අය කිරීම් වලින්-නිදහස්"</string> + <string name="spoken_emoji_1F22F" msgid="609797148862445402">"සමචතුරස්රගත භාවලේඛය වෙන් කළ-ආසනය"</string> + <string name="spoken_emoji_1F232" msgid="8125716331632035820">"සමචතුරස්රගත භාවලේඛය තහනම් කරනවා"</string> + <string name="spoken_emoji_1F233" msgid="8749401090457355028">"සමචතුරස්රගත භාවලේඛය පුරප්පාඩුව"</string> + <string name="spoken_emoji_1F234" msgid="3546951604285970768">"සමචතුරස්රගත භාවලේඛය පිළිගැනීම"</string> + <string name="spoken_emoji_1F235" msgid="5320186982841793711">"සමචතුරස්රගත භාවලේඛය සම්පූර්ණ පදිංචි කාලය"</string> + <string name="spoken_emoji_1F236" msgid="879755752069393034">"සමචතුරස්රගත භාවලේඛය ගෙවන ලද"</string> + <string name="spoken_emoji_1F237" msgid="6741807001205851437">"සමචතුරස්රගත භාවලේඛය මාස්පතා"</string> + <string name="spoken_emoji_1F238" msgid="5504414186438196912">"සමචතුරස්රගත භාවලේඛය ඉල්ලුම් පත්රය"</string> + <string name="spoken_emoji_1F239" msgid="1634067311597618959">"සමචතුරස්රගත භාවලේඛය වට්ටම"</string> + <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"සමචතුරස්රගත භාවලේඛය තුළ ව්යාපාර"</string> + <string name="spoken_emoji_1F250" msgid="6586943922806727907">"කව කළ භාවලේඛය වාසිය"</string> + <string name="spoken_emoji_1F251" msgid="9099032855993346948">"කව කළ භාවලේඛය පිළිගන්නවා"</string> + <string name="spoken_emoji_1F300" msgid="4720098285295840383">"සුළි සුළඟ"</string> + <string name="spoken_emoji_1F301" msgid="3601962477653752974">"මීදුමෙන් වැසුණු"</string> + <string name="spoken_emoji_1F302" msgid="3404357123421753593">"වසන ලද කුඩය"</string> + <string name="spoken_emoji_1F303" msgid="3899301321538188206">"තරු සමඟ රාත්රිය"</string> + <string name="spoken_emoji_1F304" msgid="2767148930689050040">"කදු මුදුන් වලට උඩින් හිරු උදාව"</string> + <string name="spoken_emoji_1F305" msgid="9165812924292061196">"හිරු උදාව"</string> + <string name="spoken_emoji_1F306" msgid="5889294736109193104">"සන්ධ්යාවේ නගර භූ දර්ශනය"</string> + <string name="spoken_emoji_1F307" msgid="2714290867291163713">"ගොඩනැගිලි වලට උඩින් හිරු උදාව"</string> + <string name="spoken_emoji_1F308" msgid="688704703985173377">"දේදුන්න"</string> + <string name="spoken_emoji_1F309" msgid="6217981957992313528">"රාත්රියට පාලම උඩ"</string> + <string name="spoken_emoji_1F30A" msgid="4329309263152110893">"ජල රැල්ල"</string> + <string name="spoken_emoji_1F30B" msgid="5729430693700923112">"යමහල්"</string> + <string name="spoken_emoji_1F30C" msgid="2961230863217543082">"ක්ෂීර පථය"</string> + <string name="spoken_emoji_1F30D" msgid="1113905673331547953">"පෘථිවිය ගෝලය යුරෝපය-අප්රිකාව"</string> + <string name="spoken_emoji_1F30E" msgid="5278512600749223671">"පෘථිවිය ගෝලය අමෙරිකාව"</string> + <string name="spoken_emoji_1F30F" msgid="5718144880978707493">"පෘථිවිය ගෝලය ආසියාව-ඕස්ටේරලියාව"</string> + <string name="spoken_emoji_1F310" msgid="2959618582975247601">"මධ්යහ්න රේඛාව සමඟ පෘථිවිය"</string> + <string name="spoken_emoji_1F311" msgid="623906380914895542">"නව සඳ සංකේතය"</string> + <string name="spoken_emoji_1F312" msgid="4458575672576125401">"පුරපක්ෂයේ අඬ සඳ සංකේතය"</string> + <string name="spoken_emoji_1F313" msgid="7599181787989497294">"මුල් කාර්තුවේ සඳ සංකේතය"</string> + <string name="spoken_emoji_1F314" msgid="4898293184964365413">"පුරපක්ෂයේ කුදු සඳ සංකේතය"</string> + <string name="spoken_emoji_1F315" msgid="3218117051779496309">"පූර්ණ සඳ සංකේතය"</string> + <string name="spoken_emoji_1F316" msgid="2061317145777689569">"අවපක්ෂයේ කුදු සඳ සංකේතය"</string> + <string name="spoken_emoji_1F317" msgid="2721090687319539049">"අවසාන කාර්තුවේ සඳ සංකේතය"</string> + <string name="spoken_emoji_1F318" msgid="3814091755648887570">"අවපක්ෂයේ අඬ සඳ සංකේතය"</string> + <string name="spoken_emoji_1F319" msgid="4074299824890459465">"අඬ සඳ"</string> + <string name="spoken_emoji_1F31A" msgid="3092285278116977103">"නව සඳ සමඟ මුහුණ"</string> + <string name="spoken_emoji_1F31B" msgid="2658562138386927881">"මුල් කාර්තුවේ සඳ සමඟ මුහුණ"</string> + <string name="spoken_emoji_1F31C" msgid="7914768515547867384">"අවසාන කාර්තුවේ සඳ සමඟ මුහුණ"</string> + <string name="spoken_emoji_1F31D" msgid="1925730459848297182">"පූර්ණ සඳ සමඟ මුහුණ"</string> + <string name="spoken_emoji_1F31E" msgid="8022112382524084418">"ඉරු සමඟ මුහුණ"</string> + <string name="spoken_emoji_1F31F" msgid="1051661214137766369">"ජ්වලිත තුරු"</string> + <string name="spoken_emoji_1F320" msgid="5450591979068216115">"උල්කාපාත තුරු"</string> + <string name="spoken_emoji_1F330" msgid="3115760035618051575">"චෙස්ට්නට්"</string> + <string name="spoken_emoji_1F331" msgid="5658888205290008691">"බීජ පැළය"</string> + <string name="spoken_emoji_1F332" msgid="2935650450421165938">"සදාහරිත ගස"</string> + <string name="spoken_emoji_1F333" msgid="5898847427062482675">"පතනශිල ගස"</string> + <string name="spoken_emoji_1F334" msgid="6183375224678417894">"තාල ගස"</string> + <string name="spoken_emoji_1F335" msgid="5352418412103584941">"පතොක්"</string> + <string name="spoken_emoji_1F337" msgid="3839107352363566289">"ටියුලිප්"</string> + <string name="spoken_emoji_1F338" msgid="6389970364260468490">"චෙරි මල"</string> + <string name="spoken_emoji_1F339" msgid="9128891447985256151">"රෝස"</string> + <string name="spoken_emoji_1F33A" msgid="2025828400095233078">"වද මල"</string> + <string name="spoken_emoji_1F33B" msgid="8163868254348448552">"සූරියකාන්ත"</string> + <string name="spoken_emoji_1F33C" msgid="6850371206262335812">"මල"</string> + <string name="spoken_emoji_1F33D" msgid="9033484052864509610">"බඩ ඉරිඟු කරල"</string> + <string name="spoken_emoji_1F33E" msgid="2540173396638444120">"වී කරල"</string> + <string name="spoken_emoji_1F33F" msgid="4384823344364908558">"ඖෂධ"</string> + <string name="spoken_emoji_1F340" msgid="3494255459156499305">"කොළ හතරේ කොළය"</string> + <string name="spoken_emoji_1F341" msgid="4581959481754990158">"මේපල් කොළය"</string> + <string name="spoken_emoji_1F342" msgid="3119068426871821222">"වැටුණු කොළය"</string> + <string name="spoken_emoji_1F343" msgid="2663317495805149004">"සුළගේ කොළය වැනීම"</string> + <string name="spoken_emoji_1F344" msgid="2738517881678722159">"හතු"</string> + <string name="spoken_emoji_1F345" msgid="6135288642349085554">"තක්කාලි"</string> + <string name="spoken_emoji_1F346" msgid="2075395322785406367">"වම්බටු"</string> + <string name="spoken_emoji_1F347" msgid="7753453754963890571">"මිදි"</string> + <string name="spoken_emoji_1F348" msgid="1247076837284932788">"කොමඩු"</string> + <string name="spoken_emoji_1F349" msgid="5563054555180611086">"දිය කොමඩු"</string> + <string name="spoken_emoji_1F34A" msgid="4688661208570160524">"ජවනාරන්"</string> + <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"දෙහි"</string> + <string name="spoken_emoji_1F34C" msgid="3712827239858159474">"කෙසෙල්"</string> + <string name="spoken_emoji_1F34D" msgid="7712521967162622936">"අන්නාසි"</string> + <string name="spoken_emoji_1F34E" msgid="1859466882598614228">"රතු ඇපල්"</string> + <string name="spoken_emoji_1F34F" msgid="8251711032295005633">"කොළ ඇපල්"</string> + <string name="spoken_emoji_1F350" msgid="625802980159197701">"පෙයර්"</string> + <string name="spoken_emoji_1F351" msgid="4269460120610911895">"පීච්"</string> + <string name="spoken_emoji_1F352" msgid="965600953360182635">"චෙරි"</string> + <string name="spoken_emoji_1F353" msgid="7068623879906925592">"ස්ට්රෝබෙරි"</string> + <string name="spoken_emoji_1F354" msgid="45162285238888494">"හැම්බර්ගර්"</string> + <string name="spoken_emoji_1F355" msgid="9157587635526433283">"පීසා කැල්ල"</string> + <string name="spoken_emoji_1F356" msgid="2667196119149852244">"මස් කටු"</string> + <string name="spoken_emoji_1F357" msgid="8022817413851052256">"කුකුළු කකුල"</string> + <string name="spoken_emoji_1F358" msgid="3042693264748036476">"හාල් විස්කෝතු"</string> + <string name="spoken_emoji_1F359" msgid="3988148661730121958">"බත් බෝල"</string> + <string name="spoken_emoji_1F35A" msgid="1763824172198327268">"උයන ලද හාල්"</string> + <string name="spoken_emoji_1F35B" msgid="62530406745717835">"ව්යංජනය සහ බත්"</string> + <string name="spoken_emoji_1F35C" msgid="7537756539198945509">"හුමාලය භාජනය"</string> + <string name="spoken_emoji_1F35D" msgid="8173523083861875196">"ස්පැගටි"</string> + <string name="spoken_emoji_1F35E" msgid="2935428307894662571">"පාන්"</string> + <string name="spoken_emoji_1F35F" msgid="4840297386785728443">"ෆ්රේන්ච් ෆ්රියිස්"</string> + <string name="spoken_emoji_1F360" msgid="4094659855684686801">"කර කරන ලද රසවත් අර්තාපල්"</string> + <string name="spoken_emoji_1F361" msgid="6475486395784096109">"ඩෑන්ගෝ"</string> + <string name="spoken_emoji_1F362" msgid="5004692577661076275">"ඔඩින්"</string> + <string name="spoken_emoji_1F363" msgid="1606603765717743806">"සුෂි"</string> + <string name="spoken_emoji_1F364" msgid="6550457766169570811">"බදින ලද කූනිස්සා"</string> + <string name="spoken_emoji_1F365" msgid="4963815540953316307">"මාළු කේක් සමඟ දිය සුළි මෝස්තරය"</string> + <string name="spoken_emoji_1F366" msgid="7862401745277049404">"මෘදු අයිස් ක්රීම්"</string> + <string name="spoken_emoji_1F367" msgid="7447972978281980414">"සහින ලද අයිස්"</string> + <string name="spoken_emoji_1F368" msgid="7790003146142724913">"අයිස් ක්රීම්"</string> + <string name="spoken_emoji_1F369" msgid="7383712944084857350">"ඩෝනට්"</string> + <string name="spoken_emoji_1F36A" msgid="2726271795913042295">"කුකීය"</string> + <string name="spoken_emoji_1F36B" msgid="6342163604299875931">"චොකලට් බාරය"</string> + <string name="spoken_emoji_1F36C" msgid="2168934753998218790">"පැණිරස"</string> + <string name="spoken_emoji_1F36D" msgid="3671507903799975792">"ලොලිපොප්"</string> + <string name="spoken_emoji_1F36E" msgid="4630541402785165902">"කස්ටට්"</string> + <string name="spoken_emoji_1F36F" msgid="5577915387425169439">"මී පැණි මුට්ටිය"</string> + <string name="spoken_emoji_1F370" msgid="7243244547866114951">"ෂොට් කේක්"</string> + <string name="spoken_emoji_1F371" msgid="6731527040552916358">"බෙන්ටෝ පෙට්ටිය"</string> + <string name="spoken_emoji_1F372" msgid="1635035323832181733">"කෑම හැළිය"</string> + <string name="spoken_emoji_1F373" msgid="7799289534289221045">"කෑම පිසීම"</string> + <string name="spoken_emoji_1F374" msgid="5973820884987069131">"ගෑරුප්පුව සහ පිහිය"</string> + <string name="spoken_emoji_1F375" msgid="1074832087699617700">"හැඬලය නැතිව තේ කෝප්පය"</string> + <string name="spoken_emoji_1F376" msgid="6499274685584852067">"සකේ බෝතලය සහ කෝප්පය"</string> + <string name="spoken_emoji_1F377" msgid="1762398562314172075">"වයින් වීදුරුව"</string> + <string name="spoken_emoji_1F378" msgid="5528234560590117516">"කොක්ටේල් වීදුරුව"</string> + <string name="spoken_emoji_1F379" msgid="790581290787943325">"නිවර්තන බීම"</string> + <string name="spoken_emoji_1F37A" msgid="391966822450619516">"බීර ජෝගුව"</string> + <string name="spoken_emoji_1F37B" msgid="9015043286465670662">"බීර ජෝගු ගැට්ට වීම"</string> + <string name="spoken_emoji_1F37C" msgid="2532113819464508894">"බිළිඳාගේ බෝතලය"</string> + <string name="spoken_emoji_1F380" msgid="3487363857092458827">"රිබනය"</string> + <string name="spoken_emoji_1F381" msgid="614180683680675444">"කවර කරන ලද තෑග්ග"</string> + <string name="spoken_emoji_1F382" msgid="4720497171946687501">"උපන් දින කේක්"</string> + <string name="spoken_emoji_1F383" msgid="3536505941578757623">"Jack-o-ලන්තෑරුම"</string> + <string name="spoken_emoji_1F384" msgid="1797870204479059004">"නත්තල් ගස"</string> + <string name="spoken_emoji_1F385" msgid="1754174063483626367">"නත්තල් සීයා"</string> + <string name="spoken_emoji_1F386" msgid="2130445450758114746">"ගිනිකෙළි"</string> + <string name="spoken_emoji_1F387" msgid="3403182563117999933">"ගිනිකෙළි දියමන්තිය"</string> + <string name="spoken_emoji_1F388" msgid="2903047203723251804">"බැලුන"</string> + <string name="spoken_emoji_1F389" msgid="2352830665883549388">"සාද ලොකු බොත්තම"</string> + <string name="spoken_emoji_1F38A" msgid="6280428984773641322">"සරුවපිත්තල බෝල"</string> + <string name="spoken_emoji_1F38B" msgid="4902225837479015489">"ටනබාටා ගස"</string> + <string name="spoken_emoji_1F38C" msgid="7623268024030989365">"කතිර කළ කොඩි"</string> + <string name="spoken_emoji_1F38D" msgid="8237542796124408528">"සරල සැරසිලි"</string> + <string name="spoken_emoji_1F38E" msgid="5373397476238212371">"ජපන් බෝනික්කා"</string> + <string name="spoken_emoji_1F38F" msgid="8754091376829552844">"කාපියා ධජය"</string> + <string name="spoken_emoji_1F390" msgid="8903307048095431374">"සුළං ඝණ්ටානාදය"</string> + <string name="spoken_emoji_1F391" msgid="2134952069191911841">"සඳ බැලීමේ උත්සවය"</string> + <string name="spoken_emoji_1F392" msgid="6380405493914304737">"පාසල් බෑගය"</string> + <string name="spoken_emoji_1F393" msgid="6947890064872470996">"උපාධි තොප්පිය"</string> + <string name="spoken_emoji_1F3A0" msgid="3572095190082826057">"කැරෝසල් අශ්වයා"</string> + <string name="spoken_emoji_1F3A1" msgid="4300565511681058798">"කතුරු ඔංචිල්ලාව"</string> + <string name="spoken_emoji_1F3A2" msgid="15486093912232140">"රෝලර් යාත්රාව"</string> + <string name="spoken_emoji_1F3A3" msgid="921739319504942924">"බිලීපිත්ත සහ මාඑ"</string> + <string name="spoken_emoji_1F3A4" msgid="7497596355346856950">"මයික්රෝෆෝනය"</string> + <string name="spoken_emoji_1F3A5" msgid="4290497821228183002">"චිත්රපට කැමරාව"</string> + <string name="spoken_emoji_1F3A6" msgid="26019057872319055">"සිනමාව"</string> + <string name="spoken_emoji_1F3A7" msgid="837856608794094105">"හෙඩ්ෆෝන්"</string> + <string name="spoken_emoji_1F3A8" msgid="2332260356509244587">"චිත්ර ශිල්පියාගේ වර්ණ එලකය"</string> + <string name="spoken_emoji_1F3A9" msgid="9045869366525115256">"උස් තොප්පිය"</string> + <string name="spoken_emoji_1F3AA" msgid="5728760354237132">"සර්කස් කූඩාරම"</string> + <string name="spoken_emoji_1F3AB" msgid="1657997517193216284">"ප්රවේශපත්ර"</string> + <string name="spoken_emoji_1F3AC" msgid="4317366554314492152">"ටකපෝරුව"</string> + <string name="spoken_emoji_1F3AD" msgid="607157286336130470">"අභිවාහ්ය කලා"</string> + <string name="spoken_emoji_1F3AE" msgid="2902308174671548150">"වීඩියෝ ක්රීඩා"</string> + <string name="spoken_emoji_1F3AF" msgid="5420539221790296407">"ඉලක්කයට වැදීම"</string> + <string name="spoken_emoji_1F3B0" msgid="7440244806527891956">"තව් යන්ත්රය"</string> + <string name="spoken_emoji_1F3B1" msgid="545544382391379234">"බිලියර්ඩ්"</string> + <string name="spoken_emoji_1F3B2" msgid="8302262034774787493">"සූදු දාදු කැටය"</string> + <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"බොලින් ක්රීඩාව"</string> + <string name="spoken_emoji_1F3B4" msgid="4723852033266071564">"මල් ක්රීඩා කරන කාඩ්පත්"</string> + <string name="spoken_emoji_1F3B5" msgid="1998470239850548554">"සංගීත ස්වරය"</string> + <string name="spoken_emoji_1F3B6" msgid="3827730457113941705">"බහු සංගීත ස්වර"</string> + <string name="spoken_emoji_1F3B7" msgid="5503403099445042180">"සැක්සෆෝනය"</string> + <string name="spoken_emoji_1F3B8" msgid="3985658156795011430">"ගිටාරය"</string> + <string name="spoken_emoji_1F3B9" msgid="5596295757967881451">"සංගීතය යතුරු පුවරුව"</string> + <string name="spoken_emoji_1F3BA" msgid="4284064120340683558">"ට්රම්පටය"</string> + <string name="spoken_emoji_1F3BB" msgid="2856598510069988745">"වයලීනය"</string> + <string name="spoken_emoji_1F3BC" msgid="1608424748821446230">"සංගීත විභ්නය"</string> + <string name="spoken_emoji_1F3BD" msgid="5490786111375627777">"දුවන කමිසය සමඟ සැෂ්"</string> + <string name="spoken_emoji_1F3BE" msgid="1851613105691627931">"ටෙනිස් පිත්ත සහ බෝලය"</string> + <string name="spoken_emoji_1F3BF" msgid="6862405997423247921">"ස්කි සහ ස්කි සපත්තුව"</string> + <string name="spoken_emoji_1F3C0" msgid="7421420756115104085">"පැසිපන්දු සහ වළල්ල"</string> + <string name="spoken_emoji_1F3C1" msgid="6926537251677319922">"අල්ලි වැටුණු කොඩිය"</string> + <string name="spoken_emoji_1F3C2" msgid="5708596929237987082">"හිම මත ලිස්සා යන්නා"</string> + <string name="spoken_emoji_1F3C3" msgid="5850982999510115824">"ධාවකයා"</string> + <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"සර්ෆ"</string> + <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"කුසලාන"</string> + <string name="spoken_emoji_1F3C7" msgid="8172206200368370116">"අශ්වයින් තරඟයට දිවීම"</string> + <string name="spoken_emoji_1F3C8" msgid="5619171461277597709">"ඇමරිකානු පාපන්දු"</string> + <string name="spoken_emoji_1F3C9" msgid="6371294008765871043">"රග්බි පාපන්දු"</string> + <string name="spoken_emoji_1F3CA" msgid="130977831787806932">"පීනන්නා"</string> + <string name="spoken_emoji_1F3E0" msgid="6277213201655811842">"නිවාස ගොඩනැඟිල්ල"</string> + <string name="spoken_emoji_1F3E1" msgid="233476176077538885">"නිවාස සමඟ ගෙවත්ත"</string> + <string name="spoken_emoji_1F3E2" msgid="919736380093964570">"කාර්යාලය ගොඩනැඟිල්ල"</string> + <string name="spoken_emoji_1F3E3" msgid="6177606081825094184">"ජපන් තැපැල් කාර්යාලය"</string> + <string name="spoken_emoji_1F3E4" msgid="717377871070970293">"යුරෝපීය තැපැල් කාර්යාලය"</string> + <string name="spoken_emoji_1F3E5" msgid="1350532500431776780">"රෝහල"</string> + <string name="spoken_emoji_1F3E6" msgid="342132788513806214">"බැංකුව"</string> + <string name="spoken_emoji_1F3E7" msgid="6322352038284944265">"ස්වයංක්රියකෘත ටෙලර් යන්ත්රය"</string> + <string name="spoken_emoji_1F3E8" msgid="5864918444350599907">"හෝටලය"</string> + <string name="spoken_emoji_1F3E9" msgid="7830416185375326938">"ආදර හෝටලය"</string> + <string name="spoken_emoji_1F3EA" msgid="5081084413084360479">"පහසු වෙළඳසල"</string> + <string name="spoken_emoji_1F3EB" msgid="7010966528205150525">"පාසල"</string> + <string name="spoken_emoji_1F3EC" msgid="4845978861878295154">"දෙපාර්තමේන්තුව වෙළඳසල"</string> + <string name="spoken_emoji_1F3ED" msgid="3980316226665215370">"කර්මාන්තශාලාව"</string> + <string name="spoken_emoji_1F3EE" msgid="1253964276770550248">"ලැසකායා ලන්තෑරුම"</string> + <string name="spoken_emoji_1F3EF" msgid="1128975573507389883">"ජපන් මාළිගාව"</string> + <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"යුරෝපීය මාළිගාව"</string> + <string name="spoken_emoji_1F400" msgid="2063034795679578294">"මීයා"</string> + <string name="spoken_emoji_1F401" msgid="6736421616217369594">"මීයා"</string> + <string name="spoken_emoji_1F402" msgid="7276670995895485604">"ඔක්ස්"</string> + <string name="spoken_emoji_1F403" msgid="8045709541897118928">"මී හරකා"</string> + <string name="spoken_emoji_1F404" msgid="5240777285676662335">"එළදෙන"</string> + <string name="spoken_emoji_1F406" msgid="5163461930159540018">"දිවියා"</string> + <string name="spoken_emoji_1F407" msgid="6905370221172708160">"හාවා"</string> + <string name="spoken_emoji_1F408" msgid="1362164550508207284">"පූසා"</string> + <string name="spoken_emoji_1F409" msgid="8476130983168866013">"මකරා"</string> + <string name="spoken_emoji_1F40A" msgid="1149626786411545043">"කිඹුලා"</string> + <string name="spoken_emoji_1F40B" msgid="5199104921208397643">"තල්මසා"</string> + <string name="spoken_emoji_1F40C" msgid="2704006052881702675">"ගොළුබෙල්ලා"</string> + <string name="spoken_emoji_1F40D" msgid="8648186663643157522">"සර්පයා"</string> + <string name="spoken_emoji_1F40E" msgid="7219137467573327268">"අශ්වයා"</string> + <string name="spoken_emoji_1F40F" msgid="7834336676729040395">"බැටළුවා"</string> + <string name="spoken_emoji_1F410" msgid="8686765722255775031">"එළුවා"</string> + <string name="spoken_emoji_1F411" msgid="3585715397876383525">"බැටළුවා"</string> + <string name="spoken_emoji_1F412" msgid="4924794582980077838">"වඳුරා"</string> + <string name="spoken_emoji_1F413" msgid="1460475310405677377">"කුකුළා"</string> + <string name="spoken_emoji_1F414" msgid="5857296282631892219">"කුකුල් පැටියා"</string> + <string name="spoken_emoji_1F415" msgid="5920041074892949527">"බල්ලා"</string> + <string name="spoken_emoji_1F416" msgid="4362403392912540286">"ඌරා"</string> + <string name="spoken_emoji_1F417" msgid="6836978415840795128">"ඌරා"</string> + <string name="spoken_emoji_1F418" msgid="7926161463897783691">"අලියා"</string> + <string name="spoken_emoji_1F419" msgid="1055233959755784186">"බූවල්ලා"</string> + <string name="spoken_emoji_1F41A" msgid="5195666556511558060">"සර්පිල සිප්පිය"</string> + <string name="spoken_emoji_1F41B" msgid="7652480167465557832">"මකුණා"</string> + <string name="spoken_emoji_1F41C" msgid="1123461148697574239">"කුහුඹියා"</string> + <string name="spoken_emoji_1F41D" msgid="718579308764058851">"මී මැස්සා"</string> + <string name="spoken_emoji_1F41E" msgid="6766305509608115467">"ගැහැණු කුරුමිණියා"</string> + <string name="spoken_emoji_1F41F" msgid="1207261298343160838">"මාළුවා"</string> + <string name="spoken_emoji_1F420" msgid="1041145003133609221">"නිවර්තන මාළුවා"</string> + <string name="spoken_emoji_1F421" msgid="1748378324417438751">"බ්ලොව්ෆිෂ්"</string> + <string name="spoken_emoji_1F422" msgid="4106724877523329148">"කැස්බෑවා"</string> + <string name="spoken_emoji_1F423" msgid="4077407945958691907">"කුකුළු පැටවා බිහිවන"</string> + <string name="spoken_emoji_1F424" msgid="6911326019270172283">"බිළිදු කුකුළු පැටවා"</string> + <string name="spoken_emoji_1F425" msgid="5466514196557885577">"ඉදිරියට-මුහුණ දමා සිටින බිළිදු කුකුළු පැටවා"</string> + <string name="spoken_emoji_1F426" msgid="2163979138772892755">"කුරුල්ලා"</string> + <string name="spoken_emoji_1F427" msgid="3585670324511212961">"පෙන්ගුවින්"</string> + <string name="spoken_emoji_1F428" msgid="7955440808647898579">"කොවාලා"</string> + <string name="spoken_emoji_1F429" msgid="5028269352809819035">"පූඩ්ල්"</string> + <string name="spoken_emoji_1F42A" msgid="4681926706404032484">"මොල්ලික් ඇති ඔටුවා"</string> + <string name="spoken_emoji_1F42B" msgid="2725166074981558322">"මොල්ලි දෙකක් ඇති ඔටුවා"</string> + <string name="spoken_emoji_1F42C" msgid="6764791873413727085">"ඩොල්ෆින්"</string> + <string name="spoken_emoji_1F42D" msgid="1033643138546864251">"ඩොල්ෆින් මුහුණ"</string> + <string name="spoken_emoji_1F42E" msgid="8099223337120508820">"ගව මුහුණ"</string> + <string name="spoken_emoji_1F42F" msgid="2104743989330781572">"කොටි මුහුණ"</string> + <string name="spoken_emoji_1F430" msgid="525492897063150160">"හා මුහුණ"</string> + <string name="spoken_emoji_1F431" msgid="6051358666235016851">"පූස් මුහුණ"</string> + <string name="spoken_emoji_1F432" msgid="7698001871193018305">"මකර මුහුණ"</string> + <string name="spoken_emoji_1F433" msgid="3762356053512899326">"දිය විදින තල්මසා"</string> + <string name="spoken_emoji_1F434" msgid="3619943222159943226">"අශ්ව මුහුණ"</string> + <string name="spoken_emoji_1F435" msgid="59199202683252958">"වඳුරු මුහුණ"</string> + <string name="spoken_emoji_1F436" msgid="340544719369009828">"බලු මුහුණ"</string> + <string name="spoken_emoji_1F437" msgid="1219818379784982585">"ඌරා මුහුණ"</string> + <string name="spoken_emoji_1F438" msgid="9128124743321008210">"ගෙබි මුහුණ"</string> + <string name="spoken_emoji_1F439" msgid="1424161319554642266">"හම්ස්ටර් මුහුණ"</string> + <string name="spoken_emoji_1F43A" msgid="6727645488430385584">"වෘක මුහුණ"</string> + <string name="spoken_emoji_1F43B" msgid="5397170068392865167">"වලස් මුහුණ"</string> + <string name="spoken_emoji_1F43C" msgid="2715995734367032431">"පැන්ඩාගේ මුහුණ"</string> + <string name="spoken_emoji_1F43D" msgid="6005480717951776597">"ඌරා නහය"</string> + <string name="spoken_emoji_1F43E" msgid="8917626103219080547">"අඩි මුද්රණය"</string> + <string name="spoken_emoji_1F440" msgid="7144338258163384433">"ඇස්"</string> + <string name="spoken_emoji_1F442" msgid="1905515392292676124">"කන්"</string> + <string name="spoken_emoji_1F443" msgid="1491504447758933115">"නහය"</string> + <string name="spoken_emoji_1F444" msgid="3654613047946080332">"කට"</string> + <string name="spoken_emoji_1F445" msgid="7024905244040509204">"දිව"</string> + <string name="spoken_emoji_1F446" msgid="2150365643636471745">"පිටි අතේ ඇගිල්ල ඉහළට දිගුකර සිටින සුචිය"</string> + <string name="spoken_emoji_1F447" msgid="8794022344940891388">"පිටි අතේ ඇගිල්ල පහළට දිගුකර සිටින සුචිය"</string> + <string name="spoken_emoji_1F448" msgid="3261812959215550650">"පිටි අතේ ඇගිල්ල වමට දිගුකර සිටින සුචිය"</string> + <string name="spoken_emoji_1F449" msgid="4764447975177805991">"පිටි අතේ ඇගිල්ල දකුණට දිගුකර සිටින සුචිය"</string> + <string name="spoken_emoji_1F44A" msgid="7197417095486424841">"අත මිට මොළවා සිටින සලකුණ"</string> + <string name="spoken_emoji_1F44B" msgid="1975968945250833117">"අත වනන සලකුණ"</string> + <string name="spoken_emoji_1F44C" msgid="3185919567897876562">"හරි අත් සලකුණ"</string> + <string name="spoken_emoji_1F44D" msgid="6182553970602667815">"ඇගිල්ල ඉහළට දමන සලකුණ"</string> + <string name="spoken_emoji_1F44E" msgid="8030851867365111809">"ඇගිල්ල පහළට දමන සලකුණ"</string> + <string name="spoken_emoji_1F44F" msgid="5148753662268213389">"අත්පොළසන් දෙන අත් සලකුණ"</string> + <string name="spoken_emoji_1F450" msgid="1012021072085157054">"විවෘත අත් සලකුණ"</string> + <string name="spoken_emoji_1F451" msgid="8257466714629051320">"ඔටුන්න"</string> + <string name="spoken_emoji_1F452" msgid="4567394011149905466">"කාන්තා හිස්වැස්ම"</string> + <string name="spoken_emoji_1F453" msgid="5978410551173163010">"ඇස් කණ්නාඩි"</string> + <string name="spoken_emoji_1F454" msgid="348469036193323252">"කරපටිය"</string> + <string name="spoken_emoji_1F455" msgid="5665118831861433578">"ටී-ෂර්ටය"</string> + <string name="spoken_emoji_1F456" msgid="1890991330923356408">"ඩෙනිම් කලිසම"</string> + <string name="spoken_emoji_1F457" msgid="3904310482655702620">"ඇඳුම"</string> + <string name="spoken_emoji_1F458" msgid="5704243858031107692">"කිමෝනෝව"</string> + <string name="spoken_emoji_1F459" msgid="3553148747050035251">"බිකිනි"</string> + <string name="spoken_emoji_1F45A" msgid="1389654639484716101">"කාන්තා ඇදුම්"</string> + <string name="spoken_emoji_1F45B" msgid="1113293170254222904">"පසුම්බිය"</string> + <string name="spoken_emoji_1F45C" msgid="3410257778598006936">"අත්බෑග්ය"</string> + <string name="spoken_emoji_1F45D" msgid="812176504300064819">"පැස"</string> + <string name="spoken_emoji_1F45E" msgid="2901741399934723562">"පිරිමි සපත්තුව"</string> + <string name="spoken_emoji_1F45F" msgid="6828566359287798863">"ධාවන සපත්තුව"</string> + <string name="spoken_emoji_1F460" msgid="305863879170420855">"අඩි උස සපත්තුව"</string> + <string name="spoken_emoji_1F461" msgid="5160493217831417630">"කාන්තා සෙරෙප්පුව"</string> + <string name="spoken_emoji_1F462" msgid="1722897795554863734">"කාන්තා අඩි උස සපත්තුව"</string> + <string name="spoken_emoji_1F463" msgid="5850772903593010699">"පා සළකුණු"</string> + <string name="spoken_emoji_1F464" msgid="1228335905487734913">"කැලිසේයාව තුළ උඩුකය"</string> + <string name="spoken_emoji_1F465" msgid="4461307702499679879">"කැලිසේයාව තුළ උඩුකයන්"</string> + <string name="spoken_emoji_1F466" msgid="1938873085514108889">"කොල්ලා"</string> + <string name="spoken_emoji_1F467" msgid="8237080594860144998">"කෙල්ල"</string> + <string name="spoken_emoji_1F468" msgid="6081300722526675382">"පිරිමියා"</string> + <string name="spoken_emoji_1F469" msgid="1090140923076108158">"ගැහැනිය"</string> + <string name="spoken_emoji_1F46A" msgid="5063570981942606595">"පවුල"</string> + <string name="spoken_emoji_1F46B" msgid="6795882374287327952">"පිරිමියා සහ ගැහැනිය අත් අල්ලා ගෙන සිටි"</string> + <string name="spoken_emoji_1F46C" msgid="6844464165783964495">"පිරිමි දෙන්නෙක් අත් අල්ලා ගෙන සිටි"</string> + <string name="spoken_emoji_1F46D" msgid="2316773068014053180">"ගැහැනු දෙන්නෙක් අත් අල්ලා ගෙන සිටි"</string> + <string name="spoken_emoji_1F46E" msgid="5897625605860822401">"පොලිස් නිලධාරියා"</string> + <string name="spoken_emoji_1F46F" msgid="7716871657717641490">"ගැහැනියක් හා කන් පැළඳ සිටි"</string> + <string name="spoken_emoji_1F470" msgid="6409995400510338892">"වේල් සමඟ මනමාලිය"</string> + <string name="spoken_emoji_1F471" msgid="3058247860441670806">"තඹවන් කොණ්ඩය සමඟ පුද්ගලයා"</string> + <string name="spoken_emoji_1F472" msgid="3928854667819339142">"ගුආ පි මාඕ සමඟ පිරිමියා"</string> + <string name="spoken_emoji_1F473" msgid="5921952095808988381">"තලප්පාව සමඟ පිරිමියා"</string> + <string name="spoken_emoji_1F474" msgid="1082237499496725183">"වයසක පිරිමියා"</string> + <string name="spoken_emoji_1F475" msgid="7280323988642212761">"වයසක ගැහැනිය"</string> + <string name="spoken_emoji_1F476" msgid="4713322657821088296">"බිළිඳා"</string> + <string name="spoken_emoji_1F477" msgid="2197036131029221370">"ඉදි කිරීමේ කම්කරුවා"</string> + <string name="spoken_emoji_1F478" msgid="7245521193493488875">"කුමාරිකාව"</string> + <string name="spoken_emoji_1F479" msgid="6876475321015553972">"ජපන් රාක්ෂසයා"</string> + <string name="spoken_emoji_1F47A" msgid="3900813633102703571">"ජපන් පිශාචයා"</string> + <string name="spoken_emoji_1F47B" msgid="2608250873194079390">"භූතයා"</string> + <string name="spoken_emoji_1F47C" msgid="3838699131276537421">"බිළිදු දෙව්දුව"</string> + <string name="spoken_emoji_1F47D" msgid="2874077455888369538">"පාරභෞම පරදේශියා"</string> + <string name="spoken_emoji_1F47E" msgid="3642607168625579507">"පරදේශී රාක්ෂසයා"</string> + <string name="spoken_emoji_1F47F" msgid="441605977269926252">"Imp"</string> + <string name="spoken_emoji_1F480" msgid="3696253485164878739">"හිස්කබල"</string> + <string name="spoken_emoji_1F481" msgid="320408708521966893">"තොරතුරු මේසයේ පුද්ගලයා"</string> + <string name="spoken_emoji_1F482" msgid="3424354860245608949">"රාජ්යාරක්ෂක භටයා"</string> + <string name="spoken_emoji_1F483" msgid="3221113594843849083">"නැට්ටුවා"</string> + <string name="spoken_emoji_1F484" msgid="7348014979080444885">"තොල් සායම්"</string> + <string name="spoken_emoji_1F485" msgid="6133507975565116339">"නිය ඔපදමනවා"</string> + <string name="spoken_emoji_1F486" msgid="9085459968247394155">"මුහුණ සම්බාහනය"</string> + <string name="spoken_emoji_1F487" msgid="1479113637259592150">"කොණ්ඩා මෝස්තරය"</string> + <string name="spoken_emoji_1F488" msgid="6922559285234100252">"කරණවෑමි කණුව"</string> + <string name="spoken_emoji_1F489" msgid="8114863680950147305">"නළය"</string> + <string name="spoken_emoji_1F48A" msgid="8526843630145963032">"ගුලිය"</string> + <string name="spoken_emoji_1F48B" msgid="2538528967897640292">"හාදු ලකුණ"</string> + <string name="spoken_emoji_1F48C" msgid="1681173271652890232">"ආදර හසුන"</string> + <string name="spoken_emoji_1F48D" msgid="8259886164999042373">"රිංග් කරන්න"</string> + <string name="spoken_emoji_1F48E" msgid="8777981696011111101">"මැණික් ගල්"</string> + <string name="spoken_emoji_1F48F" msgid="741593675183677907">"සිප ගැනීම"</string> + <string name="spoken_emoji_1F490" msgid="4482549128959806736">"මල් පොකුර"</string> + <string name="spoken_emoji_1F491" msgid="2305245307882441500">"හදවත සමඟ යුවළ"</string> + <string name="spoken_emoji_1F492" msgid="3884119934804475732">"විවාහ"</string> + <string name="spoken_emoji_1F493" msgid="1208828371565525121">"තැළීණු හදවත"</string> + <string name="spoken_emoji_1F494" msgid="6198876398509338718">"කැඩුණු හදවත"</string> + <string name="spoken_emoji_1F495" msgid="9206202744967130919">"හදවත් දෙකක්"</string> + <string name="spoken_emoji_1F496" msgid="5436953041732207775">"දීප්තිමත් හදවත"</string> + <string name="spoken_emoji_1F497" msgid="7285142863951448473">"වැඩෙන හදවත"</string> + <string name="spoken_emoji_1F498" msgid="7940131245037575715">"ඊතලය සමඟ හදවත"</string> + <string name="spoken_emoji_1F499" msgid="4453235040265550009">"නිල් හදවත"</string> + <string name="spoken_emoji_1F49A" msgid="6262178648366971405">"කොළ හදවත"</string> + <string name="spoken_emoji_1F49B" msgid="8085384999750714368">"කහ හදවත"</string> + <string name="spoken_emoji_1F49C" msgid="453829540120898698">"දම් හදවත"</string> + <string name="spoken_emoji_1F49D" msgid="3460534750224161888">"පීත්ත පටිය සමඟ හදවත"</string> + <string name="spoken_emoji_1F49E" msgid="4490636226072523867">"කැරකෙන හදවත්"</string> + <string name="spoken_emoji_1F49F" msgid="2059319756421226336">"හදවත් සැරසිල්ල"</string> + <string name="spoken_emoji_1F4A0" msgid="1954850380550212038">"ඇතුළත තිත සමඟ දියමන්ති හැඩය"</string> + <string name="spoken_emoji_1F4A1" msgid="403137413540909021">"විදුලි ආලෝක බල්බය"</string> + <string name="spoken_emoji_1F4A2" msgid="2604192053295622063">"කෝප සංකේතය"</string> + <string name="spoken_emoji_1F4A3" msgid="6378351742957821735">"බෝම්බය"</string> + <string name="spoken_emoji_1F4A4" msgid="7217736258870346625">"නිඳන සංකේතය"</string> + <string name="spoken_emoji_1F4A5" msgid="5401995723541239858">"හැප්පීම සංකේතය"</string> + <string name="spoken_emoji_1F4A6" msgid="3837802182716483848">"වැගිරීමේ දහඩිය සංකේතය"</string> + <string name="spoken_emoji_1F4A7" msgid="5718438987757885141">"බිඳිත්ත"</string> + <string name="spoken_emoji_1F4A8" msgid="4472108229720006377">"ඉරි සංකේතය"</string> + <string name="spoken_emoji_1F4A9" msgid="1240958472788430032">"පයිල් ඔෆ් පූ"</string> + <string name="spoken_emoji_1F4AA" msgid="8427525538635146416">"නමන ලද ද්වීමූර්ධකය"</string> + <string name="spoken_emoji_1F4AB" msgid="5484114759939427459">"ඉස කරකැවෙන සංකේතය"</string> + <string name="spoken_emoji_1F4AC" msgid="5571196638219612682">"කථන බැලූනය"</string> + <string name="spoken_emoji_1F4AD" msgid="353174619257798652">"සිතුවිලි බැලූනය"</string> + <string name="spoken_emoji_1F4AE" msgid="1223142786927162641">"සුදු මල්"</string> + <string name="spoken_emoji_1F4AF" msgid="3526278354452138397">"ශතකයේ ලකුණු සංකේතය"</string> + <string name="spoken_emoji_1F4B0" msgid="4124102195175124156">"මුදල් බෑගය"</string> + <string name="spoken_emoji_1F4B1" msgid="8339494003418572905">"මුදල් හුවමාරුව"</string> + <string name="spoken_emoji_1F4B2" msgid="3179159430187243132">"අධික ඩොලර ලකුණ"</string> + <string name="spoken_emoji_1F4B3" msgid="5375412518221759596">"ණය පත"</string> + <string name="spoken_emoji_1F4B4" msgid="1068592463669453204">"යෙන් ලකුණ සමඟ බැංකු නෝට්ටුව"</string> + <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"ඩොලරය ලකුණ සමඟ බැංකු නෝට්ටුව"</string> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"යුරෝ ලකුණ සමඟ බැංකු නෝට්ටුව"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"පවුම් ලකුණ සමඟ බැංකු නෝට්ටුව"</string> + <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"මුදල් සමඟ පියාපත"</string> + <string name="spoken_emoji_1F4B9" msgid="647509393536679903">"යෙන් ලකුණ සහ ඉහළට නැඹුරුතාව සමඟ ප්රස්තාරය"</string> + <string name="spoken_emoji_1F4BA" msgid="1269737854891046321">"ආසනය"</string> + <string name="spoken_emoji_1F4BB" msgid="6252883563347816451">"පෞද්ගලික පරිගණකය"</string> + <string name="spoken_emoji_1F4BC" msgid="6182597732218446206">"ලිපි කොපුව"</string> + <string name="spoken_emoji_1F4BD" msgid="5820961044768829176">"කුඩා තැටිය"</string> + <string name="spoken_emoji_1F4BE" msgid="4754542485835379808">"නම්ය ඩිස්කය"</string> + <string name="spoken_emoji_1F4BF" msgid="2237481756984721795">"ප්රකාශ තැටිය"</string> + <string name="spoken_emoji_1F4C0" msgid="491582501089694461">"Dvd"</string> + <string name="spoken_emoji_1F4C1" msgid="6645461382494158111">"ගොනුවේ ෆෝල්ඩරය"</string> + <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"ගොනුව ෆෝල්ඩරය විවෘත කරන්න"</string> + <string name="spoken_emoji_1F4C3" msgid="3727274466173970142">"රැල්ල සමඟ පිටුව"</string> + <string name="spoken_emoji_1F4C4" msgid="4382570710795501612">"උඩුකුරු පිටුව"</string> + <string name="spoken_emoji_1F4C5" msgid="8693944622627762487">"දින දර්ශනය"</string> + <string name="spoken_emoji_1F4C6" msgid="8469908708708424640">"ඉරෙන දින දර්ශනය"</string> + <string name="spoken_emoji_1F4C7" msgid="2665313547987324495">"කාඩ්පත් සුචිය"</string> + <string name="spoken_emoji_1F4C8" msgid="8007686702282833600">"ඉහළට නැඹුරුතාව සමඟ ප්රස්තාරය"</string> + <string name="spoken_emoji_1F4C9" msgid="2271951411192893684">"පහළට නැඹුරුතාව සමඟ ප්රස්තාරය"</string> + <string name="spoken_emoji_1F4CA" msgid="3525692829622381444">"තීර ප්රස්ථාර"</string> + <string name="spoken_emoji_1F4CB" msgid="977639227554095521">"පසුරු පුවරුව"</string> + <string name="spoken_emoji_1F4CC" msgid="156107396088741574">"Pushpin"</string> + <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Round pushpin"</string> + <string name="spoken_emoji_1F4CE" msgid="6294288509864968290">"Paperclip"</string> + <string name="spoken_emoji_1F4CF" msgid="149679400831136810">"Straight ruler"</string> + <string name="spoken_emoji_1F4D0" msgid="8130339336619202915">"Triangular ruler"</string> + <string name="spoken_emoji_1F4D1" msgid="5852176364856284968">"Bookmark tabs"</string> + <string name="spoken_emoji_1F4D2" msgid="2276810154105920052">"ලෙජරය"</string> + <string name="spoken_emoji_1F4D3" msgid="5873386492793610808">"නෝට්බුක්"</string> + <string name="spoken_emoji_1F4D4" msgid="4754469936418776360">"Notebook සමඟ decorative cover"</string> + <string name="spoken_emoji_1F4D5" msgid="4642713351802778905">"Closed book"</string> + <string name="spoken_emoji_1F4D6" msgid="6987347918381807186">"Open book"</string> + <string name="spoken_emoji_1F4D7" msgid="7813394163241379223">"Green book"</string> + <string name="spoken_emoji_1F4D8" msgid="7189799718984979521">"Blue book"</string> + <string name="spoken_emoji_1F4D9" msgid="3874664073186440225">"Orange book"</string> + <string name="spoken_emoji_1F4DA" msgid="872212072924287762">"ග්රන්ථ"</string> + <string name="spoken_emoji_1F4DB" msgid="2015183603583392969">"Name badge"</string> + <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"අනුචලනය කරන්න"</string> + <string name="spoken_emoji_1F4DD" msgid="2494006707147586786">"Memo"</string> + <string name="spoken_emoji_1F4DE" msgid="7883008605002117671">"Telephone receiver"</string> + <string name="spoken_emoji_1F4DF" msgid="3538610110623780465">"පේජරය"</string> + <string name="spoken_emoji_1F4E0" msgid="2960778342609543077">"Fax machine"</string> + <string name="spoken_emoji_1F4E1" msgid="6269733703719242108">"Satellite කුහුඹියාenna"</string> + <string name="spoken_emoji_1F4E2" msgid="1987535386302883116">"Public address loudspeaker"</string> + <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Cheering megaphone"</string> + <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Outbox tray"</string> + <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Inbox tray"</string> + <string name="spoken_emoji_1F4E6" msgid="3399454337197561635">"පැකේජය"</string> + <string name="spoken_emoji_1F4E7" msgid="5557136988503873238">"ඊ-තැපැල් සංකේතය"</string> + <string name="spoken_emoji_1F4E8" msgid="30698793974124123">"Incoming envelope"</string> + <string name="spoken_emoji_1F4E9" msgid="5947550337678643166">"Envelope සමඟ downwards ඊතලය above"</string> + <string name="spoken_emoji_1F4EA" msgid="772614045207213751">"Closed mailbox සමඟ lowered flag"</string> + <string name="spoken_emoji_1F4EB" msgid="6491414165464146137">"Closed mailbox සමඟ raised flag"</string> + <string name="spoken_emoji_1F4EC" msgid="7369517138779988438">"Open mailbox සමඟ raised flag"</string> + <string name="spoken_emoji_1F4ED" msgid="5657520436285454241">"Open mailbox සමඟ lowered flag"</string> + <string name="spoken_emoji_1F4EE" msgid="8464138906243608614">"Postbox"</string> + <string name="spoken_emoji_1F4EF" msgid="8801427577198798226">"Postal horn"</string> + <string name="spoken_emoji_1F4F0" msgid="6330208624731662525">"Newspaper"</string> + <string name="spoken_emoji_1F4F1" msgid="3966503935581675695">"Mobile phone"</string> + <string name="spoken_emoji_1F4F2" msgid="1057540341746100087">"Mobile phone සමඟ rightwards ඊතලය at left"</string> + <string name="spoken_emoji_1F4F3" msgid="5003984447315754658">"Vibration mode"</string> + <string name="spoken_emoji_1F4F4" msgid="5549847566968306253">"Mobile phone off"</string> + <string name="spoken_emoji_1F4F5" msgid="3660199448671699238">"No mobile phones"</string> + <string name="spoken_emoji_1F4F6" msgid="2676974903233268860">"කුහුඹියාenna සමඟ bars"</string> + <string name="spoken_emoji_1F4F7" msgid="2643891943105989039">"කැමරාව"</string> + <string name="spoken_emoji_1F4F9" msgid="4475626303058218048">"Video camera"</string> + <string name="spoken_emoji_1F4FA" msgid="1079796186652960775">"රූපවාහිනිය"</string> + <string name="spoken_emoji_1F4FB" msgid="3848729587403760645">"රේඩියෝව"</string> + <string name="spoken_emoji_1F4FC" msgid="8370432508874310054">"Videocassette"</string> + <string name="spoken_emoji_1F500" msgid="2389947994502144547">"Twisted rightwards ඊතලයs"</string> + <string name="spoken_emoji_1F501" msgid="2132188352433347009">"Clockwise rightwards සහ leftwards open කවය ඊතලයs"</string> + <string name="spoken_emoji_1F502" msgid="2361976580513178391">"Clockwise rightwards සහ leftwards open කවය ඊතලයs සමඟ කව කළ one overlay"</string> + <string name="spoken_emoji_1F503" msgid="8936283551917858793">"Clockwise downwards සහ upwards open කවය ඊතලයs"</string> + <string name="spoken_emoji_1F504" msgid="708290317843535943">"කුහුඹියාiclockwise downwards සහ upwards open කවය ඊතලයs"</string> + <string name="spoken_emoji_1F505" msgid="6348909939004951860">"Low brightness සංකේතය"</string> + <string name="spoken_emoji_1F506" msgid="4449609297521280173">"High brightness සංකේතය"</string> + <string name="spoken_emoji_1F507" msgid="7136386694923708448">"Speaker සමඟ cancellation stroke"</string> + <string name="spoken_emoji_1F508" msgid="5063567689831527865">"නාදකය"</string> + <string name="spoken_emoji_1F509" msgid="3948050077992370791">"Speaker සමඟ one sound wave"</string> + <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Speaker සමඟ three sound waves"</string> + <string name="spoken_emoji_1F50B" msgid="8083470451266295876">"බැටරිය"</string> + <string name="spoken_emoji_1F50C" msgid="7793219132036431680">"Electric plug"</string> + <string name="spoken_emoji_1F50D" msgid="8140244710637926780">"Left-pointing magnifying වීදුරුව"</string> + <string name="spoken_emoji_1F50E" msgid="4751821352839693365">"Right-pointing magnifying වීදුරුව"</string> + <string name="spoken_emoji_1F50F" msgid="915079280472199605">"Lock සමඟ ink pen"</string> + <string name="spoken_emoji_1F510" msgid="7658381761691758318">"Closed lock සමඟ key"</string> + <string name="spoken_emoji_1F511" msgid="262319867774655688">"Key"</string> + <string name="spoken_emoji_1F512" msgid="5628688337255115175">"අඟුළුලන්න"</string> + <string name="spoken_emoji_1F513" msgid="8579201846619420981">"Open lock"</string> + <string name="spoken_emoji_1F514" msgid="7027268683047322521">"Bell"</string> + <string name="spoken_emoji_1F515" msgid="8903179856036069242">"Bell සමඟ cancellation stroke"</string> + <string name="spoken_emoji_1F516" msgid="108097933937925381">"Bookmark"</string> + <string name="spoken_emoji_1F517" msgid="2450846665734313397">"Link සංකේතය"</string> + <string name="spoken_emoji_1F518" msgid="7028220286841437832">"Radio button"</string> + <string name="spoken_emoji_1F519" msgid="8211189165075445687">"Back සමඟ leftwards ඊතලය above"</string> + <string name="spoken_emoji_1F51A" msgid="823966751787338892">"End සමඟ leftwards ඊතලය above"</string> + <string name="spoken_emoji_1F51B" msgid="5920570742107943382">"On සමඟ exclamation mark සමඟ left right ඊතලය above"</string> + <string name="spoken_emoji_1F51C" msgid="110609810659826676">"Soon සමඟ rightwards ඊතලය above"</string> + <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Top සමඟ upwards ඊතලය above"</string> + <string name="spoken_emoji_1F51E" msgid="8512873526157201775">"No one under eighteen සංකේතය"</string> + <string name="spoken_emoji_1F51F" msgid="8673370823728653973">"Keycap ten"</string> + <string name="spoken_emoji_1F520" msgid="7335109890337048900">"Input සංකේතය for latin capital letters"</string> + <string name="spoken_emoji_1F521" msgid="2693185864450925778">"Input සංකේතය for latin small letters"</string> + <string name="spoken_emoji_1F522" msgid="8419130286280673347">"Input සංකේතය for numbers"</string> + <string name="spoken_emoji_1F523" msgid="3318053476401719421">"සංකේත සඳහා ආදාන සංකේතය"</string> + <string name="spoken_emoji_1F524" msgid="1625073997522316331">"Input සංකේතය for latin letters"</string> + <string name="spoken_emoji_1F525" msgid="4083884189172963790">"ගින්න"</string> + <string name="spoken_emoji_1F526" msgid="2035494936742643580">"Electric torch"</string> + <string name="spoken_emoji_1F527" msgid="134257142354034271">"Wrench"</string> + <string name="spoken_emoji_1F528" msgid="700627429570609375">"Hammer"</string> + <string name="spoken_emoji_1F529" msgid="7480548235904988573">"Nut සහ bolt"</string> + <string name="spoken_emoji_1F52A" msgid="7613580031502317893">"Hocho"</string> + <string name="spoken_emoji_1F52B" msgid="4554906608328118613">"Pistol"</string> + <string name="spoken_emoji_1F52C" msgid="1330294501371770790">"Microscope"</string> + <string name="spoken_emoji_1F52D" msgid="7549551775445177140">"Telescope"</string> + <string name="spoken_emoji_1F52E" msgid="4457099417872625141">"Crystal ball"</string> + <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"මැද තිත සමඟ තුඩු හයක් කළ තරුව"</string> + <string name="spoken_emoji_1F530" msgid="3572898444281774023">"ජපන් සංකේතය for beginner"</string> + <string name="spoken_emoji_1F531" msgid="5225633376450025396">"Trident emblem"</string> + <string name="spoken_emoji_1F532" msgid="9169568490485180779">"කළු square button"</string> + <string name="spoken_emoji_1F533" msgid="6554193837201918598">"සුදු square button"</string> + <string name="spoken_emoji_1F534" msgid="8339298801331865340">"Large red කවය"</string> + <string name="spoken_emoji_1F535" msgid="1227403104835533512">"Large blue කවය"</string> + <string name="spoken_emoji_1F536" msgid="5477372445510469331">"Large orange diamond"</string> + <string name="spoken_emoji_1F537" msgid="3158915214347274626">"Large blue diamond"</string> + <string name="spoken_emoji_1F538" msgid="4300084249474451991">"Small orange diamond"</string> + <string name="spoken_emoji_1F539" msgid="6535159756325742275">"Small blue diamond"</string> + <string name="spoken_emoji_1F53A" msgid="3728196273988781389">"Up-pointing red triangle"</string> + <string name="spoken_emoji_1F53B" msgid="7182097039614128707">"Down-pointing red triangle"</string> + <string name="spoken_emoji_1F53C" msgid="4077022046319615029">"Up-pointing small red triangle"</string> + <string name="spoken_emoji_1F53D" msgid="3939112784894620713">"Down-pointing small red triangle"</string> + <string name="spoken_emoji_1F550" msgid="7761392621689986218">"Clock මුහුණ one oclock"</string> + <string name="spoken_emoji_1F551" msgid="2699448504113431716">"Clock මුහුණ two oclock"</string> + <string name="spoken_emoji_1F552" msgid="5872107867411853750">"Clock මුහුණ three oclock"</string> + <string name="spoken_emoji_1F553" msgid="8490966286158640743">"Clock මුහුණ four oclock"</string> + <string name="spoken_emoji_1F554" msgid="7662585417832909280">"Clock මුහුණ five oclock"</string> + <string name="spoken_emoji_1F555" msgid="5564698204520412009">"Clock මුහුණ six oclock"</string> + <string name="spoken_emoji_1F556" msgid="7325712194836512205">"Clock මුහුණ seven oclock"</string> + <string name="spoken_emoji_1F557" msgid="4398343183682848693">"Clock මුහුණ eight oclock"</string> + <string name="spoken_emoji_1F558" msgid="3110507820404018172">"Clock මුහුණ nine oclock"</string> + <string name="spoken_emoji_1F559" msgid="2972160366448337839">"Clock මුහුණ ten oclock"</string> + <string name="spoken_emoji_1F55A" msgid="5568112876681714834">"Clock මුහුණ eleven oclock"</string> + <string name="spoken_emoji_1F55B" msgid="6731739890330659276">"Clock මුහුණ twelve oclock"</string> + <string name="spoken_emoji_1F55C" msgid="7838853679879115890">"Clock මුහුණ one-thirty"</string> + <string name="spoken_emoji_1F55D" msgid="3518832144255922544">"Clock මුහුණ two-thirty"</string> + <string name="spoken_emoji_1F55E" msgid="3092760695634993002">"Clock මුහුණ three-thirty"</string> + <string name="spoken_emoji_1F55F" msgid="2326720311892906763">"Clock මුහුණ four-thirty"</string> + <string name="spoken_emoji_1F560" msgid="5771339179963924448">"Clock මුහුණ five-thirty"</string> + <string name="spoken_emoji_1F561" msgid="3139944777062475382">"Clock මුහුණ six-thirty"</string> + <string name="spoken_emoji_1F562" msgid="8273944611162457084">"Clock මුහුණ seven-thirty"</string> + <string name="spoken_emoji_1F563" msgid="8643976903718136299">"Clock මුහුණ eight-thirty"</string> + <string name="spoken_emoji_1F564" msgid="3511070239796141638">"Clock මුහුණ nine-thirty"</string> + <string name="spoken_emoji_1F565" msgid="4567451985272963088">"Clock මුහුණ ten-thirty"</string> + <string name="spoken_emoji_1F566" msgid="2790552288169929810">"Clock මුහුණ eleven-thirty"</string> + <string name="spoken_emoji_1F567" msgid="9026037362100689337">"Clock මුහුණ twelve-thirty"</string> + <string name="spoken_emoji_1F5FB" msgid="9037503671676124015">"Mount fuji"</string> + <string name="spoken_emoji_1F5FC" msgid="1409415995817242150">"Tokyo tower"</string> + <string name="spoken_emoji_1F5FD" msgid="2562726956654429582">"Statue of liberty"</string> + <string name="spoken_emoji_1F5FE" msgid="1184469756905210580">"Silhouette of japan"</string> + <string name="spoken_emoji_1F5FF" msgid="6003594799354942297">"Moyai"</string> + <string name="spoken_emoji_1F600" msgid="7601109464776835283">"Grinning මුහුණ"</string> + <string name="spoken_emoji_1F601" msgid="746026523967444503">"Grinning මුහුණ සමඟ smiling eyes"</string> + <string name="spoken_emoji_1F602" msgid="8354558091785198246">"මුහුණ සමඟ tears of joy"</string> + <string name="spoken_emoji_1F603" msgid="3861022912544159823">"Smiling මුහුණ සමඟ open කට"</string> + <string name="spoken_emoji_1F604" msgid="5119021072966343531">"Smiling මුහුණ සමඟ open කට සහ smiling eyes"</string> + <string name="spoken_emoji_1F605" msgid="6140813923973561735">"Smiling මුහුණ සමඟ open කට සහ cold sweat"</string> + <string name="spoken_emoji_1F606" msgid="3549936813966832799">"Smiling මුහුණ සමඟ open කට සහ tightly-closed eyes"</string> + <string name="spoken_emoji_1F607" msgid="2826424078212384817">"Smiling මුහුණ සමඟ halo"</string> + <string name="spoken_emoji_1F608" msgid="7343559595089811640">"Smiling මුහුණ සමඟ horns"</string> + <string name="spoken_emoji_1F609" msgid="5481030187207504405">"Winking මුහුණ"</string> + <string name="spoken_emoji_1F60A" msgid="5023337769148679767">"Smiling මුහුණ සමඟ smiling eyes"</string> + <string name="spoken_emoji_1F60B" msgid="3005248217216195694">"මුහුණ savouring delicious food"</string> + <string name="spoken_emoji_1F60C" msgid="349384012958268496">"Relieved මුහුණ"</string> + <string name="spoken_emoji_1F60D" msgid="7921853137164938391">"Smiling මුහුණ සමඟ heart-shaped eyes"</string> + <string name="spoken_emoji_1F60E" msgid="441718886380605643">"Smiling මුහුණ සමඟ ඉරුවීදුරුවes"</string> + <string name="spoken_emoji_1F60F" msgid="2674453144890180538">"Smirking මුහුණ"</string> + <string name="spoken_emoji_1F610" msgid="3225675825334102369">"Neutral මුහුණ"</string> + <string name="spoken_emoji_1F611" msgid="7199179827619679668">"Expressionless මුහුණ"</string> + <string name="spoken_emoji_1F612" msgid="985081329745137998">"Unamused මුහුණ"</string> + <string name="spoken_emoji_1F613" msgid="5548607684830303562">"මුහුණ සමඟ cold sweat"</string> + <string name="spoken_emoji_1F614" msgid="3196305665259916390">"Pensive මුහුණ"</string> + <string name="spoken_emoji_1F615" msgid="3051674239303969101">"Confused මුහුණ"</string> + <string name="spoken_emoji_1F616" msgid="8124887056243813089">"Confounded මුහුණ"</string> + <string name="spoken_emoji_1F617" msgid="7052733625511122870">"Kissing මුහුණ"</string> + <string name="spoken_emoji_1F618" msgid="408207170572303753">"මුහුණ throwing a kiss"</string> + <string name="spoken_emoji_1F619" msgid="8645430335143153645">"Kissing මුහුණ සමඟ smiling eyes"</string> + <string name="spoken_emoji_1F61A" msgid="2882157190974340247">"Kissing මුහුණ සමඟ closed eyes"</string> + <string name="spoken_emoji_1F61B" msgid="3765927202787211499">"මුහුණ සමඟ stuck-out දිව"</string> + <string name="spoken_emoji_1F61C" msgid="198943912107589389">"මුහුණ සමඟ stuck-out දිව සහ winking eye"</string> + <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"මුහුණ සමඟ stuck-out දිව සහ tightly-closed eyes"</string> + <string name="spoken_emoji_1F61E" msgid="1528732952202098364">"Disappointed මුහුණ"</string> + <string name="spoken_emoji_1F61F" msgid="1853664164636082404">"Worried මුහුණ"</string> + <string name="spoken_emoji_1F620" msgid="6051942001307375830">"Angry මුහුණ"</string> + <string name="spoken_emoji_1F621" msgid="2114711878097257704">"Pouting මුහුණ"</string> + <string name="spoken_emoji_1F622" msgid="29291014645931822">"Crying මුහුණ"</string> + <string name="spoken_emoji_1F623" msgid="7803959833595184773">"Persevering මුහුණ"</string> + <string name="spoken_emoji_1F624" msgid="8637637647725752799">"මුහුණ සමඟ look of triumph"</string> + <string name="spoken_emoji_1F625" msgid="6153625183493635030">"Disappointed but relieved මුහුණ"</string> + <string name="spoken_emoji_1F626" msgid="6179485689935562950">"Frowning මුහුණ සමඟ open කට"</string> + <string name="spoken_emoji_1F627" msgid="8566204052903012809">"Anguished මුහුණ"</string> + <string name="spoken_emoji_1F628" msgid="8875777401624904224">"Fearful මුහුණ"</string> + <string name="spoken_emoji_1F629" msgid="1411538490319190118">"Weary මුහුණ"</string> + <string name="spoken_emoji_1F62A" msgid="4726686726690289969">"Sleepy මුහුණ"</string> + <string name="spoken_emoji_1F62B" msgid="3221980473921623613">"Tired මුහුණ"</string> + <string name="spoken_emoji_1F62C" msgid="4616356691941225182">"Grimacing මුහුණ"</string> + <string name="spoken_emoji_1F62D" msgid="4283677508698812232">"Loudly crying මුහුණ"</string> + <string name="spoken_emoji_1F62E" msgid="726083405284353894">"මුහුණ සමඟ open කට"</string> + <string name="spoken_emoji_1F62F" msgid="7746620088234710962">"Hushed මුහුණ"</string> + <string name="spoken_emoji_1F630" msgid="3298804852155581163">"මුහුණ සමඟ open කට සහ cold sweat"</string> + <string name="spoken_emoji_1F631" msgid="1603391150954646779">"මුහුණ screaming in fear"</string> + <string name="spoken_emoji_1F632" msgid="4846193232203976013">"Astonished මුහුණ"</string> + <string name="spoken_emoji_1F633" msgid="4023593836629700443">"Flushed මුහුණ"</string> + <string name="spoken_emoji_1F634" msgid="3155265083246248129">"Sleeping මුහුණ"</string> + <string name="spoken_emoji_1F635" msgid="4616691133452764482">"Dizzy මුහුණ"</string> + <string name="spoken_emoji_1F636" msgid="947000211822375683">"මුහුණ සමඟout කට"</string> + <string name="spoken_emoji_1F637" msgid="1269551267347165774">"මුහුණ සමඟ medical mask"</string> + <string name="spoken_emoji_1F638" msgid="3410766467496872301">"Grinning පූසා මුහුණ සමඟ smiling eyes"</string> + <string name="spoken_emoji_1F639" msgid="1833417519781022031">"පූසා මුහුණ සමඟ tears of joy"</string> + <string name="spoken_emoji_1F63A" msgid="8566294484007152613">"Smiling පූසා මුහුණ සමඟ open කට"</string> + <string name="spoken_emoji_1F63B" msgid="74417995938927571">"Smiling පූසා මුහුණ සමඟ heart-shaped eyes"</string> + <string name="spoken_emoji_1F63C" msgid="6472812005729468870">"පූසා මුහුණ සමඟ wry smile"</string> + <string name="spoken_emoji_1F63D" msgid="1638398369553349509">"Kissing පූසා මුහුණ සමඟ closed eyes"</string> + <string name="spoken_emoji_1F63E" msgid="6788969063020278986">"Pouting පූසා මුහුණ"</string> + <string name="spoken_emoji_1F63F" msgid="1207234562459550185">"Crying පූසා මුහුණ"</string> + <string name="spoken_emoji_1F640" msgid="6023054549904329638">"Weary පූසා මුහුණ"</string> + <string name="spoken_emoji_1F645" msgid="5202090629227587076">"මුහුණ සමඟ no good gesture"</string> + <string name="spoken_emoji_1F646" msgid="6734425134415138134">"මුහුණ සමඟ ok gesture"</string> + <string name="spoken_emoji_1F647" msgid="1090285518444205483">"Person bowing deeply"</string> + <string name="spoken_emoji_1F648" msgid="8978535230610522356">"See-no-evil වඳුරා"</string> + <string name="spoken_emoji_1F649" msgid="8486145279809495102">"Hear-no-evil වඳුරා"</string> + <string name="spoken_emoji_1F64A" msgid="1237524974033228660">"Speak-no-evil වඳුරා"</string> + <string name="spoken_emoji_1F64B" msgid="4251150782016370475">"Happy person raising one hසහ"</string> + <string name="spoken_emoji_1F64C" msgid="5446231430684558344">"සමරන විට පුද්ගලයන් ඇත දෙකම ඔසවයි"</string> + <string name="spoken_emoji_1F64D" msgid="4646485595309482342">"Person frowning"</string> + <string name="spoken_emoji_1F64E" msgid="3376579939836656097">"Person සමඟ pouting මුහුණ"</string> + <string name="spoken_emoji_1F64F" msgid="1044439574356230711">"Person සමඟ folded hසහs"</string> + <string name="spoken_emoji_1F680" msgid="513263736012689059">"Rocket"</string> + <string name="spoken_emoji_1F681" msgid="9201341783850525339">"Helicopter"</string> + <string name="spoken_emoji_1F682" msgid="8046933583867498698">"Steam locomotive"</string> + <string name="spoken_emoji_1F683" msgid="8772750354339223092">"Railway car"</string> + <string name="spoken_emoji_1F684" msgid="346396777356203608">"High-speed train"</string> + <string name="spoken_emoji_1F685" msgid="1237059817190832730">"High-speed train සමඟ bullet නහය"</string> + <string name="spoken_emoji_1F686" msgid="3525197227223620343">"Train"</string> + <string name="spoken_emoji_1F687" msgid="5110143437960392837">"Metro"</string> + <string name="spoken_emoji_1F688" msgid="4702085029871797965">"Light rail"</string> + <string name="spoken_emoji_1F689" msgid="2375851019798817094">"Station"</string> + <string name="spoken_emoji_1F68A" msgid="6368370859718717198">"Tබැටළුවා"</string> + <string name="spoken_emoji_1F68B" msgid="2920160427117436633">"Tබැටළුවා car"</string> + <string name="spoken_emoji_1F68C" msgid="1061520934758810864">"Bus"</string> + <string name="spoken_emoji_1F68D" msgid="2890059031360969304">"Oncoming bus"</string> + <string name="spoken_emoji_1F68E" msgid="6234042976027309654">"Trolleybus"</string> + <string name="spoken_emoji_1F68F" msgid="5871099334672012107">"Bus stop"</string> + <string name="spoken_emoji_1F690" msgid="8080964620200195262">"Minibus"</string> + <string name="spoken_emoji_1F691" msgid="999173032408730501">"Ambulance"</string> + <string name="spoken_emoji_1F692" msgid="1712863785341849487">"Fire engine"</string> + <string name="spoken_emoji_1F693" msgid="7987109037389768934">"Police car"</string> + <string name="spoken_emoji_1F694" msgid="6061658916653884608">"Oncoming police car"</string> + <string name="spoken_emoji_1F695" msgid="6913445460364247283">"Taxi"</string> + <string name="spoken_emoji_1F696" msgid="6391604457418285404">"Oncoming taxi"</string> + <string name="spoken_emoji_1F697" msgid="7978399334396733790">"Automobile"</string> + <string name="spoken_emoji_1F698" msgid="7006050861129732018">"Oncoming automobile"</string> + <string name="spoken_emoji_1F699" msgid="630317052666590607">"Recreational vehicle"</string> + <string name="spoken_emoji_1F69A" msgid="4739797891735823577">"Delivery truck"</string> + <string name="spoken_emoji_1F69B" msgid="4715997280786620649">"ඈඳූ ලොරිය"</string> + <string name="spoken_emoji_1F69C" msgid="5557395610750818161">"Tractor"</string> + <string name="spoken_emoji_1F69D" msgid="5467164189942951047">"Monorail"</string> + <string name="spoken_emoji_1F69E" msgid="169238196389832234">"Mountain railway"</string> + <string name="spoken_emoji_1F69F" msgid="7508128757012845102">"Suspension railway"</string> + <string name="spoken_emoji_1F6A0" msgid="8733056213790160147">"Mountain cableway"</string> + <string name="spoken_emoji_1F6A1" msgid="4666516337749347253">"Aerial tබැටළුවාway"</string> + <string name="spoken_emoji_1F6A2" msgid="4511220588943129583">"Ship"</string> + <string name="spoken_emoji_1F6A3" msgid="8412962252222205387">"Rowboat"</string> + <string name="spoken_emoji_1F6A4" msgid="8867571300266339211">"Speedboat"</string> + <string name="spoken_emoji_1F6A5" msgid="7650260812741963884">"තිරස් මාර්ග තදබද පහන"</string> + <string name="spoken_emoji_1F6A6" msgid="485575967773793454">"Vertical traffic light"</string> + <string name="spoken_emoji_1F6A7" msgid="6411048933816976794">"Construction සලකුණ"</string> + <string name="spoken_emoji_1F6A8" msgid="6345717218374788364">"Police cars revolving light"</string> + <string name="spoken_emoji_1F6A9" msgid="6586380356807600412">"Triangular flag on post"</string> + <string name="spoken_emoji_1F6AA" msgid="8954448167261738885">"Door"</string> + <string name="spoken_emoji_1F6AB" msgid="5313946262888343544">"No entry සලකුණ"</string> + <string name="spoken_emoji_1F6AC" msgid="6946858177965948288">"Smoking සංකේතය"</string> + <string name="spoken_emoji_1F6AD" msgid="6320088669185507241">"දුම්පානය කරන්න එපා සංකේතය"</string> + <string name="spoken_emoji_1F6AE" msgid="1062469925352817189">"Put litter in its place සංකේතය"</string> + <string name="spoken_emoji_1F6AF" msgid="2286668056123642208">"Do not litter සංකේතය"</string> + <string name="spoken_emoji_1F6B0" msgid="179424763882990952">"Potable water සංකේතය"</string> + <string name="spoken_emoji_1F6B1" msgid="5585212805429161877">"Non-potable water සංකේතය"</string> + <string name="spoken_emoji_1F6B2" msgid="1771885082068421875">"Bicycle"</string> + <string name="spoken_emoji_1F6B3" msgid="8033779581263314408">"No bicycles"</string> + <string name="spoken_emoji_1F6B4" msgid="1999538449018476947">"Bicyclist"</string> + <string name="spoken_emoji_1F6B5" msgid="340846352660993117">"Mountain bicyclist"</string> + <string name="spoken_emoji_1F6B6" msgid="4351024386495098336">"Pedestrian"</string> + <string name="spoken_emoji_1F6B7" msgid="4564800655866838802">"No pedestrians"</string> + <string name="spoken_emoji_1F6B8" msgid="3020531906940267349">"Children crossing"</string> + <string name="spoken_emoji_1F6B9" msgid="1207095844125041251">"Mens සංකේතය"</string> + <string name="spoken_emoji_1F6BA" msgid="2346879310071017531">"Womens සංකේතය"</string> + <string name="spoken_emoji_1F6BB" msgid="2370172469642078526">"Restroom"</string> + <string name="spoken_emoji_1F6BC" msgid="5558827593563530851">"Baby සංකේතය"</string> + <string name="spoken_emoji_1F6BD" msgid="9213590243049835957">"Toilet"</string> + <string name="spoken_emoji_1F6BE" msgid="394016533781742491">"Water closet"</string> + <string name="spoken_emoji_1F6BF" msgid="906336365928291207">"Shower"</string> + <string name="spoken_emoji_1F6C0" msgid="4592099854378821599">"Bath"</string> + <string name="spoken_emoji_1F6C1" msgid="2845056048320031158">"Bathtub"</string> + <string name="spoken_emoji_1F6C2" msgid="8117262514698011877">"Passport control"</string> + <string name="spoken_emoji_1F6C3" msgid="1176342001834630675">"Customs"</string> + <string name="spoken_emoji_1F6C4" msgid="1477622834179978886">"Baggage claim"</string> + <string name="spoken_emoji_1F6C5" msgid="2495834050856617451">"Left luggage"</string> +</resources> diff --git a/java/res/values-si-rLK/strings-letter-descriptions.xml b/java/res/values-si-rLK/strings-letter-descriptions.xml new file mode 100644 index 000000000..0673e19ff --- /dev/null +++ b/java/res/values-si-rLK/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ස්ත්රී ක්රමාංකය දර්ශකය"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"මයික්රො ලකුණ"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"පුරුෂ ක්රමාංකය දර්ශකය"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"සියුම් S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, ගම්භීර"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, තියුණු"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, වකුටු"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, නාසික්ය"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, ස්වර"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, වළල්ලට ඉහළ"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, බැම්ම"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, ගම්භීර"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, තියුණු"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, වකුටු"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, ස්වර"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, ගම්භීර"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, තියුණු"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, වකුටු"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, ස්වර"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"එත්"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, නාසික්ය"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, ගම්භීර"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, තියුණු"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, වකුටු"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, නාසික්ය"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, ස්වර"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, වාරය"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, ගම්භීර"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, තියුණු"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, වකුටු"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, ස්වර"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, තියුණු"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"කටුව"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, ස්වර"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, මුද්රිත"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, බ්රේව්"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ඔගොනෙක්"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, තියුණු"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, වකුටු"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ඉහළින් තිත"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, කරෝන්"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, කරෝන්"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, වාරය"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, මුද්රිත"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, බ්රේව්"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ඉහළින් තිත"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ඔගොනෙක්"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, කරෝන්"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, වකුටු"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, බ්රේව්"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ඉහළින් තිත"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, වකුටු"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, වාරය"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, නාසික්ය"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, මුද්රිත"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, බ්රේව්"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ඔගොනෙක්"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"තිත නැති I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, බැම්ම"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, වකුටු"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ක්ර"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, තියුණු"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, කරෝන්"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, මැද තිත"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, වාරය"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, තියුණු"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, කරෝන්"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, පෙර මඟින් ආමන්ත්රණයක්"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"එන්ග්"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, මුද්රිත"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, බ්රේව්"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, ද්විත්ව තියුණු"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, බැම්ම"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, තියුණු"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, කරෝන්"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, තියුණු"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, වකුටු"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, කරෝන්"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, සකාර ලකුණ"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, කරෝන්"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, වාරය"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, නාසික්ය"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, මුද්රිත"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, බ්රේව්"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, වළල්ලට ඉහළ"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, ද්විත්ව තියුණු"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ඔගොනෙක්"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, වකුටු"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, වකුටු"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, තියුණු"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ඉහළින් තිත"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, කරෝන්"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"දිග S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, අං"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, අං"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, පහළ කොමාව"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, පහළ කොමාව"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ස්චාව"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, පහළ තිත"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, වකුටු සහ තියුණු"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, වකුටු සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, වකුටු සහ ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, වකුටු සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, වකුටු සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, බ්රේව් සහ තියුණු"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, බ්රේව් සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, බ්රේව් සහ පහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, බ්රේව් සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, බ්රේව් සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, පහළ තිත"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, නාසික්ය"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, වකුටු සහ තියුණු"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, වකුටු සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, වකුටු සහ ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, වකුටු සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, වකුටු සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, පහළ තිත"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, පහළ තිත"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, වකුටු සහ තියුණු"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, වකුටු සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, වකුටු සහ ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, වකුටු සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, වකුටු සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, අං සහ තියුණු"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, අං සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, අං සහ ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, අං සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, අං සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, පහළ තිත"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, අං සහ තියුණු"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, අං සහ ගම්භීර"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, අං සහ ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, අං සහ නාසික්ය"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, අං සහ පහළ තිත"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, ගම්භීර"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, පහළ තිත"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ඉහළ කොක්ක"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, නාසික්ය"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"යටිකුරු කළ හර්ෂදී ලකුණ"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"වමට-ලක්ෂ ගත ද්විත්ව අනාත කළ උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"මැද තිත"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"උඩු ලකුණු එක"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"දකුණට-ලක්ෂ ගත ද්විත්ව අනාත කළ උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"යටිකුරු කළ ප්රශ්ණාර්ථ ලකුණ"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"වම් ද්විත්ව උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"දකුණු තනි උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"තනි 9-අඩු උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"වම් ද්විත්ව උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"දකුණු ද්විත්ව උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"සිරිය"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ද්විත්ව සිරිය"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"මිල්ලේ ලකුණ"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"මූලික"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ද්විත්ව මූලික"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"තනි වමට-ලක්ෂ ගත අනාත කළ උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"තනිව දකුණට-ලක්ෂ ගත අනාත කළ උද්ධෘත ලකුණ"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"උඩු ලකුණු හතර"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"උඩු ලකුණු ලතින් කුඩා n අකුර"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"පෙසෝ ලකුණ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"බාරේ"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"දකුණට ඇති ඊතලය"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"කළු ඊතලය"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"හිස් කුලකය"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"වැඩිවීම"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"කුඩා හෝ සමානයි"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"විශාලයි හෝ සමානයි"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"කළු තුරු"</string> +</resources> diff --git a/java/res/values-si-rLK/strings-talkback-descriptions.xml b/java/res/values-si-rLK/strings-talkback-descriptions.xml new file mode 100644 index 000000000..85cb5f6aa --- /dev/null +++ b/java/res/values-si-rLK/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"මුරපදයේ යතුරු හඬ හොඳින් ඇසීමට හෙඩ්සෙටය සම්බන්ධ කරන්න."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"වර්තමාන පෙළ %s ය"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"පෙළ ඇතුළු කර නැත"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> සිට <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> වෙත නිවැරදි කරයි"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ස්වයං-නිවැරදි කිරීම සිදු කරයි"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"නොදන්නා අකුර"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"ෂිෆ්ට්"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"තව සංකේත"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"ෂිෆ්ට්"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"සංකේත"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"ෂිෆ්ට්"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"මකන්න"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"සංකේත"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"අකුරු"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"අංක"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"සැකසීම්"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ටැබය"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ස්පේස්"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"හඬ ආදානය"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ඉමොජි"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ආපසු එවන්න"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"සොයන්න"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"තිත"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"භාෂාව මාරු කරන්න"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"මීළඟ"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"පෙර"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"ෂිෆ්ට් සබල කර ඇත"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"කැප්ස් ලොක් සබල කර ඇත"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"සංකේත ආකාරය"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"තව සංකේත ආකාර"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"අකුරු ආකාරය"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"දුරකථන ආකාරය"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"දුරකථන සංකේත ආකාරය"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"යතුරු පුවරුව සැඟවී ඇත"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> යතුරුපුවරුව පෙන්වමින්"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"දිනය"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"දිනය සහ වේලාව"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ඊ-තැපෑල"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"පණිවිඩ යැවීම"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"අංකය"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"දුරකථනය"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"පෙළ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"කාලය"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"මෑත"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"පුද්ගලයින්"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"වස්තුව"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"සොබාදහම"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ස්ථාන"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"සංකේත"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ඉමෝටිකොන්"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"ලොකු <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"ලොකු I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"ලොකු I, ඉහළින් තිත"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"නොදන්නා සංකේතය"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"නොදන්නා ඉමොජි"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"විකල්ප අකුරු තිබේ"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"විකල්ප අකුරු අස් කරන ලදි"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"විකල්ප යෝජනා තිබේ"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"විකල්ප යෝජනා අස් කරන ලදි"</string> +</resources> diff --git a/java/res/values-si-rLK/strings.xml b/java/res/values-si-rLK/strings.xml new file mode 100644 index 000000000..e4e0b8e4c --- /dev/null +++ b/java/res/values-si-rLK/strings.xml @@ -0,0 +1,199 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ආදාන විකල්ප"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"සබඳතා නම් විමසන්න"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"අක්ෂර වින්යාස පරික්ෂකය ඔබගේ සබඳතා ලැයිස්තුව වෙතින් ඇතුළත් කිරීම් භාවිතා කරයි"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"යතුර එබීමට කම්පනය කිරීම සක්රියයි"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"යතුරු එබිම මත හඬ"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"යතුරු එබීම මත උත්පතනය"</string> + <string name="settings_screen_input" msgid="2808654300248306866">"ආදාන මනාපය"</string> + <string name="settings_screen_appearances" msgid="3611951947835553700">"පෙනුම"</string> + <string name="settings_screen_multi_lingual" msgid="6829970893413937235">"බහු මූර්ධජ අක්ෂර විකල්ප"</string> + <string name="settings_screen_gesture" msgid="9113437621722871665">"ඉංගිතයෙන් ටයිප් කිරීමේ මනාපය"</string> + <string name="settings_screen_correction" msgid="1616818407747682955">"පෙළ නිවැරදි කිරීම"</string> + <string name="settings_screen_advanced" msgid="7472408607625972994">"උසස්"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"වෙනත් ආදාන ක්රම වෙත මාරුවන්න"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"භාෂා මාරු යතුර වෙනත් ආදාන ක්රමද ආවරණය කරයි"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"භාෂා මාරු යතුර"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"බහුවිධ ආදාන භාෂා සබල කර ඇති විට පෙන්වන්න"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"සර්පණ දර්ශකය පෙන්වන්න"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"ෂිෆ්ට් හෝ සංකේත යතුරු වෙතින් සර්පණය කරන අතරතුර දෘෂ්ය ඉඟි දර්ශනය කරන්න"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"යතුරු උත්පතන ඉවත් කිරීමේ ප්රමාදය"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ප්රමාද නැත"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"සුපුරුදු"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>ms"</string> + <string name="settings_system_default" msgid="6268225104743331821">"පද්ධති සුපුරුදු"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"සබඳතා නම් යෝජනා කරන්න"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"යෝජනා සහ නිවැරදි කිරීම් සඳහා සබඳතා වෙතින් නම් භාවිතා කරන්න"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"පෞද්ගලීකරණය කළ යෝජනා"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"දියුණු <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"දෙවරක්-ඉඩ නැවතීමේ ලකුණ"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"ඉඩ යතුර මත දෙවරක් තට්ටු කිරීම හිස් තැනකට අනුගාමිව නැවතීමේ ලකුණක් ඇතුළත් කරයි."</string> + <string name="auto_cap" msgid="1719746674854628252">"ස්වයං-ලොකු අකුරු කරණය"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"එක් එක් වාක්යයේ පළමු වචනය ලොකු අකුරු කරන්න"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"පුද්ගලික ශබ්ද කෝෂය"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"ඈඳුම් ශබ්දකෝෂ"</string> + <string name="main_dictionary" msgid="4798763781818361168">"ප්රධාන ශබ්ද කෝෂය"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"නිවැරදි කිරීම් යෝජනා පෙන්වන්න"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ටයිප් කරන අතරතුර යෝජිත වචන දර්ශනය කරන්න"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"සැමවිටම පෙන්වන්න"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"සිරස් ආකෘති ප්රකාරය තුළ පෙන්වන්න"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"සැමවිට සඟවන්න"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"අප්රසන්න වචන අවහිර කරන්න"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"විභව්යව අප්රසන්න වචන යෝජනා නොකරන්න"</string> + <string name="auto_correction" msgid="7630720885194996950">"ස්වයං-නිවැරදි කිරීම"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"ඉඩ යතුර සහ විරාම ලකුණ වැරදියට ටයිප් කළ වචන ස්වයංක්රියව නිවැරදි කරයි"</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_aggressive" msgid="7319007299148899623">"ආක්රමණකාරී"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"ඉතා ආක්රමණකාරී"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"ඊළඟ-වචනයේ යෝජනා"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"යෝජනා කිරීමේදී පෙර වචනය භාවිතා කරන්න"</string> + <string name="gesture_input" msgid="826951152254563827">"ඉංගිතයෙන් ටයිප් කිරීම සබල කරන්න"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"අකුරු ඔස්සේ සර්පණය කිරීමෙන් වචනයක් ආදානය කරන්න"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"ඉංගිතයෙන් මඟ පෙන්වන්න"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ගතිකව ඉපිලෙන පෙරදසුන"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ඉංගිතය කරන අතරතුර යෝජිත වචන බලන්න"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ජේද ඉංගිතය"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ඉංගිතයන් අතරතුර space යතුර වෙත ලිස්සීම මඟින් ඉඩ ඇතුල් කරන්න"</string> + <string name="voice_input" msgid="3583258583521397548">"හඬ ආදාන යතුර"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"හඬ ආදාන සබල කර නැත. භාෂාව සහ ආදාන සැකසීම් පරීක්ෂා කරන්න."</string> + <string name="configure_input_method" msgid="373356270290742459">"ආදාන ක්රම වින්යාස කරන්න"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ආදාන භාෂා"</string> + <string name="send_feedback" msgid="1780431884109392046">"ප්රතිපෝෂණ යවන්න"</string> + <string name="select_language" msgid="3693815588777926848">"ආදාන භාෂා"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"සුරැකීමට නැවත ස්පර්ශ කරන්න"</string> + <string name="has_dictionary" msgid="6071847973466625007">"ශබ්ද කෝෂය ලබාගත හැක"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"යතුරු පුවරු තේමාව"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ඉංග්රීසි (UK)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ඉංග්රීසි (US)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ස්පාඤ්ඤ (US)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ඉංග්රීසි (එ.රා) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ඉංග්රීසි (එ.ජ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ස්පාඤ්ඤ (එ.ජ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (සාම්ප්රදායික)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (සිරිලික්)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ලතින්)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"භාෂාවක් නැත (අකාරාදිය)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"අකාරාදිය (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"අකාරාදිය (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"අකාරාදිය (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"අකාරාදිය (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"අකාරාදිය (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"අකාරාදිය (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ඉමොජි"</string> + <string name="keyboard_theme" msgid="4909551808526178852">"යතුරු පුවරු තේමාව"</string> + <string name="keyboard_theme_holo_white" msgid="8506588144096428751">"හොලෝ සුදු"</string> + <string name="keyboard_theme_holo_blue" msgid="192400518003397418">"හොලෝ නිල්"</string> + <string name="keyboard_theme_material_dark" msgid="2701178578784760596">"ද්රව්යමය අඳුරු"</string> + <string name="keyboard_theme_material_light" msgid="3479400901818790331">"ද්රව්යමය ළා"</string> + <string name="custom_input_styles_title" msgid="8429952441821251512">"අභිරුචි ආදාන විලාස"</string> + <string name="add_style" msgid="6163126614514489951">"විලාසය එක් කරන්න"</string> + <string name="add" msgid="8299699805688017798">"එක් කරන්න"</string> + <string name="remove" msgid="4486081658752944606">"ඉවත් කරන්න"</string> + <string name="save" msgid="7646738597196767214">"සුරකින්න"</string> + <string name="subtype_locale" msgid="8576443440738143764">"භාෂාව"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"පිරිසැලසුම"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"ඔබ එය භාවිතය ආරම්භ කිරීමට පෙර ඔබගේ අභිරුචි ආදාන විලාසය සබල කිරීමට අවශ්යය. ඔබට එය දැන් සබල කිරීමට අවශ්යද?"</string> + <string name="enable" msgid="5031294444630523247">"සබල කරන්න"</string> + <string name="not_now" msgid="6172462888202790482">"දැන් නොවේ"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"සමාන ආදාන විලාසය දැනටමත් පවතී: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"යතුරු දිගු එබීම් ප්රමාදය"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"යතුරු එබිම් කම්පන කාලපරිච්ඡේදය"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"යතුරු එබීම් හඬ තීව්රතාවය"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"බාහිර ශබ්ද කෝෂ ගොනුව කියවන්න"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"බාගැනීම් ෆෝල්ඩරය තුළ ශබ්දකෝෂ ගොනු නොමැත"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ස්ථාපනය කිරීමට ශබ්ද කෝෂ ගොනුවක් තෝරන්න"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> සඳහා ඇත්තටම මෙම ගොනුව ස්ථාපනය කරන්නද?"</string> + <string name="error" msgid="8940763624668513648">"දෝෂයක් ඇති විය"</string> + <string name="button_default" msgid="3988017840431881491">"සුපුරුදු"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> වෙත සාදරයෙන් පිළිගනිමු"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"ඉංගිත ටයිප් කිරීම් සමග"</string> + <string name="setup_start_action" msgid="8936036460897347708">"අරඹන්න"</string> + <string name="setup_next_action" msgid="371821437915144603">"ඊළඟ පියවර"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සැකසෙමින් පවතී"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සබල කරන්න"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"කරණාකර ඔබගේ භාෂවෙහි සහ ආදාන සැකසීම් වල \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" පරික්ෂා කරන්න. මෙය ඔබගේ උපාංගය මත එයට ධාවනය වීමට අනුමැතිය දෙනු ඇත."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> දැනටමත් ඔබගේ භාෂාවෙන් සහ ආදාන සැකසීම්වල සබල කර ඇත, එම නිසා මෙම පියවර නිමයි. ඊළග එක වෙතට!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"සැකසීම් තුළ සබල කරන්න"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> වෙත මාරුවන්න"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"ඊළඟට, ඔබගේ සක්රිය පෙළ-ආදාන ක්රමය ලෙස \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" තෝරන්න."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ආදාන ක්රම මාරු කරන්න"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"සුබපැතුම්, ඔබ සියල්ල පිහිටුවා ඇත!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"දැන් ඔබට <xliff:g id="APPLICATION_NAME">%s</xliff:g> සමගින් ඔබගේ සියළුම ප්රියතම යෙදුම් වලින් ටයිප් කළ හැක."</string> + <string name="setup_step3_action" msgid="600879797256942259">"අතිරේක භාෂා වින්යාස කරන්න"</string> + <string name="setup_finish_action" msgid="276559243409465389">"අවසන්"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"යෙදුම් නිරූපකය පෙන්වන්න"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"දියත්කරනය තුළ යෙදුම් නිරූපකය දර්ශනය කරන්න"</string> + <string name="app_name" msgid="6320102637491234792">"ශබ්දකෝෂ සැපයුම්කරු"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ශබ්දකෝෂ සැපයුම්කරු"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"ශබ්ද කෝෂ සේවාව"</string> + <string name="download_description" msgid="6014835283119198591">"ශබ්ද කෝෂ යාවත්කාලීන තොරතුරු"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ඈඳුම් ශබ්ද කෝෂ"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"ශබ්දකෝෂය ලබාගත හැක"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"ශබ්ද කෝෂ සඳහා සැකසීම්"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"පරිශීලක ශබ්ද කෝෂ"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"පරිශීලක ශබ්ද කෝෂය"</string> + <string name="dictionary_available" msgid="4728975345815214218">"ශබ්දකෝෂය ලබාගත හැක"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"දැනට බාගැනේ"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ස්ථාපිතයි"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ස්ථාපනය කළ, අබල කළ"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"ශබ්දකෝෂ සේවාව වෙත සම්බන්ධ වීමට ගැටලුවක්ද"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"ශබ්ද කෝෂ ලබාගත නොහැක"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"නැවුම් කරන්න"</string> + <string name="last_update" msgid="730467549913588780">"අවසන් වරට යාවත්කාලීන කළේ"</string> + <string name="message_updating" msgid="4457761393932375219">"යාවත්කාලීන සඳහා පරික්ෂා කෙරේ"</string> + <string name="message_loading" msgid="5638680861387748936">"පූරණය වෙමින්..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"ප්රධාන ශබ්ද කෝෂය"</string> + <string name="cancel" msgid="6830980399865683324">"අවලංගු කරන්න"</string> + <string name="go_to_settings" msgid="3876892339342569259">"සැකසීම්"</string> + <string name="install_dict" msgid="180852772562189365">"ස්ථාපනය"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"අවලංගු කරන්න"</string> + <string name="delete_dict" msgid="756853268088330054">"මකන්න"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ඔබගේ ජංගම උපාංගය මත තෝරාගත් භාෂාවට ලබාගත හැකි ශබ්ද කෝෂයක් ඇත.<br/> අප ඔබගේ ටයිප් කිරීමේ පළපුරුද්ද වැඩි දියුණු කිරීමට <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ශබ්ද කෝෂය <b>බාගැනීම</b> නිර්දේශ කරමු.<br/> <br/> 3G හරහා බාගැනීම මිනිත්තුවක් හෝ දෙකක් ගත හැකිය. ඔබට <b>සීමාරහිත දත්ත සැලසුමක්</b> නොමැති නම් ගාස්තු අදාළ විය හැක.<br/> ඔබට තිබෙන්නේ කුමන දත්ත සැලසුමක්ද යන්න පිළිබඳ විශ්වාසයක් නොමැති නම්, බාගැනීම ස්වයංක්රියව ආරම්භ කිරීමට Wi-Fi සම්බන්ධයක් සොයා ගැනීම අප නිර්දේශ කරමු.<br/> <br/> ඉඟිය: ඔබට ඔබගේ ජංගම උපාංගයේ <b>සැකසීම්</b> මෙනුව තුළ <b>භාෂාව සහ ආදානය</b> වෙත යාම මගින් ශබ්දකෝෂ බාගැනීමට සහ ඉවත් කිරීමට හැක."</string> + <string name="download_over_metered" msgid="1643065851159409546">"දැන් බාගන්න (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi හරහා බාගන්න"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> සඳහා ශබ්දකෝෂයක් නොමැත"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"සමාලෝචනය කිරීමට සහ බාගැනීමට ඔබන්න"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"බාගතකරමින්: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> සඳහා යෝජනා ඉක්මනින් සුදානම් වනු ඇත."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> අනුවාදය"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"එක් කරන්න"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"ශබ්ද කෝෂය වෙත එක් කරන්න"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"වාක්ය ඛණ්ඩය"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"තවත් විකල්ප"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"අඩු විකල්ප"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"හරි"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"වචනය:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"කෙටිමග:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"භාෂාව:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"වචනයක් ටයිප් කරන්න"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"විකල්පමය කෙටිමග"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"වචනය සංස්කරණය කරන්න"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"සංස්කරණය කරන්න"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"මකන්න"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"ඔබට පරිශීලක ශබ්ද කෝෂය තුළ වචන කිසිවක් නැත. එක් කරන්න (+) බොත්තම ස්පර්ශ කිරීම මගින් වචනයක් එක් කරන්න."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"සියලු භාෂාවන් සඳහා"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"තවත් භාෂා…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"මකන්න"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-sk/strings-action-keys.xml b/java/res/values-sk/strings-action-keys.xml index 3586fb140..84e1c3172 100644 --- a/java/res/values-sk/strings-action-keys.xml +++ b/java/res/values-sk/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Pred."</string> <string name="label_done_key" msgid="7564866296502630852">"OK"</string> <string name="label_send_key" msgid="482252074224462163">"Posl."</string> + <string name="label_search_key" msgid="7965186050435796642">"Hľadať"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string> <string name="label_wait_key" msgid="5891247853595466039">"Čakať"</string> </resources> diff --git a/java/res/values-sk/strings-config-important-notice.xml b/java/res/values-sk/strings-config-important-notice.xml new file mode 100644 index 000000000..9b15ac992 --- /dev/null +++ b/java/res/values-sk/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Zlepšovať návrhy na základe komunikácie a zadaných údajov"</string> +</resources> diff --git a/java/res/values-sk/strings-letter-descriptions.xml b/java/res/values-sk/strings-letter-descriptions.xml new file mode 100644 index 000000000..e6bba4a8a --- /dev/null +++ b/java/res/values-sk/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikátor radovej číslovky ženského rodu"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikátor radovej číslovky mužského rodu"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostré S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A s opačným dĺžňom"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A s dĺžňom"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A s vokáňom"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A s vlnovkou"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A s dvoma bodkami"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A s krúžkom"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Ligatúra písmen A, E"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E s opačným dĺžňom"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E s dĺžňom"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E s vokáňom"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E s dvoma bodkami"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I s opačným dĺžňom"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I s dĺžňom"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I s vokáňom"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I s dvoma bodkami"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N s vlnovkou"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O s opačným dĺžňom"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O s dĺžňom"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O s vokáňom"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O s vlnovkou"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O s dvoma bodkami"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Prečiarknuté O"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U s opačným dĺžňom"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U s dĺžňom"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U s vokáňom"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U s dvoma bodkami"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y s dĺžňom"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y s dvoma bodkami"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A s vodorovnou čiarkou"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A s oblúčikom"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A s nožičkou"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C s dĺžňom"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C s vokáňom"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C s bodkou nad písmenom"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C s mäkčeňom"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D s mäkčeňom"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Prečiarknuté D"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E s vodorovnou čiarkou"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E s oblúčikom"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E s bodkou nad písmenom"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E s nožičkou"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E s mäkčeňom"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G s vokáňom"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G s oblúčikom"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G s bodkou nad písmenom"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H s vokáňom"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Prečiarknuté H"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I s vlnovkou"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I s vodorovnou čiarkou"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I s oblúčikom"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I s nožičkou"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez bodky"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatúra písmen I, J"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J s vokáňom"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L s dĺžňom"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L s mäkčeňom"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L s bodkou uprostred"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Prečiarknuté L"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N s dĺžňom"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N s mäkčeňom"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N s apostrofom na začiatku"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O s vodorovnou čiarkou"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O s oblúčikom"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O s dvoma dĺžňami"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatúra písmen O, E"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R s dĺžňom"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R s mäkčeňom"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S s dĺžňom"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S s vokáňom"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S s mäkčeňom"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T s háčikom pod písmenom"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T s mäkčeňom"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Prečiarknuté T"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U s vlnovkou"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U s vodorovnou čiarkou"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U s oblúčikom"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U s krúžkom"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U s dvoma dĺžňami"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U s nožičkou"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W s vokáňom"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y s vokáňom"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z s dĺžňom"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z s bokou nad písmenom"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z s mäkčeňom"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dlhé S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O s rohom"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U s rohom"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S s čiarkou pod písmenom"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T s čiarkou pod písmenom"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A s vokáňom aj dĺžňom"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A s vokáňom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A s vokáňom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A s vokáňom aj vlnovkou"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A s vokáňom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A s oblúčikom aj dĺžňom"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A s oblúčikom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A s oblúčikom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A s oblúčikom aj vlnovkou"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A s oblúčikom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E s vlnovkou"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E s vokáňom aj dĺžňom"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E s vokáňom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E s vokáňom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E s vokáňom aj vlnovkou"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E s vokáňom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O s vokáňom aj dĺžňom"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O s vokáňom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O s vokáňom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O s vokáňom aj vlnovkou"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O s vokáňom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O s rohom aj dĺžňom"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O s rohom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O s rohom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O s rohom aj vlnovkou"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O s rohom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U s rohom aj dĺžňom"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U s rohom aj opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U s rohom aj háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U s rohom aj vlnovkou"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U s rohom aj bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y s opačným dĺžňom"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y s bodkou pod písmenom"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y s háčikom nad písmenom"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y s vlnovkou"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrátený výkričník"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Lomené ľavé dvojité úvodzovky"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Bodka uprostred"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Jednotka v hornom indexe"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Lomené pravé dvojité úvodzovky"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrátený otáznik"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ľavé jednoduché úvodzovky"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Pravé jednoduché úvodzovky"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dolné jednoduché úvodzovky"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ľavé dvojité úvodzovky"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Pravé dvojité úvodzovky"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Krížik"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvojitý krížik"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Znak promile"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Indexová čiarka"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvojitá indexová čiarka"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Jednoduché ľavé úvodzovky"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Jednoduché pravé úvodzovky"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Štvorka v hornom indexe"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Latinka – malé písmeno n v hornom indexe"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak pesa"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Malé písmená c a o oddelené lomkou"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Šípka vpravo"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Šípka nadol"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prázdna množina"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Prírastok"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menšie alebo rovné ako"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Väčšie alebo rovné ako"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Čierna hviezda"</string> +</resources> diff --git a/java/res/values-sk/strings-talkback-descriptions.xml b/java/res/values-sk/strings-talkback-descriptions.xml new file mode 100644 index 000000000..2cd094ee1 --- /dev/null +++ b/java/res/values-sk/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Ak si chcete pri zadávaní hesla vypočuť nahlas vyslovené klávesy, pripojte náhlavnú súpravu."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Aktuálny text je %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nie je zadaný žiadny text"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> opravíte slovo <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> spustíte automatické opravy"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Neznámy znak"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Ďalšie symboly"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboly"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Odstrániť"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboly"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Písmená"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Čísla"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Nastavenia"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Karta"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Medzerník"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Hlasový vstup"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Hľadať"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Bodka"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Prepnúť jazyk"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Ďalej"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Naspäť"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Kláves Shift je povolený"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Kláves Caps Lock je povolený"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Režim symbolov"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Režim ďalších symbolov"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Režim písmen"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Režim telefónu"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Režim telefónnych symbolov"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klávesnica je skrytá"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Je zobrazená klávesnica <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"dátum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"dátum a čas"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-mail"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"odosielanie správ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"číslo"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefón"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"čas"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"Adresa URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Nedávne"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Ľudia"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Predmety"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Príroda"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Miesta"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboly"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikony"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Veľké písmeno – <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Veľké I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Veľké I s bodkou nad písmenom"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Neznámy symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Neznámy symbol Emodži"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatívne znaky sú dostupné"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatívne znaky boli zrušené"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatívne návrhy sú dostupné"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatívne návrhy boli zrušené"</string> +</resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index d1f966cea..40e1db42c 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávania textu a údajov"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Príkazy denníka výskumu"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Vyhľadať kontakty"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kontrola pravopisu používa záznamy z vášho zoznamu kontaktov"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Pri stlačení klávesu vibrovať"</string> <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="general_category" msgid="1859088467017573195">"Všeobecné"</string> - <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Písanie gestami"</string> - <string name="misc_category" msgid="6894192814868233453">"Ďalšie možnosti"</string> - <string name="advanced_settings" msgid="362895144495591463">"Rozšírené nastavenia"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Možnosti pre odborníkov"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Prepnúť na iné metódy vstupu"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Kláves na prepnutie jazyka pokrýva aj ďalšie metódy vstupu"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Kľúč na prepínanie jazyka"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Predvolené nastav."</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Navrhnúť mená kontaktov"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Používať mená z Kontaktov na návrhy a opravy"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Prispôsobené návrhy"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Zlepšiť aplikáciu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Bodka s medzerou"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojitým klepnutím na medzerník vložíte bodku a medzeru."</string> <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Zobrazovať stopu gesta"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamická plávajúca ukážka"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Zobrazenie navrhovaného slova pri písaní gestami"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uložené"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Ak si chcete pri zadávaní hesla vypočuť nahlas vyslovené klávesy, pripojte náhlavnú súpravu."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Aktuálny text je %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Nie je zadaný žiadny text"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Klávesom <xliff:g id="KEY">%1$s</xliff:g> opravíte slovo <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Klávesom <xliff:g id="KEY">%1$s</xliff:g> spustíte automatické opravy"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Kód klávesu %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Kláves Shift je zapnutý (zakážete ho klepnutím)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Kláves Caps Lock je zapnutý (zakážete ho klepnutím)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboly"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Písmená"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Čísla"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Nastavenia"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Karta"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Medzerník"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Hlasový vstup"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Usmiata tvár"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Hľadať"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Bodka"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Prepnúť jazyk"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Ďalšie"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Predchádzajúce"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Kláves Shift je povolený"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Kláves Caps Lock je povolený"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Kláves Shift je zakázaný"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Režim symbolov"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Režim písmen"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Režim telefónu"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Režim telefónnych symbolov"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klávesnica je skrytá"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Zobrazenie klávesnice v režime <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"dátum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"dátum a čas"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-mail"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"odosielanie správ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"číslo"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefón"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"čas"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"Adresa URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frázové gesto"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Medzery medzi gestá vložíte prejdením po klávese medzerníka"</string> <string name="voice_input" msgid="3583258583521397548">"Kľúč hlasového vstupu"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Nie sú povolené žiadne metódy hlasového vstupu. Skontrolujte nastavenia položky Jazyk a vstup."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurovať metódy vstupu"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string> <string name="send_feedback" msgid="1780431884109392046">"Odoslať spätnú väzbu"</string> <string name="select_language" msgid="3693815588777926848">"Jazyky vstupu"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opätovným dotykom uložíte"</string> <string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Automatickým zasielaním štatistík o využívaní editora metódy vstupu a správ o jeho zlyhaní môžete prispieť k vylepšeniu tohto nástroja"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Motív klávesnice"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Anglická klávesnica (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Anglická klávesnica (US)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"španielčina (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"angličtina (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"angličtina (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"španielčina (USA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradičná)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angličtina (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angličtina (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španielčina (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradičná)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cyrilika)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinka)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Žiadny jazyk (latinka)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Latinka (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Latinka (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Latinka (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Latinka (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Farebná schéma"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Biela"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Modrá"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Vlastné štýly vstupu"</string> <string name="add_style" msgid="6163126614514489951">"Pridať štýl"</string> <string name="add" msgid="8299699805688017798">"Pridať"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Povoliť"</string> <string name="not_now" msgid="6172462888202790482">"Teraz nie"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Rovnaký štýl vstupu už existuje: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Režim štúdie použiteľnosti"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Oneskor. pri stlač. a podržaní"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Trvanie vibrov. pri stlač. kl."</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Hlasitosť pri stlačení klávesu"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Čítať súbor externého slovníka"</string> - <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V priečinku Preberanie nie sú žiadne súbory slovníka"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V priečinku Sťahovanie nie sú žiadne súbory slovníka"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte súbor slovníka, ktorý chcete nainštalovať"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Chcete nainštalovať tento súbor pre jazyk <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Chcete nainštalovať tento súbor pre jazyk <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Vyskytla sa chyba"</string> <string name="button_default" msgid="3988017840431881491">"Predvolené"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Vitajte v aplikácii <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -199,7 +166,7 @@ <string name="user_dictionaries" msgid="3582332055892252845">"Používateľské slovníky"</string> <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Používateľský slovník"</string> <string name="dictionary_available" msgid="4728975345815214218">"K dispozícii je slovník"</string> - <string name="dictionary_downloading" msgid="2982650524622620983">"Aktuálne sa preberá"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Aktuálne sa sťahuje"</string> <string name="dictionary_installed" msgid="8081558343559342962">"Nainštalované"</string> <string name="dictionary_disabled" msgid="8950383219564621762">"Nainštalovaný, zakázaný"</string> <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Probl. s prip. k sl."</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Obnoviť"</string> <string name="last_update" msgid="730467549913588780">"Posledná aktualizácia"</string> <string name="message_updating" msgid="4457761393932375219">"Prebieha kontrola aktualizácií"</string> - <string name="message_loading" msgid="8689096636874758814">"Načítava sa..."</string> + <string name="message_loading" msgid="5638680861387748936">"Prebieha načítavanie..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Hlavný slovník"</string> <string name="cancel" msgid="6830980399865683324">"Zrušiť"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Nastavenia"</string> <string name="install_dict" msgid="180852772562189365">"Inštalovať"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Zrušiť"</string> <string name="delete_dict" msgid="756853268088330054">"Odstrániť"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Pre vybratý jazyk mobilného zariadenia je k dispozícii slovník.<br/> Slovník jazyka <xliff:g id="LANGUAGE">%1$s</xliff:g> vám odporúčame <b>prevziať</b>. Pomôže vám pri zadávaní textu.<br/> <br/> V sieti 3G môže preberanie chvíľu trvať. Ak nemáte <b>neobmedzený dátový program</b>, môžu sa účtovať poplatky.<br/> Ak s určitosťou neviete aký dátový program používate, vyhľadajte pripojenie k sieti Wi-Fi a preberanie sa spustí automaticky.<br/> <br/> Tip: Slovníky môžete v mobilnom zariadení preberať a odstraňovať v časti <b>Jazyk a vstup</b> ponuky <b>Nastavenia</b>."</string> - <string name="download_over_metered" msgid="1643065851159409546">"Prevziať (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="2176209579313941583">"Prevziať cez sieť Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"K dispozícii je slovník pre jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Pre vybratý jazyk mobilného zariadenia je k dispozícii slovník.<br/> Slovník jazyka <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> vám odporúčame <b>stiahnuť</b>. Pomôže vám pri zadávaní textu.<br/> <br/> V sieti 3G môže sťahovanie trvať jednu až dve minúty. Ak nemáte <b>neobmedzený dátový program</b>, môžu sa účtovať poplatky.<br/> Ak s určitosťou neviete aký dátový program používate, vyhľadajte pripojenie k sieti Wi-Fi a sťahovanie sa spustí automaticky.<br/> <br/> Tip: Slovníky môžete v mobilnom zariadení sťahovať a odstraňovať v časti <b>Jazyk a vstup</b> ponuky <b>Nastavenia</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Stiahnuť (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Stiahnuť cez sieť Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"K dispozícii je slovník pre jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Stlačením skontrolujete a prevezmete"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Preberanie: návrhy pre jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> budú čoskoro k dispozícii."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Sťahovanie: návrhy pre jazyk <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> budú čoskoro k dispozícii."</string> <string name="version_text" msgid="2715354215568469385">"Verzia <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Pridať"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Pridať do slovníka"</string> diff --git a/java/res/values-sl/strings-action-keys.xml b/java/res/values-sl/strings-action-keys.xml index 0235887af..dc0c44f5a 100644 --- a/java/res/values-sl/strings-action-keys.xml +++ b/java/res/values-sl/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Prej."</string> <string name="label_done_key" msgid="7564866296502630852">"Konec"</string> <string name="label_send_key" msgid="482252074224462163">"Pošl."</string> + <string name="label_search_key" msgid="7965186050435796642">"Iskanje"</string> <string name="label_pause_key" msgid="2225922926459730642">"Zaus."</string> <string name="label_wait_key" msgid="5891247853595466039">"Čakaj"</string> </resources> diff --git a/java/res/values-sl/strings-config-important-notice.xml b/java/res/values-sl/strings-config-important-notice.xml new file mode 100644 index 000000000..d5bed6fd8 --- /dev/null +++ b/java/res/values-sl/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Vaša sporočila in vnesene podatke uporabi za boljše predloge"</string> +</resources> diff --git a/java/res/values-sl/strings-letter-descriptions.xml b/java/res/values-sl/strings-letter-descriptions.xml new file mode 100644 index 000000000..6415c997c --- /dev/null +++ b/java/res/values-sl/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Kazalec ženskega vrstilnika"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak »mikro«"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Kazalec moškega vrstilnika"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostri S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A s krativcem"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A z ostrivcem"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A s cirkumfleksom"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A s tildo"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A z dierezo"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A s krogcem"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Ligatura AE"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C s sedijem"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E s krativcem"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E z ostrivcem"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E s cirkumfleksom"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E z dierezo"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I s krativcem"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I z ostrivcem"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I s cirkumfleksom"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I z dierezo"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Latinska črka Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N s tildo"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O s krativcem"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O z ostrivcem"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O s cirkumfleksom"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O s tildo"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O z dierezo"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O s črtico"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U s krativcem"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U z ostrivcem"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U s cirkumfleksom"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U z dierezo"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y z ostrivcem"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Latinska črka Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y z dierezo"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A z dolžino"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A s polkrogcem"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A z repkom spodaj"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C z ostrivcem"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C s cirkumfleksom"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C s piko zgoraj"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C s strešico"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D s strešico"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D s črtico"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E z dolžino"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E s polkrogcem"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E s piko zgoraj"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E z repkom spodaj"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E s strešico"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G s cirkumfleksom"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G s polkrogcem"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G s piko zgoraj"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G s sedijem"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H s cirkumfleksom"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H s črtico"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I s tildo"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I z dolžino"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I s polkrogcem"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I z repkom spodaj"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I brez pike"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatura IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J s cirkumfleksom"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K s sedijem"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Latinska črka Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L z ostrivcem"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L s sedijem"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L s strešico"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L s srednjo piko"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L s črtico"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N z ostrivcem"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N s sedijem"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N s strešico"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N z opuščajem spredaj"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Latinska črka Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O z dolžino"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O s polkrogcem"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O z dvojnim ostrivcem"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatura OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R z ostrivcem"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R s sedijem"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R s strešico"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S z ostrivcem"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S s cirkumfleksom"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S s sedijem"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S s strešico"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T s sedijem"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T s strešico"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T s črtico"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U s tildo"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U z dolžino"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U s polkrogcem"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U s krogcem zgoraj"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U z dvojnim ostrivcem"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U z repkom spodaj"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W s cirkumfleksom"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y s cirkumfleksom"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z z ostrivcem"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z s piko zgoraj"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z s strešico"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dolgi S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O z buckastim ostrivcem"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U z buckastim ostrivcem"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S z vejico spodaj"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T z vejico spodaj"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Latinska črka Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A s piko spodaj"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A z zanko zgoraj"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A s cirkumfleksom in ostrivcem"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A s cirkumfleksom in krativcem"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A s cirkumfleksom in zanko zgoraj"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A s cirkumfleksom in tildo"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A s cirkumfleksom in piko spodaj"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A s polkrogcem in ostrivcem"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A s polkrogcem in krativcem"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A s polkrogcem in zanko zgoraj"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A s polkrogcem in tildo"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A s polkrogcem in piko spodaj"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E s piko spodaj"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E z zanko zgoraj"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E s tildo"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E s cirkumfleksom in ostrivcem"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E s cirkumfleksom in krativcem"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E s cirkumfleksom in zanko zgoraj"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E s cirkumfleksom in tildo"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E s cirkumfleksom in piko spodaj"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I z zanko zgoraj"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I s piko spodaj"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O s piko spodaj"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O z zanko zgoraj"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O s cirkumfleksom in ostrivcem"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O s cirkumfleksom in krativcem"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O s cirkumfleksom in zanko zgoraj"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O s cirkumfleksom in tildo"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O s cirkumfleksom in piko spodaj"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O z buckastim ostrivcem in ostrivcem"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O z buckastim ostrivcem in krativcem"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O z buckastim ostrivcem in zanko zgoraj"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O z buckastim ostrivcem in tildo"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O z buckastim ostrivcem in piko spodaj"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U s piko spodaj"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U z zanko zgoraj"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U z buckastim ostrivcem in ostrivcem"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U z buckastim ostrivcem in krativcem"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U z buckastim ostrivcem in zanko zgoraj"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U z buckastim ostrivcem in tildo"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U z buckastim ostrivcem in piko spodaj"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y s krativcem"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y s piko spodaj"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y z zanko zgoraj"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y s tildo"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrnjeni klicaj"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Desni sredinski narekovaj"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Srednja pika"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Nadpisana enka"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Levi sredinski narekovaj"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrnjeni vprašaj"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Levi enojni zgornji narekovaj"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Desni enojni zgornji narekovaj"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enojni spodnji narekovaj"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Levi dvojni zgornji narekovaj"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Desni dvojni zgornji narekovaj"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Križec"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvojni križec"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Znak za promile"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Simbol za označevanje minut ali čevljev"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvojni simbol za označevanje minut ali čevljev"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enojni desni sredinski narekovaj"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Enojni levi sredinski narekovaj"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Nadpisana štirica"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Nadpisana latinska majhna črka n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak za pesos"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Znak za »Care of«"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Puščica desno"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Puščica navzdol"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prazna množica"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Prirastek"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Manj od ali enako"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Več od ali enako"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Črna zvezda"</string> +</resources> diff --git a/java/res/values-sl/strings-talkback-descriptions.xml b/java/res/values-sl/strings-talkback-descriptions.xml new file mode 100644 index 000000000..baef01f7d --- /dev/null +++ b/java/res/values-sl/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Trenutno besedilo je %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ni vnesenega besedila"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Tipka <xliff:g id="KEY_NAME">%1$s</xliff:g> popravi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> v <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Tipka <xliff:g id="KEY_NAME">%1$s</xliff:g> izvede samopopravek"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Neznan znak"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Več simbolov"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simboli"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Izbriši"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simboli"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Črke"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Števila"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Nastavitve"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Preslednica"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Glasovni vnos"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Znaki »emoji«"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Iskanje"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Pika"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Preklop jezika"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Naprej"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Nazaj"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Način »Shift« je omogočen"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Funkcija »Caps Lock« je omogočena"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Način simbolov"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Način za več simbolov"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Način črk"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Način telefona"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Način simbolov telefona"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tipkovnica je skrita"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Prikaz tipkovnice <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum in ura"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-pošta"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"sporočila"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"števila"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"besedilo"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"ura"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Nedavni"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Osebe"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Predmeti"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Narava"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Mesta"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboli"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Čustveni simboli"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Velika črka <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Velika črka I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Velika črka I s piko zgoraj"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Neznan simbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Neznan znak »emoji«"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Nadomestni znaki so na voljo"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Nadomestni znaki se ne upoštevajo"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Nadomestni predlogi so na voljo"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Nadomestni predlogi se ne upoštevajo"</string> +</resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index a0f83c12f..09392e512 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti vnosa"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Ukazi za dnevnik raziskav"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Iskanje imen stikov"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Črkovalnik uporablja vnose s seznama stikov"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibriranje ob pritisku tipke"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Zvok ob pritisku tipke"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Povečaj črko ob pritisku"</string> - <string name="general_category" msgid="1859088467017573195">"Splošno"</string> - <string name="correction_category" msgid="2236750915056607613">"Popravljanje besedila"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Vnos s potezami"</string> - <string name="misc_category" msgid="6894192814868233453">"Druge možnosti"</string> - <string name="advanced_settings" msgid="362895144495591463">"Dodatne nastavitve"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Možnosti za strokovnjake"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Prekl. na drug nač. vnosa"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Tipka za preklop jezika, ki vključuje tudi druge načine vnosa"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Tipka za preklop med jeziki"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Privzeto v sistemu"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Predlagaj imena stikov"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Uporaba imen iz stikov za predloge in popravke"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Prilagojeni predlogi"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Izboljšava aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dva presl. za vnos pike"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Z dvojnim dotikom preslednice vstavite piko in za njo presledek"</string> <string name="auto_cap" msgid="1719746674854628252">"Samod. velike začetnice"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Prikaži pot poteze"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamični plavajoči predogled"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Prikaz predlagane besede med vnosom s prstom"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: shranjeno"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Trenutno besedilo je %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ni vnesenega besedila"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Tipka <xliff:g id="KEY">%1$s</xliff:g> popravi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> v <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Tipka <xliff:g id="KEY">%1$s</xliff:g> izvede samodejno popravljanje"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Koda tipke %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift je vklopljen (dotaknite se, da onemogočite)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock je vklopljen (dotaknite se, da onemogočite)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simboli"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Pisma"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Številke"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Nastavitve"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabulator"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Presledek"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Glasovni vnos"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smeško"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Vračalka"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Iskanje"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Pika"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Preklop jezika"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Naprej"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Nazaj"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Način »Shift« je omogočen"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Način »Caps Lock« je omogočen"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Način »Shift« je onemogočen"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Način simbolov"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Način črk"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Način telefona"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Način simbolov telefona"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tipkovnica je skrita"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Prikaz tipkovnice: <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum in ura"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-pošta"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"sporočila"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"števila"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"besedilo"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"ura"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Vnos besed s potezami"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Vnos presledkov pri vnašanju s potezami z drsenjem po preslednici"</string> <string name="voice_input" msgid="3583258583521397548">"Tipka za glasovni vnos"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ni omogočenih glasovnih načinov vnosa. Preverite nastavitve v razdelku »Jezik in vnos«."</string> <string name="configure_input_method" msgid="373356270290742459">"Nastavitev načinov vnosa"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string> <string name="send_feedback" msgid="1780431884109392046">"Pošljite povratne informacije"</string> <string name="select_language" msgid="3693815588777926848">"Jeziki vnosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotaknite se še enkrat, da shranite"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"S samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah nam pomagate izboljšati urejevalnik načina vnosa."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema tipkovnice"</string> <string name="subtype_en_GB" msgid="88170601942311355">"angleščina (Združeno kraljestvo)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"angleščina (ZDA)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"španščina (ZDA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Angleška (Zdr. kralj.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Angleška (ZDA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"španščina (ZDA) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (tradicionalna)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"angleščina (VB) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"angleščina (ZDA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"španščina (ZDA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tradicionalna)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cirilica)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinica)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Brez jezika (latinice)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Latinica (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Latinica (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Latinica (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Latinica (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Znaki »emoji«"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Barvna shema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Bela"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Modra"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Slogi vnosa po meri"</string> <string name="add_style" msgid="6163126614514489951">"Dodaj slog"</string> <string name="add" msgid="8299699805688017798">"Dodaj"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Omogoči"</string> <string name="not_now" msgid="6172462888202790482">"Ne zdaj"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Isti slog vnosa že obstaja: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Način za preučevanje uporabnosti"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Zakasn. za dolg pritisk tipke"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Trajanje vibr. ob prit. tipke"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Glasn. zvoka ob pritisku tipke"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Branje zunanje datoteke slovarja"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V mapi »Prenosi« ni nobene datoteke slovarja"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Izberite datoteko slovarja, ki jo želite namestiti"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Zares želite namestiti to datoteko za jezik <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Zares želite namestiti to datoteko za ta jezik: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Prišlo je do napake"</string> <string name="button_default" msgid="3988017840431881491">"Privzeto"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Pozdravljeni v aplikaciji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Osveži"</string> <string name="last_update" msgid="730467549913588780">"Nazadnje posodobljeno"</string> <string name="message_updating" msgid="4457761393932375219">"Iskanje posodobitev"</string> - <string name="message_loading" msgid="8689096636874758814">"Nalaganje ..."</string> + <string name="message_loading" msgid="5638680861387748936">"Nalaganje …"</string> <string name="main_dict_description" msgid="3072821352793492143">"Glavni slovar"</string> <string name="cancel" msgid="6830980399865683324">"Prekliči"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Nastavitve"</string> <string name="install_dict" msgid="180852772562189365">"Namesti"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Prekliči"</string> <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Za izbrani jezik v mobilni napravi je na voljo slovar.<br/> Za izboljšano izkušnjo tipkanja priporočamo, da <b>prenesete</b> slovar za ta jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>.<br/> <br/> Prenos prek povezave 3G lahko traja minuto ali dve. Če nimate <b>neomejenega podatkovnega paketa</b>.<br/>, boste morda morali plačati prenos podatkov. Če ne veste, kateri podatkovni paket imate, priporočamo, da poiščete omrežje Wi-Fi in prenos začnete samodejno.<br/> <br/> Nasvet: Slovarje lahko prenesete in odstranite tako, da v meniju <b>Nastavitve</b> v mobilni napravi odprete <b>Jezik in vnos</b>."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Za izbrani jezik v mobilni napravi je na voljo slovar.<br/> Za izboljšano izkušnjo tipkanja priporočamo, da <b>prenesete</b> slovar za ta jezik: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>.<br/> <br/> Prenos prek povezave 3G lahko traja minuto ali dve. Če nimate <b>neomejenega podatkovnega paketa</b>.<br/>, boste morda morali plačati prenos podatkov. Če ne veste, kateri podatkovni paket imate, priporočamo, da poiščete omrežje Wi-Fi in prenos začnete samodejno.<br/> <br/> Nasvet: slovarje lahko prenesete in odstranite tako, da v meniju <b>Nastavitve</b> v mobilni napravi odprete <b>Jezik in vnos</b>."</string> <string name="download_over_metered" msgid="1643065851159409546">"Prenesi zdaj (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Prenos prek povezave Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Slovar je na voljo za jezik <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Na voljo je slovar za ta jezik: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled in prenos"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Predlogi za prenos za jezik <xliff:g id="LANGUAGE">%1$s</xliff:g> bodo kmalu pripravljeni."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Prenos: predlogi za jezik <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> bodo kmalu na voljo."</string> <string name="version_text" msgid="2715354215568469385">"Različica <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Dodaj"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Dodaj v slovar"</string> diff --git a/java/res/values-sr/strings-action-keys.xml b/java/res/values-sr/strings-action-keys.xml index 1ce0ed7fb..c130bedf8 100644 --- a/java/res/values-sr/strings-action-keys.xml +++ b/java/res/values-sr/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Претх"</string> <string name="label_done_key" msgid="7564866296502630852">"Готов"</string> <string name="label_send_key" msgid="482252074224462163">"Шаљи"</string> + <string name="label_search_key" msgid="7965186050435796642">"Тражи"</string> <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string> <string name="label_wait_key" msgid="5891247853595466039">"Чекај"</string> </resources> diff --git a/java/res/values-sr/strings-config-important-notice.xml b/java/res/values-sr/strings-config-important-notice.xml new file mode 100644 index 000000000..943135cfd --- /dev/null +++ b/java/res/values-sr/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Користи комуникације и унете податке ради побољшања предлога"</string> +</resources> diff --git a/java/res/values-sr/strings-letter-descriptions.xml b/java/res/values-sr/strings-letter-descriptions.xml new file mode 100644 index 000000000..51cabc3b8 --- /dev/null +++ b/java/res/values-sr/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Знак за редни број у женском роду"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак микро"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Знак за редни број у мушком роду"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Оштро с"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Краткоузлазно а"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Дугоузлазно а"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"А са циркумфлексом"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"А са тилдом"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"А са умлаутом"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"А са кружићем изнад"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Лигатура а и е"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Ц са седиљом"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Краткоузлазно е"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Дугоузлазно е"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Е са циркумфлексом"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Е са умлаутом"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Краткоузлазно и"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Дугоузлазно и"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"И са циркумфлексом"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"И са умлаутом"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ет"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Н са тилдом"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Краткоузлазно о"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Дугоузлазно о"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"О са циркумфлексом"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"О са тилдом"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"О са умлаутом"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Прецртано о"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Краткоузлазно у"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Дугоузлазно у"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"У са циркумфлексом"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"У са умлаутом"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Дугоузлазни ипсилон"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Ипсилон са умлаутом"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"А са макроном"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"А са бревом"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"А са огонеком"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Дугоузлазно ц"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Ц са циркумфлексом"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Ц са тачком изнад"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Ч"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Д са квачицом"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Ђ"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Е са макроном"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Е са бревом"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Е са тачком изнад"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Е са огонеком"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Е са квачицом"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Г са циркумфлексом"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Г са бревом"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Г са тачком изнад"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Г са седиљом"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Х са циркумфлексом"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Прецртано х"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"И са тилдом"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"И са макроном"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"И са бревом"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"И са огонеком"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"И без тачке"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Лигатура и и ј"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Ј са циркумфлексом"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"К са седиљом"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Дугоузлазно л"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Л са седиљом"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Л са квачицом"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"Л са тачком на средини"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Прецртано л"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Дугоузлазно н"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Н са седиљом"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Н са квачицом"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Н коме претходи апостроф"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Ангма"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"О са макроном"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"О са бревом"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"О са двоструким акутним акцентом"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Лигатура о и е"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Дугоузлазно р"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Р са седиљом"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Р са квачицом"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Дугоузлазно с"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"С са циркумфлексом"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"С са седиљом"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Ш"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Т са седиљом"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Т са квачицом"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Прецртано т"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"У са тилдом"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"У са макроном"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"У са бревом"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"У са кружићем изнад"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"У са двоструким акутним акцентом"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"У са огонеком"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Дупло ве са циркумфлексом"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Ипсилон са циркумфлексом"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Дугоузлазно з"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"З са тачком изнад"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Ж"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Дуго с"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"О са рогом"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"У са рогом"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"С са зарезом испод"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Т са зарезом испод"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"А са тачком испод"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"А са куком изнад"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"А са циркумфлексом, дугоузлазно"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"А са циркумфлексом, краткоузлазно"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"А са циркумфлексом и куком изнад"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"А са циркумфлексом и тилдом"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"А са циркумфлексом и тачком испод"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"А са бревом, дугоузлазно"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"А са бревом, краткоузлазно"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"А са бревом и куком изнад"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"А са бревом и тилдом"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"А са бревом и тачком испод"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Е са тачком испод"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Е са куком изнад"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Е са тилдом"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Е са циркумфлексом, дугоузлазно"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Е са циркумфлексом, краткоузлазно"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Е са циркумфлексом и куком изнад"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Е са циркумфлексом и тилдом"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Е са циркумфлексом и тачком испод"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"И са куком изнад"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"И са тачком испод"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"О са тачком испод"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"О са куком изнад"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"О са циркумфлексом, дугоузлазно"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"О са циркумфлексом, краткоузлазно"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"О са циркумфлексом и куком изнад"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"О са циркумфлексом и тилдом"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"О са циркумфлексом и тачком испод"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"О са рогом, дугоузлазно"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"О са рогом, краткоузлазно"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"О са рогом и куком изнад"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"О са рогом и тилдом"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"О са рогом и тачком испод"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"У са тачком испод"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"У са куком изнад"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"У са рогом, дугоузлазно"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"У са рогом, краткоузлазно"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"У са рогом и куком изнад"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"У са рогом и тилдом"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"У са рогом и тачком испод"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Краткоузлазни ипсилон"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Ипсилон са тачком испод"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Ипсилон са куком изнад"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Ипсилон са тилдом"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Обрнути знак узвика"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Леви двоструки угласти наводници"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Тачка на средини"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Један у експонентном тексту"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Десни двоструки угласти наводници"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Обрнути знак питања"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Леви једноструки наводник"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Десни једноструки наводник"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Једноструки доњи отворени наводник"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Леви двоструки наводник"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Десни двоструки наводник"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Обелиск"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Двоструки обелиск"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак за промил"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Прим"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Дупли прим"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Леви једноструки угласти наводник"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Десни једноструки угласти наводник"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Четири у експонентном тексту"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Мало латинично н у експонентном тексту"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак за пезо"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"За"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрелица надесно"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрелица надоле"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Празан скуп"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Повећање"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Мање или једнако"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Веће или једнако"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Црна звездица"</string> +</resources> diff --git a/java/res/values-sr/strings-talkback-descriptions.xml b/java/res/values-sr/strings-talkback-descriptions.xml new file mode 100644 index 000000000..974ad3a34 --- /dev/null +++ b/java/res/values-sr/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Укључите слушалице да бисте чули наглас изговорене тастере за лозинку."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Тренутни текст је %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст није унет"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> исправља <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> у <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> обавља аутоматско исправљање"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Непознати знак"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Још симбола"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Симболи"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Избриши"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Симболи"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Слова"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Бројеви"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Подешавања"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Картица"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Размак"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Гласовни унос"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Емоџи"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Претражи"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Тачка"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Пребаци језик"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Претходно"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Следеће"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift је омогућен"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock је омогућен"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Режим симбола"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Режим Још симбола"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Режим слова"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Режим телефона"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Режим симбола телефона"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Тастатура је сакривена"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Приказујемо тастатуру у режиму <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"датум"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"датум и време"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"имејл"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"размена порука"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"број"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"телефон"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"текст"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"време"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Недавни контакти"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Људи"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Предмети"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Природа"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Места"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Симболи"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Емотикони"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Велико <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Велико И"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Велико И са тачком изнад"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Непознат симбол"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Непознати емоџи"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Доступни су алтернативни знаци"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Алтернативни знаци су одбачени"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Доступни су алтернативни предлози"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Алтернативни предлози су одбачени"</string> +</resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index ce4978ff5..4f1e42662 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Опције уноса"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Команде евиденције истраживања"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Потражи имена контаката"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Контролор правописа користи уносе са листе контаката"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вибрирај на притисак тастера"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук на притисак тастера"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Искачући прозор приликом притиска тастера"</string> - <string name="general_category" msgid="1859088467017573195">"Опште"</string> - <string name="correction_category" msgid="2236750915056607613">"Исправљање текста"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Унос покретом"</string> - <string name="misc_category" msgid="6894192814868233453">"Друге опције"</string> - <string name="advanced_settings" msgid="362895144495591463">"Напредна подешавања"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Опције за стручњаке"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Пребаци на друге методе уноса"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Тастер за пребацивање језика обухвата и друге методе уноса"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Тастер за пребацивање језика"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Подразумевано"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Предложи имена контаката"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Користи имена из Контаката за предлоге и исправке"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Персонализовани предлози"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Побољшајте апликацију <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Тачка и размак"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Двоструким додиром размака умеће се тачка праћена размаком"</string> <string name="auto_cap" msgid="1719746674854628252">"Аутоматски унос великих слова"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Прикажи траг покрета"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамички плутајући преглед"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Приказује предложену реч при уносу покретом"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сачувано"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Укључите слушалице да бисте чули наглас изговорене тастере за лозинку."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Тренутни текст је %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст није унет"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> исправља <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> у <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> обавља функцију аутоматског исправљања"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Кôд тастера %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift је укључен (додирните да бисте га онемогућили)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock је укључен (додирните да бисте га онемогућили)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Симболи"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Слова"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Бројеви"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Подешавања"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Размак"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Гласовни унос"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Смајли"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Претражи"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Тачка"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Пребаци језик"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Следеће"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Претходно"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift је омогућен"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock је омогућен"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift је онемогућен"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Режим симбола"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим слова"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим телефона"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим симбола телефона"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Тастатура је сакривена"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Приказује се тастатура у режиму <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"датум"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"датум и време"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"адреса е-поште"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"размена порука"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"број"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефон"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"време"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Покрет за фразе"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Уносите размаке током покрета преласком до тастера за размак"</string> <string name="voice_input" msgid="3583258583521397548">"Тастер за гласовни унос"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ниједан метод гласовног уноса није омогућен. Проверите Подешавања језика и уноса."</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигурисање метода уноса"</string> <string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string> <string name="send_feedback" msgid="1780431884109392046">"Пошаљи повратне информације"</string> <string name="select_language" msgid="3693815588777926848">"Језици уноса"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Поново додирните да бисте сачували"</string> <string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Помозите нам да побољшамо овај уређивач метода уноса тако што ћете аутоматски слати статистику коришћења и извештаје о отказивању"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Тема тастатуре"</string> <string name="subtype_en_GB" msgid="88170601942311355">"енглески (УК)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"енглески (САД)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"шпански (САД)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"енглески (УК) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"енглески (САД) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"шпански (САД) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (традиционални)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"енглески (УК) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"енглески (САД) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"шпански (САД) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиционални)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ћирилица)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (латиница)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Нема језика (абецеда)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Абецеда (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Абецеда (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Абецеда (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Абецеда (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Емотикони"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Шема боја"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Бела"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Плава"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Прилаг. стилови уноса"</string> <string name="add_style" msgid="6163126614514489951">"Додав. стила"</string> <string name="add" msgid="8299699805688017798">"Додај"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Омогући"</string> <string name="not_now" msgid="6172462888202790482">"Не сада"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Исти стил уноса већ постоји: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим за студију могућности коришћења"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Одлагање при дугом притиску"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Трајање вибрације при притиску"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Јачина звука при притиску"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читање датотеке спољног речника"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У директоријуму Преузимања нема датотека речника"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Избор датотеке речника за инсталирање"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Желите ли стварно да инсталирате ову датотеку за <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Желите ли стварно да инсталирате ову датотеку за <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Дошло је до грешке"</string> <string name="button_default" msgid="3988017840431881491">"Подразумевано"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Добро дошли у <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Освежи"</string> <string name="last_update" msgid="730467549913588780">"Последње ажурирање"</string> <string name="message_updating" msgid="4457761393932375219">"Тражење ажурирања"</string> - <string name="message_loading" msgid="8689096636874758814">"Учитавање..."</string> + <string name="message_loading" msgid="5638680861387748936">"Учитавање…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Главни речник"</string> <string name="cancel" msgid="6830980399865683324">"Откажи"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Подешавања"</string> <string name="install_dict" msgid="180852772562189365">"Инсталирај"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Откажи"</string> <string name="delete_dict" msgid="756853268088330054">"Избриши"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Доступан је речник за изабрани језик на мобилном уређају.<br/> Препоручујемо да <b>преузмете </b> речник за <xliff:g id="LANGUAGE">%1$s</xliff:g> да бисте побољшали доживљај куцања.<br/> <br/> Преузимање може да траје минут или два преко 3G мреже. Трошкови ће можда бити наплаћени ако немате <b>претплатнички пакет без ограничења</b>.<br/> Ако нисте сигурни који претплатнички пакет имате, препоручујемо да пронађете Wi-Fi везу да бисте аутоматски започели преузимање.<br/> <br/> Савет: Речнике можете да преузимате и уклањате тако што ћете посетити <b>Језик и унос</b> у менију <b>Подешавања</b> мобилног уређаја."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Доступан је речник за изабрани језик на мобилном уређају.<br/> Препоручујемо вам да <b>преузмете</b> речник за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> да бисте побољшали доживљај куцања.<br/> <br/> Преузимање може да траје минут или два преко 3G мреже. Трошкови ће можда бити наплаћени ако немате <b>претплатнички пакет без ограничења</b>.<br/> Ако нисте сигурни који претплатнички пакет имате, препоручујемо вам да пронађете Wi-Fi везу да бисте аутоматски започели преузимање.<br/> <br/> Савет: Речнике можете да преузимате и уклањате ако одете на <b>Језик и унос</b> у менију <b>Подешавања</b> на мобилном уређају."</string> <string name="download_over_metered" msgid="1643065851159409546">"Преузми одмах (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Преузми преко Wi-Fi-ја"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Речник је доступан за <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Доступан је речник за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Притисните за преглед и преузимање"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Преузимање: Предлози за <xliff:g id="LANGUAGE">%1$s</xliff:g> ће ускоро бити спремни."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Преузимање: Предлози за <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ће ускоро бити спремни."</string> <string name="version_text" msgid="2715354215568469385">"Верзија <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Додај"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Додавање у речник"</string> diff --git a/java/res/values-sv/strings-action-keys.xml b/java/res/values-sv/strings-action-keys.xml index e13860811..87926fb8f 100644 --- a/java/res/values-sv/strings-action-keys.xml +++ b/java/res/values-sv/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Föreg"</string> <string name="label_done_key" msgid="7564866296502630852">"Klart"</string> <string name="label_send_key" msgid="482252074224462163">"Sänd"</string> + <string name="label_search_key" msgid="7965186050435796642">"Sökning"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string> <string name="label_wait_key" msgid="5891247853595466039">"Vänta"</string> </resources> diff --git a/java/res/values-sv/strings-config-important-notice.xml b/java/res/values-sv/strings-config-important-notice.xml new file mode 100644 index 000000000..9b9b92e46 --- /dev/null +++ b/java/res/values-sv/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Få bättre förslag genom att använda tidigare angiven data och annan kommunikation"</string> +</resources> diff --git a/java/res/values-sv/strings-letter-descriptions.xml b/java/res/values-sv/strings-letter-descriptions.xml new file mode 100644 index 000000000..a0a594fef --- /dev/null +++ b/java/res/values-sv/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminin ordningsindikator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikrotecken"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Maskulin ordningsindikator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Dubbel-s"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grav accent"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akut accent"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, cirkumflex accent"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, trema"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring ovanför"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatur"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilj"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grav accent"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akut accent"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, cirkumflex accent"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, trema"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grav accent"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akut accent"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, cirkumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, trema"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grav accent"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akut accent"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, cirkumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, trema"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, snedstreck"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grav accent"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akut accent"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, cirkumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, trema"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akut accent"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, trema"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, streck ovanför"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brevis"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, svans"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akut accent"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, cirkumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punkt ovanför"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, hake"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, hake"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, snedstreck"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, streck ovanför"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brevis"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punkt ovanför"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, svans"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, hake"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, cirkumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brevis"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punkt ovanför"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilj"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, cirkumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, snedstreck"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, streck ovanför"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brevis"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, svans"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I utan punkt"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatur"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, cirkumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilj"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akut accent"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilj"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, hake"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, halvhög punkt"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, snedstreck"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akut accent"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilj"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, hake"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, med apostrof före"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, diakritiskt tecken"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brevis"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dubbel akut accent"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatur"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akut accent"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilj"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, hake"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akut accent"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, cirkumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilj"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, hake"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilj"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, hake"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, snedstreck"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, streck ovanför"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brevis"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring ovanför"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dubbel akut accent"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, svans"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, cirkumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, cirkumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akut accent"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punkt ovanför"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, hake"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Långt s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, komma nedanför"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, komma nedanför"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punkt nedanför"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hake ovanför"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, cirkumflex och akut accent"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, cirkumflex och grav accent"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, cirkumflex och hake ovanför"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, cirkumflex och tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, cirkumflex och punkt nedanför"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brevis och akut accent"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brevis och grav accent"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brevis och hake ovanför"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brevis och tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brevis och punkt nedanför"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punkt nedanför"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hake ovanför"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, cirkumflex och akut accent"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, cirkumflex och grav accent"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, cirkumflex och hake ovanför"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, cirkumflex och tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, cirkumflex och punkt nedanför"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hake ovanför"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punkt nedanför"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punkt nedanför"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hake ovanför"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, cirkumflex och akut accent"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, cirkumflex och grav accent"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, cirkumflex och hake ovanför"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, cirkumflex och tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, cirkumflex och punkt nedanför"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn och akut accent"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn och grav accent"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn och hake ovanför"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn och tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn och punkt nedanför"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punkt nedanför"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hake ovanför"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn och akut accent"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn och grav accent"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn och hake ovanför"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn och tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn och punkt nedanför"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grav accent"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punkt nedanför"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hake ovanför"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Upp och nedvänt utropstecken"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Gåsögon som pekar åt vänster"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Halvhög punkt"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Upphöjt läge (ett)"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Gåsögon som pekar åt höger"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Upp och nedvänt frågetecken"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Vänsterställt enkelt citattecken"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Högerställt enkelt citattecken"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkelt lågt 9-citattecken"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Vänsterställt dubbelt citattecken"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Högerställt dubbelt citattecken"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kors"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubbelkors"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promilletecken"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Primtecken"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubbelprimtecken"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Vänsterställt enkelt vinkelcitationstecken"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Högerställt enkelt vinkelcitationstecken"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Upphöjt läge (fyra)"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Upphöjt läge, litet latinskt n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Pesotecken"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"c/o"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Högerpil"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Nedåtpil"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tomma mängden"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Öka"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mindre än eller lika med"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Större än eller lika med"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Svart stjärna"</string> +</resources> diff --git a/java/res/values-sv/strings-talkback-descriptions.xml b/java/res/values-sv/strings-talkback-descriptions.xml new file mode 100644 index 000000000..e3f7ca131 --- /dev/null +++ b/java/res/values-sv/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Anslut hörlurar om du vill att lösenordet ska läsas upp."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Nuvarande text är %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Ingen text har angetts"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Om du trycker på <xliff:g id="KEY_NAME">%1$s</xliff:g> rättas <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> till <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Om du trycker på <xliff:g id="KEY_NAME">%1$s</xliff:g> utförs autokorrigering"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Okänt tecken"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Skift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Fler symboler"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Skift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Symboler"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Skift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Ta bort"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Symboler"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Bokstäver"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Siffror"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Inställningar"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tabb"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Blanksteg"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Röstindata"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Retur"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Sökning"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Punkt"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Byt språk"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Nästa"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Föregående"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Skift aktiverat"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock är aktiverat"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbolläge"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Läge med fler symboler"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Bokstavsläge"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefonläge"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefonsymbolläge"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Tangentbordet är dolt"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Tangentbord för <xliff:g id="KEYBOARD_MODE">%s</xliff:g> visas"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"datum"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"datum och tid"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-post"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"sms/mms"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"siffror"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefonnummer"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"text"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"klockslag"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"webbadresser"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Senaste"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Personer"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Föremål"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Natur"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Platser"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboler"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Uttryckssymboler"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Versalt <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Versalt I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Versalt I, punkt ovanför"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Okänd symbol"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Okänd emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternativa tecken är tillgängliga"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternativa tecken avvisas"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternativa förslag är tillgängliga"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternativa förslag avvisas"</string> +</resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index afe349afd..798b26e27 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Inmatningsalternativ"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Loggkommandon"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Sök namn på kontakter"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"I stavningskontrollen används poster från kontaktlistan"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrera vid tangenttryck"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Knappljud"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Popup vid knapptryck"</string> - <string name="general_category" msgid="1859088467017573195">"Allmänt"</string> - <string name="correction_category" msgid="2236750915056607613">"Textkorrigering"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Svepskrivning"</string> - <string name="misc_category" msgid="6894192814868233453">"Andra alternativ"</string> - <string name="advanced_settings" msgid="362895144495591463">"Avancerade inställningar"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Alternativ för experter"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Byt till annan inmatning"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Språkbytesknappen omfattar även andra inmatningsmetoder"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Knapp för att byta språk"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Standardinställning"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Föreslå kontaktnamn"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Använd namn från Kontakter för förslag och korrigeringar"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Anpassade förslag"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Förbättra <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelt blanksteg = punkt"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbelt blanksteg ger en punkt följt av mellanslag"</string> <string name="auto_cap" msgid="1719746674854628252">"Automatiska versaler"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Visa spår efter rörelse"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visa ordförslag vid svepskrivning"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ordförslaget visas i rörelsen medan du skriver"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Anslut hörlurar om du vill att lösenordet ska läsas upp."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Nuvarande text är %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Ingen text har angetts"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Om du trycker på <xliff:g id="KEY">%1$s</xliff:g> rättas <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> till <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Om du trycker på <xliff:g id="KEY">%1$s</xliff:g> utförs autokorrigering"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Nyckelkod %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Skift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Skift på (knacka lätt för att inaktivera)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock på (knacka lätt för att inaktivera)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Symboler"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Bokstäver"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Siffror"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Inställningar"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tabb"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Blanksteg"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Röstinmatning"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Uttryckssymbol"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Retur"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Sök"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Punkt"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Byt språk"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Nästa"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Föregående"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Skift är aktiverat"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock är aktiverat"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Skift är inaktiverat"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Symbolläge"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Bokstavsläge"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefonläge"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefonsymbolläge"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Tangentbordet är dolt"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Tangentbord för <xliff:g id="MODE">%s</xliff:g> visas"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"datum"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"datum och tid"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-post"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"sms"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"siffror"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefonnummer"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"text"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"klockslag"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"webbadresser"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Frasrörelse"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Infoga blanksteg genom att dra fingret över blankstegstangenten"</string> <string name="voice_input" msgid="3583258583521397548">"Röstinmatningsknapp"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Ingen röstinmatningsmetod har aktiverats. Kontrollera språk- och inmatningsinställningarna."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurera inmatningsmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string> <string name="send_feedback" msgid="1780431884109392046">"Skicka feedback"</string> <string name="select_language" msgid="3693815588777926848">"Inmatningsspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Spara genom att trycka igen"</string> <string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tangentbordstema"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engelskt (brittiskt)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engelskt (amerikanskt)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"spanska (USA)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Engelskt (brittiskt) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Engelskt (amerikanskt) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"spanska (USA (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (traditionell)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Engelska (Storbritannien) <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Engelska (USA) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanska (USA (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (traditionell)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (kyrillisk)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (latinsk)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Inget språk (alfabet)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabet (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabet (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabet (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabet (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Humörsymbol"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Färgschema"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Vit"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Blå"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Anpassade indatastilar"</string> <string name="add_style" msgid="6163126614514489951">"Ny stil"</string> <string name="add" msgid="8299699805688017798">"Lägg till"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Aktivera"</string> <string name="not_now" msgid="6172462888202790482">"Inte nu"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Samma indatastil finns redan: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Läge för studie av användbarhet"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Fördröjning vid långt tryck"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Vibrationslängd för tangenter"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Ljudvolym för tangenter"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Läs extern ordboksfil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Inga ordboksfiler i mappen Hämtningar"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Välj en ordboksfil att installera"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Vill du verkligen installera filen för <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Vill du verkligen installera filen för <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Ett fel uppstod"</string> <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Välkommen till <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Uppdatera"</string> <string name="last_update" msgid="730467549913588780">"Informationen uppdaterades senast"</string> <string name="message_updating" msgid="4457761393932375219">"Söker efter uppdateringar"</string> - <string name="message_loading" msgid="8689096636874758814">"Läser in ..."</string> + <string name="message_loading" msgid="5638680861387748936">"Läser in …"</string> <string name="main_dict_description" msgid="3072821352793492143">"Huvudordlista"</string> <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Inställningar"</string> <string name="install_dict" msgid="180852772562189365">"Installera"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string> <string name="delete_dict" msgid="756853268088330054">"Ta bort"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det finns en ordlista för språket du har valt i din mobila enhet.<br/> Vi rekommenderar att du <b>hämtar</b> ordlistan för <xliff:g id="LANGUAGE">%1$s</xliff:g> så att det blir enklare att skriva.<br/> <br/> Det kan ta någon minut att hämta den via 3G. Avgifter kan tillkomma om du inte har ett abonnemang med <b>obegränsad datatrafik</b>.<br/> Om du är osäker på vilket abonnemang du har rekommenderar vi att du ansluter till ett Wi-Fi-nätverk och hämtar ordlistan automatiskt.<br/> <br/> Tips! Du kan hämta och ta bort ordlistor under <b>Språk och inmatning</b> i menyn <b>Inställningar</b> på den mobila enheten."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Det finns en ordbok för språket du har valt på din mobila enhet.<br/> Vi rekommenderar att du <b>hämtar</b> ordboken på <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>. Då blir det enklare och smidigare att skriva.<br/> <br/> Hämtningen tar en minut eller två om du använder 3G. Avgifter kan tillkomma om du inte har ett <b>abonnemang med obegränsad data</b>.<br/> Om du inte är säker på vad som ingår i ditt abonnemang rekommenderar vi att du hittar en Wi-Fi-anslutning och påbörjar hämtningen automatiskt.<br/> <br/> Tips: Du kan hämta och ta bort ordböcker via <b>Språk och inmatning</b> i menyn <b>Inställningar</b> på din mobila enhet."</string> <string name="download_over_metered" msgid="1643065851159409546">"Hämta nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Hämta via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"En ordlista är tillgänglig för <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"En ordlista för <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> är tillgänglig"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryck om du vill granska och hämta"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Hämtar: förslag för <xliff:g id="LANGUAGE">%1$s</xliff:g> är snart klara."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Hämtar: förslag för <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> är snart klara."</string> <string name="version_text" msgid="2715354215568469385">"Version <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Lägg till"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Lägg till i ordlista"</string> diff --git a/java/res/values-sw/strings-action-keys.xml b/java/res/values-sw/strings-action-keys.xml index 7d8822e80..21ed88108 100644 --- a/java/res/values-sw/strings-action-keys.xml +++ b/java/res/values-sw/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Nyuma"</string> <string name="label_done_key" msgid="7564866296502630852">"Imekamilika"</string> <string name="label_send_key" msgid="482252074224462163">"Tuma"</string> + <string name="label_search_key" msgid="7965186050435796642">"Tafuta"</string> <string name="label_pause_key" msgid="2225922926459730642">"Sitisha"</string> <string name="label_wait_key" msgid="5891247853595466039">"Subiri"</string> </resources> diff --git a/java/res/values-sw/strings-config-important-notice.xml b/java/res/values-sw/strings-config-important-notice.xml new file mode 100644 index 000000000..7b10085b5 --- /dev/null +++ b/java/res/values-sw/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Jifunze kutoka kwenye mawasiliano yako na data iliyocharazwa ili kuboresha mapendekezo"</string> +</resources> diff --git a/java/res/values-sw/strings-letter-descriptions.xml b/java/res/values-sw/strings-letter-descriptions.xml new file mode 100644 index 000000000..2265817d1 --- /dev/null +++ b/java/res/values-sw/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Alama ya herufi \"a\" inayowekwa sehemu ya juu ya nambari kama ishara ya nambari zinazowakilisha nafasi au mtiririko"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Ishara ndogo"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Alama ya herufi \"o\" inayowekwa sehemu ya juu ya nambari kama ishara ya nambari zinazowakilisha nafasi au mtiririko"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S inayotamkwa kwa sauti ya shada, yaani SS"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, ya kutamkwa kwa sauti ya mwendelezo wenye kiwimbi"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, inayotamkwa kwa kuumba mdomo kama o"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, zinazotamkwa kama neno moja"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedila"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, iliyokatwa kwa kijistari kilicholala kuelekea upande wa kulia inayotamkwa kwa kuumba mdomo kama o na kumalizia kama e."</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Alama ya Kilatini inayofanana na p yenye kistari kilichopitiliza kwenda upande wa juu"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, yenye nukta mbili juu ikiwa ni msisitizo wa kuitamka kama ilivyo bila kuiunganisha kama silabi"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, alama ya kijistari juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kuvuta"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, alama ya koma iliyogeuzwa inayowekwa sehemu ya chini ya irabu"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, alama ya kitone inayowekwa sehemu ya juu ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C,inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, iliyokatwa kwa kijistari kilicholala kuelekea upande wa kulia inayotamkwa kwa kuumba mdomo kama o na kumalizia kama e."</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, alama ya kijistari juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kuvuta"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, alama ya kitone inayowekwa sehemu ya juu ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, alama ya koma iliyogeuzwa inayowekwa sehemu ya chini ya irabu"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, alama ya kitone inayowekwa sehemu ya juu ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, iliyokatwa kwa kijistari kilicholala kuelekea upande wa kulia inayotamkwa kwa kuumba mdomo kama o na kumalizia kama e"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, alama ya kijistari juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kuvuta"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, yenye kijistari kilichojikunja kuelekea juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida ya kukatiza"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, alama ya koma iliyogeuzwa inayowekwa sehemu ya chini ya irabu"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I isiyokuwa na kitone sehemu ya juu"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, zinazotamkwa kama neno moja"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Alama inayofanana herufi \"k\" lakini inayotamkwa kama herufi \"g\" katika alfabeti ya Grinlandi"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, yenye alama ya kitone sehemu ya kati kati"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, iliyokatwa kwa kijistari kilicholala kuelekea upande wa kulia inayotamkwa kwa kuumba mdomo kama o na kumalizia kama e."</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, inayotanguliwa na alama ya koma katika kona ya juu kushoto"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Alama ya herufi \"n\" ndogo katika alfabeti ya Kilatini"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, alama ya kijistari juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kuvuta"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, inayotamkwa kwa sauti ya shada inayopazwa"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, zinazotamkwa kama neno moja"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, inayotamkwa kwa sauti nyororo"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, iliyokatwa kwa kijistari kilicholala kuelekea upande wa kulia inayotamkwa kwa kuumba mdomo kama o na kumalizia kama e"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, alama ya kijistari juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kuvuta"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, yenye kijistari kilichojikunja kuelekea juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida ya kukatiza"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, inayotamkwa kwa kuumba mdomo kama o"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, inayotamkwa kwa sauti ya shada inayopazwa"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, inayowekewa kijimkia kwa upande wa kulia chini ikisisitiza irabu kutamkwa kwa sauti ya kubanwa puani"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, alama ya kitone inayowekwa sehemu ya juu ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Herufi ya \"Z\" yenye alama ya \"v\" upande wa juu wa herufi inayotamkwa kwa sauti yenye mwelekeo wa kuanzia juu kisha kushuka na kupanda tena"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, alama ya koma inayowekwa kwenye sehemu ya chini ya baadhi ya herufi katika alfabeti ya Kilatini"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, alama ya koma inayowekwa kwenye sehemu ya chini ya baadhi ya herufi katika alfabeti ya Kilatini"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Alama ya herufi \"e\" iliyogeuzwa inayotumiwa katika baadhi ya irabu"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda pamoja na inayotamkwa kwa sauti ya juu inayopazwa"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, inayotamkwa kwa sauti yenye mwelekeo wa kujipinda pamoja na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya itamkwe kwa sauti ya kawaida lakini ya kukatana kwa sauti iliyopazwa"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata na ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, alama ya kijistari cha kujikunja juu ya irabu kuifanya ya kutamkwa kwa sauti ya kawaida lakini ya kukata na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na inayotamkwa kwa sauti ya kupazwa"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na inayotamkwa kwa sauti ya kupazwa"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, inayotamkwa kwa sauti yenye mwelekeo wa kwenda na kurudi au kujikunja na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, inayotofautisha matamshi kwa sauti ya kupaza"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na inayotamkwa kwa sauti ya juu kali"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na ya kutamkwa kwa sauti ya mwendelezo yenye wimbi"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, alama ya koma inayowekwa kwenye kona ya juu kulia ya herufi \"o\" na \"u\" katika alfabeti ya Kivietnamu na alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, inayotamkwa kwa sauti ya chini nyembamba"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, alama ya kitone inayowekwa sehemu ya chini ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, alama inayofanana na alama ya kuuliza isiyokuwa na kitone chini inayowekwa juu ya irabu kwenye alfabeti ya Kivietnamu inayoifanya itamkwe kwa kupandisha na kushusha sauti"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, ya kutamkwa kwa sauti ya mwendelezo wa kiwimbi"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Alama hisi iliyogeuzwa juu chini"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Alama ya kunukuu yenye pembe mbili zinazoelekea kushoto"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Kitone cha kati"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Nambari moja iliyoandikwa kwa juu kidogo"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Alama ya kunukuu yenye pembe mbili zinazoelekeza kulia"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Kiulizi kilichogeuzwa juu chini"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Alama moja ya kunukuu ya kushoto"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Alama moja ya kunukuu ya kulia"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Alama moja ya koma inayowekwa sehemu ya chini ya baadhi ya herufi"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Alama mbili za kunukuu za kushoto"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Alama mbili za kunukuu za kulia"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Alama ya kurejea"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Alama mbili za kurejea"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Alama ya kuonyesha sehemu moja ya elfu"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Alama inayofanana alama ya koma inayotumiwa kuonyesha aina tofauti za vipimo"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Alama mbili zinazofanana alama za koma inayotumiwa kuonyesha aina tofauti za vipimo"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Alama moja ya kunukuu yenye pembe inayoelekeza kushoto"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Alama moja ya kunukuu yenye pembe inayoelekeza kulia"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Nambari \"4\" inayotumika kama alama inayowekwa kona ya juu kulia ya baadhi ya herufi"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Herufi ndogo ya \"n\" ya kilatini inayowekwa kona ya juu kulia ya baadhi ya herufi"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Alama ya Peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Kupitia kwa"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Kishale kinachoelekeza kulia"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Kishale kinachoelekeza chini"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Seti isiyokuwa na kitu chochote"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Ongezeko"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Ndogo kuliko au sawa na"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Kubwa kuliko au sawa na"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Nyota Nyeusi"</string> +</resources> diff --git a/java/res/values-sw/strings-talkback-descriptions.xml b/java/res/values-sw/strings-talkback-descriptions.xml new file mode 100644 index 000000000..6f84aa865 --- /dev/null +++ b/java/res/values-sw/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Chomeka kifaa cha sauti ili usikie vitufe vya nenosiri vikitamkwa kwa sauti."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Maandishi ya sasa ni %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Hakuna maandishi yaliyoingizwa"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> hurekebisha <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kuwa <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> hufanya marekebisho otomatiki"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Herufi isiyojulikana"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Alama zaidi"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Alama"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Futa"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Alama"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Herufi"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Nambari"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Mipangilio"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Kichupo"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Nafasi"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Kuweka data kwa kutamka"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Rudi"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Utafutaji"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Nukta"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Badilisha lugha"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Linalofuata"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Iililotangulia"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift imewashwa"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock imewashwa"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Hali ya alama"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Hali ya alama zaidi"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Hali ya herufi"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Hali ya simu"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Hali ya alama za simu"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Kibodi imefichwa"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Inaonyesha kibodi ya <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"tarehe"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"tarehe na wakati"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"barua pepe"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"utumaji ujumbe"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"nambari"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"simu"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"maandishi"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"wakati"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Zilizotumika majuzi"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Watu"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Vitu"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Maumbile"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Maeneo"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Alama"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Vikaragosi"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Herufi kubwa <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Herufi I kubwa"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Herufi I kubwa, alama ya kitone inayowekwa sehemu ya juu ya herufi katika alfabeti za Kilatini na Kivietnamu"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Alama isiyojulikana"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji isiyojulikana"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Herufi mbadala zinapatikana"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Herufi mbadala huondolewa"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Mapendekezo mbadala yanapatikana"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Mapendekezo mbadala huondolewa"</string> +</resources> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index 191ad977c..8f2a6624a 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Amri za Kumbukumbu za Utafiti"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Angalia majina ya unaowasiliana nao"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kikagua tahajia hutumia majina yaliyoingizwa katika orodha yako ya anwani"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Toa sauti unapobofya kitufe"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Ibuka kitufe kinapobonyezwa"</string> - <string name="general_category" msgid="1859088467017573195">"Kawaida"</string> - <string name="correction_category" msgid="2236750915056607613">"Marekebisho ya maandishi"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Kuandika kwa ishara"</string> - <string name="misc_category" msgid="6894192814868233453">"Chaguo zingine"</string> - <string name="advanced_settings" msgid="362895144495591463">"Mipangilio ya kina"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Chaguo za wataalamu"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Badilisha hadi kwa mbinu zingine za ingizo"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Ufunguo wa kubadilisha lugha unashughulikia mbinu zingine za ingizo pia"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Kitufe cha kubadilisha lugha"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Chaguo-msingi la mfumo"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Pendekeza majini ya Anwani"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Tumia majina kutoka kwa Anwani kwa mapendekezo na marekebisho"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Mapendekezo yaliyobadilishwa kukufaa"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Boresha <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Kitone baada ya nafasi mbili"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Kugonga mara mbili kwenye upau nafasi kunaingiza kitone kikifuatiwa na nafasi"</string> <string name="auto_cap" msgid="1719746674854628252">"Uwekaji wa herufi kubwa kiotomatiki"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Onyesha njia ya ishara"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Kihakiki kinachobadilika cha kuelea"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Onyesha neno lililopendekezwa unapoonyesha ishara"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Imehifadhiwa"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Chomeka plagi ya kifaa cha kichwa cha kusikiza ili kusikiliza msimbo wa nenosiri inayozungumwa kwa sauti ya juu."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Maandishi ya sasa ni %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Hakuna maandishi yaliyoingizwa"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> hurekebisha <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kuwa <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> hurekebisha kiotomatiki"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Msimbo wa kitufe %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Badilisha"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift imewashwa (gonga ili kulemaza)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock imewashwa (gonga ili kulemaza)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Futa"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Alama"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Herufi"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Nambari"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Mipangilio"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Kichupo"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Nafasi"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Kuweka data kwa kutamka"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Uso wenye tabasamu"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Rudi"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Tafuta"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Nukta"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Badili lugha"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Inayofuata"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Iliyotangulia"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift imewezeshwa"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock imewezeshwa"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift imelemazwa"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Hali ya alama"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Hali ya barua"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Hali ya simu"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Hali ya alama za simu"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Kibodi imefichwa"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Inaonyesha kibodi <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"tarehe"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarehe na wakati"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"barua pepe"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"Utumaji ujumbe"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"nambari"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"simu"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"maandishi"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"wakati"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Ishara ya fungu la maneno"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Weka nafasi wakati wa ishara kwa kuelea katika kitufe cha nafasi"</string> <string name="voice_input" msgid="3583258583521397548">"Kibao cha kuweka data kwa kutamka"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwenye kibodi kuu"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Kwenye kibodi ya ishara"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"Zima"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Maikrofoni kwenye kibodi kuu"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Maikrofoni kwenye kibodi ya ishara"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Kipengele cha kuweka data kwa kutamka kimezimwa"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Hakuna mbinu ya kuweka data kwa kutamka iliyowashwa. Angalia Lugha na mipangilio ya kuingiza data."</string> <string name="configure_input_method" msgid="373356270290742459">"Sanidi mbinu za uingizaji"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string> <string name="send_feedback" msgid="1780431884109392046">"Tuma maoni"</string> <string name="select_language" msgid="3693815588777926848">"Lugha zinazoruhusiwa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Gusa tena ili kuhifadhi"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Wezesha maoni ya watumiaji"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Saidia kuimarisha mbinu hii ya uingizaji wa kihariri, kwa kutuma takwimu za matumizi na ripoti za kuvurugika kiotomatiki"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Maandhari ya kibodi"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Kiingereza cha (Uingereza)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Kiingereza cha (Marekani)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Kihispania (Marekani)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Kiingereza (Uingereza) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Kiingereza (Marekani) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Kihispania (Marekani) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Asili)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Kiingereza (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Kiingereza (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Kihispania (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (cha Jadi)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Kikriliki)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Kilatini)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Hakuna lugha (Alfabeti)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabeti (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabeti (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabeti (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabeti (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Mpangilio wa rangi"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Nyeupe"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Samawati"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Mitindo maalum ya ingizo"</string> <string name="add_style" msgid="6163126614514489951">"Ongeza mtindo"</string> <string name="add" msgid="8299699805688017798">"Ongeza"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Washa"</string> <string name="not_now" msgid="6172462888202790482">"Sio sasa"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Mfumo sawa wa maingizo tayari upo: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modi ya uchunguzi wa utumizi"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ubofyaji kitufe kunakochelewa"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Bonyeza kitufe cha muda wa kutetema"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Bonyeza kitufe cha kiwango cha sauti"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Soma faili ya kamusi ya nje"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Hakuna faili za kamusi katika folda ya Vilivyopakuliwa"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chagua faili ya kamusi ya kusakinisha"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Isakinishe faili hii kwa <xliff:g id="LOCALE_NAME">%s</xliff:g> kweli?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Ungependa kusakinisha faili hii ya <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Kulikuwa na hitilafu"</string> <string name="button_default" msgid="3988017840431881491">"Chaguo-msingi"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Karibu kwenye <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Onyesha upya"</string> <string name="last_update" msgid="730467549913588780">"Ilibadilishwa mwisho"</string> <string name="message_updating" msgid="4457761393932375219">"Inatafuta sasisho..."</string> - <string name="message_loading" msgid="8689096636874758814">"Inapakia..."</string> + <string name="message_loading" msgid="5638680861387748936">"Inapakia…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Kamusi kuu"</string> <string name="cancel" msgid="6830980399865683324">"Ghairi"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Mipangilio"</string> <string name="install_dict" msgid="180852772562189365">"Sakinisha"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Ghairi"</string> <string name="delete_dict" msgid="756853268088330054">"Futa"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Lugha iliyochaguliwa kwenye kifaa chako cha mkononi ina kamusi inayopatikana.<br/> Tunapendekeza<b>upakuaji wa kamusi</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> ili kuboresha hali yako ya kucharaza.<br/> <br/> Upakuaji unaweza kuchukua dakika moja au mbili kukamilika kwenye 3G. Unaweza kutozwa pesa ikiwa huna mpango wa data <b>usio na kipimo </b>.<br/>Ikiwa huna uhakika una mpango gani wa data, tunapendekeza utafute muunganisho wa Wi-Fi ili uanze upakuaji moja kwa moja.<br/> <br/> Kidokezo: Unaweza kupakua na kuondoa kamusi kwa kuenda kwenye<b>Ingizo la & Lugha</b> katika <b>menyu ya Mipangilio</b> ya kifaa chako cha mkononi."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Lugha iliyochaguliwa kwenye kifaa chako cha mkononi ina kamusi inayopatikana.<br/> Tunapendekeza<b>upakuaji wa kamusi ya</b> <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ili kuboresha hali yako ya kuchapa.<br/> <br/> Upakuaji unaweza kuchukua dakika moja au mbili kukamilika kwenye mtandao wa 3G. Unaweza kutozwa ada ikiwa huna mpango wa data <b>usio na kipimo </b>.<br/>Ikiwa huna uhakika una mpango gani wa data, tunapendekeza utafute muunganisho wa Wi-Fi ili uanze upakuaji kiotomatiki.<br/> <br/> Kidokezo: Unaweza kupakua na kuondoa kamusi kwa kuenda kwenye<b>Lugha na Zana za Kuingiza Datalt;/b> katika <b>menyu ya Mipangilio</b> ya kifaa chako cha mkononi."</string> <string name="download_over_metered" msgid="1643065851159409546">"Pakua sasa (MB<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Pakua kwenye Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamusi ya <xliff:g id="LANGUAGE">%1$s</xliff:g> inapatikana"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Kamusi inapatikana ya <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Bonyeza ili kukagua na kupakua"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Inapakua: mapendekezo ya <xliff:g id="LANGUAGE">%1$s</xliff:g> yatakuwa tayari hivi karibuni."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Inapakua: mapendekezo ya <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> yatakuwa tayari hivi karibuni."</string> <string name="version_text" msgid="2715354215568469385">"Toleo la <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ongeza"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Ongeza kwenye kamusi"</string> diff --git a/java/res/values-sw430dp/config-per-form-factor.xml b/java/res/values-sw430dp/config-per-form-factor.xml new file mode 100644 index 000000000..8868081c3 --- /dev/null +++ b/java/res/values-sw430dp/config-per-form-factor.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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. +*/ +--> + +<!-- Configuration values for Large Phone. --> +<resources> + <bool name="config_enable_show_key_preview_popup_option">true</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_key_preview_popup">true</bool> + <bool name="config_default_sound_enabled">false</bool> + <bool name="config_enable_show_voice_key_option">true</bool> + <bool name="config_key_selection_by_dragging_finger">true</bool> + <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if + false --> + <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool> + <bool name="config_use_fullscreen_mode">false</bool> +</resources> diff --git a/java/res/values-sw540dp-land/config.xml b/java/res/values-sw430dp/config-screen-metrics.xml index b3cd7278d..bc1c964af 100644 --- a/java/res/values-sw540dp-land/config.xml +++ b/java/res/values-sw430dp/config-screen-metrics.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2011, The Android Open Source Project +** Copyright 2013, 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. @@ -19,5 +19,6 @@ --> <resources> - <bool name="config_use_fullscreen_mode">false</bool> + <!-- Must be aligned with {@link Constants#SCREEN_METRICS_LARGE_PHONE}. --> + <integer name="config_screen_metrics">1</integer> </resources> diff --git a/java/res/values-sw540dp-land/dimens.xml b/java/res/values-sw540dp-land/dimens.xml deleted file mode 100644 index 002493798..000000000 --- a/java/res/values-sw540dp-land/dimens.xml +++ /dev/null @@ -1,72 +0,0 @@ -<?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. -*/ ---> - -<resources> - <!-- Preferable keyboard height in absolute scale: 45.0mm --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">283.5dp</dimen> - <fraction name="minKeyboardHeight">45%p</fraction> - - <fraction name="keyboard_top_padding_gb">2.444%p</fraction> - <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction> - <fraction name="key_bottom_gap_gb">5.200%p</fraction> - <fraction name="key_horizontal_gap_gb">1.447%p</fraction> - - <fraction name="keyboard_top_padding_holo">2.727%p</fraction> - <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction> - <fraction name="key_bottom_gap_holo">4.5%p</fraction> - <fraction name="key_horizontal_gap_holo">0.9%p</fraction> - - <dimen name="popup_key_height">81.9dp</dimen> - - <!-- left or right padding of label alignment --> - <dimen name="key_label_horizontal_padding">18dp</dimen> - - <fraction name="key_letter_ratio">50%</fraction> - <fraction name="key_large_letter_ratio">48%</fraction> - <fraction name="key_label_ratio">32%</fraction> - <fraction name="key_hint_letter_ratio">23%</fraction> - <fraction name="key_hint_label_ratio">34%</fraction> - <fraction name="key_uppercase_letter_ratio">29%</fraction> - <fraction name="spacebar_text_ratio">30.0%</fraction> - <dimen name="key_uppercase_letter_padding">4dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">3.20%p</fraction> - <fraction name="key_letter_ratio_5row">62%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">36%</fraction> - - <dimen name="suggestions_strip_padding">252.0dp</dimen> - <integer name="max_more_suggestions_row">5</integer> - <fraction name="min_more_suggestions_width">50%</fraction> - - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">26dp</dimen> - <dimen name="gesture_floating_preview_text_offset">76dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">26dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">17dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">10%p</fraction> - <fraction name="emoji_keyboard_row_height">33%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">70%p</fraction> - <integer name="emoji_keyboard_max_key_count">30</integer> - -</resources> diff --git a/java/res/values-sw540dp/dimens.xml b/java/res/values-sw540dp/dimens.xml deleted file mode 100644 index 801b7acb5..000000000 --- a/java/res/values-sw540dp/dimens.xml +++ /dev/null @@ -1,98 +0,0 @@ -<?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. -*/ ---> - -<resources> - <!-- Preferable keyboard height in absolute scale: 48.0mm --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">302.4dp</dimen> - <fraction name="maxKeyboardHeight">46%p</fraction> - <fraction name="minKeyboardHeight">-35.0%p</fraction> - - <dimen name="popup_key_height">63.0dp</dimen> - - <fraction name="keyboard_top_padding_gb">2.291%p</fraction> - <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction> - <fraction name="key_bottom_gap_gb">4.625%p</fraction> - <fraction name="key_horizontal_gap_gb">2.113%p</fraction> - - <fraction name="keyboard_top_padding_holo">2.335%p</fraction> - <fraction name="keyboard_bottom_padding_holo">4.0%p</fraction> - <fraction name="key_bottom_gap_holo">4.5%p</fraction> - <fraction name="key_horizontal_gap_holo">1.565%p</fraction> - - <dimen name="more_keys_keyboard_key_horizontal_padding">6dp</dimen> - <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.2 --> - <dimen name="more_keys_keyboard_slide_allowance">98.3dp</dimen> - <!-- popup_key_height x -1.0 --> - <dimen name="more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen> - - <!-- left or right padding of label alignment --> - <dimen name="key_label_horizontal_padding">6dp</dimen> - <dimen name="key_hint_letter_padding">3dp</dimen> - <dimen name="key_uppercase_letter_padding">3dp</dimen> - - <fraction name="key_letter_ratio">42%</fraction> - <fraction name="key_large_letter_ratio">45%</fraction> - <fraction name="key_label_ratio">25%</fraction> - <fraction name="key_large_label_ratio">32%</fraction> - <fraction name="key_hint_letter_ratio">23%</fraction> - <fraction name="key_hint_label_ratio">28%</fraction> - <fraction name="key_uppercase_letter_ratio">22%</fraction> - <fraction name="key_preview_text_ratio">50%</fraction> - <fraction name="spacebar_text_ratio">28.0%</fraction> - <dimen name="key_preview_height">94.5dp</dimen> - <dimen name="key_preview_offset_gb">16.0dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">3.20%p</fraction> - <fraction name="key_letter_ratio_5row">52%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">27%</fraction> - - <dimen name="key_preview_offset_holo">8.0dp</dimen> - <!-- popup_key_height x -0.5 --> - <dimen name="more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen> - - <dimen name="suggestions_strip_height">44dp</dimen> - <dimen name="more_suggestions_row_height">44dp</dimen> - <integer name="max_more_suggestions_row">6</integer> - <fraction name="min_more_suggestions_width">90%</fraction> - <dimen name="suggestions_strip_padding">94.5dp</dimen> - <dimen name="suggestion_min_width">48.0dp</dimen> - <dimen name="suggestion_padding">12dp</dimen> - <dimen name="suggestion_text_size">22dp</dimen> - <dimen name="more_suggestions_hint_text_size">33dp</dimen> - - <!-- Gesture trail parameters --> - <dimen name="gesture_trail_width">2.5dp</dimen> - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">28dp</dimen> - <dimen name="gesture_floating_preview_text_offset">87dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">28dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">19dp</dimen> - <dimen name="gesture_floating_preview_round_radius">3dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">12.5%p</fraction> - <fraction name="emoji_keyboard_row_height">33%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">60%p</fraction> - <integer name="emoji_keyboard_max_key_count">24</integer> - -</resources> diff --git a/java/res/values-sw600dp-land/config.xml b/java/res/values-sw600dp-land/config.xml new file mode 100644 index 000000000..ba8b52f0b --- /dev/null +++ b/java/res/values-sw600dp-land/config.xml @@ -0,0 +1,68 @@ +<?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. +*/ +--> + +<!-- Configuration values for Small Tablet Landscape. --> +<resources> + <!-- Preferable keyboard height in absolute scale: 45.0mm --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">283.5dp</dimen> + <fraction name="config_min_keyboard_height">45%p</fraction> + + <dimen name="config_more_keys_keyboard_key_height">81.9dp</dimen> + + <fraction name="config_keyboard_top_padding_holo">2.727%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction> + <fraction name="config_key_vertical_gap_holo">4.5%p</fraction> + <fraction name="config_key_horizontal_gap_holo">0.9%p</fraction> + + <fraction name="config_key_letter_ratio">50%</fraction> + <fraction name="config_key_large_letter_ratio">48%</fraction> + <fraction name="config_key_label_ratio">32%</fraction> + <fraction name="config_key_hint_letter_ratio">23%</fraction> + <fraction name="config_key_hint_label_ratio">34%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">29%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">30.0%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="config_key_label_horizontal_padding">18dp</dimen> + <dimen name="config_key_shifted_letter_hint_padding">4dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">3.20%p</fraction> + <fraction name="config_key_letter_ratio_5row">62%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">36%</fraction> + + <dimen name="config_suggestions_strip_height">44dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">180.0dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">54dp</dimen> + <integer name="config_max_more_suggestions_row">5</integer> + <fraction name="config_min_more_suggestions_width">50%</fraction> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">26dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">76dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">26dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">17dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">10%p</fraction> + <fraction name="config_emoji_keyboard_row_height">33%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">70%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">30</integer> +</resources> diff --git a/java/res/values-sw600dp/config-per-form-factor.xml b/java/res/values-sw600dp/config-per-form-factor.xml new file mode 100644 index 000000000..aa9a05482 --- /dev/null +++ b/java/res/values-sw600dp/config-per-form-factor.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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. +*/ +--> + +<!-- Configuration values for Small Tablet. --> +<resources> + <bool name="config_enable_show_key_preview_popup_option">false</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_key_preview_popup">false</bool> + <bool name="config_default_sound_enabled">true</bool> + <bool name="config_enable_show_voice_key_option">false</bool> + <bool name="config_key_selection_by_dragging_finger">false</bool> + <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if + false --> + <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool> + <bool name="config_use_fullscreen_mode">false</bool> +</resources> diff --git a/java/res/layout/emoji_keyboard_tab_label.xml b/java/res/values-sw600dp/config-screen-metrics.xml index 62c552dd8..d16c9253f 100644 --- a/java/res/layout/emoji_keyboard_tab_label.xml +++ b/java/res/values-sw600dp/config-screen-metrics.xml @@ -18,9 +18,7 @@ */ --> -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="0dip" - android:layout_weight="1.0" - android:layout_height="wrap_content" - android:gravity="center" -/> +<resources> + <!-- Must be aligned with {@link Constants#SCREEN_METRICS_SMALL_TABLET}. --> + <integer name="config_screen_metrics">3</integer> +</resources> diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml index e72e4941e..d97538de0 100644 --- a/java/res/values-sw600dp/config.xml +++ b/java/res/values-sw600dp/config.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2013, The Android Open Source Project +** Copyright 2011, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,6 +18,71 @@ */ --> +<!-- Configuration values for Small Tablet Portrait. --> <resources> - <bool name="config_enable_show_voice_key_option">false</bool> + <dimen name="config_key_hysteresis_distance">40.0dp</dimen> + + <!-- Preferable keyboard height in absolute scale: 48.0mm --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">302.4dp</dimen> + <fraction name="config_max_keyboard_height">46%p</fraction> + <fraction name="config_min_keyboard_height">-35.0%p</fraction> + + <dimen name="config_more_keys_keyboard_key_height">63.0dp</dimen> + <dimen name="config_more_keys_keyboard_key_horizontal_padding">6dp</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- config_more_keys_keyboard_key_height x 1.2 --> + <dimen name="config_more_keys_keyboard_slide_allowance">98.3dp</dimen> + + <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">4.0%p</fraction> + <fraction name="config_key_vertical_gap_holo">4.5%p</fraction> + <fraction name="config_key_horizontal_gap_holo">1.565%p</fraction> + <!-- config_more_keys_keyboard_key_height x -0.5 --> + <dimen name="config_more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen> + <dimen name="config_key_preview_offset_holo">8.0dp</dimen> + + <dimen name="config_key_preview_height">94.5dp</dimen> + <fraction name="config_key_preview_text_ratio">50%</fraction> + <fraction name="config_key_letter_ratio">42%</fraction> + <fraction name="config_key_large_letter_ratio">45%</fraction> + <fraction name="config_key_label_ratio">25%</fraction> + <fraction name="config_key_large_label_ratio">32%</fraction> + <fraction name="config_key_hint_letter_ratio">23%</fraction> + <fraction name="config_key_hint_label_ratio">28%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">22%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">28.0%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="config_key_label_horizontal_padding">6dp</dimen> + <dimen name="config_key_hint_letter_padding">3dp</dimen> + <dimen name="config_key_shifted_letter_hint_padding">3dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">3.20%p</fraction> + <fraction name="config_key_letter_ratio_5row">52%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">27%</fraction> + + <dimen name="config_suggestions_strip_height">44dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">54dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">54dp</dimen> + <dimen name="config_more_suggestions_row_height">44dp</dimen> + <integer name="config_max_more_suggestions_row">6</integer> + <fraction name="config_min_more_suggestions_width">90%</fraction> + <dimen name="config_suggestion_min_width">48.0dp</dimen> + <dimen name="config_suggestion_text_horizontal_padding">10dp</dimen> + <dimen name="config_suggestion_text_size">22dp</dimen> + <dimen name="config_more_suggestions_hint_text_size">33dp</dimen> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">28dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">87dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">28dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">19dp</dimen> + <dimen name="config_gesture_floating_preview_round_radius">3dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">12.5%p</fraction> + <fraction name="config_emoji_keyboard_row_height">33%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">24</integer> </resources> diff --git a/java/res/values-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/res/values-sw600dp/donottranslate-config-spacing-and-punctuations.xml new file mode 100644 index 000000000..9cc555fbc --- /dev/null +++ b/java/res/values-sw600dp/donottranslate-config-spacing-and-punctuations.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Symbols that are suggested between words --> + <string name="suggested_punctuations">:,;,\",(,),\',-,/,@,_</string> +</resources> diff --git a/java/res/values-sw540dp/touch-position-correction.xml b/java/res/values-sw600dp/touch-position-correction.xml index 932b8fc72..6aaa605a6 100644 --- a/java/res/values-sw540dp/touch-position-correction.xml +++ b/java/res/values-sw600dp/touch-position-correction.xml @@ -37,17 +37,6 @@ </string-array> <string-array - name="touch_position_correction_data_gb" - translatable="false" - > - <!-- The default touch position data (See com.android.inputmethod.keyboard.ProximityInfo) - correctionX = 0.0f - correctionY = 0.0f - correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS - --> - </string-array> - - <string-array name="touch_position_correction_data_holo" translatable="false" > diff --git a/java/res/values-sw768dp-land/config.xml b/java/res/values-sw768dp-land/config.xml index b3cd7278d..63f86ba81 100644 --- a/java/res/values-sw768dp-land/config.xml +++ b/java/res/values-sw768dp-land/config.xml @@ -18,6 +18,51 @@ */ --> +<!-- Configuration values for Large Tablet Landscape. --> <resources> - <bool name="config_use_fullscreen_mode">false</bool> + <!-- Preferable keyboard height in absolute scale: 58.0mm --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">365.4dp</dimen> + <fraction name="config_min_keyboard_height">45%p</fraction> + + <fraction name="config_keyboard_top_padding_holo">1.896%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction> + <fraction name="config_key_vertical_gap_holo">3.690%p</fraction> + <fraction name="config_key_horizontal_gap_holo">1.030%p</fraction> + <dimen name="config_key_preview_offset_holo">8.0dp</dimen> + + <dimen name="config_more_keys_keyboard_key_height">81.9dp</dimen> + + <dimen name="config_key_preview_height">107.1dp</dimen> + <fraction name="config_key_letter_ratio">43%</fraction> + <fraction name="config_key_large_letter_ratio">42%</fraction> + <fraction name="config_key_label_ratio">28%</fraction> + <fraction name="config_key_hint_letter_ratio">23%</fraction> + <fraction name="config_key_hint_label_ratio">28%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">24%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">24.00%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="config_key_label_horizontal_padding">18dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">2.65%p</fraction> + <fraction name="config_key_letter_ratio_5row">53%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">30%</fraction> + + <dimen name="config_suggestions_strip_height">44dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">340dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">54dp</dimen> + <fraction name="config_min_more_suggestions_width">50%</fraction> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">32dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">100dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">32dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">21dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">7.69%p</fraction> + <fraction name="config_emoji_keyboard_row_height">33%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">39</integer> </resources> diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml deleted file mode 100644 index 653f5e7d5..000000000 --- a/java/res/values-sw768dp-land/dimens.xml +++ /dev/null @@ -1,73 +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> - <!-- Preferable keyboard height in absolute scale: 58.0mm --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">365.4dp</dimen> - <fraction name="minKeyboardHeight">45%p</fraction> - - <fraction name="keyboard_top_padding_gb">1.896%p</fraction> - <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction> - <fraction name="key_bottom_gap_gb">3.896%p</fraction> - <fraction name="key_horizontal_gap_gb">1.195%p</fraction> - - <fraction name="keyboard_top_padding_holo">1.896%p</fraction> - <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction> - <fraction name="key_bottom_gap_holo">3.690%p</fraction> - <fraction name="key_horizontal_gap_holo">1.030%p</fraction> - - <dimen name="popup_key_height">81.9dp</dimen> - - <!-- left or right padding of label alignment --> - <dimen name="key_label_horizontal_padding">18dp</dimen> - - <fraction name="key_letter_ratio">43%</fraction> - <fraction name="key_large_letter_ratio">42%</fraction> - <fraction name="key_label_ratio">28%</fraction> - <fraction name="key_hint_letter_ratio">23%</fraction> - <fraction name="key_hint_label_ratio">28%</fraction> - <fraction name="key_uppercase_letter_ratio">24%</fraction> - <fraction name="spacebar_text_ratio">24.00%</fraction> - <dimen name="key_preview_height">107.1dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">2.65%p</fraction> - <fraction name="key_letter_ratio_5row">53%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">30%</fraction> - - <dimen name="key_preview_offset_holo">8.0dp</dimen> - - <dimen name="suggestions_strip_padding">252.0dp</dimen> - <fraction name="min_more_suggestions_width">50%</fraction> - - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">32dp</dimen> - <dimen name="gesture_floating_preview_text_offset">100dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">32dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">21dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">7.69%p</fraction> - <fraction name="emoji_keyboard_row_height">33%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">60%p</fraction> - <integer name="emoji_keyboard_max_key_count">39</integer> - -</resources> diff --git a/java/res/values-sw540dp/config.xml b/java/res/values-sw768dp/config-per-form-factor.xml index 027780ce3..b90fbaea5 100644 --- a/java/res/values-sw540dp/config.xml +++ b/java/res/values-sw768dp/config-per-form-factor.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2011, The Android Open Source Project +** Copyright 2013, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,22 +18,16 @@ */ --> +<!-- Configuration values for Large Tablet. --> <resources> - <bool name="config_enable_show_option_of_key_preview_popup">false</bool> - <bool name="config_enable_bigram_suggestions_option">false</bool> + <bool name="config_enable_show_key_preview_popup_option">false</bool> <!-- Whether or not Popup on key press is enabled by default --> <bool name="config_default_key_preview_popup">false</bool> <bool name="config_default_sound_enabled">true</bool> - <bool name="config_auto_correction_spacebar_led_enabled">false</bool> - <!-- The language is never displayed if == 0, always displayed if < 0 --> - <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer> - <integer name="config_max_more_keys_column">5</integer> - <!-- - Configuration for MainKeyboardView - --> - <dimen name="config_key_hysteresis_distance">40.0dp</dimen> - <bool name="config_sliding_key_input_enabled">false</bool> + <bool name="config_enable_show_voice_key_option">false</bool> + <bool name="config_key_selection_by_dragging_finger">false</bool> <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if false --> <bool name="config_show_more_keys_keyboard_at_touched_point">true</bool> + <bool name="config_use_fullscreen_mode">false</bool> </resources> diff --git a/java/res/values-sw768dp/config-screen-metrics.xml b/java/res/values-sw768dp/config-screen-metrics.xml new file mode 100644 index 000000000..7769ad80d --- /dev/null +++ b/java/res/values-sw768dp/config-screen-metrics.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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> + <!-- Must be aligned with {@link Constants#SCREEN_METRICS_LARGE_TABLET}. --> + <integer name="config_screen_metrics">2</integer> +</resources> diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml index e1c07d6f8..94b38d850 100644 --- a/java/res/values-sw768dp/config.xml +++ b/java/res/values-sw768dp/config.xml @@ -18,28 +18,69 @@ */ --> +<!-- Configuration values for Large Tablet Portrait. --> <resources> - <bool name="config_enable_show_voice_key_option">false</bool> - <bool name="config_enable_show_option_of_key_preview_popup">false</bool> - <bool name="config_enable_bigram_suggestions_option">false</bool> - <!-- Whether or not Popup on key press is enabled by default --> - <bool name="config_default_key_preview_popup">false</bool> - <bool name="config_default_sound_enabled">true</bool> - <bool name="config_auto_correction_spacebar_led_enabled">false</bool> - <integer name="config_max_more_keys_column">5</integer> - <!-- - Configuration for MainKeyboardView - --> - <bool name="config_sliding_key_input_enabled">false</bool> - <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if - false --> - <bool name="config_show_more_keys_keyboard_at_touched_point">true</bool> - <!-- Screen metrics for logging. - 0 = "mdpi phone screen" - 1 = "hdpi phone screen" - 2 = "mdpi 11 inch tablet screen" - 3 = "xhdpi phone screen?" - 4 = ? - --> - <integer name="log_screen_metrics">2</integer> + <!-- Preferable keyboard height in absolute scale: 48.0mm --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">302.4dp</dimen> + <fraction name="config_max_keyboard_height">46%p</fraction> + <fraction name="config_min_keyboard_height">-35.0%p</fraction> + + <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction> + <fraction name="config_key_vertical_gap_holo">3.312%p</fraction> + <fraction name="config_key_horizontal_gap_holo">1.066%p</fraction> + <!-- config_more_keys_keyboard_key_height x -0.5 --> + <dimen name="config_more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen> + <dimen name="config_key_preview_offset_holo">8.0dp</dimen> + + <dimen name="config_more_keys_keyboard_key_height">63.0dp</dimen> + <dimen name="config_more_keys_keyboard_key_horizontal_padding">12dp</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- config_more_keys_keyboard_key_height x 1.2 --> + <dimen name="config_more_keys_keyboard_slide_allowance">98.3dp</dimen> + + <dimen name="config_key_preview_height">94.5dp</dimen> + <fraction name="config_key_preview_text_ratio">50%</fraction> + <fraction name="config_key_letter_ratio">40%</fraction> + <fraction name="config_key_large_letter_ratio">42%</fraction> + <fraction name="config_key_label_ratio">28%</fraction> + <fraction name="config_key_large_label_ratio">28%</fraction> + <fraction name="config_key_hint_letter_ratio">23%</fraction> + <fraction name="config_key_hint_label_ratio">28%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">26%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">29.03%</fraction> + <!-- left or right padding of label alignment --> + <dimen name="config_key_label_horizontal_padding">6dp</dimen> + <dimen name="config_key_hint_letter_padding">3dp</dimen> + <dimen name="config_key_shifted_letter_hint_padding">3dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">2.95%p</fraction> + <fraction name="config_key_letter_ratio_5row">51%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">33%</fraction> + + <dimen name="config_suggestions_strip_height">44dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">100dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">54dp</dimen> + <dimen name="config_more_suggestions_row_height">44dp</dimen> + <integer name="config_max_more_suggestions_row">6</integer> + <fraction name="config_min_more_suggestions_width">90%</fraction> + <dimen name="config_suggestion_min_width">46dp</dimen> + <dimen name="config_suggestion_text_horizontal_padding">10dp</dimen> + <dimen name="config_suggestion_text_size">22dp</dimen> + <dimen name="config_more_suggestions_hint_text_size">33dp</dimen> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">26dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">86dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">26dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">17dp</dimen> + <dimen name="config_gesture_floating_preview_round_radius">3dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">10%p</fraction> + <fraction name="config_emoji_keyboard_row_height">33%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">30</integer> </resources> diff --git a/java/res/values-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml deleted file mode 100644 index 4671aa28b..000000000 --- a/java/res/values-sw768dp/dimens.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. -*/ ---> - -<resources> - <!-- Preferable keyboard height in absolute scale: 48.0mm --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">302.4dp</dimen> - <fraction name="maxKeyboardHeight">46%p</fraction> - <fraction name="minKeyboardHeight">-35.0%p</fraction> - - <fraction name="keyboard_top_padding_gb">2.291%p</fraction> - <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction> - <fraction name="key_bottom_gap_gb">4.687%p</fraction> - <fraction name="key_horizontal_gap_gb">1.272%p</fraction> - - <fraction name="keyboard_top_padding_holo">2.335%p</fraction> - <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction> - <fraction name="key_bottom_gap_holo">3.312%p</fraction> - <fraction name="key_horizontal_gap_holo">1.066%p</fraction> - - <dimen name="popup_key_height">63.0dp</dimen> - - <dimen name="more_keys_keyboard_key_horizontal_padding">12dp</dimen> - <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.2 --> - <dimen name="more_keys_keyboard_slide_allowance">98.3dp</dimen> - <!-- popup_key_height x -1.0 --> - <dimen name="more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen> - - <!-- left or right padding of label alignment --> - <dimen name="key_label_horizontal_padding">6dp</dimen> - <dimen name="key_hint_letter_padding">3dp</dimen> - <dimen name="key_uppercase_letter_padding">3dp</dimen> - - <fraction name="key_letter_ratio">40%</fraction> - <fraction name="key_large_letter_ratio">42%</fraction> - <fraction name="key_label_ratio">28%</fraction> - <fraction name="key_large_label_ratio">28%</fraction> - <fraction name="key_hint_letter_ratio">23%</fraction> - <fraction name="key_hint_label_ratio">28%</fraction> - <fraction name="key_uppercase_letter_ratio">26%</fraction> - <fraction name="key_preview_text_ratio">50%</fraction> - <fraction name="spacebar_text_ratio">29.03%</fraction> - <dimen name="key_preview_height">94.5dp</dimen> - <dimen name="key_preview_offset_gb">16.0dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">2.95%p</fraction> - <fraction name="key_letter_ratio_5row">51%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">33%</fraction> - - <dimen name="key_preview_offset_holo">8.0dp</dimen> - <!-- popup_key_height x -0.5 --> - <dimen name="more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen> - - <dimen name="suggestions_strip_height">44dp</dimen> - <dimen name="more_suggestions_row_height">44dp</dimen> - <integer name="max_more_suggestions_row">6</integer> - <fraction name="min_more_suggestions_width">90%</fraction> - <dimen name="suggestions_strip_padding">94.5dp</dimen> - <dimen name="suggestion_min_width">46dp</dimen> - <dimen name="suggestion_padding">8dp</dimen> - <dimen name="suggestion_text_size">22dp</dimen> - <dimen name="more_suggestions_hint_text_size">33dp</dimen> - - <!-- Gesture trail parameters --> - <dimen name="gesture_trail_width">2.5dp</dimen> - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">26dp</dimen> - <dimen name="gesture_floating_preview_text_offset">86dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">26dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">17dp</dimen> - <dimen name="gesture_floating_preview_round_radius">3dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">10%p</fraction> - <fraction name="emoji_keyboard_row_height">33%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">68%p</fraction> - <integer name="emoji_keyboard_max_key_count">30</integer> - -</resources> diff --git a/java/res/values-ta-rIN/strings-action-keys.xml b/java/res/values-ta-rIN/strings-action-keys.xml new file mode 100644 index 000000000..c07de3594 --- /dev/null +++ b/java/res/values-ta-rIN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"செல்"</string> + <string name="label_next_key" msgid="5586407279258592635">"அடுத்து"</string> + <string name="label_previous_key" msgid="1421141755779895275">"முன்"</string> + <string name="label_done_key" msgid="7564866296502630852">"முடிந்தது"</string> + <string name="label_send_key" msgid="482252074224462163">"அனுப்பு"</string> + <string name="label_search_key" msgid="7965186050435796642">"தேடு"</string> + <string name="label_pause_key" msgid="2225922926459730642">"இடைநிறுத்து"</string> + <string name="label_wait_key" msgid="5891247853595466039">"காத்திரு"</string> +</resources> diff --git a/java/res/values-ta-rIN/strings-appname.xml b/java/res/values-ta-rIN/strings-appname.xml new file mode 100644 index 000000000..5ad5eae66 --- /dev/null +++ b/java/res/values-ta-rIN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android Keyboard (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android Spell Checker (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android Keyboard Settings (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android Spell Checker Settings (AOSP)"</string> +</resources> diff --git a/java/res/values-ta-rIN/strings-config-important-notice.xml b/java/res/values-ta-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..ae9a4ca7b --- /dev/null +++ b/java/res/values-ta-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"தொடர்புகளிலிருந்தும், உள்ளிட்ட தரவிலிருந்தும் பரிந்துரைகளை மேம்படுத்த அறியவும்"</string> +</resources> diff --git a/java/res/values-ta-rIN/strings-letter-descriptions.xml b/java/res/values-ta-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..e1254aac9 --- /dev/null +++ b/java/res/values-ta-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ஃபெமினைன் ஆர்டினல் இன்டிகேட்டர்"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"மைக்ரோ குறி"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"மாஸ்குலின் ஆர்டினல் இன்டிகேட்டர்"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ஷார்ப் S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, கிரேவ்"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, அக்யூட்"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, வளைவு"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, டில்டு"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, மேல் வளையம்"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, லிகஷர்"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, செடில்லா"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, கிரேவ்"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, அக்யூட்"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, வளைவு"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, கிரேவ்"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, அக்யூட்"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, வளைவு"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ஈத்"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, டில்டு"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, கிரேவ்"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, அக்யூட்"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, வளைவு"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, டில்டு"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, கிரேவ்"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, அக்யூட்"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, வளைவு"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, அக்யூட்"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"தோர்ன்"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, மேக்ரான்"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, பிரீவ்"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ஒகோனெக்"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, அக்யூட்"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, வளைவு"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, கேரன்"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, கேரன்"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, மேக்ரான்"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, பிரீவ்"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ஒகோனேக்"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, கேரன்"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, வளைவு"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, பிரீவ்"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, செடில்லா"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, வளைவு"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, டில்டு"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, மேக்ரான்"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, பிரீவ்"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ஒகோனேக்"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"புள்ளியற்ற I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, லிகஷர்"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, வளைவு"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, செடில்லா"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"க்ரா"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, அக்யூட்"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, செடில்லா"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, கேரன்"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, நடுப் புள்ளி"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, அக்யூட்"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, செடில்லா"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, கேரன்"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, தனிமேற்கோள் குறிக்கு அடுத்துவருவது"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"இங்க்"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, மேக்ரான்"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, பிரீவ்"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, டபுள் அக்யூட்"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, லிகஷர்"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, அக்யூட்"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, செடில்லா"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, கேரன்"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, அக்யூட்"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, வளைவு"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, செடில்லா"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, கேரன்"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, செடில்லா"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, கேரன்"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, டில்டு"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, மேக்ரான்"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, பிரீவ்"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, மேல் வளையம்"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, டபுள் அக்யூட்"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ஒகோனேக்"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, வளைவு"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, வளைவு"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, அக்யூட்"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, கேரன்"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"நீண்ட S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ஹார்ன்"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ஹார்ன்"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, கீழ் காற்புள்ளி"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, கீழ் காற்புள்ளி"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"செச்சுவா"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, பிரீவ் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, பிரீவ் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, பிரீவ் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, பிரீவ் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, பிரீவ் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, டில்டு"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ஹார்ன் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ஹார்ன் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ஹார்ன் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ஹார்ன் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ஹார்ன் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ஹார்ன் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ஹார்ன் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ஹார்ன் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ஹார்ன் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ஹார்ன் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, கிரேவ்"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, டில்டு"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"தலைகீழ் ஆச்சரியக் குறி"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"இடது பிரான்சிய வலது மேற்கோள்குறி"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"நடுப் புள்ளி"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"சூப்பர்ஸ்கிரிப்ட் ஒன்"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"வலது பிரான்சிய இரட்டை மேற்கோள்குறி"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"தலைகீழ் கேள்விக் குறி"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"இடது ஒற்றை மேற்கோள் குறி"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"வலது ஒற்றை மேற்கோள் குறி"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ஒற்றை லோ-9 மேற்கோள் குறி"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"இடது இரட்டை மேற்கோள் குறி"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"வலது இரட்டை மேற்கோள் குறி"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"டேகர்"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"இரட்டை டேகர்"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"விழுக்காட்டுச் சின்னம்"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"அளவுக்குறி"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"இரட்டை அளவுக்குறி"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"இடது பிரான்சிய ஒற்றை மேற்கோள்குறி"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"வலது பிரான்சிய ஒற்றை மேற்கோள்குறி"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"சூப்பர்ஸ்கிரிப்ட் நான்கு"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"சூப்பர்ஸ்கிரிப்ட் லத்தீன் சிற்றெழுத்து n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"பெஸோ குறி"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"கேர் ஆஃப்"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"வலது நோக்கிய அம்பு"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"கீழ் நோக்கிய அம்பு"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"வெற்று கணம்"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"இன்கிரிமென்ட்"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"குறைவு அல்லது சமம்"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"அதிகம் அல்லது சமம்"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"கருப்பு நட்சத்திரம்"</string> +</resources> diff --git a/java/res/values-ta-rIN/strings-talkback-descriptions.xml b/java/res/values-ta-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..a65c8de21 --- /dev/null +++ b/java/res/values-ta-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"சத்தமாகக் கூறப்படும் கடவுச்சொல் விசைகளைக் கேட்பதற்கு ஹெட்செட்டைச் செருகவும்."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"நடப்பு உரை %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"உரை எதுவும் உள்ளிடப்படவில்லை"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> இலிருந்து <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ஆக <xliff:g id="KEY_NAME">%1$s</xliff:g> திருத்துகிறது"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> தன்னியக்க திருத்தத்தைச் செயல்படுத்துகிறது"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"அறியப்படாத எழுத்துக்குறி"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"ஷிஃப்டு"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"கூடுதல் குறியீடுகள்"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"ஷிஃப்டு"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"குறியீடுகள்"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"ஷிஃப்டு"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"நீக்கு"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"சின்னங்கள்"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"எழுத்துகள்"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"எண்கள்"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"அமைப்புகள்"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"டேப்"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ஸ்பேஸ்"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"குரல் உள்ளீடு"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ஈமோஜி"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"திரும்பு"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"தேடல்"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"புள்ளி"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"மொழியை மாற்று"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"அடுத்து"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"முந்தையது"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"ஷிப்டு இயக்கப்பட்டது"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"பேரெழுத்தாக்கம் இயக்கப்பட்டது"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"குறியீடுகள் பயன்முறை"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"கூடுதல் குறியீடுகள் முறை"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"எழுத்துகள் பயன்முறை"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ஃபோன் பயன்முறை"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ஃபோன் குறியீடுகள் பயன்முறை"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"விசைப்பலகை மறைக்கப்பட்டது"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> விசைப்பலகையைக் காட்டுகிறது"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"தேதி"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"தேதி மற்றும் நேரம்"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"மின்னஞ்சல்"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"செய்தியிடல்"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"எண்"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ஃபோன்"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"உரை"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"நேரம்"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"சமீபத்தியவை"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"நபர்கள்"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"பொருட்கள்"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"இயற்கை"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"இடங்கள்"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"சின்னங்கள்"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"எமோடிகான்ஸ்"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"பேரெழுத்து <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"பேரெழுத்து I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"பேரெழுத்து I, மேல் புள்ளி"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"அறியப்படாத குறியீடு"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"அறியப்படாத ஈமோஜி"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"மாற்று எழுத்துக்குறிகள் உள்ளன"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"மாற்று எழுத்துக்குறிகள் நிராகரிக்கப்பட்டன"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"மாற்று பரிந்துரைகள் உள்ளன"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"மாற்று பரிந்துரைகள் நிராகரிக்கப்பட்டன"</string> +</resources> diff --git a/java/res/values-ta-rIN/strings.xml b/java/res/values-ta-rIN/strings.xml new file mode 100644 index 000000000..14f64c634 --- /dev/null +++ b/java/res/values-ta-rIN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"உள்ளீட்டு விருப்பங்கள்"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"தொடர்பு பெயர்களை ஆய்வுசெய்"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"உங்கள் தொடர்புபட்டியலில் இருந்து உள்ளீடுகளை பிழைத்திருத்தி பயன்படுத்துகிறது"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"விசையழுத்தின்போது அதிர்வுரு"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"விசையழுத்தத்தின்போது ஒலியெழுப்பு"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"விழை அழுத்தத்தின்போது பாப்அப் செய்"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"பிற உள்ளீட்டு முறைகளுக்கு மாறு"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"மொழி மாற்றல் விசை பிற உள்ளீட்டு முறைகளையும் கட்டுப்படுத்துகிறது"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"மொழி மாற்ற விசை"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"பல உள்ளீட்டு மொழிகள் இயக்கப்பட்டிருக்கும்போது காட்டு"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"இழுத்தல் குறிப்பானைக் காட்டு"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"ஷிப்ட் அல்லது குறியீட்டு விசைகளிலிருந்து இழுத்து செல்லும்போது காட்சித் தடத்தைக் காட்டு"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"விசை பாப்அப் விலக்கின் தாமதம்"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"தாமதம் வேண்டாம்"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"இயல்புநிலை"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>மி.வி."</string> + <string name="settings_system_default" msgid="6268225104743331821">"அமைப்பின் இயல்புநிலை"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"தொடர்பு பெயர்களைப் பரிந்துரை"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"பரிந்துரைகள், திருத்தங்கள் ஆகியவற்றிற்கு தொடர்புகளிலிருந்து பெயர்களை பயன்படுத்து"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"தனிப்பட்ட பரிந்துரைகள்"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ஐ மேம்படுத்து"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"புள்ளியைத் தொடர்ந்து இடைவெளியை உள்ளிடு"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"ஸ்பேஸ் பட்டியை இருமுறை தட்டுவது, புள்ளியை தொடர்ந்து இடைவெளியை உள்ளிடும்"</string> + <string name="auto_cap" msgid="1719746674854628252">"தன்னியக்க பேரெழுத்தாக்கல்"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"வரியின் முதல் எழுத்தை பேரெழுத்தாக்கும்"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"தனிப்பட்ட அகராதி"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"துணை அகராதிகள்"</string> + <string name="main_dictionary" msgid="4798763781818361168">"முதன்மை அகராதி"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"திருத்துதல் விருப்பங்களைக் காட்டு"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"உள்ளிடும்போது பரிந்துரைக்கப்பட்ட வார்த்தைகளைக் காட்டும்"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"எப்போதும் காட்டு"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"நிலைப்பதிப்பு பயன்முறையில் காட்டு"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"எப்போதும் மறை"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"தீங்குவிளைவிக்கும் வார்த்தைகளை தடு"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"தீங்குவிளைவிக்க சாத்தியமுள்ளதான வார்த்தைகளைப் பரிந்துரைக்க வேண்டாம்"</string> + <string name="auto_correction" msgid="7630720885194996950">"தன்னியக்க திருத்தம்"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"ஸ்பேஸ்பாரும், நிறுத்தற்குறிகளும் தவறாக உள்ளிடப்பட்ட வார்த்தைகளை தானாக திருத்தும்"</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_aggressive" msgid="7319007299148899623">"தீவிரமாக"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"மிகத் தீவிரமாக"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"அடுத்த வார்த்தை பரிந்துரைகள்"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"பரிந்துரைகளை உருவாக்க முந்தைய வார்த்தைகளைப் பயன்படுத்தும்"</string> + <string name="gesture_input" msgid="826951152254563827">"சைகை உள்ளீட்டை இயக்கு"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"எழுத்துகள் வழியாக இழுப்பதன் மூலம் வார்த்தையை உள்ளிடலாம்"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"சைகை தடத்தைக் காட்டு"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ஆற்றல்மிகு மிதக்கும் மாதிரிக்காட்சி"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"சைகையிடும் போது பரிந்துரைக்கும் வார்த்தையைப் பார்க்கலாம்"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"சொற்றொடர் சைகை"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ஸ்பேஸ் விசைக்கு இழுப்பதன் மூலம் சைகைகளுக்கு இடையே இடைவெளிகளை உள்ளிடலாம்"</string> + <string name="voice_input" msgid="3583258583521397548">"குரல் உள்ளீட்டு விசை"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"குரல் உள்ளீட்டு முறைகள் எதுவும் இயக்கப்படவில்லை. மொழி & உள்ளீட்டு அமைப்புகளைச் சரிபார்க்கவும்."</string> + <string name="configure_input_method" msgid="373356270290742459">"உள்ளீட்டு முறைகளை உள்ளமைத்தல்"</string> + <string name="language_selection_title" msgid="1651299598555326750">"உள்ளீட்டு மொழிகள்"</string> + <string name="send_feedback" msgid="1780431884109392046">"கருத்தை அனுப்பு"</string> + <string name="select_language" msgid="3693815588777926848">"உள்ளீட்டு மொழிகள்"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"சேமிக்க தொடவும்"</string> + <string name="has_dictionary" msgid="6071847973466625007">"அகராதி உள்ளது"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"விசைப்பலகை தீம்"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ஆங்கிலம் (யூகே)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ஆங்கிலம் (யூஎஸ்)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ஸ்பானிஷ் (யூஎஸ்)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ஆங்கிலம் (யூகே) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ஆங்கிலம் (யூஎஸ்) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ஸ்பானிஷ் (யூஎஸ்) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (பாரம்பரியமானது)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (சிரிலிக்)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (இலத்தீன்)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"மொழியில்லை (அகரவரிசை)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"அகரவரிசை (க்வெர்டி)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"அகரவரிசை (க்வெர்ட்ச்)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"அகரவரிசை (எசெர்டி)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"அகரவரிசை (ட்வொராக்)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"அகரவரிசை (கொல்மக்)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"அகரவரிசை (பிசி)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"எமோஜி"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"தனிப்பயன் உள்ளீட்டு நடைகள்"</string> + <string name="add_style" msgid="6163126614514489951">"நடையைச் சேர்"</string> + <string name="add" msgid="8299699805688017798">"சேர்"</string> + <string name="remove" msgid="4486081658752944606">"அகற்று"</string> + <string name="save" msgid="7646738597196767214">"சேமி"</string> + <string name="subtype_locale" msgid="8576443440738143764">"மொழி"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"தளவமைப்பு"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"உங்கள் தனிப்பயன் உள்ளீட்டு நடையை பயன்படுத்த தொடங்கும் முன்பு, அதை இயக்க வேண்டும். அதை இப்போது இயக்க விரும்புகிறீர்களா?"</string> + <string name="enable" msgid="5031294444630523247">"இயக்கு"</string> + <string name="not_now" msgid="6172462888202790482">"இப்பொழுது வேண்டாம்"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"இதே உள்ளீட்டு நடை ஏற்கனவே உள்ளது: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"விசையின் நீண்ட அழுத்தத்தின் தாமதம்"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"விசையழுத்த அதிர்வின் காலஅளவு"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"விசையழுத்த ஒலியளவு"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"வெளிப்புற அகராதி கோப்பைப் படித்தல்"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"பதிவிறக்கங்கள் கோப்புறையில் அகராதி கோப்புகள் எதுவும் இல்லை"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"நிறுவுவதற்கு அகராதி கோப்பைத் தேர்ந்தெடுக்கவும்"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> மொழிக்கான இந்தக் கோப்பை நிச்சயமாக நிறுவ வேண்டுமா?"</string> + <string name="error" msgid="8940763624668513648">"பிழை ஏற்பட்டது"</string> + <string name="button_default" msgid="3988017840431881491">"இயல்புநிலை"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டிற்கு வரவேற்கிறோம்"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"சைகை உள்ளீடு மூலம்"</string> + <string name="setup_start_action" msgid="8936036460897347708">"தொடங்குக"</string> + <string name="setup_next_action" msgid="371821437915144603">"அடுத்த கட்டம்"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டை அமைக்கிறது"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டை இயக்கவும்"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"உங்கள் மொழி & உள்ளீட்டு அமைப்புகளில் \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" பயன்பாட்டைச் சரிபார்க்கவும். உங்கள் சாதனத்தில் பயன்பாட்டை இயக்குவதை இது அங்கீகரிக்கும்."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"உங்கள் மொழி & உள்ளீட்டு அமைப்புகளில் <xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாடு ஏற்கனவே இயக்கப்பட்டுவிட்டது, அதனால் இந்தப் படிமுறை முடிந்தது. அடுத்த படிமுறைக்குச் செல்கிறது!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"அமைப்புகளில் இயக்கு"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> க்கு மாறவும்"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"அடுத்து, உங்கள் செயலில் உள்ள உரை உள்ளீட்டு முறையாக \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" பயன்பாட்டைத் தேர்ந்தெடுக்கவும்."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"உள்ளீட்டு முறைகளை மாற்றவும்"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"வாழ்த்துகள், தயாராகிவிட்டீர்கள்!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாடு மூலம் உங்களுக்கு விருப்பமான எல்லா பயன்பாடுகளிலும் நீங்கள் உள்ளிடலாம்."</string> + <string name="setup_step3_action" msgid="600879797256942259">"கூடுதல் மொழிகளை உள்ளமை"</string> + <string name="setup_finish_action" msgid="276559243409465389">"முடிந்தது"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"பயன்பாட்டு ஐகானைக் காட்டு"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"துவக்கியில் பயன்பாட்டு ஐகானைக் காட்டும்"</string> + <string name="app_name" msgid="6320102637491234792">"அகராதி வழங்கி"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"அகராதி வழங்கி"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"அகராதி சேவை"</string> + <string name="download_description" msgid="6014835283119198591">"அகராதியின் புதுப்பிப்பு தகவல்"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"துணை அகராதிகள்"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"அகராதி கிடைக்கிறது"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"அகராதிகளுக்கான அமைப்புகள்"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"பயனர் அகராதிகள்"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"பயனர் அகராதி"</string> + <string name="dictionary_available" msgid="4728975345815214218">"அகராதி கிடைக்கிறது"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"தற்போது பதிவிறக்குகிறது"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"நிறுவப்பட்டது"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"நிறுவப்பட்டது, முடக்கப்பட்டது"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"அகராதி சேவையில் இணைப்பதில் பிரச்சனை ஏற்பட்டது"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"அகராதிகள் எதுவும் இல்லை"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"புதுப்பி"</string> + <string name="last_update" msgid="730467549913588780">"இறுதியாகப் புதுப்பித்தது"</string> + <string name="message_updating" msgid="4457761393932375219">"புதுப்பிப்புகளுக்காக சரிபார்கிறது"</string> + <string name="message_loading" msgid="5638680861387748936">"ஏற்றுகிறது..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"முதன்மை அகராதி"</string> + <string name="cancel" msgid="6830980399865683324">"ரத்துசெய்"</string> + <string name="go_to_settings" msgid="3876892339342569259">"அமைப்புகள்"</string> + <string name="install_dict" msgid="180852772562189365">"நிறுவு"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ரத்துசெய்"</string> + <string name="delete_dict" msgid="756853268088330054">"நீக்கு"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"உங்கள் மொபைலில் தேர்ந்தெடுத்த மொழிக்கு அகராதி உள்ளது.<br/> உங்கள் உள்ளீட்டு அனுபவத்தை மேம்படுத்த <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> அகராதியைப் <b>பதிவிறக்குவதைப்</b> பரிந்துரைக்கிறோம்.<br/> <br/> 3G இல் பதிவிறக்கத்திற்கு ஒன்று அல்லது இரண்டு நிமிடங்கள் ஆகலாம். உங்களிடம் <b>வரம்பில்லா தரவு திட்டம்</b> இல்லையெனில் கட்டணம் விதிக்கப்படலாம்.<br/> உங்களிடம் எந்தத் தரவு திட்டம் உள்ளது என்பது உறுதியாகத் தெரியவில்லையெனில், பதிவிறக்கத்தைத் தானாகத் துவங்க, Wi-Fi இணைப்பைக் கண்டறிவதைப் பரிந்துரைக்கிறோம்.<br/> <br/> உதவிக்குறிப்பு: உங்கள் மொபைல் சாதனத்தில் <b>அமைப்புகள்</b> மெனுவில் உள்ள <b>மொழி & உள்ளீடு</b> என்பதற்குச் செலவதன் மூலம் அகராதிகளைப் பதிவிறக்கலாம் மற்றும் அகற்றலாம்."</string> + <string name="download_over_metered" msgid="1643065851159409546">"இப்போது பதிவிறக்கு (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>மெ.பை.)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi வழியாகப் பதிவிறக்கு"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> மொழிக்கு அகராதி கிடைக்கிறது"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"மதிப்பாய்வு செய்து பதிவிறக்க அழுத்தவும்"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"பதிவிறக்குகிறது: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> க்கான பரிந்துரைகள் விரைவில் தயாராகிவிடும்."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> பதிப்பு"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"சேர்"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"அகராதியில் சேர்"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"சொற்றொடர்"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"மேலும் விருப்பங்கள்"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"குறைவான விருப்பங்கள்"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"சரி"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"வார்த்தை:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"குறுக்குவழி:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"மொழி:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"வார்த்தையை உள்ளிடவும்"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"விருப்பத்திற்குரிய குறுக்குவழி"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"வார்த்தையைத் திருத்து"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"திருத்து"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"நீக்கு"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"பயனர் அகராதியில் உங்களுக்கு எந்த வார்த்தைகளும் இல்லை. சேர் (+) என்ற பொத்தானைத் தொடுவதன் மூலம் வார்த்தையைச் சேர்க்கவும்."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"எல்லா மொழிகளுக்கும்"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"மேலும் மொழிகள்..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"நீக்கு"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings-action-keys.xml b/java/res/values-ta-rTN/strings-action-keys.xml new file mode 100644 index 000000000..c07de3594 --- /dev/null +++ b/java/res/values-ta-rTN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"செல்"</string> + <string name="label_next_key" msgid="5586407279258592635">"அடுத்து"</string> + <string name="label_previous_key" msgid="1421141755779895275">"முன்"</string> + <string name="label_done_key" msgid="7564866296502630852">"முடிந்தது"</string> + <string name="label_send_key" msgid="482252074224462163">"அனுப்பு"</string> + <string name="label_search_key" msgid="7965186050435796642">"தேடு"</string> + <string name="label_pause_key" msgid="2225922926459730642">"இடைநிறுத்து"</string> + <string name="label_wait_key" msgid="5891247853595466039">"காத்திரு"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings-appname.xml b/java/res/values-ta-rTN/strings-appname.xml new file mode 100644 index 000000000..5ad5eae66 --- /dev/null +++ b/java/res/values-ta-rTN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android Keyboard (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android Spell Checker (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android Keyboard Settings (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android Spell Checker Settings (AOSP)"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings-config-important-notice.xml b/java/res/values-ta-rTN/strings-config-important-notice.xml new file mode 100644 index 000000000..ae9a4ca7b --- /dev/null +++ b/java/res/values-ta-rTN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"தொடர்புகளிலிருந்தும், உள்ளிட்ட தரவிலிருந்தும் பரிந்துரைகளை மேம்படுத்த அறியவும்"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings-letter-descriptions.xml b/java/res/values-ta-rTN/strings-letter-descriptions.xml new file mode 100644 index 000000000..e1254aac9 --- /dev/null +++ b/java/res/values-ta-rTN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ஃபெமினைன் ஆர்டினல் இன்டிகேட்டர்"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"மைக்ரோ குறி"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"மாஸ்குலின் ஆர்டினல் இன்டிகேட்டர்"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ஷார்ப் S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, கிரேவ்"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, அக்யூட்"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, வளைவு"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, டில்டு"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, மேல் வளையம்"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, லிகஷர்"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, செடில்லா"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, கிரேவ்"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, அக்யூட்"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, வளைவு"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, கிரேவ்"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, அக்யூட்"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, வளைவு"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ஈத்"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, டில்டு"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, கிரேவ்"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, அக்யூட்"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, வளைவு"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, டில்டு"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, கிரேவ்"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, அக்யூட்"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, வளைவு"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, அக்யூட்"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"தோர்ன்"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, டையாரேசிஸ்"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, மேக்ரான்"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, பிரீவ்"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ஒகோனெக்"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, அக்யூட்"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, வளைவு"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, கேரன்"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, கேரன்"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, மேக்ரான்"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, பிரீவ்"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ஒகோனேக்"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, கேரன்"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, வளைவு"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, பிரீவ்"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, செடில்லா"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, வளைவு"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, டில்டு"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, மேக்ரான்"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, பிரீவ்"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ஒகோனேக்"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"புள்ளியற்ற I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, லிகஷர்"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, வளைவு"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, செடில்லா"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"க்ரா"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, அக்யூட்"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, செடில்லா"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, கேரன்"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, நடுப் புள்ளி"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, அக்யூட்"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, செடில்லா"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, கேரன்"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, தனிமேற்கோள் குறிக்கு அடுத்துவருவது"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"இங்க்"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, மேக்ரான்"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, பிரீவ்"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, டபுள் அக்யூட்"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, லிகஷர்"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, அக்யூட்"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, செடில்லா"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, கேரன்"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, அக்யூட்"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, வளைவு"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, செடில்லா"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, கேரன்"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, செடில்லா"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, கேரன்"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, ஸ்ட்ரோக்"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, டில்டு"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, மேக்ரான்"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, பிரீவ்"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, மேல் வளையம்"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, டபுள் அக்யூட்"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ஒகோனேக்"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, வளைவு"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, வளைவு"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, அக்யூட்"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, மேல் புள்ளி"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, கேரன்"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"நீண்ட S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ஹார்ன்"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ஹார்ன்"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, கீழ் காற்புள்ளி"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, கீழ் காற்புள்ளி"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"செச்சுவா"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, பிரீவ் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, பிரீவ் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, பிரீவ் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, பிரீவ் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, பிரீவ் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, டில்டு"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, வளைவு மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, வளைவு மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, வளைவு மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, வளைவு மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, வளைவு மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ஹார்ன் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ஹார்ன் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ஹார்ன் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ஹார்ன் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ஹார்ன் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ஹார்ன் மற்றும் அக்யூட்"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ஹார்ன் மற்றும் கிரேவ்"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ஹார்ன் மற்றும் மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ஹார்ன் மற்றும் டில்டு"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ஹார்ன் மற்றும் கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, கிரேவ்"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, கீழ் புள்ளி"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, மேல் ஹூக்"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, டில்டு"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"தலைகீழ் ஆச்சரியக் குறி"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"இடது பிரான்சிய வலது மேற்கோள்குறி"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"நடுப் புள்ளி"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"சூப்பர்ஸ்கிரிப்ட் ஒன்"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"வலது பிரான்சிய இரட்டை மேற்கோள்குறி"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"தலைகீழ் கேள்விக் குறி"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"இடது ஒற்றை மேற்கோள் குறி"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"வலது ஒற்றை மேற்கோள் குறி"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ஒற்றை லோ-9 மேற்கோள் குறி"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"இடது இரட்டை மேற்கோள் குறி"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"வலது இரட்டை மேற்கோள் குறி"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"டேகர்"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"இரட்டை டேகர்"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"விழுக்காட்டுச் சின்னம்"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"அளவுக்குறி"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"இரட்டை அளவுக்குறி"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"இடது பிரான்சிய ஒற்றை மேற்கோள்குறி"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"வலது பிரான்சிய ஒற்றை மேற்கோள்குறி"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"சூப்பர்ஸ்கிரிப்ட் நான்கு"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"சூப்பர்ஸ்கிரிப்ட் லத்தீன் சிற்றெழுத்து n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"பெஸோ குறி"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"கேர் ஆஃப்"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"வலது நோக்கிய அம்பு"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"கீழ் நோக்கிய அம்பு"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"வெற்று கணம்"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"இன்கிரிமென்ட்"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"குறைவு அல்லது சமம்"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"அதிகம் அல்லது சமம்"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"கருப்பு நட்சத்திரம்"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings-talkback-descriptions.xml b/java/res/values-ta-rTN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..a65c8de21 --- /dev/null +++ b/java/res/values-ta-rTN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"சத்தமாகக் கூறப்படும் கடவுச்சொல் விசைகளைக் கேட்பதற்கு ஹெட்செட்டைச் செருகவும்."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"நடப்பு உரை %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"உரை எதுவும் உள்ளிடப்படவில்லை"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> இலிருந்து <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ஆக <xliff:g id="KEY_NAME">%1$s</xliff:g> திருத்துகிறது"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> தன்னியக்க திருத்தத்தைச் செயல்படுத்துகிறது"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"அறியப்படாத எழுத்துக்குறி"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"ஷிஃப்டு"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"கூடுதல் குறியீடுகள்"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"ஷிஃப்டு"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"குறியீடுகள்"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"ஷிஃப்டு"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"நீக்கு"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"சின்னங்கள்"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"எழுத்துகள்"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"எண்கள்"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"அமைப்புகள்"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"டேப்"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"ஸ்பேஸ்"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"குரல் உள்ளீடு"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ஈமோஜி"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"திரும்பு"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"தேடல்"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"புள்ளி"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"மொழியை மாற்று"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"அடுத்து"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"முந்தையது"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"ஷிப்டு இயக்கப்பட்டது"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"பேரெழுத்தாக்கம் இயக்கப்பட்டது"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"குறியீடுகள் பயன்முறை"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"கூடுதல் குறியீடுகள் முறை"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"எழுத்துகள் பயன்முறை"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ஃபோன் பயன்முறை"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ஃபோன் குறியீடுகள் பயன்முறை"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"விசைப்பலகை மறைக்கப்பட்டது"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> விசைப்பலகையைக் காட்டுகிறது"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"தேதி"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"தேதி மற்றும் நேரம்"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"மின்னஞ்சல்"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"செய்தியிடல்"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"எண்"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ஃபோன்"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"உரை"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"நேரம்"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"சமீபத்தியவை"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"நபர்கள்"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"பொருட்கள்"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"இயற்கை"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"இடங்கள்"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"சின்னங்கள்"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"எமோடிகான்ஸ்"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"பேரெழுத்து <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"பேரெழுத்து I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"பேரெழுத்து I, மேல் புள்ளி"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"அறியப்படாத குறியீடு"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"அறியப்படாத ஈமோஜி"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"மாற்று எழுத்துக்குறிகள் உள்ளன"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"மாற்று எழுத்துக்குறிகள் நிராகரிக்கப்பட்டன"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"மாற்று பரிந்துரைகள் உள்ளன"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"மாற்று பரிந்துரைகள் நிராகரிக்கப்பட்டன"</string> +</resources> diff --git a/java/res/values-ta-rTN/strings.xml b/java/res/values-ta-rTN/strings.xml new file mode 100644 index 000000000..14f64c634 --- /dev/null +++ b/java/res/values-ta-rTN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"உள்ளீட்டு விருப்பங்கள்"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"தொடர்பு பெயர்களை ஆய்வுசெய்"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"உங்கள் தொடர்புபட்டியலில் இருந்து உள்ளீடுகளை பிழைத்திருத்தி பயன்படுத்துகிறது"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"விசையழுத்தின்போது அதிர்வுரு"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"விசையழுத்தத்தின்போது ஒலியெழுப்பு"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"விழை அழுத்தத்தின்போது பாப்அப் செய்"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"பிற உள்ளீட்டு முறைகளுக்கு மாறு"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"மொழி மாற்றல் விசை பிற உள்ளீட்டு முறைகளையும் கட்டுப்படுத்துகிறது"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"மொழி மாற்ற விசை"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"பல உள்ளீட்டு மொழிகள் இயக்கப்பட்டிருக்கும்போது காட்டு"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"இழுத்தல் குறிப்பானைக் காட்டு"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"ஷிப்ட் அல்லது குறியீட்டு விசைகளிலிருந்து இழுத்து செல்லும்போது காட்சித் தடத்தைக் காட்டு"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"விசை பாப்அப் விலக்கின் தாமதம்"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"தாமதம் வேண்டாம்"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"இயல்புநிலை"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>மி.வி."</string> + <string name="settings_system_default" msgid="6268225104743331821">"அமைப்பின் இயல்புநிலை"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"தொடர்பு பெயர்களைப் பரிந்துரை"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"பரிந்துரைகள், திருத்தங்கள் ஆகியவற்றிற்கு தொடர்புகளிலிருந்து பெயர்களை பயன்படுத்து"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"தனிப்பட்ட பரிந்துரைகள்"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ஐ மேம்படுத்து"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"புள்ளியைத் தொடர்ந்து இடைவெளியை உள்ளிடு"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"ஸ்பேஸ் பட்டியை இருமுறை தட்டுவது, புள்ளியை தொடர்ந்து இடைவெளியை உள்ளிடும்"</string> + <string name="auto_cap" msgid="1719746674854628252">"தன்னியக்க பேரெழுத்தாக்கல்"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"வரியின் முதல் எழுத்தை பேரெழுத்தாக்கும்"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"தனிப்பட்ட அகராதி"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"துணை அகராதிகள்"</string> + <string name="main_dictionary" msgid="4798763781818361168">"முதன்மை அகராதி"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"திருத்துதல் விருப்பங்களைக் காட்டு"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"உள்ளிடும்போது பரிந்துரைக்கப்பட்ட வார்த்தைகளைக் காட்டும்"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"எப்போதும் காட்டு"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"நிலைப்பதிப்பு பயன்முறையில் காட்டு"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"எப்போதும் மறை"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"தீங்குவிளைவிக்கும் வார்த்தைகளை தடு"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"தீங்குவிளைவிக்க சாத்தியமுள்ளதான வார்த்தைகளைப் பரிந்துரைக்க வேண்டாம்"</string> + <string name="auto_correction" msgid="7630720885194996950">"தன்னியக்க திருத்தம்"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"ஸ்பேஸ்பாரும், நிறுத்தற்குறிகளும் தவறாக உள்ளிடப்பட்ட வார்த்தைகளை தானாக திருத்தும்"</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_aggressive" msgid="7319007299148899623">"தீவிரமாக"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"மிகத் தீவிரமாக"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"அடுத்த வார்த்தை பரிந்துரைகள்"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"பரிந்துரைகளை உருவாக்க முந்தைய வார்த்தைகளைப் பயன்படுத்தும்"</string> + <string name="gesture_input" msgid="826951152254563827">"சைகை உள்ளீட்டை இயக்கு"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"எழுத்துகள் வழியாக இழுப்பதன் மூலம் வார்த்தையை உள்ளிடலாம்"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"சைகை தடத்தைக் காட்டு"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ஆற்றல்மிகு மிதக்கும் மாதிரிக்காட்சி"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"சைகையிடும் போது பரிந்துரைக்கும் வார்த்தையைப் பார்க்கலாம்"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"சொற்றொடர் சைகை"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ஸ்பேஸ் விசைக்கு இழுப்பதன் மூலம் சைகைகளுக்கு இடையே இடைவெளிகளை உள்ளிடலாம்"</string> + <string name="voice_input" msgid="3583258583521397548">"குரல் உள்ளீட்டு விசை"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"குரல் உள்ளீட்டு முறைகள் எதுவும் இயக்கப்படவில்லை. மொழி & உள்ளீட்டு அமைப்புகளைச் சரிபார்க்கவும்."</string> + <string name="configure_input_method" msgid="373356270290742459">"உள்ளீட்டு முறைகளை உள்ளமைத்தல்"</string> + <string name="language_selection_title" msgid="1651299598555326750">"உள்ளீட்டு மொழிகள்"</string> + <string name="send_feedback" msgid="1780431884109392046">"கருத்தை அனுப்பு"</string> + <string name="select_language" msgid="3693815588777926848">"உள்ளீட்டு மொழிகள்"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"சேமிக்க தொடவும்"</string> + <string name="has_dictionary" msgid="6071847973466625007">"அகராதி உள்ளது"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"விசைப்பலகை தீம்"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ஆங்கிலம் (யூகே)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ஆங்கிலம் (யூஎஸ்)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ஸ்பானிஷ் (யூஎஸ்)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ஆங்கிலம் (யூகே) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ஆங்கிலம் (யூஎஸ்) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ஸ்பானிஷ் (யூஎஸ்) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (பாரம்பரியமானது)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (சிரிலிக்)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (இலத்தீன்)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"மொழியில்லை (அகரவரிசை)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"அகரவரிசை (க்வெர்டி)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"அகரவரிசை (க்வெர்ட்ச்)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"அகரவரிசை (எசெர்டி)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"அகரவரிசை (ட்வொராக்)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"அகரவரிசை (கொல்மக்)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"அகரவரிசை (பிசி)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"எமோஜி"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"தனிப்பயன் உள்ளீட்டு நடைகள்"</string> + <string name="add_style" msgid="6163126614514489951">"நடையைச் சேர்"</string> + <string name="add" msgid="8299699805688017798">"சேர்"</string> + <string name="remove" msgid="4486081658752944606">"அகற்று"</string> + <string name="save" msgid="7646738597196767214">"சேமி"</string> + <string name="subtype_locale" msgid="8576443440738143764">"மொழி"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"தளவமைப்பு"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"உங்கள் தனிப்பயன் உள்ளீட்டு நடையை பயன்படுத்த தொடங்கும் முன்பு, அதை இயக்க வேண்டும். அதை இப்போது இயக்க விரும்புகிறீர்களா?"</string> + <string name="enable" msgid="5031294444630523247">"இயக்கு"</string> + <string name="not_now" msgid="6172462888202790482">"இப்பொழுது வேண்டாம்"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"இதே உள்ளீட்டு நடை ஏற்கனவே உள்ளது: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"விசையின் நீண்ட அழுத்தத்தின் தாமதம்"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"விசையழுத்த அதிர்வின் காலஅளவு"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"விசையழுத்த ஒலியளவு"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"வெளிப்புற அகராதி கோப்பைப் படித்தல்"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"பதிவிறக்கங்கள் கோப்புறையில் அகராதி கோப்புகள் எதுவும் இல்லை"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"நிறுவுவதற்கு அகராதி கோப்பைத் தேர்ந்தெடுக்கவும்"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> மொழிக்கான இந்தக் கோப்பை நிச்சயமாக நிறுவ வேண்டுமா?"</string> + <string name="error" msgid="8940763624668513648">"பிழை ஏற்பட்டது"</string> + <string name="button_default" msgid="3988017840431881491">"இயல்புநிலை"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டிற்கு வரவேற்கிறோம்"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"சைகை உள்ளீடு மூலம்"</string> + <string name="setup_start_action" msgid="8936036460897347708">"தொடங்குக"</string> + <string name="setup_next_action" msgid="371821437915144603">"அடுத்த கட்டம்"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டை அமைக்கிறது"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாட்டை இயக்கவும்"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"உங்கள் மொழி & உள்ளீட்டு அமைப்புகளில் \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" பயன்பாட்டைச் சரிபார்க்கவும். உங்கள் சாதனத்தில் பயன்பாட்டை இயக்குவதை இது அங்கீகரிக்கும்."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"உங்கள் மொழி & உள்ளீட்டு அமைப்புகளில் <xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாடு ஏற்கனவே இயக்கப்பட்டுவிட்டது, அதனால் இந்தப் படிமுறை முடிந்தது. அடுத்த படிமுறைக்குச் செல்கிறது!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"அமைப்புகளில் இயக்கு"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> க்கு மாறவும்"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"அடுத்து, உங்கள் செயலில் உள்ள உரை உள்ளீட்டு முறையாக \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" பயன்பாட்டைத் தேர்ந்தெடுக்கவும்."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"உள்ளீட்டு முறைகளை மாற்றவும்"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"வாழ்த்துகள், தயாராகிவிட்டீர்கள்!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> பயன்பாடு மூலம் உங்களுக்கு விருப்பமான எல்லா பயன்பாடுகளிலும் நீங்கள் உள்ளிடலாம்."</string> + <string name="setup_step3_action" msgid="600879797256942259">"கூடுதல் மொழிகளை உள்ளமை"</string> + <string name="setup_finish_action" msgid="276559243409465389">"முடிந்தது"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"பயன்பாட்டு ஐகானைக் காட்டு"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"துவக்கியில் பயன்பாட்டு ஐகானைக் காட்டும்"</string> + <string name="app_name" msgid="6320102637491234792">"அகராதி வழங்கி"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"அகராதி வழங்கி"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"அகராதி சேவை"</string> + <string name="download_description" msgid="6014835283119198591">"அகராதியின் புதுப்பிப்பு தகவல்"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"துணை அகராதிகள்"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"அகராதி கிடைக்கிறது"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"அகராதிகளுக்கான அமைப்புகள்"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"பயனர் அகராதிகள்"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"பயனர் அகராதி"</string> + <string name="dictionary_available" msgid="4728975345815214218">"அகராதி கிடைக்கிறது"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"தற்போது பதிவிறக்குகிறது"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"நிறுவப்பட்டது"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"நிறுவப்பட்டது, முடக்கப்பட்டது"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"அகராதி சேவையில் இணைப்பதில் பிரச்சனை ஏற்பட்டது"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"அகராதிகள் எதுவும் இல்லை"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"புதுப்பி"</string> + <string name="last_update" msgid="730467549913588780">"இறுதியாகப் புதுப்பித்தது"</string> + <string name="message_updating" msgid="4457761393932375219">"புதுப்பிப்புகளுக்காக சரிபார்கிறது"</string> + <string name="message_loading" msgid="5638680861387748936">"ஏற்றுகிறது..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"முதன்மை அகராதி"</string> + <string name="cancel" msgid="6830980399865683324">"ரத்துசெய்"</string> + <string name="go_to_settings" msgid="3876892339342569259">"அமைப்புகள்"</string> + <string name="install_dict" msgid="180852772562189365">"நிறுவு"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ரத்துசெய்"</string> + <string name="delete_dict" msgid="756853268088330054">"நீக்கு"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"உங்கள் மொபைலில் தேர்ந்தெடுத்த மொழிக்கு அகராதி உள்ளது.<br/> உங்கள் உள்ளீட்டு அனுபவத்தை மேம்படுத்த <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> அகராதியைப் <b>பதிவிறக்குவதைப்</b> பரிந்துரைக்கிறோம்.<br/> <br/> 3G இல் பதிவிறக்கத்திற்கு ஒன்று அல்லது இரண்டு நிமிடங்கள் ஆகலாம். உங்களிடம் <b>வரம்பில்லா தரவு திட்டம்</b> இல்லையெனில் கட்டணம் விதிக்கப்படலாம்.<br/> உங்களிடம் எந்தத் தரவு திட்டம் உள்ளது என்பது உறுதியாகத் தெரியவில்லையெனில், பதிவிறக்கத்தைத் தானாகத் துவங்க, Wi-Fi இணைப்பைக் கண்டறிவதைப் பரிந்துரைக்கிறோம்.<br/> <br/> உதவிக்குறிப்பு: உங்கள் மொபைல் சாதனத்தில் <b>அமைப்புகள்</b> மெனுவில் உள்ள <b>மொழி & உள்ளீடு</b> என்பதற்குச் செலவதன் மூலம் அகராதிகளைப் பதிவிறக்கலாம் மற்றும் அகற்றலாம்."</string> + <string name="download_over_metered" msgid="1643065851159409546">"இப்போது பதிவிறக்கு (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>மெ.பை.)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi வழியாகப் பதிவிறக்கு"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> மொழிக்கு அகராதி கிடைக்கிறது"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"மதிப்பாய்வு செய்து பதிவிறக்க அழுத்தவும்"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"பதிவிறக்குகிறது: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> க்கான பரிந்துரைகள் விரைவில் தயாராகிவிடும்."</string> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> பதிப்பு"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"சேர்"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"அகராதியில் சேர்"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"சொற்றொடர்"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"மேலும் விருப்பங்கள்"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"குறைவான விருப்பங்கள்"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"சரி"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"வார்த்தை:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"குறுக்குவழி:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"மொழி:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"வார்த்தையை உள்ளிடவும்"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"விருப்பத்திற்குரிய குறுக்குவழி"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"வார்த்தையைத் திருத்து"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"திருத்து"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"நீக்கு"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"பயனர் அகராதியில் உங்களுக்கு எந்த வார்த்தைகளும் இல்லை. சேர் (+) என்ற பொத்தானைத் தொடுவதன் மூலம் வார்த்தையைச் சேர்க்கவும்."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"எல்லா மொழிகளுக்கும்"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"மேலும் மொழிகள்..."</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"நீக்கு"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-te-rAP/strings-action-keys.xml b/java/res/values-te-rAP/strings-action-keys.xml new file mode 100644 index 000000000..279b7fdcf --- /dev/null +++ b/java/res/values-te-rAP/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"వెళ్లు"</string> + <string name="label_next_key" msgid="5586407279258592635">"తదుపరి"</string> + <string name="label_previous_key" msgid="1421141755779895275">"మునుపటి"</string> + <string name="label_done_key" msgid="7564866296502630852">"పూర్తి"</string> + <string name="label_send_key" msgid="482252074224462163">"పంపు"</string> + <string name="label_search_key" msgid="7965186050435796642">"శోధించు"</string> + <string name="label_pause_key" msgid="2225922926459730642">"పాజ్ చేయి"</string> + <string name="label_wait_key" msgid="5891247853595466039">"వేచి ఉ."</string> +</resources> diff --git a/java/res/values-te-rAP/strings-appname.xml b/java/res/values-te-rAP/strings-appname.xml new file mode 100644 index 000000000..c644e5fa6 --- /dev/null +++ b/java/res/values-te-rAP/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android కీబోర్డ్ (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android అక్షరక్రమ తనిఖీ (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android కీబోర్డ్ సెట్టింగ్లు (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android అక్షరక్రమ తనిఖీ సెట్టింగ్లు (AOSP)"</string> +</resources> diff --git a/java/res/values-te-rAP/strings-config-important-notice.xml b/java/res/values-te-rAP/strings-config-important-notice.xml new file mode 100644 index 000000000..92ea8838b --- /dev/null +++ b/java/res/values-te-rAP/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"సూచనలను మెరుగుపరచడానికి మీ కమ్యూనికేషన్లు మరియు టైప్ చేయబడిన డేటా నుండి తెలుసుకోండి"</string> +</resources> diff --git a/java/res/values-te-rAP/strings-letter-descriptions.xml b/java/res/values-te-rAP/strings-letter-descriptions.xml new file mode 100644 index 000000000..a1d025861 --- /dev/null +++ b/java/res/values-te-rAP/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ఫెమినైన్ ఆర్డినల్ సూచిక"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"సూక్ష్మ గుర్తు"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"మాస్క్యూలిన్ ఆర్డినల్ సూచిక"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"షార్ప్ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, గ్రేవ్"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, అక్యూట్"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, టిల్డ్"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ఎగువన రింగ్"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, లిగేచర్"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, సిడిల్లా"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, గ్రేవ్"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, అక్యూట్"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, గ్రేవ్"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, అక్యూట్"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ఈథ్"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, టిల్డ్"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, గ్రేవ్"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, అక్యూట్"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, టిల్డ్"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, స్ట్రోక్"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, గ్రేవ్"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, అక్యూట్"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, అక్యూట్"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"థార్న్"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, డయేరిసిస్"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, బ్రీవ్"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, అక్యూట్"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, క్యారాన్"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, క్యారాన్"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, బ్రీవ్"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ఒగోనెక్"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, క్యారాన్"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, బ్రీవ్"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, సిడిల్లా"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, టిల్డ్"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, బ్రీవ్"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"డాట్లెస్ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, లిగేచర్"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, సిడిల్లా"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"క్రా"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, అక్యూట్"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, సిడిల్లా"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, క్యారాన్"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, మధ్యలో చుక్క"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, అక్యూట్"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, సిడిల్లా"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, క్యారాన్"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, ముందు భాగంలో అపాస్ట్రఫీ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ఇంజి"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, బ్రీవ్"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, డబుల్ అక్యూట్"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, లిగేచర్"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, అక్యూట్"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, సిడిల్లా"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, క్యారాన్"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, అక్యూట్"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, సిడిల్లా"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, క్యారాన్"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, సిడిల్లా"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, క్యారాన్"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, టిల్డ్"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, బ్రీవ్"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ఎగువన రింగ్"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, డబుల్ అక్యూట్"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, అక్యూట్"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, క్యారాన్"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"పొడవైన S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, హార్న్"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, హార్న్"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, దిగువన కామా"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, దిగువన కామా"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ష్వా"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, సర్కమ్ఫ్లెక్స్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, బ్రీవ్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, బ్రీవ్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, బ్రీవ్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, బ్రీవ్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, బ్రీవ్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, టిల్డ్"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, సర్కమ్ఫ్లెక్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, సర్కమ్ఫ్లెక్స్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, హార్న్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, హార్న్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, హార్న్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, హార్న్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, హార్న్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, హార్న్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, హార్న్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, హార్న్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, హార్న్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, హార్న్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, గ్రేవ్"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, టిల్డ్"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"విలోమ ఆశ్చర్యార్థక గుర్తు"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ఎడమవైపుకి ఉండే డబుల్ యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"మధ్యలో చుక్క"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"సూపర్స్క్రిప్ట్ ఒకటి"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"కుడివైపుకి ఉండే డబుల్ యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"విలోమ ప్రశార్థక గుర్తు"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ఎడమవైపు సింగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"కుడివైపు సింగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ఒక దిగువ-9 కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ఎడమవైపు డబుల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"కుడివైపు డబుల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"డ్యాగర్"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"డబుల్ డ్యాగర్"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"ఒక మిల్లేకి గుర్తు"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"ప్రైమ్"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"డబుల్ ప్రైమ్"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ఒకటి ఎడమవైపుకి ఉండే యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ఒకటి కుడివైపుకి ఉండే యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"సూపర్స్క్రిప్ట్ నాలుగు"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"సూపర్స్క్రిప్ట్ లాటిన్ చిన్న అక్షరం n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"పెసో గుర్తు"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"కేరాఫ్"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"కుడివైపుకి ఉండే బాణం"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"దిగువకు ఉండే బాణం"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"శూన్య సమితి"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"వృద్ధి"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"దీని కంటే తక్కువ లేదా దీనికి సమానం"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"దీని కంటే ఎక్కువ లేదా దీనికి సమానం"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"నలుపు రంగు నక్షత్రం"</string> +</resources> diff --git a/java/res/values-te-rAP/strings-talkback-descriptions.xml b/java/res/values-te-rAP/strings-talkback-descriptions.xml new file mode 100644 index 000000000..175b13e5e --- /dev/null +++ b/java/res/values-te-rAP/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"బిగ్గరగా చదివి వినిపించే పాస్వర్డ్ కీలను వినడానికి హెడ్సెట్ను ప్లగిన్ చేయండి."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ప్రస్తుత వచనం %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"వచనం ఏదీ నమోదు చేయబడలేదు"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ని <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>గా సరి చేస్తుంది"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> స్వీయ-సవరణను అమలు చేస్తుంది"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"తెలియని అక్షరం"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"షిప్ట్"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"మరిన్ని గుర్తులు"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"షిప్ట్"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"గుర్తులు"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"షిప్ట్"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"తొలగించు"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"గుర్తులు"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"అక్షరాలు"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"సంఖ్యలు"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"సెట్టింగ్లు"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ట్యాబ్"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"స్పేస్"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"వాయిస్ ఇన్పుట్"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ఎమోజి"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"తిరిగి వెళ్లు"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"శోధించు"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"చుక్క"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"భాషను మార్చండి"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"తదుపరి"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"మునుపటి"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"షిఫ్ట్ ప్రారంభించబడింది"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ప్రారంభించబడింది"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"గుర్తుల మోడ్"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"మరిన్ని గుర్తుల మోడ్"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"అక్షరాల మోడ్"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ఫోన్ మోడ్"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ఫోన్ గుర్తుల మోడ్"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"కీబోర్డ్ దాచబడింది"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> కీబోర్డ్ను చూపుతోంది"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"తేదీ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"తేదీ మరియు సమయం"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ఇమెయిల్"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"సందేశం"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"సంఖ్య"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ఫోన్"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"వచనం"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"సమయం"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ఇటీవలివి"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"వ్యక్తులు"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ఆబ్జెక్ట్లు"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ప్రకృతి"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"స్థలాలు"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"గుర్తులు"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ఎమోటికాన్లు"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"క్యాపిటల్ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"క్యాపిటల్ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"క్యాపిటల్ I, ఎగువన చుక్క"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"తెలియని చిహ్నం"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"తెలియని ఎమోజీ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ప్రత్యామ్నాయ అక్షరాలు అందుబాటులో ఉన్నాయి"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ప్రత్యామ్నాయ అక్షరాలు తీసివేయబడ్డాయి"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ప్రత్యామ్నాయ సూచనలు అందుబాటులో ఉన్నాయి"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ప్రత్యామ్నాయ సూచనలు తీసివేయబడ్డాయి"</string> +</resources> diff --git a/java/res/values-te-rAP/strings.xml b/java/res/values-te-rAP/strings.xml new file mode 100644 index 000000000..fa46f645d --- /dev/null +++ b/java/res/values-te-rAP/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ఇన్పుట్ ఎంపికలు"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"పరిచయ పేర్లను వెతకండి"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"అక్షరక్రమ తనిఖీ మీ పరిచయ జాబితా నుండి నమోదులను ఉపయోగిస్తుంది"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"కీని నొక్కినప్పుడు వైబ్రేట్"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"కీని నొక్కినప్పుడు ధ్వని"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"కీని నొక్కినప్పుడు పాప్అప్ చూపు"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ఇతర ఇన్పుట్ పద్ధతులకు మారండి"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"భాష మార్పు కీ ఇతర ఇన్పుట్ పద్ధతులను కూడా కవర్ చేస్తుంది"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"భాష మార్పు కీ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"బహుళ ఇన్పుట్ భాషలు ప్రారంభించబడినప్పుడు చూపు"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"స్లైడ్ సూచికను చూపు"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift లేదా గుర్తు కీల నుండి స్లైడ్ చేసేటప్పుడు దృశ్యమాన సంకేతాన్ని ప్రదర్శించు"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"కీ పాప్అప్ తీసివేత ఆలస్యం"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ఆలస్యం లేదు"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"డిఫాల్ట్"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>మిసె"</string> + <string name="settings_system_default" msgid="6268225104743331821">"సిస్టమ్ డిఫాల్ట్"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"పరిచయ పేర్లను సూచించు"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"సూచనలు మరియు సవరణల కోసం పరిచయాల నుండి పేర్లను ఉపయోగించు"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"వ్యక్తిగతీకరించబడిన సూచనలు"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని మెరుగుపరచండి"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"రెండు-అంతరాల చుక్క గుర్తు"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"స్పేస్ బార్పై రెండుసార్లు నొక్కడం వలన చుక్క, దాని ప్రక్కన అంతరం చొప్పించబడుతుంది"</string> + <string name="auto_cap" msgid="1719746674854628252">"స్వీయ-పెద్ద అక్షరాలు"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ప్రతి వాక్యంలో మొదటి పదాన్ని పెద్ద అక్షరాలుగా చేయి"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"వ్యక్తిగత నిఘంటువు"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"నిఘంటువులను జోడించు"</string> + <string name="main_dictionary" msgid="4798763781818361168">"ప్రధాన నిఘంటువు"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"సవరణ సూచనలను చూపు"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"టైప్ చేసేటప్పుడు సూచిత పదాలను ప్రదర్శించు"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ఎల్లప్పుడూ చూపు"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"పోర్ట్రెయిట్ మోడ్లో చూపు"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ఎల్లప్పుడూ దాచు"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"అభ్యంతరకరమైన పదాలను బ్లాక్ చేయి"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"సంభావ్యంగా అభ్యంతరకరమైన పదాలను సూచించవద్దు"</string> + <string name="auto_correction" msgid="7630720885194996950">"స్వీయ-సవరణ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"స్పేస్ బార్ మరియు విరామ చిహ్నాలు తప్పుగా టైప్ చేసిన పదాలను స్వయంచాలకంగా సరి చేస్తాయి"</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_aggressive" msgid="7319007299148899623">"తీవ్రం"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"చాలా తీవ్రం"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"తదుపరి-పదం సూచనలు"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"సూచనలను రూపొందించడంలో మునుపటి పదాన్ని ఉపయోగించు"</string> + <string name="gesture_input" msgid="826951152254563827">"సంజ్ఞ టైపింగ్ను ప్రారంభించండి"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"అక్షరాల గుండా స్లైడ్ చేయడం ద్వారా పదాన్ని ఇన్పుట్ చేయండి"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"సంజ్ఞ ట్రయిల్ను చూపు"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"డైనమిక్ ఫ్లోటింగ్ పరిదృశం"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"సంజ్ఞలు చేసేటప్పుడు సూచిత పదాన్ని చూడండి"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"పదబంధం సంజ్ఞ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"స్పేస్ కీకి గ్లైడ్ చేయడం ద్వారా సంజ్ఞల సమయంలో అంతరాలను ఇన్పుట్ చేయండి"</string> + <string name="voice_input" msgid="3583258583521397548">"వాయిస్ ఇన్పుట్ కీ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"వాయిస్ ఇన్పుట్ పద్ధతులు ఏవీ ప్రారంభించబడలేదు. భాష & ఇన్పుట్ సెట్టింగ్లను తనిఖీ చేయండి."</string> + <string name="configure_input_method" msgid="373356270290742459">"ఇన్పుట్ పద్ధతులను కాన్ఫిగర్ చేయండి"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ఇన్పుట్ భాషలు"</string> + <string name="send_feedback" msgid="1780431884109392046">"అభిప్రాయాన్ని పంపండి"</string> + <string name="select_language" msgid="3693815588777926848">"ఇన్పుట్ భాషలు"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"సేవ్ చేయడానికి మళ్లీ తాకండి"</string> + <string name="has_dictionary" msgid="6071847973466625007">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"కీబోర్డ్ థీమ్"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ఆంగ్లం (యుకె)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ఆంగ్లం (యుఎస్)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"స్పానిష్ (యుఎస్)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ఆంగ్లం (యుకె) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ఆంగ్లం (యుఎస్) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"స్పానిష్ (యుఎస్) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (సాంప్రదాయకం)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (సిరిలిక్)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (లాటిన్)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"భాష లేదు (ఆల్ఫాబెట్)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ఆల్ఫాబెట్ (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ఆల్ఫాబెట్ (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"ఆల్ఫాబెట్ (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"ఆల్ఫాబెట్ (డ్వోరక్)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ఆల్ఫాబెట్ (కోల్మాక్)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ఆల్ఫాబెట్ (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ఎమోజి"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"అనుకూల ఇన్పుట్ శైలులు"</string> + <string name="add_style" msgid="6163126614514489951">"శైలిని జోడించండి"</string> + <string name="add" msgid="8299699805688017798">"జోడించండి"</string> + <string name="remove" msgid="4486081658752944606">"తీసివేయి"</string> + <string name="save" msgid="7646738597196767214">"సేవ్ చేయి"</string> + <string name="subtype_locale" msgid="8576443440738143764">"భాష"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"లేఅవుట్"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"మీరు మీ అనుకూల ఇన్పుట్ శైలిని ఉపయోగించడం ప్రారంభించడానికి ముందు దీన్ని ప్రారంభించాల్సి ఉంటుంది. మీరు ఇప్పుడు దీన్ని ప్రారంభించాలనుకుంటున్నారా?"</string> + <string name="enable" msgid="5031294444630523247">"ప్రారంభించండి"</string> + <string name="not_now" msgid="6172462888202790482">"ఇప్పుడు కాదు"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ఇదే ఇన్పుట్ శైలి ఇప్పటికే ఉంది: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"కీని ఎక్కువసేపు నొక్కి ఉంచాల్సిన సమయంలో ఆలస్యం"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"కీని నొక్కినప్పుడు వైబ్రేషన్ వ్యవధి"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"కీని నొక్కినప్పుడు చేసే ధ్వని వాల్యూమ్"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"బాహ్య నిఘంటువు ఫైల్ను చదవండి"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"డౌన్లోడ్ల ఫోల్డర్లో నిఘంటువు ఫైల్లు ఏవీ లేవు"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ఇన్స్టాల్ చేయాల్సిన నిఘంటువు ఫైల్ను ఎంచుకోండి"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> కోసం ఈ ఫైల్ను నిజంగానే ఇన్స్టాల్ చేయాలా?"</string> + <string name="error" msgid="8940763624668513648">"లోపం ఏర్పడింది"</string> + <string name="button_default" msgid="3988017840431881491">"డిఫాల్ట్"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>కు స్వాగతం"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"సంజ్ఞ టైపింగ్తో"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ప్రారంభించండి"</string> + <string name="setup_next_action" msgid="371821437915144603">"తదుపరి దశ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని సెటప్ చేయడం"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని ప్రారంభించండి"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"దయచేసి మీ భాష & ఇన్పుట్ సెట్టింగ్ల్లో \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\"ని తనిఖీ చేయండి. ఇది మీ పరికరంలో అమలు చేయబడటానికి దీన్ని ప్రామాణీకరిస్తుంది."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ఇప్పటికే మీ భాష & ఇన్పుట్ సెట్టింగ్ల్లో ప్రారంభించబడింది, కనుక ఈ దశ పూర్తయింది. తదుపరి దశకు వెళ్లండి!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"సెట్టింగ్ల్లో ప్రారంభించండి"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>కు మారండి"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"తర్వాత, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\"ని మీ సక్రియ వచన-ఇన్పుట్ పద్ధతిగా ఎంచుకోండి."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ఇన్పుట్ పద్ధతులను మార్చు"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"అభినందనలు, మీరు అంతా పూర్తి చేసారు!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"ఇప్పుడు మీరు <xliff:g id="APPLICATION_NAME">%s</xliff:g>తో మీకు ఇష్టమైన అన్ని అనువర్తనాల్లో టైప్ చేయవచ్చు."</string> + <string name="setup_step3_action" msgid="600879797256942259">"అదనపు భాషలను కాన్ఫిగర్ చేయండి"</string> + <string name="setup_finish_action" msgid="276559243409465389">"పూర్తయింది"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"అనువర్తన చిహ్నాన్ని చూపు"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"లాంచర్లో అనువర్తన చిహ్నాన్ని ప్రదర్శించు"</string> + <string name="app_name" msgid="6320102637491234792">"నిఘంటువు ప్రదాత"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"నిఘంటువు ప్రదాత"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"నిఘంటువు సేవ"</string> + <string name="download_description" msgid="6014835283119198591">"నిఘంటువు నవీకరణ సమాచారం"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"నిఘంటువులను జోడించండి"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"నిఘంటువుల కోసం సెట్టింగ్లు"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"వినియోగదారు నిఘంటువులు"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"వినియోగదారు నిఘంటువు"</string> + <string name="dictionary_available" msgid="4728975345815214218">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"ప్రస్తుతం డౌన్లోడ్ చేస్తోంది"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ఇన్స్టాల్ చేయబడింది"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ఇన్స్టాల్ చేయబడింది, నిలిపివేయబడింది"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"నిఘంటువు సేవకు కనెక్ట్ చేయడంలో సమస్య"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"నిఘంటువులు ఏవీ అందుబాటులో లేవు"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"రీఫ్రెష్ చేయండి"</string> + <string name="last_update" msgid="730467549913588780">"చివరిగా నవీకరించబడినది"</string> + <string name="message_updating" msgid="4457761393932375219">"నవీకరణల కోసం తనిఖీ చేస్తోంది"</string> + <string name="message_loading" msgid="5638680861387748936">"లోడ్ చేస్తోంది…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"ప్రధాన నిఘంటువు"</string> + <string name="cancel" msgid="6830980399865683324">"రద్దు చేయి"</string> + <string name="go_to_settings" msgid="3876892339342569259">"సెట్టింగ్లు"</string> + <string name="install_dict" msgid="180852772562189365">"ఇన్స్టాల్ చేయి"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"రద్దు చేయి"</string> + <string name="delete_dict" msgid="756853268088330054">"తొలగించు"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"మీ మొబైల్ పరికరంలో ఎంచుకున్న భాషకు నిఘంటువు అందుబాటులో ఉంది.<br/> మీ టైపింగ్ అనుభవాన్ని మెరుగుపరచుకోవడానికి <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> నిఘంటువుని <b>డౌన్లోడ్ చేయాల్సిందిగా</b> మేము సిఫార్సు చేస్తున్నాము.<br/> <br/> డౌన్లోడ్ చేయడానికి 3Gలో ఒకటి లేదా రెండు నిమిషాలు పట్టవచ్చు. మీకు <b>అపరిమిత డేటా ప్లాన్</b> లేకపోతే, ఛార్జీలు వర్తించవచ్చు.<br/> మీరు ఏ డేటా ప్లాన్ను కలిగి ఉన్నారనే విషయం సరిగ్గా తెలియకపోతే, డౌన్లోడ్ను స్వయంచాలకంగా ప్రారంభించడానికి Wi-Fi కనెక్షన్ను కనుగొనాల్సిందిగా మేము సిఫార్సు చేస్తున్నాము.<br/> <br/> చిట్కా: మీరు మీ మొబైల్ పరికరం యొక్క <b>సెట్టింగ్లు</b> మెనులో <b>భాష & ఇన్పుట్</b>కి వెళ్లడం ద్వారా నిఘంటువులను డౌన్లోడ్ చేయవచ్చు మరియు తీసివేయవచ్చు."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ఇప్పుడే డౌన్లోడ్ చేయండి (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi ద్వారా డౌన్లోడ్ చేయండి"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> కోసం నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"సమీక్షించి, డౌన్లోడ్ చేయడానికి నొక్కండి"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"డౌన్లోడ్ చేస్తోంది: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> కోసం సూచనలు త్వరలో సిద్ధం చేయబడతాయి."</string> + <string name="version_text" msgid="2715354215568469385">"సంస్కరణ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"జోడించు"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"నిఘంటువుకి జోడించు"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"పదబంధం"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"మరిన్ని ఎంపికలు"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"తక్కువ ఎంపికలు"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"సరే"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"పదం:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"సత్వరమార్గం:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"భాష:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"పదాన్ని టైప్ చేయి"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ఐచ్ఛిక సత్వరమార్గం"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"పదాన్ని సవరించు"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"సవరించు"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"తొలగించు"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"మీరు వినియోగదారు నిఘంటువులో పదాలు ఏవీ కలిగి లేరు. జోడించు (+) బటన్ను తాకడం ద్వారా పదాన్ని జోడించండి."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"అన్ని భాషల కోసం"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"మరిన్ని భాషలు…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"తొలగించు"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-te-rIN/strings-action-keys.xml b/java/res/values-te-rIN/strings-action-keys.xml new file mode 100644 index 000000000..279b7fdcf --- /dev/null +++ b/java/res/values-te-rIN/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"వెళ్లు"</string> + <string name="label_next_key" msgid="5586407279258592635">"తదుపరి"</string> + <string name="label_previous_key" msgid="1421141755779895275">"మునుపటి"</string> + <string name="label_done_key" msgid="7564866296502630852">"పూర్తి"</string> + <string name="label_send_key" msgid="482252074224462163">"పంపు"</string> + <string name="label_search_key" msgid="7965186050435796642">"శోధించు"</string> + <string name="label_pause_key" msgid="2225922926459730642">"పాజ్ చేయి"</string> + <string name="label_wait_key" msgid="5891247853595466039">"వేచి ఉ."</string> +</resources> diff --git a/java/res/values-te-rIN/strings-appname.xml b/java/res/values-te-rIN/strings-appname.xml new file mode 100644 index 000000000..c644e5fa6 --- /dev/null +++ b/java/res/values-te-rIN/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android కీబోర్డ్ (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android అక్షరక్రమ తనిఖీ (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android కీబోర్డ్ సెట్టింగ్లు (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android అక్షరక్రమ తనిఖీ సెట్టింగ్లు (AOSP)"</string> +</resources> diff --git a/java/res/values-te-rIN/strings-config-important-notice.xml b/java/res/values-te-rIN/strings-config-important-notice.xml new file mode 100644 index 000000000..92ea8838b --- /dev/null +++ b/java/res/values-te-rIN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"సూచనలను మెరుగుపరచడానికి మీ కమ్యూనికేషన్లు మరియు టైప్ చేయబడిన డేటా నుండి తెలుసుకోండి"</string> +</resources> diff --git a/java/res/values-te-rIN/strings-letter-descriptions.xml b/java/res/values-te-rIN/strings-letter-descriptions.xml new file mode 100644 index 000000000..a1d025861 --- /dev/null +++ b/java/res/values-te-rIN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ఫెమినైన్ ఆర్డినల్ సూచిక"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"సూక్ష్మ గుర్తు"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"మాస్క్యూలిన్ ఆర్డినల్ సూచిక"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"షార్ప్ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, గ్రేవ్"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, అక్యూట్"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, టిల్డ్"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ఎగువన రింగ్"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, లిగేచర్"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, సిడిల్లా"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, గ్రేవ్"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, అక్యూట్"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, గ్రేవ్"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, అక్యూట్"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ఈథ్"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, టిల్డ్"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, గ్రేవ్"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, అక్యూట్"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, టిల్డ్"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, స్ట్రోక్"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, గ్రేవ్"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, అక్యూట్"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, డయేరిసిస్"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, అక్యూట్"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"థార్న్"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, డయేరిసిస్"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, బ్రీవ్"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, అక్యూట్"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, క్యారాన్"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, క్యారాన్"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, బ్రీవ్"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ఒగోనెక్"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, క్యారాన్"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, బ్రీవ్"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, సిడిల్లా"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, టిల్డ్"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, బ్రీవ్"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"డాట్లెస్ I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, లిగేచర్"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, సిడిల్లా"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"క్రా"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, అక్యూట్"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, సిడిల్లా"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, క్యారాన్"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, మధ్యలో చుక్క"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, అక్యూట్"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, సిడిల్లా"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, క్యారాన్"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, ముందు భాగంలో అపాస్ట్రఫీ"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"ఇంజి"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, బ్రీవ్"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, డబుల్ అక్యూట్"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, లిగేచర్"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, అక్యూట్"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, సిడిల్లా"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, క్యారాన్"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, అక్యూట్"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, సిడిల్లా"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, క్యారాన్"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, సిడిల్లా"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, క్యారాన్"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, స్ట్రోక్"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, టిల్డ్"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, మ్యాక్రాన్"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, బ్రీవ్"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ఎగువన రింగ్"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, డబుల్ అక్యూట్"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ఒగోనెక్"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, సర్కమ్ఫ్లెక్స్"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, అక్యూట్"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, క్యారాన్"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"పొడవైన S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, హార్న్"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, హార్న్"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, దిగువన కామా"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, దిగువన కామా"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ష్వా"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, సర్కమ్ఫ్లెక్స్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, బ్రీవ్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, బ్రీవ్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, బ్రీవ్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, బ్రీవ్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, బ్రీవ్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ఎగువన చుక్క"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, టిల్డ్"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, సర్కమ్ఫ్లెక్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, సర్కమ్ఫ్లెక్స్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, సర్కమ్ఫ్లెక్స్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, సర్కమ్ఫ్లెక్స్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, సర్కమ్ఫ్లెక్స్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, సర్కమ్ఫ్లెక్స్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, హార్న్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, హార్న్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, హార్న్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, హార్న్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, హార్న్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, హార్న్ మరియు అక్యూట్"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, హార్న్ మరియు గ్రేవ్"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, హార్న్ మరియు ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, హార్న్ మరియు టిల్డ్"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, హార్న్ మరియు దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, గ్రేవ్"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, దిగువన చుక్క"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ఎగువన హుక్"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, టిల్డ్"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"విలోమ ఆశ్చర్యార్థక గుర్తు"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ఎడమవైపుకి ఉండే డబుల్ యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"మధ్యలో చుక్క"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"సూపర్స్క్రిప్ట్ ఒకటి"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"కుడివైపుకి ఉండే డబుల్ యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"విలోమ ప్రశార్థక గుర్తు"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"ఎడమవైపు సింగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"కుడివైపు సింగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"ఒక దిగువ-9 కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"ఎడమవైపు డబుల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"కుడివైపు డబుల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"డ్యాగర్"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"డబుల్ డ్యాగర్"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"ఒక మిల్లేకి గుర్తు"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"ప్రైమ్"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"డబుల్ ప్రైమ్"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"ఒకటి ఎడమవైపుకి ఉండే యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"ఒకటి కుడివైపుకి ఉండే యాంగిల్ కొటేషన్ గుర్తు"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"సూపర్స్క్రిప్ట్ నాలుగు"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"సూపర్స్క్రిప్ట్ లాటిన్ చిన్న అక్షరం n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"పెసో గుర్తు"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"కేరాఫ్"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"కుడివైపుకి ఉండే బాణం"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"దిగువకు ఉండే బాణం"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"శూన్య సమితి"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"వృద్ధి"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"దీని కంటే తక్కువ లేదా దీనికి సమానం"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"దీని కంటే ఎక్కువ లేదా దీనికి సమానం"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"నలుపు రంగు నక్షత్రం"</string> +</resources> diff --git a/java/res/values-te-rIN/strings-talkback-descriptions.xml b/java/res/values-te-rIN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..175b13e5e --- /dev/null +++ b/java/res/values-te-rIN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"బిగ్గరగా చదివి వినిపించే పాస్వర్డ్ కీలను వినడానికి హెడ్సెట్ను ప్లగిన్ చేయండి."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ప్రస్తుత వచనం %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"వచనం ఏదీ నమోదు చేయబడలేదు"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ని <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>గా సరి చేస్తుంది"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> స్వీయ-సవరణను అమలు చేస్తుంది"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"తెలియని అక్షరం"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"షిప్ట్"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"మరిన్ని గుర్తులు"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"షిప్ట్"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"గుర్తులు"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"షిప్ట్"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"తొలగించు"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"గుర్తులు"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"అక్షరాలు"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"సంఖ్యలు"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"సెట్టింగ్లు"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"ట్యాబ్"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"స్పేస్"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"వాయిస్ ఇన్పుట్"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"ఎమోజి"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"తిరిగి వెళ్లు"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"శోధించు"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"చుక్క"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"భాషను మార్చండి"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"తదుపరి"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"మునుపటి"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"షిఫ్ట్ ప్రారంభించబడింది"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock ప్రారంభించబడింది"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"గుర్తుల మోడ్"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"మరిన్ని గుర్తుల మోడ్"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"అక్షరాల మోడ్"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"ఫోన్ మోడ్"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"ఫోన్ గుర్తుల మోడ్"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"కీబోర్డ్ దాచబడింది"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> కీబోర్డ్ను చూపుతోంది"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"తేదీ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"తేదీ మరియు సమయం"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ఇమెయిల్"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"సందేశం"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"సంఖ్య"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ఫోన్"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"వచనం"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"సమయం"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ఇటీవలివి"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"వ్యక్తులు"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"ఆబ్జెక్ట్లు"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ప్రకృతి"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"స్థలాలు"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"గుర్తులు"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ఎమోటికాన్లు"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"క్యాపిటల్ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"క్యాపిటల్ I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"క్యాపిటల్ I, ఎగువన చుక్క"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"తెలియని చిహ్నం"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"తెలియని ఎమోజీ"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ప్రత్యామ్నాయ అక్షరాలు అందుబాటులో ఉన్నాయి"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ప్రత్యామ్నాయ అక్షరాలు తీసివేయబడ్డాయి"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ప్రత్యామ్నాయ సూచనలు అందుబాటులో ఉన్నాయి"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ప్రత్యామ్నాయ సూచనలు తీసివేయబడ్డాయి"</string> +</resources> diff --git a/java/res/values-te-rIN/strings.xml b/java/res/values-te-rIN/strings.xml new file mode 100644 index 000000000..fa46f645d --- /dev/null +++ b/java/res/values-te-rIN/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ఇన్పుట్ ఎంపికలు"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"పరిచయ పేర్లను వెతకండి"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"అక్షరక్రమ తనిఖీ మీ పరిచయ జాబితా నుండి నమోదులను ఉపయోగిస్తుంది"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"కీని నొక్కినప్పుడు వైబ్రేట్"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"కీని నొక్కినప్పుడు ధ్వని"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"కీని నొక్కినప్పుడు పాప్అప్ చూపు"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ఇతర ఇన్పుట్ పద్ధతులకు మారండి"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"భాష మార్పు కీ ఇతర ఇన్పుట్ పద్ధతులను కూడా కవర్ చేస్తుంది"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"భాష మార్పు కీ"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"బహుళ ఇన్పుట్ భాషలు ప్రారంభించబడినప్పుడు చూపు"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"స్లైడ్ సూచికను చూపు"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift లేదా గుర్తు కీల నుండి స్లైడ్ చేసేటప్పుడు దృశ్యమాన సంకేతాన్ని ప్రదర్శించు"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"కీ పాప్అప్ తీసివేత ఆలస్యం"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"ఆలస్యం లేదు"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"డిఫాల్ట్"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>మిసె"</string> + <string name="settings_system_default" msgid="6268225104743331821">"సిస్టమ్ డిఫాల్ట్"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"పరిచయ పేర్లను సూచించు"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"సూచనలు మరియు సవరణల కోసం పరిచయాల నుండి పేర్లను ఉపయోగించు"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"వ్యక్తిగతీకరించబడిన సూచనలు"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని మెరుగుపరచండి"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"రెండు-అంతరాల చుక్క గుర్తు"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"స్పేస్ బార్పై రెండుసార్లు నొక్కడం వలన చుక్క, దాని ప్రక్కన అంతరం చొప్పించబడుతుంది"</string> + <string name="auto_cap" msgid="1719746674854628252">"స్వీయ-పెద్ద అక్షరాలు"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ప్రతి వాక్యంలో మొదటి పదాన్ని పెద్ద అక్షరాలుగా చేయి"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"వ్యక్తిగత నిఘంటువు"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"నిఘంటువులను జోడించు"</string> + <string name="main_dictionary" msgid="4798763781818361168">"ప్రధాన నిఘంటువు"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"సవరణ సూచనలను చూపు"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"టైప్ చేసేటప్పుడు సూచిత పదాలను ప్రదర్శించు"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ఎల్లప్పుడూ చూపు"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"పోర్ట్రెయిట్ మోడ్లో చూపు"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ఎల్లప్పుడూ దాచు"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"అభ్యంతరకరమైన పదాలను బ్లాక్ చేయి"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"సంభావ్యంగా అభ్యంతరకరమైన పదాలను సూచించవద్దు"</string> + <string name="auto_correction" msgid="7630720885194996950">"స్వీయ-సవరణ"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"స్పేస్ బార్ మరియు విరామ చిహ్నాలు తప్పుగా టైప్ చేసిన పదాలను స్వయంచాలకంగా సరి చేస్తాయి"</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_aggressive" msgid="7319007299148899623">"తీవ్రం"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"చాలా తీవ్రం"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"తదుపరి-పదం సూచనలు"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"సూచనలను రూపొందించడంలో మునుపటి పదాన్ని ఉపయోగించు"</string> + <string name="gesture_input" msgid="826951152254563827">"సంజ్ఞ టైపింగ్ను ప్రారంభించండి"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"అక్షరాల గుండా స్లైడ్ చేయడం ద్వారా పదాన్ని ఇన్పుట్ చేయండి"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"సంజ్ఞ ట్రయిల్ను చూపు"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"డైనమిక్ ఫ్లోటింగ్ పరిదృశం"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"సంజ్ఞలు చేసేటప్పుడు సూచిత పదాన్ని చూడండి"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"పదబంధం సంజ్ఞ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"స్పేస్ కీకి గ్లైడ్ చేయడం ద్వారా సంజ్ఞల సమయంలో అంతరాలను ఇన్పుట్ చేయండి"</string> + <string name="voice_input" msgid="3583258583521397548">"వాయిస్ ఇన్పుట్ కీ"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"వాయిస్ ఇన్పుట్ పద్ధతులు ఏవీ ప్రారంభించబడలేదు. భాష & ఇన్పుట్ సెట్టింగ్లను తనిఖీ చేయండి."</string> + <string name="configure_input_method" msgid="373356270290742459">"ఇన్పుట్ పద్ధతులను కాన్ఫిగర్ చేయండి"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ఇన్పుట్ భాషలు"</string> + <string name="send_feedback" msgid="1780431884109392046">"అభిప్రాయాన్ని పంపండి"</string> + <string name="select_language" msgid="3693815588777926848">"ఇన్పుట్ భాషలు"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"సేవ్ చేయడానికి మళ్లీ తాకండి"</string> + <string name="has_dictionary" msgid="6071847973466625007">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"కీబోర్డ్ థీమ్"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ఆంగ్లం (యుకె)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ఆంగ్లం (యుఎస్)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"స్పానిష్ (యుఎస్)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"ఆంగ్లం (యుకె) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"ఆంగ్లం (యుఎస్) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"స్పానిష్ (యుఎస్) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (సాంప్రదాయకం)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (సిరిలిక్)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (లాటిన్)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"భాష లేదు (ఆల్ఫాబెట్)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ఆల్ఫాబెట్ (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ఆల్ఫాబెట్ (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"ఆల్ఫాబెట్ (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"ఆల్ఫాబెట్ (డ్వోరక్)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ఆల్ఫాబెట్ (కోల్మాక్)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ఆల్ఫాబెట్ (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"ఎమోజి"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"అనుకూల ఇన్పుట్ శైలులు"</string> + <string name="add_style" msgid="6163126614514489951">"శైలిని జోడించండి"</string> + <string name="add" msgid="8299699805688017798">"జోడించండి"</string> + <string name="remove" msgid="4486081658752944606">"తీసివేయి"</string> + <string name="save" msgid="7646738597196767214">"సేవ్ చేయి"</string> + <string name="subtype_locale" msgid="8576443440738143764">"భాష"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"లేఅవుట్"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"మీరు మీ అనుకూల ఇన్పుట్ శైలిని ఉపయోగించడం ప్రారంభించడానికి ముందు దీన్ని ప్రారంభించాల్సి ఉంటుంది. మీరు ఇప్పుడు దీన్ని ప్రారంభించాలనుకుంటున్నారా?"</string> + <string name="enable" msgid="5031294444630523247">"ప్రారంభించండి"</string> + <string name="not_now" msgid="6172462888202790482">"ఇప్పుడు కాదు"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ఇదే ఇన్పుట్ శైలి ఇప్పటికే ఉంది: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"కీని ఎక్కువసేపు నొక్కి ఉంచాల్సిన సమయంలో ఆలస్యం"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"కీని నొక్కినప్పుడు వైబ్రేషన్ వ్యవధి"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"కీని నొక్కినప్పుడు చేసే ధ్వని వాల్యూమ్"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"బాహ్య నిఘంటువు ఫైల్ను చదవండి"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"డౌన్లోడ్ల ఫోల్డర్లో నిఘంటువు ఫైల్లు ఏవీ లేవు"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"ఇన్స్టాల్ చేయాల్సిన నిఘంటువు ఫైల్ను ఎంచుకోండి"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> కోసం ఈ ఫైల్ను నిజంగానే ఇన్స్టాల్ చేయాలా?"</string> + <string name="error" msgid="8940763624668513648">"లోపం ఏర్పడింది"</string> + <string name="button_default" msgid="3988017840431881491">"డిఫాల్ట్"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>కు స్వాగతం"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"సంజ్ఞ టైపింగ్తో"</string> + <string name="setup_start_action" msgid="8936036460897347708">"ప్రారంభించండి"</string> + <string name="setup_next_action" msgid="371821437915144603">"తదుపరి దశ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని సెటప్ చేయడం"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ని ప్రారంభించండి"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"దయచేసి మీ భాష & ఇన్పుట్ సెట్టింగ్ల్లో \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\"ని తనిఖీ చేయండి. ఇది మీ పరికరంలో అమలు చేయబడటానికి దీన్ని ప్రామాణీకరిస్తుంది."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ఇప్పటికే మీ భాష & ఇన్పుట్ సెట్టింగ్ల్లో ప్రారంభించబడింది, కనుక ఈ దశ పూర్తయింది. తదుపరి దశకు వెళ్లండి!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"సెట్టింగ్ల్లో ప్రారంభించండి"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>కు మారండి"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"తర్వాత, \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\"ని మీ సక్రియ వచన-ఇన్పుట్ పద్ధతిగా ఎంచుకోండి."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"ఇన్పుట్ పద్ధతులను మార్చు"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"అభినందనలు, మీరు అంతా పూర్తి చేసారు!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"ఇప్పుడు మీరు <xliff:g id="APPLICATION_NAME">%s</xliff:g>తో మీకు ఇష్టమైన అన్ని అనువర్తనాల్లో టైప్ చేయవచ్చు."</string> + <string name="setup_step3_action" msgid="600879797256942259">"అదనపు భాషలను కాన్ఫిగర్ చేయండి"</string> + <string name="setup_finish_action" msgid="276559243409465389">"పూర్తయింది"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"అనువర్తన చిహ్నాన్ని చూపు"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"లాంచర్లో అనువర్తన చిహ్నాన్ని ప్రదర్శించు"</string> + <string name="app_name" msgid="6320102637491234792">"నిఘంటువు ప్రదాత"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"నిఘంటువు ప్రదాత"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"నిఘంటువు సేవ"</string> + <string name="download_description" msgid="6014835283119198591">"నిఘంటువు నవీకరణ సమాచారం"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"నిఘంటువులను జోడించండి"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"నిఘంటువుల కోసం సెట్టింగ్లు"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"వినియోగదారు నిఘంటువులు"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"వినియోగదారు నిఘంటువు"</string> + <string name="dictionary_available" msgid="4728975345815214218">"నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"ప్రస్తుతం డౌన్లోడ్ చేస్తోంది"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ఇన్స్టాల్ చేయబడింది"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ఇన్స్టాల్ చేయబడింది, నిలిపివేయబడింది"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"నిఘంటువు సేవకు కనెక్ట్ చేయడంలో సమస్య"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"నిఘంటువులు ఏవీ అందుబాటులో లేవు"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"రీఫ్రెష్ చేయండి"</string> + <string name="last_update" msgid="730467549913588780">"చివరిగా నవీకరించబడినది"</string> + <string name="message_updating" msgid="4457761393932375219">"నవీకరణల కోసం తనిఖీ చేస్తోంది"</string> + <string name="message_loading" msgid="5638680861387748936">"లోడ్ చేస్తోంది…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"ప్రధాన నిఘంటువు"</string> + <string name="cancel" msgid="6830980399865683324">"రద్దు చేయి"</string> + <string name="go_to_settings" msgid="3876892339342569259">"సెట్టింగ్లు"</string> + <string name="install_dict" msgid="180852772562189365">"ఇన్స్టాల్ చేయి"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"రద్దు చేయి"</string> + <string name="delete_dict" msgid="756853268088330054">"తొలగించు"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"మీ మొబైల్ పరికరంలో ఎంచుకున్న భాషకు నిఘంటువు అందుబాటులో ఉంది.<br/> మీ టైపింగ్ అనుభవాన్ని మెరుగుపరచుకోవడానికి <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> నిఘంటువుని <b>డౌన్లోడ్ చేయాల్సిందిగా</b> మేము సిఫార్సు చేస్తున్నాము.<br/> <br/> డౌన్లోడ్ చేయడానికి 3Gలో ఒకటి లేదా రెండు నిమిషాలు పట్టవచ్చు. మీకు <b>అపరిమిత డేటా ప్లాన్</b> లేకపోతే, ఛార్జీలు వర్తించవచ్చు.<br/> మీరు ఏ డేటా ప్లాన్ను కలిగి ఉన్నారనే విషయం సరిగ్గా తెలియకపోతే, డౌన్లోడ్ను స్వయంచాలకంగా ప్రారంభించడానికి Wi-Fi కనెక్షన్ను కనుగొనాల్సిందిగా మేము సిఫార్సు చేస్తున్నాము.<br/> <br/> చిట్కా: మీరు మీ మొబైల్ పరికరం యొక్క <b>సెట్టింగ్లు</b> మెనులో <b>భాష & ఇన్పుట్</b>కి వెళ్లడం ద్వారా నిఘంటువులను డౌన్లోడ్ చేయవచ్చు మరియు తీసివేయవచ్చు."</string> + <string name="download_over_metered" msgid="1643065851159409546">"ఇప్పుడే డౌన్లోడ్ చేయండి (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi ద్వారా డౌన్లోడ్ చేయండి"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> కోసం నిఘంటువు అందుబాటులో ఉంది"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"సమీక్షించి, డౌన్లోడ్ చేయడానికి నొక్కండి"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"డౌన్లోడ్ చేస్తోంది: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> కోసం సూచనలు త్వరలో సిద్ధం చేయబడతాయి."</string> + <string name="version_text" msgid="2715354215568469385">"సంస్కరణ <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"జోడించు"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"నిఘంటువుకి జోడించు"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"పదబంధం"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"మరిన్ని ఎంపికలు"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"తక్కువ ఎంపికలు"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"సరే"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"పదం:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"సత్వరమార్గం:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"భాష:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"పదాన్ని టైప్ చేయి"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ఐచ్ఛిక సత్వరమార్గం"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"పదాన్ని సవరించు"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"సవరించు"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"తొలగించు"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"మీరు వినియోగదారు నిఘంటువులో పదాలు ఏవీ కలిగి లేరు. జోడించు (+) బటన్ను తాకడం ద్వారా పదాన్ని జోడించండి."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"అన్ని భాషల కోసం"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"మరిన్ని భాషలు…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"తొలగించు"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-th/donottranslate.xml b/java/res/values-th/donottranslate-config-spacing-and-punctuations.xml index a9893feec..a9893feec 100644 --- a/java/res/values-th/donottranslate.xml +++ b/java/res/values-th/donottranslate-config-spacing-and-punctuations.xml diff --git a/java/res/values-th/strings-action-keys.xml b/java/res/values-th/strings-action-keys.xml index f23bfbc2a..1e828a1c0 100644 --- a/java/res/values-th/strings-action-keys.xml +++ b/java/res/values-th/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"ก่อน"</string> <string name="label_done_key" msgid="7564866296502630852">"เสร็จ"</string> <string name="label_send_key" msgid="482252074224462163">"ส่ง"</string> + <string name="label_search_key" msgid="7965186050435796642">"ค้นหา"</string> <string name="label_pause_key" msgid="2225922926459730642">"หยุด"</string> <string name="label_wait_key" msgid="5891247853595466039">"รอ"</string> </resources> diff --git a/java/res/values-th/strings-appname.xml b/java/res/values-th/strings-appname.xml index af6d1a94b..04193687a 100644 --- a/java/res/values-th/strings-appname.xml +++ b/java/res/values-th/strings-appname.xml @@ -20,8 +20,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="5940510615957428904">"แป้นพิมพ์แอนดรอยด์ (AOSP)"</string> - <string name="spell_checker_service_name" msgid="1254221805440242662">"เครื่องตรวจตัวสะกดแอนดรอยด์ (AOSP)"</string> - <string name="english_ime_settings" msgid="5760361067176802794">"การตั้งค่าแป้นพิมพ์แอนดรอยด์ (AOSP)"</string> - <string name="android_spell_checker_settings" msgid="6123949487832861885">"การตั้งค่าเครื่องตรวจตัวสะกดแอนดรอยด์ (AOSP)"</string> + <string name="english_ime_name" msgid="5940510615957428904">"แป้นพิมพ์ Android (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"เครื่องตรวจตัวสะกด Android (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"การตั้งค่าแป้นพิมพ์ Android (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"การตั้งค่าเครื่องตรวจตัวสะกด Android (AOSP)"</string> </resources> diff --git a/java/res/values-th/strings-config-important-notice.xml b/java/res/values-th/strings-config-important-notice.xml new file mode 100644 index 000000000..3f0b6034a --- /dev/null +++ b/java/res/values-th/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"เรียนรู้จากการสื่อสารและข้อมูลที่พิมพ์ของคุณเพื่อปรับปรุงคำแนะนำ"</string> +</resources> diff --git a/java/res/values-th/strings-letter-descriptions.xml b/java/res/values-th/strings-letter-descriptions.xml new file mode 100644 index 000000000..84b9b2da8 --- /dev/null +++ b/java/res/values-th/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"เครื่องหมายกำกับเลขลำดับนามเพศหญิง"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"สัญลักษณ์ไมโคร"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"เครื่องหมายกำกับเลขลำดับนามเพศชาย"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ชาร์ป"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A เติมเกรฟ"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A เติมทิลเดอ"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A เติมริงด้านบน"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"อักษรรวม A กับ E"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C เติมซิดิลลา"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E เติมเกรฟ"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I เติมเกรฟ"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N เติมทิลเดอ"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O เติมเกรฟ"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O เติมทิลเดอ"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O เติมสโตรก"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U เติมเกรฟ"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y เติมอะคิวต์"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ธอร์น"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y เติมไดเอเรซิส"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A เติมแมครอน"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A เติมบรีฟ"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A เติมออกอแนก"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C เติมอะคิวต์"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C เติมจุดด้านบน"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C เติมแครอน"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D เติมแครอน"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D เติมสโตรก"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"อี เติมแมครอน"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"อี เติมบรีฟ"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E เติมจุดด้านบน"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E เติมออกอแนก"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E เติมแครอน"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G เติมบรีฟ"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G เติมจุดด้านบน"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H เติมสโตรก"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I เติมทิลเดอ"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I เติมแมครอน"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I เติมบรีฟ"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I เติมออกอแนก"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I ไม่มีจุด"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"อักษรรวม I กับ J"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L เติมอะคิวต์"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L เติมซิดิลลา"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L เติมแครอน"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L เติมจุดตรงกลาง"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L เติมสโตรก"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N เติมอะคิวต์"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N เติมแครอน"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N นำหน้าด้วยเครื่องหมายอะพอสทรอฟี"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O เติมแมครอน"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O เติมบรีฟ"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O เติมอะคิวต์คู่"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"อักษรรวม O กับ E"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R เติมอะคิวต์"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R เติมแครอน"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S เติมอะคิวต์"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S เติมแครอน"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T เติมซิดิลลา"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T เติมแครอน"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T เติมสโตรก"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U เติมทิลเดอ"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U เติมแมครอน"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U เติมบรีฟ"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U เติมริงด้านบน"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U เติมอะคิวต์คู่"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U เติมออกอแนก"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y เติมเซอร์คัมเฟลกซ์"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z เติมอะคิวต์"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z เติมจุดด้านบน"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z เติมแครอน"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S ยาว"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O เติมฮอร์น"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U เติมฮอร์น"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S เติมจุลภาคด้านล่าง"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T เติมจุลภาคด้านล่าง"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ชวา"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A เติมเซอร์คัมเฟลกซ์และอะคิวต์"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A เติมเซอร์คัมเฟลกซ์และเกรฟ"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A เติมเซอร์คัมเฟลกซ์และฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A เติมเซอร์คัมเฟลกซ์และทิลเดอ"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A เติมเซอร์คัมเฟลกซ์และจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"B เติมบรีฟและเกรฟ"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A เติมบรีฟและเกรฟ"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A เติมบรีฟและฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A เติมบรีฟและทิลเดอ"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A เติมบรีฟและจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E เติมทิลเดอ"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E เติมเซอร์คัมเฟลกซ์และอะคิวต์"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E เติมเซอร์คัมเฟลกซ์และเกรฟ"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E เติมเซอร์คัมเฟลกซ์และฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E เติมเซอร์คัมเฟลกซ์และทิลเดอ"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E เติมเซอร์คัมเฟลกซ์และจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O เติมเซอร์คัมเฟลกซ์และอะคิวต์"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O เติมเซอร์คัมเฟลกซ์และเกรฟ"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O เติมเซอร์คัมเฟลกซ์และฮุกด้านบน"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O เติมเซอร์คัมเฟลกซ์และทิลเดอ"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O เติมเซอร์คัมเฟลกซ์และจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O เติมฮอร์นและอะคิวต์"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O เติมฮอร์นและเกรฟ"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O เติมฮอร์นและฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O เติมฮอร์นและทิวเดอ"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O เติมฮอร์นและจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U เติมฮอร์นและอะคิวต์"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U เติมฮอร์นและเกรฟ"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U เติมฮอร์นและฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U เติมฮอร์นและทิลเดอ"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U เติมฮอร์นและจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y เติมเกรฟ"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y เติมจุดด้านล่าง"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y เติมฮุกด้านบน"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y เติมทิลเดอ"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"เครื่องหมายอัศเจรีย์คว่ำ"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"เครื่องหมายคำพูดสองขีดชี้ไปทางด้านซ้าย"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"จุดตรงกลาง"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"เลขหนึ่งแบบตัวยก"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"เครื่องหมายคำพูดสองขีดชี้ไปทางด้านขวา"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"เครื่องหมายคำถามคว่ำ"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"เครื่องหมายคำพูดขีดเดียวทางด้านซ้าย"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"เครื่องหมายคำพูดขีดเดียวทางด้านขวา"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"เครื่องหมายคำพูดเลขเก้าต่ำขีดเดียว"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"เครื่องหมายคำพูดสองขีดทางด้านซ้าย"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"เครื่องหมายคำพูดสองขีดทางด้านขวา"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"เครื่องหมายกริช"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"เครื่องหมายกริชคู่"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"สัญลักษณ์พันละ"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"สัญลักษณ์ไพร์ม"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"สัญลักษณ์ไพร์มคู่"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"เครื่องหมายคำพูดขีดเดียวชี้ไปทางด้านซ้าย"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"เครื่องหมายคำพูดขีดเดียวชี้ไปทางด้านขวา"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"เลขสี่แบบตัวยก"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"อักษรละติน n เล็กแบบตัวยก"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"สัญลักษณ์เปโซ"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"ลูกศรชี้ไปทางขวา"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"ลูกศรชี้ลง"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"เซตว่าง"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"การเพิ่ม"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"น้อยกว่าหรือเท่ากับ"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"มากกว่าหรือเท่ากับ"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"ดาวสีดำ"</string> +</resources> diff --git a/java/res/values-th/strings-talkback-descriptions.xml b/java/res/values-th/strings-talkback-descriptions.xml new file mode 100644 index 000000000..5d70d71ab --- /dev/null +++ b/java/res/values-th/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"ข้อความปัจจุบันคือ %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"ไม่มีข้อความ"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> แก้ไข <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> เป็น <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ทำการแก้ไขอัตโนมัติ"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"อักขระที่ไม่รู้จัก"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"สัญลักษณ์เพิ่มเติม"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"สัญลักษณ์"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"นำออก"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"สัญลักษณ์"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"ตัวอักษร"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"หมายเลข"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"การตั้งค่า"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"แท็บ"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"วรรค"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"การป้อนข้อมูลด้วยเสียง"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"อีโมจิ"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"ส่งคืน"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"ค้นหา"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"จุด"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"เปลี่ยนภาษา"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"ถัดไป"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"ก่อนหน้า"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"เปิดใช้งาน Shift แล้ว"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"เปิดใช้งาน Caps Lock แล้ว"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"โหมดสัญลักษณ์"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"โหมดสัญลักษณ์เพิ่มเติม"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"โหมดตัวอักษร"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"โหมดโทรศัพท์"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"โหมดสัญลักษณ์โทรศัพท์"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"ซ่อนแป้นพิมพ์แล้ว"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"กำลังแสดงแป้นพิมพ์ <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"วันที่"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"วันที่และเวลา"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"อีเมล"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"ข้อความ"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"หมายเลข"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"โทรศัพท์"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"ข้อความ"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"เวลา"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"ล่าสุด"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"ผู้คน"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"วัตถุ"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"ธรรมชาติ"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"สถานที่"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"สัญลักษณ์"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ไอคอนสื่ออารมณ์"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> ตัวใหญ่"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I ตัวใหญ่"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I ตัวใหญ่เติมจุดด้านบน"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"สัญลักษณ์ที่ไม่รู้จัก"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"อีโมจิที่ไม่รู้จัก"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"อักขระทางเลือกพร้อมใช้งาน"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ปิดอักขระทางเลือกแล้ว"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ข้อเสนอแนะทางเลือกพร้อมใช้งาน"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ปิดข้อเสนอแนะทางเลือกแล้ว"</string> +</resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 9249c05d5..43391a54d 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"ตัวเลือกการป้อนข้อมูล"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"คำสั่งบันทึกการวิจัย"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"ค้นหารายชื่อติดต่อ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"เครื่องมือตรวจการสะกดใช้รายการจากรายชื่อติดต่อของคุณ"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"สั่นเมื่อกดปุ่ม"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"ส่งเสียงเมื่อกดปุ่ม"</string> <string name="popup_on_keypress" msgid="123894815723512944">"ป๊อปอัปเมื่อกดแป้น"</string> - <string name="general_category" msgid="1859088467017573195">"ทั่วไป"</string> - <string name="correction_category" msgid="2236750915056607613">"การแก้ไขข้อความ"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"การพิมพ์ด้วยท่าทางสัมผัส"</string> - <string name="misc_category" msgid="6894192814868233453">"ตัวเลือกอื่นๆ"</string> - <string name="advanced_settings" msgid="362895144495591463">"การตั้งค่าขั้นสูง"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"ตัวเลือกสำหรับผู้เชี่ยวชาญ"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"ใช้วิธีการป้อนข้อมูลอื่น"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"แป้นสลับภาษาครอบคลุมวิธีการป้อนข้อมูลอื่นๆ ด้วย"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"แป้นสลับภาษา"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"ค่าเริ่มต้นของระบบ"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"แนะนำชื่อผู้ติดต่อ"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ใช้ชื่อจากรายชื่อติดต่อสำหรับคำแนะนำและการแก้ไข"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"คำแนะนำในแบบของคุณ"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"ปรับปรุง <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"แตะ Space สองครั้งแทรกจุด"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"แตะ Spacebar สองครั้งจะแทรกจุดตามด้วยช่องว่างหนึ่งช่อง"</string> <string name="auto_cap" msgid="1719746674854628252">"ปรับเป็นตัวพิมพ์ใหญ่อัตโนมัติ"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"แสดงรอยทางเดินของท่าทางสัมผัส"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ดูตัวอย่างลอยแบบไดนามิก"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ดูคำแนะนำในขณะที่ใช้ท่าทางสัมผัส"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : บันทึกแล้ว"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"เสียบชุดหูฟังเพื่อฟังเสียงเมื่อพิมพ์รหัสผ่าน"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"ข้อความปัจจุบันคือ %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"ไม่มีข้อความ"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> แก้ไข <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> เป็น <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> ทำการแก้ไขอัตโนมัติ"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"รหัสคีย์ %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift เปิดอยู่ (แตะเพื่อปิดใช้งาน)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock เปิดอยู่ (แตะเพื่อปิดใช้งาน)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"ลบ"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"สัญลักษณ์"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"ตัวอักษร"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"หมายเลข"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"การตั้งค่า"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"แท็บ"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Space"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"การป้อนข้อมูลด้วยเสียง"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"หน้ายิ้ม"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"ค้นหา"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"เครื่องหมายจุด"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"เปลี่ยนภาษา"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"ถัดไป"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"ก่อนหน้า"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"เปิดใช้งาน Shift แล้ว"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"เปิดใช้งาน Caps Lock แล้ว"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"ปิดใช้งาน Shift แล้ว"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"โหมดสัญลักษณ์"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"โหมดตัวอักษร"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"โหมดโทรศัพท์"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"โหมดสัญลักษณ์โทรศัพท์"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"ซ่อนแป้นพิมพ์แล้ว"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"กำลังแสดงแป้นพิมพ์ <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"วันที่"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"วันที่และเวลา"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"อีเมล"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"ข้อความ"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"หมายเลข"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"โทรศัพท์"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"ข้อความ"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"เวลา"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"ท่าทางสัมผัสสำหรับวลี"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"ใส่ช่องว่างระหว่างท่าทางสัมผัสโดยเลื่อนไปยังแป้นเคาะวรรค"</string> <string name="voice_input" msgid="3583258583521397548">"แป้นการป้อนข้อมูลด้วยเสียง"</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="voice_input_disabled_summary" msgid="8141750303464726129">"ไม่ได้เปิดใช้วิธีการป้อนข้อมูลด้วยเสียง ตรวจสอบภาษาและการตั้งค่าการป้อนข้อมูล"</string> <string name="configure_input_method" msgid="373356270290742459">"กำหนดค่าวิธีการป้อนข้อมูล"</string> <string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string> <string name="send_feedback" msgid="1780431884109392046">"ส่งข้อเสนอแนะ"</string> <string name="select_language" msgid="3693815588777926848">"ภาษาสำหรับการป้อนข้อมูล"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"แตะอีกครั้งเพื่อบันทึก"</string> <string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"ช่วยปรับปรุงตัวแก้ไขวิธีการป้อนข้อมูลนี้โดยการส่งสถิติการใช้งานและรายงานการขัดข้องโดยอัตโนมัติ"</string> <string name="keyboard_layout" msgid="8451164783510487501">"ชุดรูปแบบแป้นพิมพ์"</string> <string name="subtype_en_GB" msgid="88170601942311355">"อังกฤษ (สหราชอาณาจักร)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"อังกฤษ (อเมริกัน)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"สเปน (สหรัฐอเมริกา)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"อังกฤษ (สหราชอาณาจักร) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"อังกฤษ (สหรัฐอเมริกา) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"สเปน (สหรัฐอเมริกา) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (ดั้งเดิม)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"อังกฤษ (สหราชอาณาจักร) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"อังกฤษ (สหรัฐอเมริกา) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"สเปน (สหรัฐอเมริกา) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ดั้งเดิม)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ซีริลลิก)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (ละติน)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"ไม่มีภาษา (ตัวอักษรละติน)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"ตัวอักษร (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"ตัวอักษร (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"ตัวอักษร (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"ตัวอักษร (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"อีโมจิ"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"รูปแบบสี"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"ขาว"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"น้ำเงิน"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"รูปแบบอินพุตกำหนดเอง"</string> <string name="add_style" msgid="6163126614514489951">"เพิ่มสไตล์"</string> <string name="add" msgid="8299699805688017798">"เพิ่ม"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"เปิดใช้งาน"</string> <string name="not_now" msgid="6172462888202790482">"ข้ามไปก่อน"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"รูปแบบการป้อนข้อมูลเดียวกันนี้มีอยู่แล้ว: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"โหมดศึกษาประโยชน์ในการใช้งาน"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"การหน่วงเวลาของการกดแป้นค้าง"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"ระยะเวลาการสั่นเมื่อกดแป้นพิมพ์"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"ระดับเสียงเมื่อกดแป้นพิมพ์"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"อ่านไฟล์พจนานุกรมภายนอก"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ไม่มีไฟล์พจนานุกรมในโฟลเดอร์ดาวน์โหลด"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"เลือกไฟล์พจนานุกรมที่จะติดตั้ง"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"ติดตั้งไฟล์นี้สำหรับ <xliff:g id="LOCALE_NAME">%s</xliff:g> จริงๆ หรือ"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"ต้องการติดตั้งไฟล์นี้สำหรับ <xliff:g id="LANGUAGE_NAME">%s</xliff:g> จริงหรือ"</string> <string name="error" msgid="8940763624668513648">"เกิดข้อผิดพลาด"</string> <string name="button_default" msgid="3988017840431881491">"ค่าเริ่มต้น"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"ยินดีต้อนรับสู่ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"รีเฟรช"</string> <string name="last_update" msgid="730467549913588780">"ปรับปรุงแก้ไขครั้งล่าสุด"</string> <string name="message_updating" msgid="4457761393932375219">"กำลังตรวจสอบการอัปเดต"</string> - <string name="message_loading" msgid="8689096636874758814">"กำลังโหลด..."</string> + <string name="message_loading" msgid="5638680861387748936">"กำลังโหลด…"</string> <string name="main_dict_description" msgid="3072821352793492143">"พจนานุกรมหลัก"</string> <string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string> + <string name="go_to_settings" msgid="3876892339342569259">"การตั้งค่า"</string> <string name="install_dict" msgid="180852772562189365">"ติดตั้ง"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"ยกเลิก"</string> - <string name="delete_dict" msgid="756853268088330054">"ลบ"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ภาษาที่คุณเลือกใช้ในอุปกรณ์เคลื่อนที่มีพจนานุกรมที่สามารถใช้ได้<br/> เราขอแนะนำให้คุณ <b>ดาวน์โหลด</b> พจนานุกรม <xliff:g id="LANGUAGE">%1$s</xliff:g> เพื่อรับประสบการณ์การพิมพ์ที่ดียิ่งขึ้น<br/> <br/>การดาวน์โหลดจะใช้เวลาหนึ่งถึงสองนาทีผ่านทาง 3G ซึ่งอาจมีการเรียกเก็บเงินหากคุณไม่ได้ใช้ <b>แผนบริการข้อมูลแบบไม่จำกัดปริมาณ</b> <br/>หากคุณไม่แน่ใจว่าคุณใช้แผนบริการข้อมูลแบบใด เราขอแนะนำให้คุณเชื่อมต่อ WiFi เพื่อเริ่มการดาวน์โหลดอัตโนมัติ<br/> <br/>เคล็ดลับ: คุณสามารถดาวน์โหลดและนำพจนานุกรมออกได้โดยไปที่ <b>ภาษาและการป้อนข้อมูล</b> ในเมนู <b>การตั้งค่า</b> ในอุปกรณ์เคลื่อนที่ของคุณ"</string> + <string name="delete_dict" msgid="756853268088330054">"นำออก"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"ภาษาที่คุณเลือกในอุปกรณ์เคลื่อนที่มีพจนานุกรมที่สามารถใช้ได้<br/> เราขอแนะนำให้คุณ <b>ดาวน์โหลด</b> พจนานุกรม <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> เพื่อรับประสบการณ์การพิมพ์ที่ดียิ่งขึ้น<br/> <br/> การดาวน์โหลดอาจใช้เวลาหนึ่งถึงสองนาทีผ่านทาง 3G ซึ่งอาจมีการเรียกเก็บเงินหากคุณไม่ได้ใช้ <b>แผนบริการข้อมูลแบบไม่จำกัดปริมาณ</b>.<br/> หากไม่แน่ใจว่าใช้แผนบริการข้อมูลแบบใด เราขอแนะนำให้คุณเชื่อมต่อ Wi-Fi เพื่อเริ่มการดาวน์โหลดอัตโนมัติ<br/> <br/> เคล็ดลับ: คุณสามารถดาวน์โหลดและนำออกพจนานุกรมออกได้โดยไปที่ <b>ภาษาและการป้อนข้อมูล</b> ในเมนู <b>การตั้งค่า</b> ในอุปกรณ์เคลื่อนที่ของคุณ"</string> <string name="download_over_metered" msgid="1643065851159409546">"ดาวน์โหลดเลย (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"ดาวน์โหลดผ่าน WiFi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"มีพจนานุกรมให้ใช้งานในภาษา <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"มีพจนานุกรมให้ใช้งานสำหรับ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"กดเพื่อตรวจสอบและดาวน์โหลด"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"กำลังดาวน์โหลด: คำแนะนำสำหรับ <xliff:g id="LANGUAGE">%1$s</xliff:g> จะพร้อมใช้งานเร็วๆ นี้"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"กำลังดาวน์โหลด: คำแนะนำสำหรับ <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> จะพร้อมใช้งานเร็วๆ นี้"</string> <string name="version_text" msgid="2715354215568469385">"เวอร์ชัน <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"เพิ่ม"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"เพิ่มในพจนานุกรม"</string> @@ -233,10 +201,10 @@ <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"ทางลัดที่ไม่บังคับ"</string> <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"แก้ไขคำ"</string> <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"แก้ไข"</string> - <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"ลบ"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"นำออก"</string> <string name="user_dict_settings_empty_text" msgid="558499587532668203">"คุณไม่มีคำในพจนานุกรมผู้ใช้เลย เพิ่มคำโดยแตะปุ่มเพิ่ม (+)"</string> <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"สำหรับทุกภาษา"</string> <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"ภาษาเพิ่มเติม…"</string> - <string name="user_dict_settings_delete" msgid="110413335187193859">"ลบ"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"นำออก"</string> <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> </resources> diff --git a/java/res/values-tl/strings-action-keys.xml b/java/res/values-tl/strings-action-keys.xml index a7f4cc78f..9f24f5df7 100644 --- a/java/res/values-tl/strings-action-keys.xml +++ b/java/res/values-tl/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Nauna"</string> <string name="label_done_key" msgid="7564866296502630852">"Tapos"</string> <string name="label_send_key" msgid="482252074224462163">"Send"</string> + <string name="label_search_key" msgid="7965186050435796642">"Maghanap"</string> <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string> <string name="label_wait_key" msgid="5891247853595466039">"Intay"</string> </resources> diff --git a/java/res/values-tl/strings-config-important-notice.xml b/java/res/values-tl/strings-config-important-notice.xml new file mode 100644 index 000000000..d8dd9194a --- /dev/null +++ b/java/res/values-tl/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Pahusayin ang suhestiyon batay sa iyong pag-uusap at na-type na data"</string> +</resources> diff --git a/java/res/values-tl/strings-letter-descriptions.xml b/java/res/values-tl/strings-letter-descriptions.xml new file mode 100644 index 000000000..3f8b93ba2 --- /dev/null +++ b/java/res/values-tl/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Simbolo ng micro"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring sa itaas"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, tuldok sa itaas"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, tuldok sa itaas"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, tuldok sa itaas"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Walang tuldok na I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, gitnang tuldok"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, may kudlit sa unahan"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring sa itaas"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, tuldok sa itaas"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, kuwit sa ibaba"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, kuwit sa ibaba"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook sa itaas"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex at acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex at grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex at hook sa itaas"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex at tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve at acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve at grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve at hook sa itaas"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve at tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook sa itaas"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex at acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex at grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex at hook sa itaas"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex at tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook sa itaas"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook sa itaas"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex at acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex at grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex at hook sa itaas"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex at tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn at acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn at grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn at hook sa itaas"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn at tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook sa itaas"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn at acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn at grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn at hook sa itaas"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn at tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn at tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, tuldok sa ibaba"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook sa itaas"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Nakabaligtad na exclamation mark"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Paniping nakaturo sa kaliwa at may double angle"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Gitnang tuldok"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Paniping nakaturo sa kanan at may double angle"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Nakabaligtad na question mark"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Isang kaliwang panipi"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Isang kanang panipi"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Isang low-9 na panipi"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dobleng kaliwang panipi"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dobleng kanang panipi"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Simbolong per mille"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Isang angle na paniping nakaturo sa kaliwa"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Isang angle na paniping nakaturo sa kanan"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin maliit na titik n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Simbolo ng peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Pakanang arrow"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pababang arrow"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less-than or equal to"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater-than or equal to"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string> +</resources> diff --git a/java/res/values-tl/strings-talkback-descriptions.xml b/java/res/values-tl/strings-talkback-descriptions.xml new file mode 100644 index 000000000..f601ad4da --- /dev/null +++ b/java/res/values-tl/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Mag-plug in ng headset upang marinig ang mga password key na binabanggit nang malakas."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Ang kasalukuyang teksto ay %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Walang tekstong inilagay"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"Itinatama ng <xliff:g id="KEY_NAME">%1$s</xliff:g> ang <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> sa <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Nagsasagawa ang <xliff:g id="KEY_NAME">%1$s</xliff:g> ng auto-correction"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Hindi alam na character"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Marami pang simbolo"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Mga Simbolo"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Tanggalin"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Mga Simbolo"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Mga Titik"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Mga Numero"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Mga Setting"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Space"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Input ng boses"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Bumalik"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Maghanap"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Tuldok"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Magpalit ng wika"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Sunod"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Nauna"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Naka-enable ang shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Naka-enable ang caps lock"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Symbols mode"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Mode na marami pang simbolo"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Letters mode"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Phone mode"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Phone symbols mode"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Nakatago ang keyboard"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Ipinapakita ang keyboard na <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"petsa"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"petsa at oras"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"pagmemensahe"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"numero"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telepono"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"teksto"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"oras"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Mga Kamakailang Ginamit"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Mga Tao"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Mga Bagay"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Kalikasan"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Mga Lugar"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Mga Simbolo"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Mga Emoticon"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, tuldok sa itaas"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Hindi alam na simbolo"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Hindi alam na emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Available ang mga alternatibong character"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Dini-dismiss ang mga alternatibong character"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Available ang mga alternatibong suhestyon"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Dini-dismiss ang mga alternatibong suhestyon"</string> +</resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index df6bda09b..8282678a8 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Mga pagpipilian sa input"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Cmmnd sa Log ng Pnnliksik"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Maghanap pangalan contact"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Gumagamit ang Spell Checker ng entries mula sa iyong contact list."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Tumunog sa keypress"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Mag-popup sa keypress"</string> - <string name="general_category" msgid="1859088467017573195">"Pangkalahatan"</string> - <string name="correction_category" msgid="2236750915056607613">"Pagwawasto ng teksto"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Gesture na pag-type"</string> - <string name="misc_category" msgid="6894192814868233453">"Iba pang mga pagpipilian"</string> - <string name="advanced_settings" msgid="362895144495591463">"Mga advanced na setting"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Mga pagpipilian para sa mga dalubhasa"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Lipat iba paraan ng input"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Saklaw din ng key ng pagpalit ng wika ang ibang paraan ng input"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Key ng panlipat ng wika"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Default ng system"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Mungkahi pangalan Contact"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gamitin pangalan mula Mga Contact sa mga mungkahi\'t pagwawasto"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalized suggestions"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Pahusayin ang <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Double-space period"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Naglalagay ng tuldok na may puwang ang pag-double tap sa spacebar"</string> <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalization"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Ipakita ang trail ng galaw"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamic na floating preview"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Tingnan ang iminungkahing salita habang gumagalaw"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Na-save"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Mag-plug in ng headset upang marinig ang mga password key na binabanggit nang malakas."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Ang kasalukuyang teksto ay %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Walang tekstong inilagay"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"Itatama at gagawing <xliff:g id="CORRECTED">%3$s</xliff:g> ng <xliff:g id="KEY">%1$s</xliff:g> ang <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"Magsasagawa ng auto-correction ang <xliff:g id="KEY">%1$s</xliff:g>"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Code ng key %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Naka-on ang shift (i-tap upang huwag paganahin)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Naka-on ang caps lock (i-tap upang huwag paganahin)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Tanggalin"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Mga Simbolo"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Mga Titik"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Mga Numero"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Mga Setting"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Puwang"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Input ng boses"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Smiley na mukha"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Bumalik"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Paghahanap"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Tuldok"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Magpalit ng wika"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Susunod"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Nakaraan"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Pinagana ang shift"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Pinagana ang caps lock"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Hindi pinagana ang shift"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Mode ng mga simbolo"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Mode ng mga titik"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Mode ng telepono"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Mode ng mga simbolo ng telepono"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Nakatago ang keyboard"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Ipinapakita ang <xliff:g id="MODE">%s</xliff:g> keyboard"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"petsa"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"petsa at oras"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"pagmemensahe"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"numero"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telepono"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"teksto"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"oras"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Phrase gesture"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Maglagay ng espasyo sa pamamagitan ng pag-glide sa space key"</string> <string name="voice_input" msgid="3583258583521397548">"Voice input key"</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="voice_input_disabled_summary" msgid="8141750303464726129">"Walang naka-enable na pamamaraan ng pag-input ng boses. Suriin ang mga setting ng Pag-input ng wika."</string> <string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string> <string name="send_feedback" msgid="1780431884109392046">"Magpadala ng feedback"</string> <string name="select_language" msgid="3693815588777926848">"Mga wika ng input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pinduting muli upang i-save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Tumulong na pahusayin ang editor ng pamamaraan ng pag-input na ito sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at ulat ng pag-crash"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Tema ng keyboard"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Ingles (UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Ingles (Estados Unidos)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Spanish (US)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Ingles (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Ingles (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Spanish (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Traditional)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Ingles (UK) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Ingles (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Traditional)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Cyrillic)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Walang wika (Alpabeto)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alpabeto (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alpabeto (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alpabeto (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alpabeto (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Scheme ng kulay"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Puti"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Asul"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Custom style ng input"</string> <string name="add_style" msgid="6163126614514489951">"Dagdag style"</string> <string name="add" msgid="8299699805688017798">"Idagdag"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Paganahin"</string> <string name="not_now" msgid="6172462888202790482">"Hindi ngayon"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Umiiral na ang parehong estilo ng input: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Study mode ng pagiging kapaki-pakinabang"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Key long press delay"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Tagal ng vibration ng keypress"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Volume ng tunog ng keypress"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Magbasa ng panlabas na file ng diksyunaryo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Walang mga file ng diksyunaryo sa folder na Mga Download"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pumili ng file ng diksyunaryo na ii-install"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"I-install talaga ang file na ito para sa <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Talagang ii-install ang file na ito para sa <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Nagkaroon ng error"</string> <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Maligayang pagdating sa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"I-refresh"</string> <string name="last_update" msgid="730467549913588780">"Huling na-update"</string> <string name="message_updating" msgid="4457761393932375219">"Tumitingin ng mga update"</string> - <string name="message_loading" msgid="8689096636874758814">"Naglo-load..."</string> + <string name="message_loading" msgid="5638680861387748936">"Naglo-load…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Pangunahing diksyunaryo"</string> <string name="cancel" msgid="6830980399865683324">"Kanselahin"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Mga Setting"</string> <string name="install_dict" msgid="180852772562189365">"I-install"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Kanselahin"</string> <string name="delete_dict" msgid="756853268088330054">"Tanggalin"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"May available na diksyunaryo ang piniling wika sa iyong mobile device.<br/> Inirerekomenda namin ang <b>pag-download</b> sa diksyunaryong <xliff:g id="LANGUAGE">%1$s</xliff:g> upang mapabuti ang iyong karanasan sa pag-type.<br/> <br/> Maaaring umabot ng isa hanggang dalawang minuto ang pag-download gamit ang 3G. Maaaring may malapat na mga pagsingil kung wala kang <b>data plan na walang limitasyon</b>.<br/> Kung hindi ka sigurado kung aling data plan ang mayroon ka, inirerekomenda naming maghanap ng koneksyon sa Wi-Fi upang awtomatikong simulan ang pag-download.<br/> <br/> Tip: Maaari kang mag-download at mag-alis ng mga diksyunaryo sa pamamagitan ng pagpunta sa <b>Wika at input</b> sa menu na <b>Mga Setting</b> ng iyong mobile device."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"May available na diksyunaryo ang napiling wika sa iyong mobile device.<br/> Inirerekomenda naming <b>i-download</b> ang diksyunaryo ng <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> upang pagbutihin ang iyong karanasan sa pagta-type.<br/> <br/> Maaaring magtagal nang ilang minuto ang pag-download sa 3G. Maaaring magkaroon ng mga pagsingil kung wala kang <b>unlimited data plan</b>.<br/> Kung hindi ka sigurado kung anong data plan ang mayroon ka, inirerekomenda naming maghanap ng koneksyon sa Wi-Fi upang awtomatikong masimulan ang pag-download.<br/> <br/> Tip: Maaari kang mag-download at mag-alis ng mga diksyunaryo sa pamamagitan ng pagpunta sa <b>Wika & input</b> sa menu ng <b>Mga Setting</b> ng iyong mobile device."</string> <string name="download_over_metered" msgid="1643065851159409546">"I-download ngayon (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"I-download gamit ang Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"May available na diksyunaryo para sa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"May available na diksyunaryo para sa <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Pindutin upang suriin at i-download"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Dina-download: malapit nang maging handa ang mga suhestiyon para sa <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Nagda-download: magkakaron ng mga suhestiyon para sa <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sa lalong madaling panahon."</string> <string name="version_text" msgid="2715354215568469385">"Bersyon <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Idagdag"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Idagdag sa diksyunaryo"</string> diff --git a/java/res/values-tr/strings-action-keys.xml b/java/res/values-tr/strings-action-keys.xml index b34c576b6..049d4fe10 100644 --- a/java/res/values-tr/strings-action-keys.xml +++ b/java/res/values-tr/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Geri"</string> <string name="label_done_key" msgid="7564866296502630852">"Bitti"</string> <string name="label_send_key" msgid="482252074224462163">"Gönder"</string> + <string name="label_search_key" msgid="7965186050435796642">"Arama"</string> <string name="label_pause_key" msgid="2225922926459730642">"Dur"</string> <string name="label_wait_key" msgid="5891247853595466039">"Bekle"</string> </resources> diff --git a/java/res/values-tr/strings-config-important-notice.xml b/java/res/values-tr/strings-config-important-notice.xml new file mode 100644 index 000000000..7d9f6ab12 --- /dev/null +++ b/java/res/values-tr/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Önerileri iyileştirmek için iletşmlrmdn. ve yazılan verilerden öğren"</string> +</resources> diff --git a/java/res/values-tr/strings-letter-descriptions.xml b/java/res/values-tr/strings-letter-descriptions.xml new file mode 100644 index 000000000..f0b765ce3 --- /dev/null +++ b/java/res/values-tr/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Dişil sıra göstergesi"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro işareti"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Eril sıra göstergesi"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sert S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, aksanlı"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, vurgulu"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, inceltme işaretli"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, dalga işaretli"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, iki noktalı"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, üstte halkalı"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, bağ işaretli"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, çengelli"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, aksanlı"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, vurgulu"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, inceltme işaretli"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, iki noktalı"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, aksanlı"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, vurgulu"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, inceltme işaretli"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, iki noktalı"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, dalga işaretli"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, aksanlı"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, vurgulu"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, inceltme işaretli"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, dalga işaretli"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, iki noktalı"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, orta çizgili"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, aksanlı"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, vurgulu"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, inceltme işaretli"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, iki noktalı"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, vurgulu"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, iki noktalı"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, uzatma işaretli"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, kısaltma işaretli"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, kancalı"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, vurgulu"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, inceltme işaretli"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, üstte noktalı"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, orta çizgili"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, uzatma işaretli"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, kısaltma işaretli"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, üstte noktalı"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, kancalı"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, inceltme işaretli"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, kısaltma işaretli"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, üstte noktalı"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, çengelli"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, inceltme işaretli"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, orta çizgili"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, dalga işaretli"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, uzatma işaretli"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, kısaltma işaretli"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, kancalı"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Noktasız I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, bağ işaretli"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, inceltme işaretli"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, çengelli"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, vurgulu"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, çengelli"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, orta noktalı"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, orta çizgili"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, vurgulu"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, çengelli"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, öncesinde üstten virgül"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, uzatma işaretli"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, kısaltma işaretli"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, çift vurgulu"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, bağ işaretli"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, vurgulu"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, çengelli"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, vurgulu"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, inceltme işaretli"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, çengelli"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, çengelli"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, orta çizgili"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, dalga işaretli"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, uzatma işaretli"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, kısaltma işaretli"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, üstte halkalı"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, çift vurgulu"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, kancalı"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, inceltme işaretli"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, inceltme işaretli"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, vurgulu"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, üstte nokta"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, yumuşatma işaretli"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Uzun S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, duyarga işaretli"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, duyarga işaretli"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, alt virgüllü"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, alt virgüllü"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, alt noktalı"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, üst çengelli"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, inceltme işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, inceltme işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, inceltme işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, inceltme işaretli ve uzatma işareti"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, inceltme işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, kısaltma işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, kısaltma işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, kısaltma işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, kısaltma işaretli ve dalga işaretli"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, kısaltma işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, alt noktalı"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, üst çengelli"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, dalga işaretli"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, inceltme işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, inceltme işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, inceltme işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, inceltme işaretli ve dalga işaretli"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, inceltme işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, üst çengelli"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, alt noktalı"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, alt noktalı"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, üst çengelli"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, inceltme işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, inceltme işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, inceltme işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, inceltme işaretli ve dalga işaretli"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, inceltme işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, duyarga işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, duyarga işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, duyarga işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, duyarga işaretli ve dalga işaretli"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, duyarga işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, alt noktalı"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, üst çengelli"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, duyarga işaretli ve vurgulu"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, duyarga işaretli ve aksanlı"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, duyarga işaretli ve üst çengelli"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, duyarga işaretli ve dalga işaretli"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, duyarga işaretli ve alt noktalı"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, aksanlı"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, alt noktalı"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, üst çengelli"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, dalga işaretli"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ters soru işareti"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Sola bakan açılı çift tırnak işareti"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Orta noktalı"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Üst simge bir"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Sağa bakan açılı çift tırnak işareti"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ters soru işareti"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Sol tekli tırnak işareti"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Sağ tekli tırnak işareti"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tekli alt 9 tırnak işareti"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Sol çift tırnak işareti"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Sağ çift tırnak işareti"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kama"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Çift kama"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille işareti"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Üs"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Çift üs"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Sola bakan açılı tek tırnak işareti"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Sağa bakan açılı tek tırnak işareti"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Üst simge dört"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Üst simge latin küçük harf n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Pezo işareti"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Yüzde işareti"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Sağa bakan ok"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Aşağı bakan ok"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Boş küme"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Artış işareti"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Küçüktür veya eşittir"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Büyüktür veya eşittir"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Siyah yıldız"</string> +</resources> diff --git a/java/res/values-tr/strings-talkback-descriptions.xml b/java/res/values-tr/strings-talkback-descriptions.xml new file mode 100644 index 000000000..a810eda2d --- /dev/null +++ b/java/res/values-tr/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Şifre tuşlarının sesli okunmasını dinlemek için kulaklık takın."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Mevcut metin: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Metin girilmedi"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>, <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kelimesini <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> olarak düzeltir"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> otomatik düzeltme yapar"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Bilinmeyen karakter"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Üst karakter"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Diğer simgeler"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Üst karakter"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Simgeler"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Üst karakter"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Sil"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Simgeler"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Harfler"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Rakamlar"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Ayarlar"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Sekme"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Boşluk çubuğu"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Ses girişi"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Enter"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Arama"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Nokta"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Dili değiştir"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Sonraki"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Önceki"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Üst karakter etkin"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Büyük harf etkin"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Sembol modu"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Diğer simgeler modu"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Harf modu"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Telefon modu"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Telefon sembolleri modu"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Klavye gizli"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> klavyesi görüntüleniyor"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"tarih"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"tarih ve saat"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"e-posta"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"mesajlaşma"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"rakam"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"telefon"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"metin"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"saat"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Son Kullanılanlar"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Kişiler"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Nesneler"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Doğa"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Yerler"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simgeler"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"İfadeler"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Büyük Harf <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Büyük Harf I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Büyük Harf I, üst noktalı"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Bilinmeyen simge"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Bilinmeyen emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatif karakterler kullanılabilir"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatif karakterler yoksayılır"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatif öneriler kullanılabilir"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatif öneriler yoksayılır"</string> +</resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index a14295153..d48ab7bb6 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Giriş seçenekleri"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Araştırma Günlüğü Komutları"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Kişi adlarını denetle"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Yazım denetleyici, kişi listenizdeki girişleri kullanır"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tuşa basıldığında titret"</string> <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="general_category" msgid="1859088467017573195">"Genel"</string> - <string name="correction_category" msgid="2236750915056607613">"Metin düzeltme"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Hareketle yazma"</string> - <string name="misc_category" msgid="6894192814868233453">"Diğer seçenekler"</string> - <string name="advanced_settings" msgid="362895144495591463">"Gelişmiş ayarlar"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Uzmanlar için seçenekler"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Diğer giriş yöntemine geç"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Dil geçiş tuşu diğer giriş yöntemlerini de kapsar"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Dil değiştirme tuşu"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Sistem varsayılanı"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Kişi Adları öner"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Öneri ve düzeltmeler için Kişiler\'deki adları kullan"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Kişisel öneriler"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> uygulamasını iyileştir"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Çift boşlukla nokta ekleme"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Boşluk çubuğuna iki kez vurmak nokta ve ardından bir boşluk ekler"</string> <string name="auto_cap" msgid="1719746674854628252">"Otomatik olarak büyük harf yap"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Hareket izini göster"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamik kayan önizleme"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Hareket sırasında önerilen kelimeyi göster"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kaydedildi"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Şifre tuşlarının sesli okunmasını dinlemek için mikrofonlu kulaklık takın."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Mevcut metin: %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Hiç metin girilmedi"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> tuşu <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kelimesini <xliff:g id="CORRECTED">%3$s</xliff:g> olarak düzeltir"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> tuşu otomatik düzeltme gerçekleştirir"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Tuş kodu: %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Üst Karakter"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Üst karakter açık (devre dışı bırakmak için hafifçe vurun)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Büyük harf kilidi açık (devre dışı bırakmak içinn hafifçe vurun)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simgeler"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Harfler"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Rakamlar"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Ayarlar"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Sekme"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Boşluk"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Ses girişi"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Gülen yüz"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Ara"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Nokta"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Dili değiştir"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Sonraki"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Önceki"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Üst karakter etkin"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Büyük harf kilidi etkin"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Üst karakter devre dışı"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Sembol modu"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Harf modu"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Telefon modu"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Telefon sembolleri modu"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Klavye gizli"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"<xliff:g id="MODE">%s</xliff:g> klavyesi gösteriliyor"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"tarih"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarih ve saat"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"e-posta"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"mesajlaşma"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"rakam"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"telefon"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"metin"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"saat"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Kelime öbeği hareketi"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Hareketle girişte boşlukları, boşluk tuşuna kaydırarak girin"</string> <string name="voice_input" msgid="3583258583521397548">"Ses girişi tuşu"</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 klavyedeki mikrofon"</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 grş devre dışı"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Hiçbir ses girişi yöntemi etkinleştirilmedi. Dil ve giriş ayarlarını kontrol edin."</string> <string name="configure_input_method" msgid="373356270290742459">"Giriş yöntemlerini yapılandır"</string> <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string> <string name="send_feedback" msgid="1780431884109392046">"Geri bildirim gönder"</string> <string name="select_language" msgid="3693815588777926848">"Giriş dilleri"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Kaydetmek için tekrar dokunun"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Kullanım istatistiklerini ve kilitlenme raporlarını otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Klavye teması"</string> <string name="subtype_en_GB" msgid="88170601942311355">"İngilizce (BK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"İngilizce (ABD)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"İspanyolca (ABD)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"İngilizce (İngiltere) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"İngilizce (ABD) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"İspanyolca (ABD) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Geleneksel)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"İngilizce (İngiltere) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"İngilizce (ABD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"İspanyolca (ABD) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Geleneksel)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Kiril)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Dil yok (Alfabe)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabe (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabe (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabe (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabe (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Renk şeması"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Beyaz"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Mavi"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Özel giriş stilleri"</string> <string name="add_style" msgid="6163126614514489951">"Stil ekle"</string> <string name="add" msgid="8299699805688017798">"Ekle"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Etkinleştir"</string> <string name="not_now" msgid="6172462888202790482">"Şimdi değil"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Aynı giriş stili zaten var: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Kullanılabilirlik çalışması modu"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Tuşa uzun basma gecikmesi"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Tuşa basma titreşim süresi"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Tuşa basma ses seviyesi"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Harici sözlük dosyasını oku"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"İndirilenler klasöründe sözlük dosyası yok"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Yüklemek için bir sözlük dosyası seçin"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g> için bu dosya gerçekten yüklensin mi?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> için bu dosya gerçekten yüklensin mi?"</string> <string name="error" msgid="8940763624668513648">"Bir hata oluştu"</string> <string name="button_default" msgid="3988017840431881491">"Varsayılan"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> uygulamasına hoş geldiniz"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Yenile"</string> <string name="last_update" msgid="730467549913588780">"Son güncelleme tarihi"</string> <string name="message_updating" msgid="4457761393932375219">"Güncellemeler denetleniyor"</string> - <string name="message_loading" msgid="8689096636874758814">"Yükleniyor..."</string> + <string name="message_loading" msgid="5638680861387748936">"Yükleniyor…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Ana sözlük"</string> <string name="cancel" msgid="6830980399865683324">"İptal"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Ayarlar"</string> <string name="install_dict" msgid="180852772562189365">"Yükle"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"İptal"</string> <string name="delete_dict" msgid="756853268088330054">"Sil"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobil cihazınızda seçili dile ait kullanılabilir bir sözlük mevcut.<br/> Daha iyi yazabilmek için bu <xliff:g id="LANGUAGE">%1$s</xliff:g> sözlüğü <b>indirmenizi</b> öneririz.<br/> <br/> İndirme işlemi 3G üzerinden bir veya iki dakika sürebilir. <b>Sınırsız veri planınız</b> yoksa ücret alınabilir.<br/> Ne tür bir veri planına sahip olduğunuzdan emin değilseniz, otomatik olarak indirmeye başlamak için bir Kablosuz bağlantı bulmanızı öneririz.<br/> <br/> İpucu: Sözlükleri, mobil cihazınızın <b>Ayarlar</b> menüsünde <b>Dil ve giriş</b> seçeneğine giderek indirebilir ve silebilirsiniz."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Mobil cihazınızda seçili dile ait kullanılabilir bir sözlük var.<br/> Daha iyi yazabilmek için bu <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sözlüğü <b>indirmenizi</b> öneririz.<br/> <br/> İndirme işlemi 3G üzerinden bir veya iki dakika sürebilir. <b>Sınırsız veri planınız </b>yoksa ücret alınabilir.<br/> Ne tür bir veri planına sahip olduğunuzdan emin değilseniz, otomatik olarak indirmeye başlamak için bir Kablosuz bağlantı bulmanızı öneririz.<br/> <br/> İpucu: Sözlükleri, mobil cihazınızın <b>Ayarlar</b> menüsünde <b>Dil ve giriş</b> seçeneğine giderek indirebilir ve silebilirsiniz."</string> <string name="download_over_metered" msgid="1643065851159409546">"Hemen indir (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Kablosuz üzerinden indir"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> için kullanılabilecek bir sözlük mevcut"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> için kullanılabilir bir sözlük var"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"İncelemek ve indirmek için basın"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"<xliff:g id="LANGUAGE">%1$s</xliff:g> için önerilerin indirilmesine kısa süre içinde başlanacak."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> için önerilerin indirilmesine kısa süre içinde başlanacak."</string> <string name="version_text" msgid="2715354215568469385">"Sürüm <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Ekle"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Sözlüğe ekle"</string> diff --git a/java/res/values-uk/strings-action-keys.xml b/java/res/values-uk/strings-action-keys.xml index 3e5762b3f..206fcf0da 100644 --- a/java/res/values-uk/strings-action-keys.xml +++ b/java/res/values-uk/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"ОК"</string> <string name="label_send_key" msgid="482252074224462163">"Слати"</string> + <string name="label_search_key" msgid="7965186050435796642">"Пошук"</string> <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string> <string name="label_wait_key" msgid="5891247853595466039">"Ждати"</string> </resources> diff --git a/java/res/values-uk/strings-config-important-notice.xml b/java/res/values-uk/strings-config-important-notice.xml new file mode 100644 index 000000000..b95b72cd4 --- /dev/null +++ b/java/res/values-uk/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Пристрій буде запам’ятовувати, що ви пишете, надсилаєте й отримуєте"</string> +</resources> diff --git a/java/res/values-uk/strings-letter-descriptions.xml b/java/res/values-uk/strings-letter-descriptions.xml new file mode 100644 index 000000000..1199771a4 --- /dev/null +++ b/java/res/values-uk/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Індикатор порядкового числівника жіночого роду"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак мікро"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Індикатор порядкового числівника чоловічого роду"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Есцет"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, гравіс"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, акут"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, циркумфлекс"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, тильда"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, трема"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, кільце вгорі"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, лігатура"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, седиль"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, гравіс"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, акут"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, циркумфлекс"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, трема"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, гравіс"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, акут"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, циркумфлекс"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, трема"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ет"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, тильда"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, гравіс"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, акут"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, циркумфлекс"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, тильда"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, трема"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, риска"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, гравіс"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, акут"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, циркумфлекс"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, трема"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, акут"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, трема"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, макрон"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, бреве"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, хвостик"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, акут"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, циркумфлекс"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, крапка вгорі"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, гачек"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, гачек"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, риска"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, макрон"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, бреве"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, крапка вгорі"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, хвостик"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, гачек"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, циркумфлекс"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, бреве"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, крапка вгорі"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, седиль"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, циркумфлекс"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, риска"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, тильда"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, макрон"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, бреве"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, хвостик"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I без крапки"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, лігатура"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, циркумфлекс"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, седиль"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, акут"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, седіль"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, гачек"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, інтерпункт"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, риска"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, акут"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, седиль"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, гачек"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, після апострофа"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Енг"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, макрон"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, бреве"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, подвійний акут"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, лігатура"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, акут"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, седиль"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, гачек"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, акут"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, циркумфлекс"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, седиль"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, гачек"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, седиль"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, гачек"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, риска"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, тильда"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, макрон"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, бреве"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, кільце вгорі"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, подвійний акут"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, хвостик"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, циркумфлекс"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, циркумфлекс"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, акут"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, крапка вгорі"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, гачек"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Довгий звук S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ріг"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ріг"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, кома внизу"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, кома внизу"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, крапка внизу"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, гачок угорі"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, циркумфлекс і акут"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, циркумфлекс і гравіс"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, циркумфлекс і гачок угорі"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, циркумфлекс і тильда"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, циркумфлекс і крапка внизу"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, бреве й акут"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, бреве та гравіс"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, бреве та гачок угорі"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, бреве та тильда"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, бреве та крапка внизу"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, крапка внизу"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, гачок угорі"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, тильда"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, циркумфлекс і акут"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, циркумфлекс і гравіс"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, циркумфлекс і гачок угорі"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, циркумфлекс і тильда"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, циркумфлекс і крапка внизу"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, гачок угорі"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, крапка внизу"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, крапка внизу"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, гачок угорі"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, циркумфлекс і акут"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, циркумфлекс і гравіс"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, циркумфлекс і гачок угорі"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, циркумфлекс і тильда"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, циркумфлекс і крапка внизу"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ріг і акут"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ріг і гравіс"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ріг і гачок угорі"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ріг і тильда"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ріг і крапка внизу"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, крапка внизу"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, гачок угорі"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ріг і акут"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ріг і гравіс"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ріг і гачок угорі"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ріг і тильда"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ріг і крапка внизу"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, гравіс"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, крапка внизу"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, гачок угорі"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, тильда"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Перевернутий знак оклику"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ліві подвійні кутові лапки"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Інтерпункт"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Верхній індекс, один"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Праві подвійні кутові лапки"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Перевернутий знак запитання"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ліві одинарні лапки"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Праві одинарні лапки"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ліві нижні одинарні лапки"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ліві подвійні лапки"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Праві подвійні лапки"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Хрестик"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Подвійний хрестик"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак проміле"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Подвійний штрих"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ліві одинарні кутові лапки"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Праві одинарні кутові лапки"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Верхній індекс, чотири"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Верхній індекс, мала латинська літера n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак песо"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Через"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрілка праворуч"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрілка вниз"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Порожня множина"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Крок"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Менше або дорівнює"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Більше або дорівнює"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Чорна зірка"</string> +</resources> diff --git a/java/res/values-uk/strings-talkback-descriptions.xml b/java/res/values-uk/strings-talkback-descriptions.xml new file mode 100644 index 000000000..80e471052 --- /dev/null +++ b/java/res/values-uk/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Підключіть гарнітуру, щоб слухати озвучені символи пароля."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Поточний текст: %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст не введено"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> виправляє слово \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" на \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\""</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> автоматично виправляє"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Невідомий символ"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Більше символів"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Клавіша Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Символи"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Клавіша Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Видалити"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Символи"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Літери"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Цифри"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Налаштування"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Пробіл"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Голосовий ввід"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Cмайли Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Повернутися"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Пошук"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Крапка"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Змінити мову"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Далі"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Назад"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift увімкнено"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps Lock увімкнено"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Режим символів"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Режим \"Більше символів\""</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Режим літер"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Режим номерів телефону"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Режим телефонних символів"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Клавіатуру сховано"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Режим клавіатури: <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"дата"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"дата й час"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"електронні адреси"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"повідомлення"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"цифри"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"номери телефону"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"текст"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"час"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL-адреси"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Останні"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Люди"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Об’єкти"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Природа"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Місця"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Символи"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Смайли"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Велика <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Велика I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Велика I, крапка вгорі"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Невідомий символ"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Невідомий смайл Emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Доступні альтернативні символи"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Альтернативні символи відхилено"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Доступні альтернативні пропозиції"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Альтернативні пропозиції відхилено"</string> +</resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index da26d5005..c59bed67e 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Парам. введення"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Команди журналу дослідж."</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Шукати імена контактів"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Програма перевірки правопису використ. записи зі списку контактів"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр. при натисканні клавіш"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string> <string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string> - <string name="general_category" msgid="1859088467017573195">"Загальні"</string> - <string name="correction_category" msgid="2236750915056607613">"Виправлення тексту"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Ввід жестами"</string> - <string name="misc_category" msgid="6894192814868233453">"Інші опції"</string> - <string name="advanced_settings" msgid="362895144495591463">"Розширені налаштування"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Налаштування для досвідчених користувачів"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Інші методи введення"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Клавіша зміни мови дозволяє змінювати методи введення"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Клавіша зміни мови"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"За умовчанням"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Пропон. імена контактів"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Використ. імена зі списку контактів для пропозицій і виправлень"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Персональні пропозиції"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Покращувати додаток <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Крапка подвійним пробілом"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Подвійне натискання пробілу вставляє крапку з пробілом після неї"</string> <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Показувати слід жестів"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамічний спливаючий перегляд"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показувати пропоноване слово під час введення тексту жестами"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : збережено"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Підключіть гарнітуру, щоб прослухати відтворені вголос символи пароля."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Поточний текст – %s."</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Текст не введено"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> виправляє <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> на <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> здійснює автоматичне виправлення"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Код клавіші – %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Клавіша Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift увімкнено (швидко торкніться, щоб вимкнути)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps Lock увімкнено (швидко торкніться, щоб вимкнути)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Клавіша Delete"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Символи"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Літери"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Цифри"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Налаштування"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Вкладка"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Пробіл"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Голосовий ввід"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Смайлик"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Клавіша Return"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Пошук"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Крапка"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Змінити мову"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Далі"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Назад"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift увімкнено"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps Lock увімкнено"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift вимкнено"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Режим символів"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Режим букв і цифр"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Режим набору номера"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Режим набору символів"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Клавіатуру сховано"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Режим клавіатури: <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"дата"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"дата й час"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"електронні адреси"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"повідомлення"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"цифри"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"номери телефонів"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"текст"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"час"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL-адреси"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Безперервний ввід фраз"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Вставляйте пробіли, проводячи пальцем по клавіші пробілу"</string> <string name="voice_input" msgid="3583258583521397548">"Ключ голосового вводу"</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">"Miкр. на симв. клавіат."</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Способи голосового вводу не ввімкнено. Перейдіть у налаштування \"Мова та введення\"."</string> <string name="configure_input_method" msgid="373356270290742459">"Налаштування методів введення"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string> <string name="send_feedback" msgid="1780431884109392046">"Надіслати відгук"</string> <string name="select_language" msgid="3693815588777926848">"Мови введення"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Торкніться знову, щоб зберегти"</string> <string name="has_dictionary" msgid="6071847973466625007">"Словник доступний"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Увімк. відгуки корист."</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Допоможіть покращити цей редактор методу введення, автоматично надсилаючи в Google статистику використання та звіти про аварійне завершення роботи."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Тема клавіатури"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Англійська (Великобританія)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Англійська (США)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"іспанська (США)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Англійська (Великобр.) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Англійська (США) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"іспанська (США) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (традиційна)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Англійська (Британія) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Англійська (США) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Іспанська (США) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (традиційна)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (кирилиця)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (латиниця)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Стандартна (латиниця)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Латиниця (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Латиниця (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Латиниця (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Латиниця (ПК)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Cмайли Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Схема кольорів"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Біла"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Синя"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Персональні стилі введення"</string> <string name="add_style" msgid="6163126614514489951">"Додати стиль"</string> <string name="add" msgid="8299699805688017798">"Додати"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Увімкнути"</string> <string name="not_now" msgid="6172462888202790482">"Не зараз"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Такий стиль введення вже існує: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Режим вивчення зручності у використанні"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Затримка довгого натискання"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Вібрація при натисканні клавіш"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Гучність натискання клавіш"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читати файл зовнішнього словника"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У папці \"Завантаження\" немає файлів словника"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вибрати файл словника, який потрібно встановити"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Справді встановити цей файл для такої мови: <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Справді встановити цей файл для такої мови: <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Сталася помилка"</string> <string name="button_default" msgid="3988017840431881491">"За умовчанням"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Вітаємо в програмі <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Оновити"</string> <string name="last_update" msgid="730467549913588780">"Останнє оновлення"</string> <string name="message_updating" msgid="4457761393932375219">"Перевірка наявності оновлень"</string> - <string name="message_loading" msgid="8689096636874758814">"Завантаження…"</string> + <string name="message_loading" msgid="5638680861387748936">"Завантаження…"</string> <string name="main_dict_description" msgid="3072821352793492143">"Основний словник"</string> <string name="cancel" msgid="6830980399865683324">"Скасувати"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Налаштування"</string> <string name="install_dict" msgid="180852772562189365">"Установити"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Скасувати"</string> <string name="delete_dict" msgid="756853268088330054">"Видалити"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Для вибраної на вашому мобільному пристрої мови доступний словник.<br/> Радимо <b>завантажити</b> словник для цієї мови (<xliff:g id="LANGUAGE">%1$s</xliff:g>), щоб покращити введення тексту.<br/> <br/> У мережі 3G завантаження триває 1–2 хвилини. Якщо у вас не <b>безлімітний тарифний план Інтернету</b>, може стягуватися плата.<br/> Якщо ви не впевнені щодо тарифного плану, радимо скористатися з’єднанням Wi-Fi, щоб автоматично почати завантаження.<br/> <br/> Порада: завантажувати та вилучати словники можна в меню <b>Налаштування</b> в розділі <b>Мова та введення</b> вашого мобільного пристрою."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Для вибраної на вашому мобільному пристрої мови доступний словник.<br/> Радимо <b>завантажити</b> словник для цієї мови (<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>), щоб покращити введення тексту.<br/> <br/> У мережі 3G завантаження триває 1–2 хвилини. Якщо у вас не <b>безлімітний тарифний план Інтернету</b>, може стягуватися плата.<br/> Якщо ви не впевнені щодо тарифного плану, радимо скористатися з’єднанням Wi-Fi, щоб автоматично почати завантаження.<br/> <br/> Порада: завантажувати та видаляти словники можна в меню <b>Налаштування</b> в розділі <b>Мова та введення</b> вашого мобільного пристрою."</string> <string name="download_over_metered" msgid="1643065851159409546">"Завантажити зараз (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mб)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Завантажити через Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Доступний словник для такої мови: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Доступний словник для такої мови: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Натисніть, щоб переглянути та завантажити"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Скоро почнеться завантаження пропозицій для такої мови: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Завантаження. Скоро будуть готові пропозиції для такої мови: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>."</string> <string name="version_text" msgid="2715354215568469385">"Версія <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Додати"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Додати в словник"</string> diff --git a/java/res/values-ur-rPK/strings-action-keys.xml b/java/res/values-ur-rPK/strings-action-keys.xml new file mode 100644 index 000000000..e08136375 --- /dev/null +++ b/java/res/values-ur-rPK/strings-action-keys.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="label_go_key" msgid="4033615332628671065">"جائیں"</string> + <string name="label_next_key" msgid="5586407279258592635">"اگلا"</string> + <string name="label_previous_key" msgid="1421141755779895275">"پيچھے"</string> + <string name="label_done_key" msgid="7564866296502630852">"ہوگیا"</string> + <string name="label_send_key" msgid="482252074224462163">"بھیجیں"</string> + <string name="label_search_key" msgid="7965186050435796642">"تلاش"</string> + <string name="label_pause_key" msgid="2225922926459730642">"موقوف"</string> + <string name="label_wait_key" msgid="5891247853595466039">"انتظار"</string> +</resources> diff --git a/java/res/values-ur-rPK/strings-appname.xml b/java/res/values-ur-rPK/strings-appname.xml new file mode 100644 index 000000000..0ecca5ad6 --- /dev/null +++ b/java/res/values-ur-rPK/strings-appname.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_name" msgid="5940510615957428904">"Android کی بورڈ (AOSP)"</string> + <string name="spell_checker_service_name" msgid="1254221805440242662">"Android ہجے چیک کنندہ (AOSP)"</string> + <string name="english_ime_settings" msgid="5760361067176802794">"Android کی بورڈ کی ترتیبات (AOSP)"</string> + <string name="android_spell_checker_settings" msgid="6123949487832861885">"Android ہجے چیک کنندہ کی ترتیبات (AOSP)"</string> +</resources> diff --git a/java/res/values-ur-rPK/strings-config-important-notice.xml b/java/res/values-ur-rPK/strings-config-important-notice.xml new file mode 100644 index 000000000..56d3ff1e1 --- /dev/null +++ b/java/res/values-ur-rPK/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"تجاویز کو بہتر بنانے کیلئے اپنی مواصلات اور ٹائپ کردہ ڈیٹا سے سیکھیں"</string> +</resources> diff --git a/java/res/values-ur-rPK/strings-letter-descriptions.xml b/java/res/values-ur-rPK/strings-letter-descriptions.xml new file mode 100644 index 000000000..23aa8cf13 --- /dev/null +++ b/java/res/values-ur-rPK/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"مؤنث علامتِ ترتيب"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"مائیکرو کا نشان"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"مذکر علامتِ ترتيب"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"شارپ S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A، گریو"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A، اکیوٹ"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A، سرکمفلیکس"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A، ٹلڈا"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A، ڈایاریسس"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A، اوپر رِنگ"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E، لیگاچر"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C، سڈِلا"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E، گریو"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E، اکیوٹ"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E، سرکمفلیکس"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E، ڈایاریسس"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I، گریو"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I، اکیوٹ"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I، سرکمفلیکس"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I، ڈایاریسس"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N، ٹلڈا"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O، گریو"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O، اکیوٹ"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O، سرکمفلیکس"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O، ٹلڈا"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O، ڈایاریسس"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O، اسٹروک"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U، گریو"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U، اکیوٹ"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U، سرکمفلیکس"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U، ڈایاریسس"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y، اکیوٹ"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"تھورن"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y، ڈایاریسس"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A، میکران"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A، بریو"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A، اوگونیک"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C، اکیوٹ"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C، سرکمفلیکس"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C، اوپر ڈاٹ"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C، کیران"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D، کیران"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D، اسٹروک"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E، میکران"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E، بریو"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E، اوپر ڈاٹ"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E، اوگونیک"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E، کیران"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G، سرکمفلیکس"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G، بریو"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G، اوپر ڈاٹ"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G، سڈِلا"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H، سرکمفلیکس"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H، اسٹروک"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I، ٹلڈا"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I، میکران"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I، بریو"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I، اوگونیک"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"بغیر ڈاٹ والی I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J لیگاچر"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J، سرکمفلیکس"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K، سڈِلا"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L، اکیوٹ"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L، سڈِلا"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L، کیران"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L، درمیانی ڈاٹ"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L، اسٹروک"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N، اکیوٹ"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N، سڈِلا"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N، کیران"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N، جس سے پہلے علامت حذف ہو"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O، میکران"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O، بریو"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O، ڈبل اکیوٹ"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E، لیگاچر"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R، اکیوٹ"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R، سڈِلا"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R، کیران"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S، اکیوٹ"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S، سرکمفلیکس"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S، سڈِلا"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S، کیران"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T، سڈِلا"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T، کیران"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T، اسٹروک"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U، ٹلڈا"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U، میکران"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U، بریو"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U، اوپر رِنگ"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U، ڈبل اکیوٹ"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U، اوگونیک"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W، سرکمفلیکس"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y، سرکمفلیکس"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z، اکیوٹ"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z، اوپر ڈاٹ"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z، کیران"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"طویل S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O، ہورن"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U، ہورن"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S، ذیل میں کوما"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T، ذیل میں کوما"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"شوا"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A، اوپر ہوک"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A، سرکمفلیکس اور اکیوٹ"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A، سرکمفلیکس اور گریو"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A، سرکمفلیکس اور اوپر ہوک"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A، سرکمفلیکس اور ٹلڈا"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A، سرکمفلیکس اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A، بریو اور اکیوٹ"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A، بریو اور گریو"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A، بریو اور اوپر ہوک"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A، بریو اور ٹلڈا"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A، بریو اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E، اوپر ہوک"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E، ٹلڈا"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E، سرکمفلیکس اور اکیوٹ"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E، سرکمفلیکس اور گریو"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E، سرکمفلیکس اور اوپر ہوک"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E، سرکمفلیکس اور ٹلڈا"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E، سرکمفلیکس اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I، اوپر ہوک"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O، اوپر ہوک"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O، سرکمفلیکس اور اکیوٹ"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O، سرکمفلیکس اور گریو"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O، سرکمفلیکس اور اوپر ہوک"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O، سرکمفلیکس اور ٹلڈا"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O، سرکمفلیکس اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O، ہورن اور اکیوٹ"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O، ہورن اور گریو"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O، ہورن اور اوپر ہوک"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O، ہورن اور ٹلڈا"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O، ہورن اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U، اوپر ہوک"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U، ہورن اور اکیوٹ"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U، ہورن اور گریو"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U، اوپر ہورن اور ہوک"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U، ہورن اور ٹلڈا"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U، ہورن اور ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y، گریو"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y، ذیل میں ڈاٹ"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y، اوپر ہوک"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y، ٹلڈا"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"الٹی علامت استعجاب"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"بائیں طرف اشارہ کرنے والا دو زاویہ علامت قوسین"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"درمیانی ڈاٹ"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"سپر اسکرپٹ ایک"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"دائیں طرف اشارہ کرنے والا دو زاویہ علامت اقتباس"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"الٹا سوالیہ نشان"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"بائیں طرف والی ایک علامت اقتباس"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"دائیں طرف والی ایک علامت اقتباس"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"واحد ذیلی 9 علامت اقتباس"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"بائیں طرف والی دہری علامت اقتباس"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"دائیں دہری علامت اقتباس"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"ڈیگر"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"ڈبل ڈیگر"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"فی ملی علامت"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"پرائم"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"ڈبل پرائم"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"بائیں طرف اشارہ کرنے والا ایک زاویہ علامت اقتباس"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"دائیں طرف اشارہ کرنے والا ایک زاویہ علامت اقتباس"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"سپر اسکرپٹ چار"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"سپر اسکرپٹ لاطینی چھوٹا حرف n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"پیسو علامت"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"کیئر آف"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"دائیں طرف کا تیر کا نشان"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"نیچے کی طرف کا تیر کا نشان"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"خالی سیٹ"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"اضافہ"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"اس سے کم یا اس کے برابر"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"اس سے بڑا یا اس کے برابر"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"سیاہ ستارہ کا نشان"</string> +</resources> diff --git a/java/res/values-ur-rPK/strings-talkback-descriptions.xml b/java/res/values-ur-rPK/strings-talkback-descriptions.xml new file mode 100644 index 000000000..5820372f5 --- /dev/null +++ b/java/res/values-ur-rPK/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"پاس ورڈ کلیدوں کی آواز اونچی آواز میں سننے کیلئے ایک ہیڈ سیٹ پلگ ان کریں۔"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"موجودہ متن %s ہے"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"کوئی متن درج نہیں کیا گیا"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> کو ٹھیک کر کے <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> کر دیتی ہے"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> خود کار اصلاح کو انجام دیتی ہے"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"نامعلوم حرف"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"مزید علامات"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"علامات"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"حذف کریں"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"علامات"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"حروف"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"نمبرز"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"ترتیبات"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"اسپیس"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"صوتی ان پٹ"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"واپس جائیں"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"تلاش کریں"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"ڈاٹ"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"زبان سوئچ کریں"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"اگلا"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"پچھلا"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift فعال ہے"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Caps lock فعال ہے"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"علامات وضع"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"مزید علامات کی وضع"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"حروف وضع"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"فون وضع"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"فون علامات کی وضع"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"کی بورڈ مخفی ہے"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"<xliff:g id="KEYBOARD_MODE">%s</xliff:g> کی بورڈ دکھائی دے رہا ہے"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"تاریخ"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"تاریخ اور وقت"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"ای میل"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"پیغام رسانی"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"نمبر"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"فون"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"متن"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"وقت"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"حالیہ"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"لوگ"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"اشیاء"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"فطرت"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"مقامات"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"علامات"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"جذباتی اشکال"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"بڑی <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"بڑی I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"بڑی I، اوپر ڈاٹ"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"نامعلوم علامت"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"نامعلوم emoji"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"متبادل حروف دستیاب ہیں"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"متبادل حروف کو مسترد کر دیا گیا ہے"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"متبادل تجاویز دستیاب ہیں"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"متبادل تجاویز کو مسترد کر دیا گیا ہے"</string> +</resources> diff --git a/java/res/values-ur-rPK/strings.xml b/java/res/values-ur-rPK/strings.xml new file mode 100644 index 000000000..8439cb526 --- /dev/null +++ b/java/res/values-ur-rPK/strings.xml @@ -0,0 +1,210 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"ان پٹ اختیارات"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"رابطوں میں سے نام ڈھونڈیں"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"ہجے چیک کنندہ آپ کی رابطہ فہرست سے اندراجات کا استعمال کرتا ہے"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"کلید دبانے پر وائبریٹ کریں"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"کلید دبانے پر آواز"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"کلید دبانے پر پاپ اپ"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"دیگر اندراج طریقوں پر سوئچ کریں"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"زبان سوئچ کرنے کی کلید اندراج کے دیگر طریقوں کا بھی احاطہ کرتی ہے"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"زبان سوئچ کرنے کی کلید"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"متعدد ان پٹ زبانیں فعال ہونے پر دکھائیں"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"سلائیڈ انڈیکیٹر کو دکھائیں"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift یا علامت کلیدوں سے سلائیڈ کرتے ہوئے بصری اشارہ ڈسپلے کریں"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"کلید پاپ اپ رفع کی تاخیر"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"کوئی تاخیر نہیں"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"ڈیفالٹ"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>ملی سیکنڈ"</string> + <string name="settings_system_default" msgid="6268225104743331821">"سسٹم ڈیفالٹ"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"رابطہ ناموں کی تجویز کریں"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"تجاویز اور اصلاحات کیلئے رابطوں سے ناموں کی تجویز کریں"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"ذاتی نوعیت کی تجاویز"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> کو بہتر بنائیں"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"ڈبل اسپیس پیریڈ"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"سپیس بار دو بار تھپتھپانے سے سپیس کے بعد پیریڈ داخل ہوجاتا ہے۔"</string> + <string name="auto_cap" msgid="1719746674854628252">"بڑے حروف میں خودکار تبدیلی"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"ہر جملے کا پہلا لفظ بڑے حروف میں لکھیں"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"ذاتی لغت"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"اضافی لغات"</string> + <string name="main_dictionary" msgid="4798763781818361168">"مرکزی لغت"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"اصلاح کی تجاویز دکھائیں"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"ٹائپ کرتے وقت تجویز کردہ الفاظ ڈسپلے کریں"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"ہمیشہ دکھائیں"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"پورٹریٹ وضع میں دکھائیں"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"ہمیشہ چھپائیں"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"ناگوار الفاظ مسدود کریں"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"ممکنہ طور پر ناگوار الفاظ تجویز نہ کریں"</string> + <string name="auto_correction" msgid="7630720885194996950">"خود کار اصلاح"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"اسپیس بار اور رموز اوقاف غلط ٹائپ کردہ الفاظ کی اصلاح کریں"</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_aggressive" msgid="7319007299148899623">"پر جوش"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"بہت پر جوش"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"اگلے الفاظ کی تجاویز"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"تجاویز پیش کرتے وقت گزشتہ لفظ استعمال کریں"</string> + <string name="gesture_input" msgid="826951152254563827">"اشارہ ٹائپنگ کو فعال کریں"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"حروف پر سلائیڈ کر کے ایک لفظ درج کریں"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"اشارہ ٹریل دکھائیں"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"ڈائنیمک فلوٹنگ پیش منظر"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"اشارہ کرتے ہوئے تجویز کردہ لفظ دیکھیں"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"جملہ کا اشارہ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"اسپیس کلید کو گلائیڈ کر کے اشاروں کے درمیان خالی جگہیں درج کریں"</string> + <string name="voice_input" msgid="3583258583521397548">"صوتی ان پٹ کلید"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"کوئی صوتی اندراج کے طریقے فعال نہیں ہیں۔ زبان اور ان پٹ ترتیبات کو چیک کریں۔"</string> + <string name="configure_input_method" msgid="373356270290742459">"اندراج کے طریقے کنفیگر کریں"</string> + <string name="language_selection_title" msgid="1651299598555326750">"ان پٹ زبانیں"</string> + <string name="send_feedback" msgid="1780431884109392046">"تاثرات بھیجیں"</string> + <string name="select_language" msgid="3693815588777926848">"ان پٹ زبانیں"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"محفوظ کرنے کیلئے دوبارہ ٹچ کریں"</string> + <string name="has_dictionary" msgid="6071847973466625007">"لغت دستیاب ہے"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"کی بورڈ تھیم"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"انگریزی (برطانیہ)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"انگریزی (امریکہ)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"ہسپانوی (امریکہ)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"انگریزی (برطانیہ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"انگریزی (امریکہ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"ہسپانوی (امریکہ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (روایتی)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (سیریلک)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (لاطینی)"</string> + <string name="subtype_no_language" msgid="7137390094240139495">"کوئی زبان نہیں (الفابیٹ)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"حروف تہجی (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"حروف تہجی (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"حروف تہجی (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"حروف تہجی (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"حروف تہجی (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"حروف تہجی (PC)"</string> + <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"حسب ضرورت ان پٹ اسٹائلز"</string> + <string name="add_style" msgid="6163126614514489951">"اسٹائل شامل کریں"</string> + <string name="add" msgid="8299699805688017798">"شامل کریں"</string> + <string name="remove" msgid="4486081658752944606">"ہٹائیں"</string> + <string name="save" msgid="7646738597196767214">"محفوظ کریں"</string> + <string name="subtype_locale" msgid="8576443440738143764">"زبان"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"لے آؤٹ"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"آپ کیلئے اپنا حسب ضرورت ان پٹ اسٹائل استعمال کرنے سے پہلے اسے فعال کرنا ضروری ہے۔ کیا آپ اسے ابھی فعال کرنا چاہتے ہیں؟"</string> + <string name="enable" msgid="5031294444630523247">"فعال کریں"</string> + <string name="not_now" msgid="6172462888202790482">"ابھی نہیں"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"ایسا ہی ان پٹ اسٹائل پہلے سے موجود ہے: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"کلید کو دیر تک دبانے کی تاخیر"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"کلید دبانے پر وائبریشن کا دورانیہ"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"کلید دبانے پر آواز کا والیوم"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"خارجی لغت کی فائل پڑھیں"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ڈاؤن لوڈز فولڈر میں کوئی لغت فائلیں نہیں ہیں"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"انسٹال کرنے کیلئے ایک لغت فائل منتخب کریں"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> کیلئے واقعی اس فائل کو انسٹال کریں؟"</string> + <string name="error" msgid="8940763624668513648">"ایک خرابی پیش آگئی"</string> + <string name="button_default" msgid="3988017840431881491">"ڈیفالٹ"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> میں خوش آمدید"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"اشارہ ٹائپنگ کے ساتھ"</string> + <string name="setup_start_action" msgid="8936036460897347708">"شروع کریں"</string> + <string name="setup_next_action" msgid="371821437915144603">"اگلا مرحلہ"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ترتیب دینا"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> کو فعال کریں"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"براہ کرم \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" کو اپنی زبان اور ان پٹ ترتیبات میں چیک کریں۔ اس سے اس کو آپ کے آلہ پر چلانے کی اجازت مل جائے گی۔"</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> پہلے ہی آپ کی زبان اور ان پٹ ترتیبات میں فعال ہے، لہذا یہ مرحلہ مکمل ہو گیا ہے۔ اگلے پر!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"ترتیبات میں فعال کریں"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> پر سوئچ کریں"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"آگے، \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" کو اپنے فعال متنی اندراج کے طریقہ کے بطور منتخب کریں۔"</string> + <string name="setup_step2_action" msgid="1660330307159824337">"اندراج کے طریقے سوئچ کریں"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"مبارک ہو، آپ بالکل تیار ہیں!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"اب آپ <xliff:g id="APPLICATION_NAME">%s</xliff:g> کے ساتھ اپنی سبھی پسندیدہ ایپس میں ٹائپ کر سکتے ہیں۔"</string> + <string name="setup_step3_action" msgid="600879797256942259">"اضافی زبانیں کنفیگر کریں"</string> + <string name="setup_finish_action" msgid="276559243409465389">"مکمل ہو گیا"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"ایپ آئیکن دکھائیں"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"لانچر میں ایپلیکیشن آئیکن کو ڈسپلے کریں"</string> + <string name="app_name" msgid="6320102637491234792">"لغت فراہم کنندہ"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"لغت فراہم کنندہ"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"لغت سروس"</string> + <string name="download_description" msgid="6014835283119198591">"لغت اپ ڈیٹ کی معلومات"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"اضافی لغات"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"لغت دستیاب ہے"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"لغات کیلئے ترتیبات"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"صارف لغات"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"صارف کی لغت"</string> + <string name="dictionary_available" msgid="4728975345815214218">"لغت دستیاب ہے"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"فی الحال ڈاؤن لوڈ ہو رہی ہے"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"انسٹال کردہ"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"انسٹال کردہ، غیر فعال"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"لغت سروس سے مربوط ہونے میں مسئلہ"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"کوئی لغت دستیاب نہیں"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"ریفریش کریں"</string> + <string name="last_update" msgid="730467549913588780">"آخری بار اپ ڈیٹ کردہ"</string> + <string name="message_updating" msgid="4457761393932375219">"اپ ڈیٹس چیک کر رہے ہیں"</string> + <string name="message_loading" msgid="5638680861387748936">"لوڈ ہو رہی ہے…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"مرکزی لغت"</string> + <string name="cancel" msgid="6830980399865683324">"منسوخ کریں"</string> + <string name="go_to_settings" msgid="3876892339342569259">"ترتیبات"</string> + <string name="install_dict" msgid="180852772562189365">"انسٹال کریں"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"منسوخ کریں"</string> + <string name="delete_dict" msgid="756853268088330054">"حذف کریں"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"آپ کے موبائل آلہ پر منتخب کردہ زبان کیلئے ایک لغت دستیاب ہے۔<br/> آپ کے ٹائپنگ تجربہ کو بہتر بنانے کیلئے ہم <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> لغت کو <b>ڈاؤن لوڈ کرنے</b> کی تجویز کرتے ہیں۔<br/> <br/> ڈاؤن لوڈ میں 3G پر ایک یا دو منٹ لگ سکتے ہیں۔ اگر آپ کے پاس <b>غیر محدود ڈیٹا پلان</b> نہیں ہے تو چارجز لاگو ہو سکتے ہیں۔<br/> اگر آپ کو یقین نہیں ہے کہ آپ کے پاس کون سا ڈیٹا پلان ہے تو ہم ڈاؤن لوڈ خود کار طور پر شروع کرنے کیلئے ایک Wi-Fi کنکشن تلاش کرنے کی تجویز کرتے ہیں۔<br/> <br/> تجویز: آپ اپنے موبائل آلہ کے <b>ترتیبات</b> مینو میں <b>زبان اور ان پٹ</b> پر جا کر لغات کو ڈاؤن لوڈ کر سکتے اور ہٹا سکتے ہیں"</string> + <string name="download_over_metered" msgid="1643065851159409546">"ابھی ڈاؤن لوڈ کریں (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi پر ڈاؤن لوڈ کریں"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> کیلئے ایک لغت دستیاب ہے"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"جائزہ لینے اور ڈاؤن لوڈ کرنے کیلئے دبائیں"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"ڈاؤن لوڈ ہو رہا ہے: <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> کیلئے تجاویز جلد ہی تیار ہو جائیں گی۔"</string> + <string name="version_text" msgid="2715354215568469385">"ورژن <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"شامل کریں"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"لغت میں شامل کریں"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"جملہ"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"مزید اختیارات"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"کم اختیارات"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"ٹھیک ہے"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"لفظ:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"شارٹ کٹ:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"زبان:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"ایک لفظ ٹائپ کریں"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"اختیاری شارٹ کٹ"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"لفظ میں ترمیم کریں"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"ترمیم کریں"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"حذف کریں"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"صارف لغت میں آپ کے پاس کوئی الفاظ نہيں ہیں۔ شامل کریں (+) بٹن کو ٹچ کر کے ایک لفظ شامل کریں۔"</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"سبھی زبانوں کیلئے"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"مزید زبانیں…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"حذف کریں"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> +</resources> diff --git a/java/res/values-uz-rUZ/strings-action-keys.xml b/java/res/values-uz-rUZ/strings-action-keys.xml new file mode 100644 index 000000000..1bb617cc1 --- /dev/null +++ b/java/res/values-uz-rUZ/strings-action-keys.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for label_go_key (4033615332628671065) --> + <skip /> + <!-- no translation found for label_next_key (5586407279258592635) --> + <skip /> + <!-- no translation found for label_previous_key (1421141755779895275) --> + <skip /> + <!-- no translation found for label_done_key (7564866296502630852) --> + <skip /> + <!-- no translation found for label_send_key (482252074224462163) --> + <skip /> + <string name="label_search_key" msgid="7965186050435796642">"Qidiruv"</string> + <!-- no translation found for label_pause_key (2225922926459730642) --> + <skip /> + <!-- no translation found for label_wait_key (5891247853595466039) --> + <skip /> +</resources> diff --git a/java/res/values-uz-rUZ/strings-letter-descriptions.xml b/java/res/values-uz-rUZ/strings-letter-descriptions.xml new file mode 100644 index 000000000..fc1c3ff78 --- /dev/null +++ b/java/res/values-uz-rUZ/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Ayol jinsiga oid tartib ko‘rsatkichi"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikro belgisi"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Erkak jinsiga oid tartib ko‘rsatkichi"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"O‘tkir S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"Gravisli A"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"Akutli A"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"Sirkumfleksli A"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"Tildali A"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"Diyerezisli A"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"Tepasida halqasi bor A"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"AE-ligatura"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"Sedillali C"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"Gravisli E"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"Akutli E"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"Sirkumfleksli E"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"Diyerezisli E"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"Gravisli I"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"Akutli I"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"Sirkumfleksli I"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"Diyerezisli I"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Et"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"Tildali N"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"Gravisli O"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"Akutli O"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"Sirkumfleksli O"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"Tildali O"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"Diyerezisli O"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O‘rtasi chizilgan O"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"Gravisli U"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"Akutli U"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"Sirkumfleksli U"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"Diyerezisli U"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Akutli Y"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Torn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Diyerezisli Y"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"Makronli A"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"Brevisli A"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"Dumli A"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"Akutli C"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"Sirkumfleksli C"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"Tepasida nuqtasi bor C"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"Gajakli C"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"Gajakli D"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"O‘rtasi chizilgan D"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"Makronli E"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"Brevisli E"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"Tepasida nuqtasi bor E"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"Dumli E"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"Gajakli E"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"Sirkumfleksli G"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"Brevisli G"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"Tepasida nuqtasi bor G"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"Sedillali G"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"Sirkumfleksli H"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"O‘rtasi chizilgan H"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"Tildali I"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"Makronli I"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"Brevisli I"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"Dumli I"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Nuqtasiz I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"IJ-ligatura"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"Sirkumfleksli J"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"Sedillali K"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"Akutli L"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"Sedillali L"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"Gajakli L"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"O‘rtasida nuqtasi bor L"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"O‘rtasi chizilgan L"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"Akutli N"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"Sedillali N"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"Gajakli N"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"Apostrofli N"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Ng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"Makronli O"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"Brevisli O"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"Qo‘sh akutli O"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"OE-ligatura"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"Akutli R"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"Sedillali R"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"Gajakli R"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"Akutli S"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"Sirkumfleksli S"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"Sedillali S"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"Gajakli S"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"Sedillali T"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"Gajakli T"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"O‘rtasi chizilgan T"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"Tildali U"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"Makronli U"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"Brevisli U"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"Tepasida halqasi bor U"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"Qo‘sh akutli U"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"Dumli U"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"Sirkumfleksli W"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Sirkumfleksli Y"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Akutli Z"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Tepasida nuqtasi bor Z"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Gajakli Z"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Uzun S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"Shohli O"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"Shohli U"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"Ostida verguli bor S"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"Ostida verguli bor T"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Shva"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"Ostida nuqtasi bor A"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"Tepasida ilmog‘i bor A"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"Sirkumfleks va akutli A"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"Sirkumfleks va gravisli A"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"Sirkumfleks va tepasida ilmog‘i bor A"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"Sirkumfleks va tildali A"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"Sirkumfleks va ostida nuqtasi bor A"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"Brevis va akutli A"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"Brevis va gravisli A"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"Brevis va tepasida ilmog‘i bor A"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"Brevis va tildali A"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"Brevis va ostida nuqtasi bor A"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"Ostida nuqtasi bor E"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"Tepasida ilmog‘i bor E"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"Tildali E"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"Sirkumfleks va akutli E"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"Sirkumfleks va gravisli E"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"Sirkumfleks va tepasida ilmog‘i bor E"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"Sirkumfleks va tildali E"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"Sirkumfleks va ostida nuqtasi bor E"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"Tepasida ilmog‘i bor I"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"Ostida nuqtasi bor I"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"Ostida nuqtasi bor O"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"Tepasida ilmog‘i bor O"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"Sirkumfleks va akutli O"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"Sirkumfleks va gravisli O"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"Sirkumfleks va tepasida ilmog‘i bor O"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"Sirkumfleks va tildali O"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"Sirkumfleks va ostida nuqtasi bor O"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"Shoh va akutli O"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"Shoh va akutli O"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"Shoh va tepasida ilmog‘i bor O"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"Shoh va tildali O"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"Shoh va ostida nuqtasi bor O"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"Ostida nuqtasi bor U"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"Tepasida nuqtasi bor U"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"Shoh va akutli U"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"Shoh va gravisli U"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"Shoh va tepasida ilmog‘i bor U"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"Shoh va tildali U"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"Shoh va ostida nuqtasi bor U"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Gravisli Y"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Ostida nuqtasi bor Y"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Tepasida ilmog‘i bor Y"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Tildali Y"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Teskari undov belgisi"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Chapga qaragan burchakli qo‘shtirnoq belgisi"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Markazlashgan nuqta"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Darajada joylashgan bir"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"O‘ngga qaragan burchakli qo‘shtirnoq belgisi"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Teskari so‘roq belgisi"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Chap bir tirnoq belgisi"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"O‘ng bir tirnoq belgisi"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Indeksda joylashgan 9 ko‘rinishidagi bir tirnoq belgisi"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Chap qo‘shtirnoq belgisi"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"O‘ng qo‘shtirnoq belgisi"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Xoch belgisi"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Qo‘sh xoch belgisi"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Promille belgisi"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Kertma belgisi"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Qo‘sh kertma belgisi"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Chapga qaragan burchakli bir tirnoq belgisi"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"O‘ngga qaragan burchakli bir tirnoq belgisi"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Darajada joylashgan to‘rt"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Darajada joylashgan lotincha kichik n harfi"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso belgisi"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Orqali (c/o) belgisi"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"O‘ngga qaragan ko‘rsatkichli chiziqcha"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pastga qaragan ko‘rsatkichli chiziqcha"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Bo‘sh to‘plam"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Delta belgisi"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kichik yoki teng"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Katta yoki teng"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Qora yulduzcha"</string> +</resources> diff --git a/java/res/values-uz-rUZ/strings-talkback-descriptions.xml b/java/res/values-uz-rUZ/strings-talkback-descriptions.xml new file mode 100644 index 000000000..589790b6f --- /dev/null +++ b/java/res/values-uz-rUZ/strings-talkback-descriptions.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for spoken_use_headphones (4313642710742229868) --> + <skip /> + <!-- no translation found for spoken_current_text_is (4240549866156675799) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (1711276837961785646) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8989324692167993804) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (7769449372355268412) --> + <skip /> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Noma’lum belgi"</string> + <!-- no translation found for spoken_description_shift (7209798151676638728) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift (3483198879916435717) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (3122704922642232605) --> + <skip /> + <!-- no translation found for spoken_description_symbols_shift_shifted (5179175466878186081) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (1224851412185975036) --> + <skip /> + <!-- no translation found for spoken_description_delete (3878902286264983302) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (8244903740201126590) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (4081215210530031950) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (4560261331530795682) --> + <skip /> + <!-- no translation found for spoken_description_settings (7281251004003143204) --> + <skip /> + <!-- no translation found for spoken_description_tab (8210782459446866716) --> + <skip /> + <!-- no translation found for spoken_description_space (5908716896642059145) --> + <skip /> + <!-- no translation found for spoken_description_mic (6153138783813452464) --> + <skip /> + <!-- no translation found for spoken_description_emoji (7990051553008088470) --> + <skip /> + <!-- no translation found for spoken_description_return (3183692287397645708) --> + <skip /> + <!-- no translation found for spoken_description_search (5099937658231911288) --> + <skip /> + <!-- no translation found for spoken_description_dot (5644176501632325560) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (6818666779313544553) --> + <skip /> + <!-- no translation found for spoken_description_action_next (431761808119616962) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (2919072174697865110) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5107180516341258979) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (7307477738053606881) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (111186851131446691) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (4676004119618778911) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (2061220553756692903) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (7879963803547701090) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (2313574218950517779) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (6698257917367823205) --> + <skip /> + <!-- no translation found for keyboard_mode_date (6597407244976713364) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (3642804408726668808) --> + <skip /> + <!-- no translation found for keyboard_mode_email (1239682082047693644) --> + <skip /> + <!-- no translation found for keyboard_mode_im (3812086215529493501) --> + <skip /> + <!-- no translation found for keyboard_mode_number (5395042245837996809) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (2486230278064523665) --> + <skip /> + <!-- no translation found for keyboard_mode_text (9138789594969187494) --> + <skip /> + <!-- no translation found for keyboard_mode_time (8558297845514402675) --> + <skip /> + <!-- no translation found for keyboard_mode_url (8072011652949962550) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_recents (4185344945205590692) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_people (8414196269847492817) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_objects (6116297906606195278) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_nature (5018340512472354640) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_places (1163315840948545317) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_symbols (474680659024880601) --> + <skip /> + <!-- no translation found for spoken_descrption_emoji_category_emoticons (456737544787823539) --> + <skip /> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Bosh harf bilan yozilgan <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Katta I harfi"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Tepasida nuqtasi bor katta I harfi"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Noma’lum belgi"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Noma’lum kulgich"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Muqobil belgilar mavjud"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Muqobil belgilar tushirib qoldirildi"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Muqobil takliflar mavjud"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Muqobil takliflar tushirib qoldirildi"</string> +</resources> diff --git a/java/res/values-uz-rUZ/strings.xml b/java/res/values-uz-rUZ/strings.xml new file mode 100644 index 000000000..2b5da5313 --- /dev/null +++ b/java/res/values-uz-rUZ/strings.xml @@ -0,0 +1,374 @@ +<?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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_personalized_dicts (5167396352105467626) --> + <skip /> + <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilovasini takomillashtirish"</string> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- 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 (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- 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_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for gesture_space_aware (2078291600664682496) --> + <skip /> + <!-- no translation found for gesture_space_aware_summary (4371385818348528538) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_disabled_summary (8141750303464726129) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for keyboard_layout (8451164783510487501) --> + <skip /> + <!-- no translation found for subtype_en_GB (88170601942311355) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (1931018968641592304) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (8809311287529805422) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (510930471167541338) --> + <skip /> + <!-- no translation found for subtype_generic_traditional (8584594350973800586) --> + <skip /> + <!-- no translation found for subtype_generic_cyrillic (7486451947618138947) --> + <skip /> + <!-- no translation found for subtype_generic_latin (9128716486310604145) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (4782116251651288054) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (5638680861387748936) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for go_to_settings (3876892339342569259) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (1583881200688185508) --> + <skip /> + <!-- no translation found for download_over_metered (1643065851159409546) --> + <skip /> + <!-- no translation found for do_not_download_over_metered (2176209579313941583) --> + <skip /> + <!-- no translation found for dict_available_notification_title (4583842811218581658) --> + <skip /> + <!-- no translation found for dict_available_notification_description (1075194169443163487) --> + <skip /> + <!-- no translation found for toast_downloading_suggestions (6128155879830851739) --> + <skip /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/res/values-v20/platform-theme.xml b/java/res/values-v20/platform-theme.xml new file mode 100644 index 000000000..52e7f3521 --- /dev/null +++ b/java/res/values-v20/platform-theme.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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: This file is temporarily placed under values-v20. --> +<!-- TODO: It might be moved under values-v21. --> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <style name="platformActivityTheme" parent="@android:style/Theme.Material.Light" /> + <style name="platformDialogTheme" parent="@android:style/Theme.Material.Light.Dialog" /> +</resources> diff --git a/java/res/values-vi/strings-action-keys.xml b/java/res/values-vi/strings-action-keys.xml index ceb780ed1..3c4060883 100644 --- a/java/res/values-vi/strings-action-keys.xml +++ b/java/res/values-vi/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Trước"</string> <string name="label_done_key" msgid="7564866296502630852">"Xong"</string> <string name="label_send_key" msgid="482252074224462163">"Gửi"</string> + <string name="label_search_key" msgid="7965186050435796642">"Tìm kiếm"</string> <string name="label_pause_key" msgid="2225922926459730642">"Tdừng"</string> <string name="label_wait_key" msgid="5891247853595466039">"Đợi"</string> </resources> diff --git a/java/res/values-vi/strings-config-important-notice.xml b/java/res/values-vi/strings-config-important-notice.xml new file mode 100644 index 000000000..828f0b603 --- /dev/null +++ b/java/res/values-vi/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Tìm hiểu từ thư từ trao đổi và dữ liệu đã nhập của bạn để cải tiến đề xuất"</string> +</resources> diff --git a/java/res/values-vi/strings-letter-descriptions.xml b/java/res/values-vi/strings-letter-descriptions.xml new file mode 100644 index 000000000..74f199f08 --- /dev/null +++ b/java/res/values-vi/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Chỉ báo thứ tự giống cái"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Ký hiệu micrô"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Chỉ báo thứ tự giống đực"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, dấu huyền"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, dấu sắc"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, dấu mũ"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, dấu ngã"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dấu tách đôi"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, dấu nhẫn phía trên"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, dấu gạch nối"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, dấu móc dưới"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, dấu huyền"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, dấu sắc"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, dấu mũ"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dấu tách đôi"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, dấu huyền"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, dấu sắc"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, dấu mũ"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dấu tách đôi"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, dấu ngã"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, dấu huyền"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, dấu sắc"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, dấu mũ"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, dấu ngã"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dấu tách đôi"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, nét gạch"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, dấu huyền"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, dấu sắc"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, dấu mũ"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, dấu tách đôi"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, dấu sắc"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Dấu móc"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dấu tách đôi"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, sự làm dấu"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, dấu ngân"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, một cái đuôi nhỏ"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, dấu sắc"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, dấu mũ"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dấu chấm phía trên"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, dấu mũ ngược"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, dấu mũ ngược"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, nét gạch"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, sự làm dấu"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, dấu ngân"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dấu chấm phía trên"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, một cái đuôi nhỏ"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, dấu mũ ngược"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, dấu mũ"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, dấu ngân"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dấu chấm phía trên"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, dấu móc dưới"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, dấu mũ"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, nét gạch"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, dấu ngã"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, sự làm dấu"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, dấu ngân"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, một cái đuôi nhỏ"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I không dấu chấm"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, dấu gạch nối"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, dấu mũ"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, dấu móc dưới"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, dấu sắc"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, dấu móc dưới"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, dấu mũ ngược"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, chấm ở giữa"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, nét gạch"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, dấu sắc"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, dấu móc dưới"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, dấu mũ ngược"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, theo sau dấu móc lửng"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, sự làm dấu"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, dấu ngân"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, hai dấu sắc"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, dấu gạch nối"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, dấu sắc"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, dấu móc dưới"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, dấu mũ ngược"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, dấu sắc"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, dấu mũ"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, dấu móc dưới"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, dấu mũ ngược"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, dấu móc dưới"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, dấu mũ ngược"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, nét gạch"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, dấu ngã"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, sự làm dấu"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, dấu ngân"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, dấu nhẫn ở trên"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, hai dấu sắc"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, một cái đuôi nhỏ"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, dấu mũ"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, dấu mũ"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, dấu sắc"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dấu chấm phía trên"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, dấu mũ ngược"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S dài"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, dấu móc"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, dấu móc"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, dấu phẩy phía dưới"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, dấu phẩy phía dưới"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Âm Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, dấu móc phía trên"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, dấu mũ và dấu sắc"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, dấu mũ và dấu huyền"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, dấu mũ và móc phía trên"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, dấu mũ và dấu ngã"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, dấu mũ và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, dấu ngân và dấu sắc"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, dấu ngân và dấu huyền"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, dấu ngân và móc phía trên"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, dấu ngân và dấu ngã"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, dấu ngân và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, móc phía trên"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, dấu ngã"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, dấu mũ và dấu sắc"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, dấu mũ và dấu huyền"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, dấu mũ và móc phía trên"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, dấu mũ và dấu ngã"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, dấu mũ và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, móc phía trên"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, móc phía trên"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, dấu mũ và dấu sắc"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, dấu mũ và dấu huyền"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, dấu mũ và móc phía trên"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, dấu mũ và dấu ngã"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, dấu mũ và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, dấu móc và dấu sắc"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, dấu móc và dấu huyền"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, dấu móc và móc phía trên"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, dấu móc và dấu ngã"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, dấu móc và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, móc phía trên"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, dấu móc và dấu sắc"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, dấu móc và dấu huyền"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, dấu móc và móc phía trên"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, dấu móc và dấu ngã"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, dấu móc và dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, dấu huyền"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dấu chấm phía dưới"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, móc phía trên"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, dấu ngã"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Dấu cảm thán đảo ngược"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dấu ngoặc kép mở"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Dấu chấm ở giữa"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Chỉ số trên một"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dấu ngoặc kép đóng"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Dấu hỏi đảo ngược"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Dấu ngoặc đơn mở"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Dấu ngoặc đơn đóng"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dấu trích dẫn đơn"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dấu ngoặc kép mở"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dấu ngoặc kép đóng"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dấu chữ thập"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dấu chữ thập kép"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Dấu cho mỗi ngàn"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Dấu phẩy"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Hai phẩy"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Dấu ngoặc đơn mở"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Dấu ngoặc đơn đóng"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Chỉ số trên bốn"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"Chỉ số trên của n thường"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Ký hiệu đồng Pêsô"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dấu phần trăm"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Mũi tên về phía phải"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Mũi tên xuống dưới"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tập rỗng"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Tăng dần"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Nhỏ hơn hoặc bằng"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lớn hơn hoặc bằng"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Sao đen"</string> +</resources> diff --git a/java/res/values-vi/strings-talkback-descriptions.xml b/java/res/values-vi/strings-talkback-descriptions.xml new file mode 100644 index 000000000..659b1d36f --- /dev/null +++ b/java/res/values-vi/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Cắm tai nghe để nghe mật khẩu được đọc to."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Ký tự hiện tại là %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Không có ký tự nào được nhập"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> sửa <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> thành <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> tự động sửa"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Ký tự không xác định"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Biểu tượng khác"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Biểu tượng"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Xóa"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Biểu tượng"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Chữ cái"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Số"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Cài đặt"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Dấu cách"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Nhập bằng giọng nói"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"Biểu tượng cảm xúc"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Quay lại"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Tìm kiếm"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Dấu chấm"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Chuyển ngôn ngữ"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Tiếp theo"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Trước"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Đã bật Shift"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Đã bật Caps lock"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Chế độ biểu tượng"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Chế độ biểu tượng khác"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Chế độ chữ cái"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Chế độ điện thoại"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Chế độ biểu tượng điện thoại"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Bàn phím bị ẩn"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Hiển thị bàn phím <xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"ngày"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"ngày và giờ"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"email"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"nhắn tin"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"số"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"điện thoại"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"văn bản"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"giờ"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Gần đây"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Con người"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Đồ vật"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Tự nhiên"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Địa điểm"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Biểu tượng"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Biểu tượng cảm xúc"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> hoa"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"I hoa"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"I hoa, dấu chấm phía trên"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ký hiệu không xác định"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Biểu tượng cảm xúc không xác định"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Có ký tự thay thế"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ký tự thay thế đã bị loại bỏ"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Có đề xuất thay thế"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Đề xuất thay thế đã bị loại bỏ"</string> +</resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 81cd373e4..ccb8668dc 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Tùy chọn nhập"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Lệnh ghi nhật ký cho nghiên cứu"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Tra cứu tên liên hệ"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Trình kiểm tra chính tả sử dụng các mục nhập từ danh sách liên hệ của bạn"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rung khi nhấn phím"</string> <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="general_category" msgid="1859088467017573195">"Chung"</string> - <string name="correction_category" msgid="2236750915056607613">"Sửa văn bản"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Nhập bằng cử chỉ"</string> - <string name="misc_category" msgid="6894192814868233453">"Tùy chọn khác"</string> - <string name="advanced_settings" msgid="362895144495591463">"Cài đặt nâng cao"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Tùy chọn dành cho chuyên gia"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Phương thức nhập khác"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Khóa chuyển ngôn ngữ bao gồm cả các phương thức nhập liệu khác"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Phím chuyển đổi ngôn ngữ"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Mặc định của hệ thống"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Đề xuất tên liên hệ"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Sử dụng tên từ Danh bạ cho các đề xuất và chỉnh sửa"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Đề xuất được cá nhân hóa"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Cải thiện <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Dấu cách đôi"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Nhấn đúp vào phím cách sẽ chèn thêm một dấu sau dấu cách"</string> <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Hiển thị vệt cử chỉ"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Xem trước nổi động"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Xem từ được đề xuất trong khi dùng cử chỉ"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Cắm tai nghe để nghe mật khẩu."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Ký tự hiện tại là %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Không có ký tự nào được nhập"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"<xliff:g id="KEY">%1$s</xliff:g> sửa <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> thành <xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"<xliff:g id="KEY">%1$s</xliff:g> thực hiện tự động sửa"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Mã phím %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift đang bật (bấm để tắt)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock đang bật (bấm để tắt)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Xóa"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Biểu tượng"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Chữ cái"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Số"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Cài đặt"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Dấu cách"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Nhập dữ liệu bằng giọng nói"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Mặt cười"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Quay lại"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Tìm kiếm"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Dấu chấm"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Chuyển ngôn ngữ"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Tiếp theo"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Trước"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Đã bật Shift"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Đã bật Caps lock"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Đã tắt Shift"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Chế độ biểu tượng"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Chế độ chữ cái"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Chế độ điện thoại"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Chế độ biểu tượng điện thoại"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Bàn phím bị ẩn"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Hiển thị bàn phím <xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"ngày"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"ngày và giờ"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"email"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"nhắn tin"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"số"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"điện thoại"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"văn bản"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"giờ"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Cử chỉ nhập cụm từ"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Nhập dấu cách khi thực hiện cử chỉ bằng cách trượt tới phím cách"</string> <string name="voice_input" msgid="3583258583521397548">"Khóa nhập giọng nói"</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ị tắt"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Không có phương thức nhập bằng giọng nói nào được bật. Kiểm tra cài đặt Ngôn ngữ và phương thức nhập."</string> <string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string> <string name="send_feedback" msgid="1780431884109392046">"Gửi phản hồi"</string> <string name="select_language" msgid="3693815588777926848">"Ngôn ngữ nhập"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Chạm lại để lưu"</string> <string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string> - <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="7525225584555429211">"Giúp cải tiến 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ố"</string> <string name="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Tiếng Anh (Anh)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Tiếng Anh (Mỹ)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"Tiếng Tây Ban Nha (Mỹ)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"Tiếng Anh (Anh) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"Tiếng Anh (Mỹ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Tiếng Tây Ban Nha (Mỹ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Truyền thống)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"Tiếng Anh (Anh) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"Tiếng Anh (Mỹ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Tiếng Tây Ban Nha (Mỹ) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Truyền thống)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tiếng Kirin)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (tiếng Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Không ngôn ngữ nào (Bảng chữ cái)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Bảng chữ cái (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Bảng chữ cái (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Bảng chữ cái (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Bảng chữ cái (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Biểu tượng cảm xúc"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Phối màu"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Trắng"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Lam"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Kiểu nhập tùy chỉnh"</string> <string name="add_style" msgid="6163126614514489951">"Thêm kiểu"</string> <string name="add" msgid="8299699805688017798">"Thêm"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Bật"</string> <string name="not_now" msgid="6172462888202790482">"Để sau"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Đã tồn tại kiểu nhập tương tự: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Chế độ nghiên cứu tính khả dụng"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Tgian chờ cho nhấn và giữ phím"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Thời gian rung khi nhấn phím"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Âm lượng khi nhấn phím"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Đọc tệp từ điển bên ngoài"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Không có tệp từ điển nào trong thư mục Nội dung tải xuống"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chọn tệp từ điển để cài đặt"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Thực sự cài đặt tệp này cho <xliff:g id="LOCALE_NAME">%s</xliff:g>?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Thực sự cài đặt tệp này cho <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Đã xảy ra lỗi"</string> <string name="button_default" msgid="3988017840431881491">"Mặc định"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Chào mừng bạn đến với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -188,7 +155,7 @@ <string name="setup_step3_action" msgid="600879797256942259">"Định cấu hình các ngôn ngữ khác"</string> <string name="setup_finish_action" msgid="276559243409465389">"Đã xong"</string> <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Hiển thị biểu tượng ứng dụng"</string> - <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Hiển thị biểu tượng ứng dụng trong trình khởi chạy"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Hiển thị biểu tượng ứng dụng trong trình chạy"</string> <string name="app_name" msgid="6320102637491234792">"Nhà cung cấp từ điển"</string> <string name="dictionary_provider_name" msgid="3027315045397363079">"Nhà cung cấp từ điển"</string> <string name="dictionary_service_name" msgid="6237472350693511448">"Dịch vụ từ điển"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Làm mới"</string> <string name="last_update" msgid="730467549913588780">"Cập nhật lần cuối"</string> <string name="message_updating" msgid="4457761393932375219">"Đang kiểm tra cập nhật"</string> - <string name="message_loading" msgid="8689096636874758814">"Đang tải..."</string> + <string name="message_loading" msgid="5638680861387748936">"Đang tải..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Từ điển chính"</string> <string name="cancel" msgid="6830980399865683324">"Hủy"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Cài đặt"</string> <string name="install_dict" msgid="180852772562189365">"Cài đặt"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Hủy"</string> <string name="delete_dict" msgid="756853268088330054">"Xóa"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Ngôn ngữ đã chọn trên thiết bị di động của bạn hiện có từ điển.<br/> Bạn nên <b>tải xuống</b> từ điển <xliff:g id="LANGUAGE">%1$s</xliff:g> để cải thiện trải nghiệm nhập của mình.<br/> <br/> Quá trình tải xuống có thể mất vài phút qua 3G. Có thể mất phí nếu bạn không có <b>gói dữ liệu không giới hạn</b>.<br/> Nếu bạn không chắc mình có gói dữ liệu nào, bạn nên tìm kết nối Wi-Fi để bắt đầu tải xuống tự động.<br/> <br/> Mẹo: Bạn có thể tải xuống và xóa từ điển bằng cách đi tới <b>Ngôn ngữ và nhập</b> trong trình đơn <b>Cài đặt</b> trên thiết bị di động của mình."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Ngôn ngữ đã chọn trên thiết bị di động của bạn hiện có từ điển.<br/> Bạn nên <b>tải xuống</b> từ điển <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> để cải thiện trải nghiệm nhập của mình.<br/> <br/> Quá trình tải xuống có thể mất vài phút qua 3G. Có thể mất phí nếu bạn không có <b>gói dữ liệu không giới hạn</b>.<br/> Nếu bạn không chắc mình có gói dữ liệu nào, bạn nên tìm kết nối Wi-Fi để bắt đầu tải xuống tự động.<br/> <br/> Mẹo: Bạn có thể tải xuống và xóa từ điển bằng cách đi tới <b>Ngôn ngữ và nhập</b> trong trình đơn <b>Cài đặt</b> trên thiết bị di động của mình."</string> <string name="download_over_metered" msgid="1643065851159409546">"Tải xuống bây giờ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Tải xuống qua Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Có sẵn từ điển cho <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Hiện có từ điển cho <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Nhấn để xem lại và tải xuống"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Tải xuống: đề xuất đối với <xliff:g id="LANGUAGE">%1$s</xliff:g> sẽ sớm sẵn sàng."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Đang tải xuống: đề xuất cho <xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> sẽ sớm sẵn sàng."</string> <string name="version_text" msgid="2715354215568469385">"Phiên bản <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Thêm"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Thêm vào từ điển"</string> diff --git a/java/res/values-zh-rCN/strings-action-keys.xml b/java/res/values-zh-rCN/strings-action-keys.xml index aacbb5fc7..de00e8335 100644 --- a/java/res/values-zh-rCN/strings-action-keys.xml +++ b/java/res/values-zh-rCN/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"上个"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"发送"</string> + <string name="label_search_key" msgid="7965186050435796642">"搜索"</string> <string name="label_pause_key" msgid="2225922926459730642">"暂停"</string> <string name="label_wait_key" msgid="5891247853595466039">"等待"</string> </resources> diff --git a/java/res/values-zh-rCN/strings-config-important-notice.xml b/java/res/values-zh-rCN/strings-config-important-notice.xml new file mode 100644 index 000000000..6013af78d --- /dev/null +++ b/java/res/values-zh-rCN/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"根据您的通信记录和以往输入的数据来完善建议"</string> +</resources> diff --git a/java/res/values-zh-rCN/strings-letter-descriptions.xml b/java/res/values-zh-rCN/strings-letter-descriptions.xml new file mode 100644 index 000000000..269f6c4aa --- /dev/null +++ b/java/res/values-zh-rCN/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"阴性顺序指示符"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"微单位标记"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"阳性顺序指示符"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"清音S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"带抑音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"带锐音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"带扬抑符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"带颚化符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"带分音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"带上圆圈的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"拉丁文小写字母连字ae"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"带软音符的拉丁文小写字母c"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"带抑音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"带锐音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"带扬抑符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"带分音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"带抑音符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"带锐音符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"带扬抑符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"带分音符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"拉丁文小写字母eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"带颚化符的拉丁文小写字母n"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"带抑音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"带锐音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"带扬抑符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"带颚化符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"带分音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"带斜线的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"带抑音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"带锐音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"带扬抑符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"带分音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"带锐音符的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"拉丁文小写字母thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"带分音符的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"带长音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"带短音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"带反尾形符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"带锐音符的拉丁文小写字母c"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"带扬抑符的拉丁文小写字母c"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"带上点的拉丁文小写字母c"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"带抑扬符的拉丁文小写字母c"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"带抑扬符的拉丁文小写字母d"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"带粗线的拉丁文小写字母d"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"带长音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"带短音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"带上点的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"带反尾形符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"带抑扬符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"带扬抑符的拉丁文小写字母g"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"带短音符的拉丁文小写字母g"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"带上点的拉丁文小写字母g"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"带软音符的拉丁文小写字母g"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"带扬抑符的拉丁文小写字母h"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"带粗线的拉丁文小写字母h"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"带颚化符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"带长音符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"带短音符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"带反尾形符的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"拉丁文小写字母无点i"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"拉丁文小写字母连字ij"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"带扬抑符的拉丁文小写字母j"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"带软音符的拉丁文小写字母k"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"拉丁文小写字母kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"带锐音符的拉丁文小写字母l"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"带软音符的拉丁文小写字母l"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"带抑扬符的拉丁文小写字母l"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"带中间点的拉丁文小写字母l"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"带斜线的拉丁文小写字母l"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"带锐音符的拉丁文小写字母n"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"带软音符的拉丁文小写字母n"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"带抑扬符的拉丁文小写字母n"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"前带撇号的拉丁文小写字母n"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"拉丁文小写字母eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"带长音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"带短音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"带双锐音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"拉丁文小写字母连字oe"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"带锐音符的拉丁文小写字母r"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"带软音符的拉丁文小写字母r"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"带抑扬符的拉丁文小写字母r"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"带锐音符的拉丁文小写字母s"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"带扬抑符的拉丁文小写字母s"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"带软音符的拉丁文小写字母s"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"带抑扬符的拉丁文小写字母s"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"带软音符的拉丁文小写字母t"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"带抑扬符的拉丁文小写字母t"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"带粗线的拉丁文小写字母t"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"带颚化符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"带长音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"带短音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"带上圆圈的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"带双锐音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"带反尾形符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"带扬抑符的拉丁文小写字母w"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"带扬抑符的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"带锐音符的拉丁文小写字母z"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"带上点的拉丁文小写字母z"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"带抑扬符的拉丁文小写字母z"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"拉丁文小写字母长s"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"带触角的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"带触角的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"带下逗号的拉丁文小写字母s"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"带下逗号的拉丁文小写字母t"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"拉丁文小写字母schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"带下点的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"带上钩的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"带扬抑符和锐音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"带扬抑符和抑音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"带扬抑符和上钩的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"带扬抑符和颚化符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"带扬抑符和下点的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"带短音符和锐音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"带短音符和抑音符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"带短音符和上钩的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"带短音符和颚化符的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"带短音符和下点的拉丁文小写字母a"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"带下点的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"带上钩的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"带颚化符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"带扬抑符和锐音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"带扬抑符和抑音符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"带扬抑符和上钩的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"带扬抑符和颚化符的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"带扬抑符和下点的拉丁文小写字母e"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"带上钩的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"带下点的拉丁文小写字母i"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"带下点的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"带上钩的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"带扬抑符和锐音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"带扬抑符和抑音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"带扬抑符和上钩的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"带扬抑符和颚化符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"带扬抑符和下点的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"带触角和锐音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"带触角和抑音符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"带触角和上钩的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"带触角和颚化符的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"带触角和下点的拉丁文小写字母o"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"带下点的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"带上钩的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"带触角和锐音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"带触角和抑音符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"带触角和上钩的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"带触角和颚化符的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"带触角和下点的拉丁文小写字母u"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"带抑音符的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"带下点的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"带上钩的拉丁文小写字母y"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"带颚化符的拉丁文小写字母y"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"竖翻叹号"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"左指双尖引号"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"中间点"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"上标1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"右指双尖引号"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"竖翻问号"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"左单引号"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"右单引号"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"单下9形引号"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"左双引号"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"右双引号"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"剑号"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"双剑号"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"千分号"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"角分符号"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"角秒符号"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"单左指尖引号"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"单右指尖引号"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"上标4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"上标拉丁文小写字母n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"比索符号"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"由...转交"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"向右箭头"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"向下箭头"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"空集"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"增量"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"小于或等于"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"大于或等于"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"实心星"</string> +</resources> diff --git a/java/res/values-zh-rCN/strings-talkback-descriptions.xml b/java/res/values-zh-rCN/strings-talkback-descriptions.xml new file mode 100644 index 000000000..b7b6b4104 --- /dev/null +++ b/java/res/values-zh-rCN/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"插入耳机可听到输入密码时的按键提示音。"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"当前文字为%s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"未输入文字"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"按<xliff:g id="KEY_NAME">%1$s</xliff:g>键可将<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>更正为<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"按<xliff:g id="KEY_NAME">%1$s</xliff:g>键可进行自动更正"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"未知字符"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"更多符号"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift键"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"符号"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift键"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"删除"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"符号"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"字母"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"数字"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"设置"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"空格"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"语音输入"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"表情符号"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"回车"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"搜索"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"点"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"切换语言"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"下一个"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"上一个"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"已开启Shift模式"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"已锁定大写模式"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"符号模式"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"更多符号模式"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"字母模式"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"电话模式"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"电话符号模式"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"键盘已隐藏"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"当前显示的是<xliff:g id="KEYBOARD_MODE">%s</xliff:g>键盘"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"日期"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"日期和时间"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"电子邮件地址"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"消息"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"数字"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"电话号码"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"文字"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"时间"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"网址"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"最近用过"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"人物"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"物件"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"自然"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"地点"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"符号"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"表情图标"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"拉丁文大写字母<xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"拉丁文大写字母I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"带上点的拉丁文大写字母I"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"未知符号"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"未知表情符号"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"有可用的替代字符"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"已关闭替代字符"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"有可用的其他建议字词"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"已关闭其他建议字词"</string> +</resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index d347c9ce8..9e71e990a 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"输入选项"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"研究记录命令"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"查找联系人姓名"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"拼写检查工具会使用您的联系人列表中的条目"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"按键振动"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按键音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按键时弹出显示字符"</string> - <string name="general_category" msgid="1859088467017573195">"常规"</string> - <string name="correction_category" msgid="2236750915056607613">"文本更正"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"滑行输入"</string> - <string name="misc_category" msgid="6894192814868233453">"其他选项"</string> - <string name="advanced_settings" msgid="362895144495591463">"高级设置"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"高级选项"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"切换到其他输入法"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"语言切换键也可用于切换其他输入法"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"语言切换键"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"系统默认值"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"联系人姓名建议"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"根据通讯录中的姓名提供建议和更正"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"个性化建议"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"改进<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"双击空格插入句号"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"双击空格键可插入句号并后跟空格"</string> <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"显示滑行输入轨迹"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"动态漂浮预览"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"在滑行输入过程中显示建议字词"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"需要插入耳机才能听到密码的按键声。"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"当前文本为%s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"未输入文字"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"按<xliff:g id="KEY">%1$s</xliff:g>可将<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>更正为<xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"按<xliff:g id="KEY">%1$s</xliff:g>可执行自动更正"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"键码为 %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift 模式已启用(点按即可停用)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"大写锁定已启用(点按即可停用)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"删除"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"符号"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"字母"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"数字"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"设置"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"空格"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"语音输入"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"笑脸"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"返回"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"搜索"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"点"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"切换语言"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"下一个"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"上一个"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift 模式已启用"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"大写锁定已启用"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift 模式已停用"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"符号模式"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"字母模式"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"电话模式"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"电话符号模式"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"键盘已隐藏"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"目前显示的是<xliff:g id="MODE">%s</xliff:g>键盘"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"日期"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"日期和时间"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"电子邮件"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"短信"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"数字"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"电话"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"文字"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"时间"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"网址"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"词组滑行输入"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"滑行输入时,滑过空格键即可输入空格"</string> <string name="voice_input" msgid="3583258583521397548">"语音输入键"</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="voice_input_disabled_summary" msgid="8141750303464726129">"未启用任何语音输入法。请检查“语言和输入法”设置。"</string> <string name="configure_input_method" msgid="373356270290742459">"配置输入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string> <string name="send_feedback" msgid="1780431884109392046">"发送反馈"</string> <string name="select_language" msgid="3693815588777926848">"输入语言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次触摸即可保存"</string> <string name="has_dictionary" msgid="6071847973466625007">"有可用词典"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"自动发送使用情况统计信息和崩溃报告,帮助改进此输入法。"</string> <string name="keyboard_layout" msgid="8451164783510487501">"键盘主题"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英语(英国)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英语(美国)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"西班牙语(美国)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"英语(英国)(<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"英语(美国)(<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"西班牙语(美国)(<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g>(传统)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"英式英语(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"美式英语(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"美式西班牙语(<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(传统)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(西里尔文)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g>(拉丁文)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"无语言(字母)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"字母 (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"字母 (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"字母 (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"字母 (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"表情符号"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"配色方案"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"白色"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"蓝色"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"自定义输入风格"</string> <string name="add_style" msgid="6163126614514489951">"添加样式"</string> <string name="add" msgid="8299699805688017798">"添加"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"启用"</string> <string name="not_now" msgid="6172462888202790482">"以后再说"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"已经存在相同的输入风格:<xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"可用性研究模式"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"按键长按延迟"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"按键振动时长"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"按键音量"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"读取外部词典文件"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"“下载内容”文件夹中没有词典文件"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"选择要安装的词典文件"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"确定要为<xliff:g id="LOCALE_NAME">%s</xliff:g>安装此文件吗?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"确定要安装这个<xliff:g id="LANGUAGE_NAME">%s</xliff:g>词典吗?"</string> <string name="error" msgid="8940763624668513648">"出现错误"</string> <string name="button_default" msgid="3988017840431881491">"默认"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"欢迎使用 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"刷新"</string> <string name="last_update" msgid="730467549913588780">"上次更新时间"</string> <string name="message_updating" msgid="4457761393932375219">"正在检查更新"</string> - <string name="message_loading" msgid="8689096636874758814">"正在加载..."</string> + <string name="message_loading" msgid="5638680861387748936">"正在加载…"</string> <string name="main_dict_description" msgid="3072821352793492143">"主词典"</string> <string name="cancel" msgid="6830980399865683324">"取消"</string> + <string name="go_to_settings" msgid="3876892339342569259">"设置"</string> <string name="install_dict" msgid="180852772562189365">"安装"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"取消"</string> <string name="delete_dict" msgid="756853268088330054">"删除"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"支持您移动设备上所选语言的词典现已可供下载啦!<br/>建议您<b>下载</b>这部<xliff:g id="LANGUAGE">%1$s</xliff:g>词典,以享受更好的输入体验。<br/><br/>通过 3G 进行下载可能需要 1 到 2 分钟的时间。如果您使用的不是<b>无流量限制的套餐</b>,则可能需要支付一定的费用。<br/>如果您不确定自己使用的是哪种流量套餐,建议您使用 WLAN 连接自动开始下载。<br/><br/>提示:您可以访问移动设备的<b>设置</b>菜单中的<b>语言和输入法</b>,来下载和删除词典。"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"您的移动设备上选择的语言有一个词典可供下载。<br/>我们建议您<b>下载</b>这个<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>词典,以便获得更好的输入体验。<br/><br/>通过3G网络下载可能需要一两分钟的时间。如果您使用的不是<b>无流量限制的套餐</b>,则可能产生一定的流量费。<br/>如果您不确定自己使用的是哪种流量套餐,我们建议您连接到WLAN网络以便自动开始下载。<br/><br/>提示:您可以在移动设备上的<b>语言和输入法</b>部分(位于<b>设置</b>菜单中)下载和删除词典。"</string> <string name="download_over_metered" msgid="1643065851159409546">"立即下载 (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"通过 WLAN 下载"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>词典可供下载"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"有一个<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>词典可供下载"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"按此通知即可查看和下载"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"下载中:很快就能启用<xliff:g id="LANGUAGE">%1$s</xliff:g>的词典建议服务了!"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"正在下载:<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>输入建议功能马上就可以使用了!"</string> <string name="version_text" msgid="2715354215568469385">"版本<xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"添加"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"添加到词典"</string> diff --git a/java/res/values-zh-rHK/strings-action-keys.xml b/java/res/values-zh-rHK/strings-action-keys.xml index e95251696..500cd5f62 100644 --- a/java/res/values-zh-rHK/strings-action-keys.xml +++ b/java/res/values-zh-rHK/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"上一步"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"傳送"</string> + <string name="label_search_key" msgid="7965186050435796642">"搜尋"</string> <string name="label_pause_key" msgid="2225922926459730642">"暫停"</string> <string name="label_wait_key" msgid="5891247853595466039">"等候"</string> </resources> diff --git a/java/res/values-zh-rHK/strings-config-important-notice.xml b/java/res/values-zh-rHK/strings-config-important-notice.xml new file mode 100644 index 000000000..a21b24388 --- /dev/null +++ b/java/res/values-zh-rHK/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"根據您的通訊記錄和已輸入的資料改善建議"</string> +</resources> diff --git a/java/res/values-zh-rHK/strings-letter-descriptions.xml b/java/res/values-zh-rHK/strings-letter-descriptions.xml new file mode 100644 index 000000000..83ea28bf2 --- /dev/null +++ b/java/res/values-zh-rHK/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"雌性符號"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro 符號"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"雄性符號"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"清音 S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"抑音符 A"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"銳音符 A"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"抑揚符 A"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"波浪號 A"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"分音符 A"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"帶上圓圈的 A"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"連字 AE"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"下尾符 C"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"抑音符 E"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"銳音符 E"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"抑揚符 E"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"分音符 E"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"抑音符 I"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"銳音符 I"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"抑揚符 I"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"分音符 I"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth 符號"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"波浪號 N"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"抑音符 O"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"銳音符 O"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"抑揚符 O"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"波浪號 O"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"分音符 O"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"帶斜線的 O"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"抑音符 U"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"銳音符 U"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"抑揚符 U"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"分音符 U"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"銳音符 Y"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn 符號"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"分音符 Y"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"長音符 A"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"短音符 A"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"反下尾符 A"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"銳音符 C"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"抑揚符 C"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"上點 C"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"上勾符 C"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"上勾符 D"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"帶斜線的 D"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"長音符 E"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"短音符 E"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"上點 E"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"反下尾符 E"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"上勾符 E"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"抑揚符 G"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"短音符 G"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"上點 G"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"下尾符 G"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"抑揚符 H"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"帶斜線的 H"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"波浪號 I"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"長音符 I"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"短音符 I"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"反下尾符 I"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"無點 I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"連字 IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"抑揚符 J"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"下尾符 K"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra 符號"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"銳音符 L"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"下尾符 L"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"上勾符 L"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"中點 L"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"帶斜線的 L"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"銳音符 N"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"下尾符 N"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"上勾符 N"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"前接縮寫符號的 N"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng 符號"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"長音符 O"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"短音符 O"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"雙銳音符 O"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"連字 OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"銳音符 R"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"下尾符 R"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"上勾符 R"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"銳音符 S"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"抑揚符 S"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"下尾符 S"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"上勾符 S"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"下尾符 T"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"上勾符 T"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"帶斜線的 T"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"波浪號 U"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"長音符 U"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"短音符 U"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"帶上圓圈的 U"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"雙銳音符 U"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"反下尾符 U"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"抑揚符 W"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"抑揚符 Y"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"銳音符 Z"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"上點 Z"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"上勾符 Z"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"長 S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"帶尖角的 O"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"帶尖角的 U"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"下加逗號的 S"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"下加逗號的 T"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"中性母音符號"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"下點 A"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"上方加勾的 A"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"帶抑揚符和銳音符的 A"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"帶抑揚符和抑音符的 A"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"帶抑揚符和上方加勾的 A"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"帶抑揚符和波浪號的 A"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"帶抑揚符和下點的 A"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"帶短音符和銳音符的 A"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"帶短音符和抑音符的 A"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"帶短音符和上方加勾的 A"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"帶短音符和波浪號的 A"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"帶短音符和下點的 A"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"下點 E"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"上方加勾的 E"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"波浪號 E"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"帶抑揚符和銳音符的 E"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"帶抑揚符和抑音符的 E"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"帶抑揚符和上方加勾的 E"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"帶抑揚符和波浪號的 E"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"帶抑揚符和下點的 E"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"上方加勾的 I"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"下點 I"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"下點 O"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"上方加勾的 O"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"帶抑揚符和銳音符的 O"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"帶抑揚符和抑音符的 O"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"帶抑揚符和上方加勾的 O"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"帶抑揚符和波浪號的 O"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"帶抑揚符和下點的 O"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"帶尖角和銳音符的 O"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"帶尖角和抑音符的 O"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"帶尖角和上方加勾的 O"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"帶尖角和波浪號的 O"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"帶尖角和下點的 O"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"下點 U"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"上方加勾的 U"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"帶尖角和銳音符的 U"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"帶尖角和抑音符的 U"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"帶尖角和上方加勾的 U"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"帶尖角和波浪號的 U"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"帶尖角和下點的 U"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"抑音符 Y"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"下點 Y"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"上方加勾的 Y"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"波浪號 Y"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"倒置的驚嘆號"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"左雙角括號"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"中間點"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"上標字 1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"右雙角括號"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"倒問號"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"左單引號"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"右單引號"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Low-9 單引號"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"左雙引號"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"右雙引號"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"單劍註釋符號"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"雙劍註釋符號"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"千分比符號"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"單撇"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"雙撇"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"左單角括號"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"右單角括號"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"上標 4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"上標拉丁小寫字母 n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"比索符號"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"百分比"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"向右箭頭"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"向下箭頭"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"空集合"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"增量"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"小於或等於"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"大於或等於"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"黑星"</string> +</resources> diff --git a/java/res/values-zh-rHK/strings-talkback-descriptions.xml b/java/res/values-zh-rHK/strings-talkback-descriptions.xml new file mode 100644 index 000000000..386b5b5a5 --- /dev/null +++ b/java/res/values-zh-rHK/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"插上耳機即可聽到系統朗讀密碼鍵。"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"目前文字為 %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"未輸入文字"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"按「<xliff:g id="KEY_NAME">%1$s</xliff:g>」可將「<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>」修正為「<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>」"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"按「<xliff:g id="KEY_NAME">%1$s</xliff:g>」可自動修正"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"未知的字元"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift 鍵"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"更多符號"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift 鍵"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"符號"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift 鍵"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"刪除"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"符號"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"字母"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"數字"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"設定"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab 鍵"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"空白鍵"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"語音輸入"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"表情圖案"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Return 鍵"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"搜尋"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"分點符號"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"切換語言"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"下一個"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"上一個"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift 鍵已啟用"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"大寫鎖定已啟用"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"符號模式"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"更多符號模式"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"字母模式"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"撥號模式"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"符號撥號模式"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"鍵盤已隱藏"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"目前顯示的是<xliff:g id="KEYBOARD_MODE">%s</xliff:g>鍵盤"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"日期"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"日期和時間"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"電郵"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"短訊"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"數字"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"電話"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"文字"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"時間"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"網址"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"最近使用過"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"人物"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"物件"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"大自然"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"地點"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"符號"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"表情符號"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"大寫 <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"大寫 I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"上方加點的大寫 I"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"未知的符號"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"未知的表情符號"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"有可用的替代字元"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"已關閉替代字元"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"有可用的建議字詞"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"已關閉其他建議字詞"</string> +</resources> diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml index 306045591..4229bce21 100644 --- a/java/res/values-zh-rHK/strings.xml +++ b/java/res/values-zh-rHK/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"輸入選項"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"研究記錄指令"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"查找聯絡人姓名"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"拼字檢查程式使用您的聯絡人名單中的各項記錄"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按鍵時播放音效"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按鍵時顯示彈出式視窗"</string> - <string name="general_category" msgid="1859088467017573195">"一般設定"</string> - <string name="correction_category" msgid="2236750915056607613">"文字更正"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"手勢輸入"</string> - <string name="misc_category" msgid="6894192814868233453">"其他選項"</string> - <string name="advanced_settings" msgid="362895144495591463">"進階設定"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"專家選項"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"切換至其他輸入法"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"語言切換鍵包括其他輸入法"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"語言切換鍵"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"系統預設"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"建議聯絡人名稱"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"使用「聯絡人」的名稱提供建議與修正"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"個人化建議"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"強化 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"按兩下空格鍵插入句號"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"只要輕按兩下空格鍵,即可插入句號並在後面加上一個空格"</string> <string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"顯示手勢軌跡"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"動態浮動預覽"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"在啟用手勢輸入時顯示建議的字詞"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"插上耳機即可聽到系統朗讀密碼鍵。"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"目前文字為 %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"未輸入文字"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"按「<xliff:g id="KEY">%1$s</xliff:g>」可將「<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>」修正為「<xliff:g id="CORRECTED">%3$s</xliff:g>」"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"按「<xliff:g id="KEY">%1$s</xliff:g>」可自動修正"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"按鍵代碼 %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift 鍵"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift 鍵已開啟 (輕按即可停用)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"大寫鎖定已開啟 (輕按即可停用)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"刪除"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"符號"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"字母"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"數字"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"設定"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab 鍵"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"空白鍵"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"語音輸入"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"笑臉"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Return 鍵"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"搜尋"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"點"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"切換語言"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"下一步"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"上一步"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift 鍵已啟用"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"大寫鎖定已啟用"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift 鍵已停用"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"符號模式"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"字母模式"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"撥號模式"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"符號撥號模式"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"鍵盤已隱藏"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"目前顯示的是<xliff:g id="MODE">%s</xliff:g>鍵盤"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"日期"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"日期和時間"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"電郵"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"短訊"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"數字"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"電話"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"文字"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"時間"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"網址"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"詞組手勢"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"在手勢輸入過程中,滑過空白鍵即可輸入空格"</string> <string name="voice_input" msgid="3583258583521397548">"語音輸入鍵"</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="voice_input_disabled_summary" msgid="8141750303464726129">"尚未啟用語音輸入法,請檢查語言和輸入設定。"</string> <string name="configure_input_method" msgid="373356270290742459">"設定輸入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> <string name="send_feedback" msgid="1780431884109392046">"傳送意見"</string> <string name="select_language" msgid="3693815588777926848">"輸入語言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次輕觸即可儲存"</string> <string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"啟用用戶意見反映"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"自動傳送使用統計資料和當機報告,協助改良這個輸入法編輯器"</string> <string name="keyboard_layout" msgid="8451164783510487501">"鍵盤主題"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英文 (英國)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英文 (美國)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"西班牙文 (美國)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"英文 (英國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"英文 (美國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"西班牙文 (美國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (傳統)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"英文 (英國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"英文 (美國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"西班牙文 (美國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (傳統)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (西里爾文)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (拉丁文)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"無語言 (字母)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"字母 (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"字母 (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"字母 (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"字母 (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"色彩配置"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"白色"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"藍色"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"自訂輸入樣式"</string> <string name="add_style" msgid="6163126614514489951">"新增樣式"</string> <string name="add" msgid="8299699805688017798">"新增"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"啟用"</string> <string name="not_now" msgid="6172462888202790482">"暫時不要"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"已存在相同的輸入樣式:<xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"可用性研究模式"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"長按鍵延遲"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"按鍵震動時間"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"按鍵音量"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"讀取外部字典檔案"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"「下載」資料夾中沒有任何字典檔案"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"選取要安裝的字典檔案"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"準備好要為<xliff:g id="LOCALE_NAME">%s</xliff:g>版本安裝這個檔案嗎?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"準備為<xliff:g id="LANGUAGE_NAME">%s</xliff:g>版本安裝這個檔案嗎?"</string> <string name="error" msgid="8940763624668513648">"發生錯誤"</string> <string name="button_default" msgid="3988017840431881491">"預設"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"歡迎使用「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"重新整理"</string> <string name="last_update" msgid="730467549913588780">"上次更新日期"</string> <string name="message_updating" msgid="4457761393932375219">"正在查看更新"</string> - <string name="message_loading" msgid="8689096636874758814">"正在載入..."</string> + <string name="message_loading" msgid="5638680861387748936">"正在載入…"</string> <string name="main_dict_description" msgid="3072821352793492143">"主要字典"</string> <string name="cancel" msgid="6830980399865683324">"取消"</string> + <string name="go_to_settings" msgid="3876892339342569259">"設定"</string> <string name="install_dict" msgid="180852772562189365">"安裝"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"取消"</string> <string name="delete_dict" msgid="756853268088330054">"刪除"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"您的流動裝置所選取的語言現有字典可供使用。<br/>建議您<b>下載</b><xliff:g id="LANGUAGE">%1$s</xliff:g>字典,讓您輸入時更方便。<br/><br/>經由 3G 網絡下載需時一兩分鐘。如果您未使用<b>無限上網計劃</b>,可能須另外付費。<br/>如果您不確定自己使用哪種上網計劃,建議您在連接 Wi-Fi 網絡後才開始自動下載。<br/><br/>提示:您可以前往流動裝置的 [設定] <b></b>選單,透過其中的 [語言和輸入] <b></b>下載和移除字典。"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"您的流動裝置所選取的語言現有字典可供使用。<br/>我們建議您<b>下載</b><xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字典,讓您輸入時更方便。<br/><br/>經由 3G 網絡下載需時一、兩分鐘。如果您未使用<b>無限上網計劃</b>,可能須另外付費。<br/>如果您不確定自己使用哪種上網計劃,我們建議您在連接 Wi-Fi 網絡後才開始自動下載。<br/><br/>提示:您可以前往流動裝置的 [設定] <b></b>選單,透過其中的 [語言和輸入] <b></b>下載和移除字典。"</string> <string name="download_over_metered" msgid="1643065851159409546">"立即下載 (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"經由 Wi-Fi 下載"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"可使用<xliff:g id="LANGUAGE">%1$s</xliff:g>字典"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"可使用<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字典"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"按下即可查看並下載"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"下載中:很快就能提供<xliff:g id="LANGUAGE">%1$s</xliff:g>字詞建議。"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"下載中:<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字詞建議服務即將啟用。"</string> <string name="version_text" msgid="2715354215568469385">"版本 <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"新增"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"加入字典"</string> diff --git a/java/res/values-zh-rTW/strings-action-keys.xml b/java/res/values-zh-rTW/strings-action-keys.xml index 00daa5c63..b56dedef2 100644 --- a/java/res/values-zh-rTW/strings-action-keys.xml +++ b/java/res/values-zh-rTW/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"返回"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"傳送"</string> + <string name="label_search_key" msgid="7965186050435796642">"搜尋"</string> <string name="label_pause_key" msgid="2225922926459730642">"暫停"</string> <string name="label_wait_key" msgid="5891247853595466039">"等待"</string> </resources> diff --git a/java/res/values-zh-rTW/strings-config-important-notice.xml b/java/res/values-zh-rTW/strings-config-important-notice.xml new file mode 100644 index 000000000..dfffa69cf --- /dev/null +++ b/java/res/values-zh-rTW/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"根據您的通訊紀錄和以往輸入的資料改善建議項目"</string> +</resources> diff --git a/java/res/values-zh-rTW/strings-letter-descriptions.xml b/java/res/values-zh-rTW/strings-letter-descriptions.xml new file mode 100644 index 000000000..c38aa38e5 --- /dev/null +++ b/java/res/values-zh-rTW/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"雌性符號"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro 符號"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"雄性符號"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"清音 S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"抑音符 A"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"銳音符 A"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"揚抑符 A"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"顎化符 A"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"分音符 A"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"帶上圓圈的 A"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"連字 AE"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"下加符 C"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"抑音符 E"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"銳音符 E"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"揚抑符 E"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"分音符 E"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"抑音符 I"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"銳音符 I"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"揚抑符 I"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"分音符 I"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"濁齒擦音符號"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"顎化符 N"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"抑音符 O"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"銳音符 O"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"揚抑符 O"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"顎化符 O"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"分音符 O"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"帶斜線的 O"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"抑音符 U"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"銳音符 U"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"揚抑符 U"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"分音符 U"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"銳音符 Y"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"刺形符號"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"分音符 Y"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"長音符 A"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"短音符 A"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"反下加符 A"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"銳音符 C"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"揚抑符 C"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"上點 C"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"倒折音符 C"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"倒折音符 D"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"帶斜線的 D"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"長音符 E"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"短音符 E"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"上點 E"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"反下加符 E"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"倒折音符 E"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"揚抑符 G"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"短音符 G"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"上點 G"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"下加符 G"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"揚抑符 H"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"帶斜線的 H"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"顎化符 I"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"長音符 I"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"短音符 I"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"反下加符 I"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"無點 I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"連字 IJ"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"揚抑符 J"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"下加符 K"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra 符號"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"銳音符 L"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"下加符 L"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"倒折音符 L"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"中點 L"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"帶斜線的 L"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"銳音符 N"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"下加符 N"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"倒折音符 N"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"前接單引號的 N"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"軟顎鼻音"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"長音符 O"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"短音符 O"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"雙銳音符 O"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"連字 OE"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"銳音符 R"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"下加符 R"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"倒折音符 R"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"銳音符 S"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"揚抑符 S"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"下加符 S"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"倒折音符 S"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"下加符 T"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"倒折音符 T"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"帶斜線的 T"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"顎化符 U"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"長音符 U"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"短音符 U"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"帶上圓圈的 U"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"雙銳音符 U"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"反下加符 U"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"揚抑符 W"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"揚抑符 Y"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"銳音符 Z"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"上點 Z"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"倒折音符 Z"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"長音 S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"帶觸角的 O"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"帶觸角的 U"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"下加逗號的 S"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"下加逗號的 T"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"中性母音符號"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"下點 A"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"上方加勾的 A"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"帶揚抑符和銳音符的 A"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"帶揚抑符和抑音符的 A"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"帶揚抑符和上勾的 A"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"帶揚抑符和顎化符的 A"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"帶揚抑符和下點的 A"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"帶短音符和銳音符的 A"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"帶短音符和抑音符的 A"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"帶短音符和上勾的 A"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"帶短音符和顎化符的 A"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"帶短音符和下點的 A"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"下點 E"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"上方加勾的 E"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"顎化符 E"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"帶揚抑符和銳音符的 E"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"帶揚抑符和抑音符的 E"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"帶揚抑符和上勾的 E"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"帶揚抑符和顎化符的 E"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"帶揚抑符和下點的 E"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"上方加勾的 I"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"下點 I"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"下點 O"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"上方加勾的 O"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"帶揚抑符和銳音符的 O"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"帶揚抑符和抑音符的 O"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"帶揚抑符和上勾的 O"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"帶揚抑符和顎化符的 O"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"帶揚抑符和下點的 O"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"帶觸角和銳音符的 O"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"帶觸角和抑音符的 O"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"帶觸角和上勾的 O"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"帶觸角和顎化符的 O"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"帶觸角和下點的 O"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"下點 U"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"上方加勾的 U"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"帶觸角和銳音符的 U"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"帶觸角和抑音符的 U"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"帶觸角和上勾的 U"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"帶觸角和顎化符的 U"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"帶觸角和下點的 U"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"抑音符 Y"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"下點 Y"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"上方加勾的 Y"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"顎化符 Y"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"倒置的驚嘆號"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"左雙角括號"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"中間點"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"上標字 1"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"右雙角括號"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"倒置的問號"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"左單引號"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"右單引號"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Low-9 單引號"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"左雙引號"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"右雙引號"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"單劍註釋符號"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"雙劍註釋符號"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"千分比符號"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"角分符號"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"角秒符號"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"左英文單引號"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"右英文單引號"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"上標 4"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"上標小寫拉丁字母 N"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"披索符號"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"轉交符號"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"向右箭頭"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"向下箭頭"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"空集合"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"遞增"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"小於或等於"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"大於或等於"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"黑星"</string> +</resources> diff --git a/java/res/values-zh-rTW/strings-talkback-descriptions.xml b/java/res/values-zh-rTW/strings-talkback-descriptions.xml new file mode 100644 index 000000000..7a5f3df16 --- /dev/null +++ b/java/res/values-zh-rTW/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"連接耳機即可聽取系統朗讀密碼按鍵。"</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"目前文字為 %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"未輸入文字"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"按下「<xliff:g id="KEY_NAME">%1$s</xliff:g>」可將「<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>」修正為「<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>」"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"按下「<xliff:g id="KEY_NAME">%1$s</xliff:g>」可執行自動修正"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"未知的字元"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"Shift 鍵"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"更多符號"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift 鍵"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"符號"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"Shift 鍵"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"刪除"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"符號"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"字母"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"數字"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"設定"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Tab 鍵"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"空格鍵"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"語音輸入"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"表情符號"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"返回"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"搜尋"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"圓點符號"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"切換語言"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"下一個"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"上一個"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"Shift 鍵已啟用"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"大寫鎖定已啟用"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"符號模式"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"更多符號模式"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"字母模式"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"撥號模式"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"撥號符號模式"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"鍵盤已隱藏"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"目前顯示的是<xliff:g id="KEYBOARD_MODE">%s</xliff:g>鍵盤"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"日期"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"日期和時間"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"電子郵件"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"簡訊"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"數字"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"電話號碼"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"文字"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"時間"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"網址"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"最近使用過"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"人物"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"物體"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"自然"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"地點"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"符號"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"表情"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"大寫 <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"大寫 I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"上方加點的大寫 I"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"未知的符號"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"未知的表情符號"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"有可用的替代字元"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"已關閉替代字元"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"有可用的建議字詞"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"已關閉其他建議字詞"</string> +</resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 2c474b79e..eafea5b26 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"輸入選項"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"研究紀錄指令"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"查詢聯絡人姓名"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"拼字檢查程式使用您的聯絡人清單項目"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"按鍵時震動"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"按鍵聲音"</string> <string name="popup_on_keypress" msgid="123894815723512944">"按鍵時彈出"</string> - <string name="general_category" msgid="1859088467017573195">"一般"</string> - <string name="correction_category" msgid="2236750915056607613">"文字修正"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"滑行輸入"</string> - <string name="misc_category" msgid="6894192814868233453">"其他選項"</string> - <string name="advanced_settings" msgid="362895144495591463">"進階設定"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"進階選項"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"切換到其他輸入法"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"使語言切換鍵包含其他輸入法"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"語言切換鍵"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"系統預設"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"聯絡人姓名建議"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"根據「聯絡人」名稱提供建議與修正"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"個人化建議"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"協助改善 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"輕按兩下空格鍵即插入句號"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"輕按兩下空格鍵可插入句號另加一個空格"</string> <string name="auto_cap" msgid="1719746674854628252">"自動大寫"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"顯示手勢軌跡"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"動態浮動預覽"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"使用滑行輸入時顯示建議字詞"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已儲存"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"連接耳機即可聽取系統朗讀密碼按鍵。"</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"目前文字為 %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"未輸入文字"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"按下「<xliff:g id="KEY">%1$s</xliff:g>」可將「<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>」修正為「<xliff:g id="CORRECTED">%3$s</xliff:g>」"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"按下「<xliff:g id="KEY">%1$s</xliff:g>」可執行自動修正"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"按鍵代碼 %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift 鍵"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift 鍵已開啟 (輕按即可停用)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"大寫鎖定已開啟 (輕按即可停用)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"刪除"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"符號"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"字母"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"數字"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"設定"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab 鍵"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"空白鍵"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"語音輸入"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"笑臉"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"返回"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"搜尋"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"點"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"切換語言"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"下一頁"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"上一頁"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift 鍵已啟用"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"大寫鎖定已啟用"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift 鍵已停用"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"符號模式"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"字母模式"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"撥號模式"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"撥號符號模式"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"鍵盤已隱藏"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"目前顯示的是<xliff:g id="MODE">%s</xliff:g>鍵盤"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"日期"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"日期和時間"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"電子郵件"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"簡訊"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"數字"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"電話號碼"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"文字"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"時間"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"網址"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"詞組手勢"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"手勢輸入時,滑過空格鍵即可輸入空格"</string> <string name="voice_input" msgid="3583258583521397548">"語音輸入按鍵"</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="voice_input_disabled_summary" msgid="8141750303464726129">"尚未啟動語音輸入法,請檢查語言與輸入設定。"</string> <string name="configure_input_method" msgid="373356270290742459">"設定輸入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> <string name="send_feedback" msgid="1780431884109392046">"提供意見"</string> <string name="select_language" msgid="3693815588777926848">"輸入語言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次輕觸即可儲存"</string> <string name="has_dictionary" msgid="6071847973466625007">"可用的字典"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"自動傳送使用統計資料和當機報告,協助改善此輸入法編輯器"</string> <string name="keyboard_layout" msgid="8451164783510487501">"鍵盤主題"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英文 (英國)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英文 (美國)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"西班牙文 (美國)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"英文 (英國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"英文 (美國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"西班牙文 (美國) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (傳統)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"英文 (英國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"英文 (美國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"西班牙文 (美國) (<xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (傳統)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (斯拉夫文)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (拉丁文)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"無語言 (字母)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"字母 (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"字母 (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"字母 (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"字母 (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"表情符號"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"色彩配置"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"白色"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"藍色"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"自訂輸入樣式"</string> <string name="add_style" msgid="6163126614514489951">"新增樣式"</string> <string name="add" msgid="8299699805688017798">"新增"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"啟用"</string> <string name="not_now" msgid="6172462888202790482">"暫時不要"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"已存在相同的輸入樣式:<xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"使用習慣學習模式"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"按鍵長按延遲"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"按鍵震動持續時間"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"按鍵音量"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"讀取外部字典檔案"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"「下載」資料夾中沒有任何字典檔案"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"選取要安裝的字典檔案"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"準備為<xliff:g id="LOCALE_NAME">%s</xliff:g>版本安裝這個檔案嗎?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"確定要安裝這個<xliff:g id="LANGUAGE_NAME">%s</xliff:g>檔案嗎?"</string> <string name="error" msgid="8940763624668513648">"發生錯誤"</string> <string name="button_default" msgid="3988017840431881491">"預設"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"歡迎使用 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"重新整理"</string> <string name="last_update" msgid="730467549913588780">"上次更新時間:"</string> <string name="message_updating" msgid="4457761393932375219">"正在檢查更新"</string> - <string name="message_loading" msgid="8689096636874758814">"載入中..."</string> + <string name="message_loading" msgid="5638680861387748936">"載入中…"</string> <string name="main_dict_description" msgid="3072821352793492143">"主要字典"</string> <string name="cancel" msgid="6830980399865683324">"取消"</string> + <string name="go_to_settings" msgid="3876892339342569259">"設定"</string> <string name="install_dict" msgid="180852772562189365">"安裝"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"取消"</string> <string name="delete_dict" msgid="756853268088330054">"刪除"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"您的行動裝置設定的語言,現有字典可供使用。<br/> 建議您<b>下載</b><xliff:g id="LANGUAGE">%1$s</xliff:g>字典,加強輸入功能。<br/> <br/> 透過 3G 網路下載約需一兩分鐘。若無<b>無限行動上網資費方案</b>,可能必須另外付費。<br/>若不確定行動上網資費方案為何,可以等連上 Wi-Fi 網路後再自動下載。<br/> <br/>提示:進入行動裝置的 [設定] 選單,選擇 [語言和輸入] 即可下載及移除字典。<b></b><b></b>"</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"您的行動裝置選用的語言現有字典可供使用。<br/>建議您<b>下載</b><xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字典,藉此強化輸入功能。<br/><br/>透過 3G 網路下載約需一兩分鐘。如果沒有<b>無限行動上網資費方案</b>,可能必須另外付費。<br/>若不確定行動上網資費方案為何,可以等連上 Wi-Fi 網路後再自動下載。<br/><br/>提示:前往行動裝置的 [設定] 選單,選擇 [語言和輸入] 即可下載及移除字典。<b></b><b></b>"</string> <string name="download_over_metered" msgid="1643065851159409546">"立即下載 (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"透過 Wi-Fi 下載"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"支援<xliff:g id="LANGUAGE">%1$s</xliff:g>字典"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"支援<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字典"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"按下即可查看並下載"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"下載中:即將啟用<xliff:g id="LANGUAGE">%1$s</xliff:g>字詞建議服務。"</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"下載中:即將啟用<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>字詞建議服務。"</string> <string name="version_text" msgid="2715354215568469385">"版本 <xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"新增"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"加入字典"</string> diff --git a/java/res/values-zu/strings-action-keys.xml b/java/res/values-zu/strings-action-keys.xml index 6cd5e8c99..fe36678e8 100644 --- a/java/res/values-zu/strings-action-keys.xml +++ b/java/res/values-zu/strings-action-keys.xml @@ -25,6 +25,7 @@ <string name="label_previous_key" msgid="1421141755779895275">"Okwedlule"</string> <string name="label_done_key" msgid="7564866296502630852">"Kwenziwe"</string> <string name="label_send_key" msgid="482252074224462163">"Thumela"</string> + <string name="label_search_key" msgid="7965186050435796642">"Sesha"</string> <string name="label_pause_key" msgid="2225922926459730642">"Misa isikhashana"</string> <string name="label_wait_key" msgid="5891247853595466039">"Linda"</string> </resources> diff --git a/java/res/values-zu/strings-config-important-notice.xml b/java/res/values-zu/strings-config-important-notice.xml new file mode 100644 index 000000000..0d352006c --- /dev/null +++ b/java/res/values-zu/strings-config-important-notice.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="use_personalized_dicts_summary" msgid="590432261305469627">"Funda kusukela kwezokuxhumana zakho nedatha ethayiphiwe ukuze uthuthukise iziphakamiso"</string> +</resources> diff --git a/java/res/values-zu/strings-letter-descriptions.xml b/java/res/values-zu/strings-letter-descriptions.xml new file mode 100644 index 000000000..54eb6e5ff --- /dev/null +++ b/java/res/values-zu/strings-letter-descriptions.xml @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ + --> + +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Isikhombi sobesifazane"</string> + <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Uphawu olukhulu"</string> + <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Isikhombi sowesilisa"</string> + <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string> + <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string> + <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string> + <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string> + <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string> + <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string> + <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring ngenhla"</string> + <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string> + <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string> + <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string> + <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string> + <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string> + <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string> + <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string> + <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string> + <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string> + <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string> + <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string> + <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string> + <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string> + <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string> + <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string> + <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string> + <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string> + <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string> + <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string> + <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string> + <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string> + <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string> + <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string> + <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string> + <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string> + <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string> + <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string> + <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string> + <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string> + <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string> + <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, icashazi ngenhla"</string> + <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string> + <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string> + <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string> + <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string> + <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string> + <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, icashazi ngenhla"</string> + <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string> + <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string> + <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string> + <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string> + <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, icashazi ngenhla"</string> + <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string> + <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string> + <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string> + <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string> + <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string> + <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string> + <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string> + <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string> + <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string> + <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string> + <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string> + <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string> + <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string> + <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string> + <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string> + <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, icashazi eliphakathi"</string> + <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string> + <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string> + <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string> + <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string> + <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, kulandele i-apostrophe"</string> + <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string> + <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string> + <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string> + <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string> + <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string> + <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string> + <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string> + <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string> + <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string> + <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string> + <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string> + <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string> + <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string> + <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string> + <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string> + <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string> + <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string> + <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string> + <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, indingilizi ngenhla"</string> + <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string> + <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string> + <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string> + <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string> + <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string> + <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, icashazi ngenhla"</string> + <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string> + <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string> + <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string> + <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string> + <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ukhefana ngezansi"</string> + <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ukhefana ngezansi"</string> + <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string> + <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, icashazi ngenhla"</string> + <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ihhuku ngenhla"</string> + <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex ne-acute"</string> + <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex ne-grave"</string> + <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex ne-tilde"</string> + <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex necashazi ngenhla"</string> + <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve ne-acute"</string> + <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve ne-grave"</string> + <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve ne-tilde"</string> + <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve necashazi ngezansi"</string> + <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, icashazi ngezansi"</string> + <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ihhuku ngenhla"</string> + <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string> + <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex ne-acute"</string> + <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex ne-grave"</string> + <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex ne-tilde"</string> + <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex necashazi ngezansi"</string> + <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ihhuku ngenhla"</string> + <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, icashazi ngezansi"</string> + <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, icashazi ngezansi"</string> + <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ihhuku ngenhla"</string> + <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex ne-acute"</string> + <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex ne-grave"</string> + <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex ne-tilde"</string> + <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex necashazi ngezansi"</string> + <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn ne-acute"</string> + <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn ne-grave"</string> + <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn ne-tilde"</string> + <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn necashazi ngezansi"</string> + <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, icashazi ngezansi"</string> + <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, uhhuku ngehla"</string> + <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn ne-acute"</string> + <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn ne-grave"</string> + <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn nehhuku ngenhla"</string> + <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn ne-tilde"</string> + <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn necashazi ngezansi"</string> + <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string> + <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, icashazi ngezansi"</string> + <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ihhuku ngenhla"</string> + <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string> + <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Umbabazi okokushiwo"</string> + <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokunxele"</string> + <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Icashazi eliphakathi"</string> + <string name="spoken_symbol_00B9" msgid="8026257165451461231">"I-Superscript one"</string> + <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokudla"</string> + <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Umbuzi okokushiwo"</string> + <string name="spoken_symbol_2018" msgid="4886476295598930225">"Umaki wokukopisha oyedwa ongakwesokunxele"</string> + <string name="spoken_symbol_2019" msgid="8892530161598134083">"Umaki wokukopisha oyedwa ongakwesokudla"</string> + <string name="spoken_symbol_201A" msgid="2072987157683446644">"Umaki wokukopisha owodwa ophansi 9"</string> + <string name="spoken_symbol_201C" msgid="4588048378803665427">"Umaki wokukopisha ongakubili ongakwekunxele"</string> + <string name="spoken_symbol_201D" msgid="1642776849495925895">"Umaki wokukopisha ongakubili ongakwekudla"</string> + <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string> + <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string> + <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string> + <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string> + <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string> + <string name="spoken_symbol_2039" msgid="6989616457213775957">"Umaki wokukopisha oyedwa ngokhombe ngakwesokunxele"</string> + <string name="spoken_symbol_203A" msgid="31245095449823701">"Umaki wokukopisha oyedwa ngokhombe ngakwesokudla"</string> + <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string> + <string name="spoken_symbol_207F" msgid="1706731172134246659">"I-Superscript latin uhlambu oluncane u-n"</string> + <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Uphawu lwe-Peso"</string> + <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ukunakekela ko"</string> + <string name="spoken_symbol_2192" msgid="827804523596125414">"Umcibisholo wangakwesokudla"</string> + <string name="spoken_symbol_2193" msgid="2659541693445985717">"Umcibisholo oyaphansi"</string> + <string name="spoken_symbol_2205" msgid="4457188084269117343">"Isethi engenalutho"</string> + <string name="spoken_symbol_2206" msgid="4856786565708380687">"Nciphisa"</string> + <string name="spoken_symbol_2264" msgid="5092061257745123554">"Okuncane noma okulinganayo"</string> + <string name="spoken_symbol_2265" msgid="1907966479878036357">"Okukhulu noma okulinganayo"</string> + <string name="spoken_symbol_2605" msgid="5202920479405857753">"Inkanyezi emnyama"</string> +</resources> diff --git a/java/res/values-zu/strings-talkback-descriptions.xml b/java/res/values-zu/strings-talkback-descriptions.xml new file mode 100644 index 000000000..6d3de70a5 --- /dev/null +++ b/java/res/values-zu/strings-talkback-descriptions.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="spoken_use_headphones" msgid="4313642710742229868">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string> + <string name="spoken_current_text_is" msgid="4240549866156675799">"Umbhalo wamanje ngu %s"</string> + <string name="spoken_no_text_entered" msgid="1711276837961785646">"Awukho umbhalo ofakiwe"</string> + <string name="spoken_auto_correct" msgid="8989324692167993804">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> ilungisa i-<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kube yi-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string> + <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> yenza ukulungisa okuzenzakalelayo"</string> + <string name="spoken_description_unknown" msgid="5139930082759824442">"Uhlamvu olungaziwa"</string> + <string name="spoken_description_shift" msgid="7209798151676638728">"U-Shift"</string> + <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Amasimbuli amaningi"</string> + <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"U-Shift"</string> + <string name="spoken_description_symbols_shift_shifted" msgid="5179175466878186081">"Amasimbuli"</string> + <string name="spoken_description_caps_lock" msgid="1224851412185975036">"U-Shift"</string> + <string name="spoken_description_delete" msgid="3878902286264983302">"Susa"</string> + <string name="spoken_description_to_symbol" msgid="8244903740201126590">"Amasimbuli"</string> + <string name="spoken_description_to_alpha" msgid="4081215210530031950">"Izinhlamvu"</string> + <string name="spoken_description_to_numeric" msgid="4560261331530795682">"Izinombolo"</string> + <string name="spoken_description_settings" msgid="7281251004003143204">"Izilungiselelo"</string> + <string name="spoken_description_tab" msgid="8210782459446866716">"Ithebhu"</string> + <string name="spoken_description_space" msgid="5908716896642059145">"Isikhala"</string> + <string name="spoken_description_mic" msgid="6153138783813452464">"Okungenayo kwezwi"</string> + <string name="spoken_description_emoji" msgid="7990051553008088470">"I-Emoji"</string> + <string name="spoken_description_return" msgid="3183692287397645708">"Buyela"</string> + <string name="spoken_description_search" msgid="5099937658231911288">"Sesha"</string> + <string name="spoken_description_dot" msgid="5644176501632325560">"Icashazi"</string> + <string name="spoken_description_language_switch" msgid="6818666779313544553">"Shintsha ulimi"</string> + <string name="spoken_description_action_next" msgid="431761808119616962">"Okulandelayo"</string> + <string name="spoken_description_action_previous" msgid="2919072174697865110">"Okwangaphambilini"</string> + <string name="spoken_description_shiftmode_on" msgid="5107180516341258979">"U-Shift uvunyelwe"</string> + <string name="spoken_description_shiftmode_locked" msgid="7307477738053606881">"Ofeleba bavunyelwe"</string> + <string name="spoken_description_mode_symbol" msgid="111186851131446691">"Imodi yezimpawu"</string> + <string name="spoken_description_mode_symbol_shift" msgid="4305607977537665389">"Imodi yamasimbuli amaningi"</string> + <string name="spoken_description_mode_alpha" msgid="4676004119618778911">"Imodi yezinhlamvu"</string> + <string name="spoken_description_mode_phone" msgid="2061220553756692903">"Imodi yefoni"</string> + <string name="spoken_description_mode_phone_shift" msgid="7879963803547701090">"Imodi yezimpawu zefoni"</string> + <string name="announce_keyboard_hidden" msgid="2313574218950517779">"Ikhibhodi ifihliwe"</string> + <string name="announce_keyboard_mode" msgid="6698257917367823205">"Ibonisa ikhibhodi ye-<xliff:g id="KEYBOARD_MODE">%s</xliff:g>"</string> + <string name="keyboard_mode_date" msgid="6597407244976713364">"idethi"</string> + <string name="keyboard_mode_date_time" msgid="3642804408726668808">"idethi nesikhathi"</string> + <string name="keyboard_mode_email" msgid="1239682082047693644">"i-imeyili"</string> + <string name="keyboard_mode_im" msgid="3812086215529493501">"imilayezo"</string> + <string name="keyboard_mode_number" msgid="5395042245837996809">"inombolo"</string> + <string name="keyboard_mode_phone" msgid="2486230278064523665">"ifoni"</string> + <string name="keyboard_mode_text" msgid="9138789594969187494">"umbhalo"</string> + <string name="keyboard_mode_time" msgid="8558297845514402675">"isikhathi"</string> + <string name="keyboard_mode_url" msgid="8072011652949962550">"I-URL"</string> + <string name="spoken_descrption_emoji_category_recents" msgid="4185344945205590692">"Okwakamuva"</string> + <string name="spoken_descrption_emoji_category_people" msgid="8414196269847492817">"Abantu"</string> + <string name="spoken_descrption_emoji_category_objects" msgid="6116297906606195278">"Izinto"</string> + <string name="spoken_descrption_emoji_category_nature" msgid="5018340512472354640">"Indalo"</string> + <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Izindawo"</string> + <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Amasimbuli"</string> + <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Izithombe-mzwelo"</string> + <string name="spoken_description_upper_case" msgid="4904835255229433916">"Ufeleba <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string> + <string name="spoken_letter_0049" msgid="4743162182646977944">"Ufeleba I"</string> + <string name="spoken_letter_0130" msgid="4766619646231612274">"Ufeleba I, icashazi ngenhla"</string> + <string name="spoken_symbol_unknown" msgid="717298227061173706">"Uphawu olungaziwa"</string> + <string name="spoken_emoji_unknown" msgid="5981009928135394306">"I-emoji engaziwa"</string> + <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ezinye izinhlamvu ziyatholakala"</string> + <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ezinye izinhlamvu ziyalahlwa"</string> + <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ezinye iziphakamiso ziyatholakala"</string> + <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Ezinye iziphakamiso ziyalahlwa"</string> +</resources> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index 27d11316c..e644a122e 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/strings.xml @@ -21,18 +21,23 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Imiyalo yefayela lokungena lokucwaninga"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Bheka amagama woxhumana nabo"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Isihloli sokupela sisebenzisa okungenayo kusuka kuhlu lalabo oxhumana nabo"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Dlidlizelisa ngokucindezela inkinobho"</string> <string name="sound_on_keypress" msgid="6093592297198243644">"Umsindo wokucindezela ukhiye"</string> <string name="popup_on_keypress" msgid="123894815723512944">"Ugaxekile ngokucindezela ukhiye"</string> - <string name="general_category" msgid="1859088467017573195">"Okuvamile"</string> - <string name="correction_category" msgid="2236750915056607613">"Ukulungiswa kombhalo"</string> - <string name="gesture_typing_category" msgid="497263612130532630">"Ukuthayipha ngokuthinta"</string> - <string name="misc_category" msgid="6894192814868233453">"Okunye okukhethwa kukho"</string> - <string name="advanced_settings" msgid="362895144495591463">"Izilungiselelo ezithuthukisiwe"</string> - <string name="advanced_settings_summary" msgid="4487980456152830271">"Izinketho zezingcwenti"</string> + <!-- no translation found for settings_screen_input (2808654300248306866) --> + <skip /> + <!-- no translation found for settings_screen_appearances (3611951947835553700) --> + <skip /> + <!-- no translation found for settings_screen_multi_lingual (6829970893413937235) --> + <skip /> + <!-- no translation found for settings_screen_gesture (9113437621722871665) --> + <skip /> + <!-- no translation found for settings_screen_correction (1616818407747682955) --> + <skip /> + <!-- no translation found for settings_screen_advanced (7472408607625972994) --> + <skip /> <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Shintshela kwezinye izindlela zokungena"</string> <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Ukhiye wokushintsha ulimi ubandakanya ezinye izindlela zokungenayo"</string> <string name="show_language_switch_key" msgid="5915478828318774384">"Ukhiye wokushintsha ullimi"</string> @@ -46,6 +51,8 @@ <string name="settings_system_default" msgid="6268225104743331821">"Okuzenzakalelayo kwesistimu"</string> <string name="use_contacts_dict" msgid="4435317977804180815">"Sikisela amagama Othintana nabo"</string> <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Amagama abasebenzisi kusuka Kothintana nabo bokusikisela nokulungisa"</string> + <string name="use_personalized_dicts" msgid="5167396352105467626">"Iziphakamiso ezenziwe okomuntu siqu"</string> + <string name="enable_metrics_logging" msgid="5506372337118822837">"Thuthukisa i-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="use_double_space_period" msgid="8781529969425082860">"Isikhathi se-Double-space"</string> <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ukuthepha kabili kubha yesikhala kufaka isikhathi esilandelwa yisikhala"</string> <string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string> @@ -73,72 +80,26 @@ <string name="gesture_preview_trail" msgid="3802333369335722221">"Bonisa i-trail yokuthinta"</string> <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Ukuhlola kuqala okuntantayo okunamandla"</string> <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Bona igama eliphakanyisiwe ngenkathi uthinta"</string> - <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Kulondoloziwe"</string> - <string name="spoken_use_headphones" msgid="896961781287283493">"Plaka ku-headset ukuze uzwe okhiye bephasiwedi ezindlebeni zakho bezwakala kakhulu."</string> - <string name="spoken_current_text_is" msgid="2485723011272583845">"Umbhalo wamanje ngu %s"</string> - <string name="spoken_no_text_entered" msgid="7479685225597344496">"Awukho umbhalo ofakiwe"</string> - <string name="spoken_auto_correct" msgid="8005997889020109763">"I-<xliff:g id="KEY">%1$s</xliff:g> ilungisa i-<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ibe yi-<xliff:g id="CORRECTED">%3$s</xliff:g>"</string> - <string name="spoken_auto_correct_obscured" msgid="6276420476908833791">"I-<xliff:g id="KEY">%1$s</xliff:g> yenza ukulungiswa kokuzenzakalela"</string> - <string name="spoken_description_unknown" msgid="3197434010402179157">"Ikhodi yokhiye %d"</string> - <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> - <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"U-Shift uvuliwe (thepha ukuwuvimbela)"</string> - <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Ofeleba bavuliwe (thepha ukubavimbela)"</string> - <string name="spoken_description_delete" msgid="8740376944276199801">"Susa"</string> - <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Amasimbuli"</string> - <string name="spoken_description_to_alpha" msgid="23129338819771807">"Imbhalo"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Izinombolo"</string> - <string name="spoken_description_settings" msgid="4627462689603838099">"Izilungiselelo"</string> - <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> - <string name="spoken_description_space" msgid="2582521050049860859">"Isikhala"</string> - <string name="spoken_description_mic" msgid="615536748882611950">"Okungenayo kwezwi"</string> - <string name="spoken_description_smiley" msgid="2256309826200113918">"Ubuso-obumomothekayo"</string> - <string name="spoken_description_return" msgid="8178083177238315647">"Buyisela"</string> - <string name="spoken_description_search" msgid="1247236163755920808">"Sesha"</string> - <string name="spoken_description_dot" msgid="40711082435231673">"Icashazi"</string> - <string name="spoken_description_language_switch" msgid="5507091328222331316">"Shintsha ulimi"</string> - <string name="spoken_description_action_next" msgid="8636078276664150324">"Okulandelayo"</string> - <string name="spoken_description_action_previous" msgid="800872415009336208">"Okwandulele"</string> - <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"U-Shift uvunyelwe"</string> - <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Ofeleba bavunyelwe"</string> - <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"U-Shift uvimbelwe"</string> - <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Imodi yezimpawu"</string> - <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Imodi yezinhlamvu"</string> - <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Imodi yefoni"</string> - <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Imodi yezimpawu zefoni"</string> - <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Ikhibhodi ifihliwe"</string> - <string name="announce_keyboard_mode" msgid="4729081055438508321">"Kuboniswa ikhibhodi engu-<xliff:g id="MODE">%s</xliff:g>"</string> - <string name="keyboard_mode_date" msgid="3137520166817128102">"idethi"</string> - <string name="keyboard_mode_date_time" msgid="339593358488851072">"idethi nesikhathi"</string> - <string name="keyboard_mode_email" msgid="6216248078128294262">"i-imeyili"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"imilayezo"</string> - <string name="keyboard_mode_number" msgid="7991623440699957069">"inombolo"</string> - <string name="keyboard_mode_phone" msgid="6851627527401433229">"ifoni"</string> - <string name="keyboard_mode_text" msgid="6479436687899701619">"umbhalo"</string> - <string name="keyboard_mode_time" msgid="4381856885582143277">"isikhathi"</string> - <string name="keyboard_mode_url" msgid="1519819835514911218">"I-URL"</string> + <string name="gesture_space_aware" msgid="2078291600664682496">"Igama lokuthinta"</string> + <string name="gesture_space_aware_summary" msgid="4371385818348528538">"Faka izikhala ngesikhathi sokuthinta ngokushelelela kukhiye wesikhala"</string> <string name="voice_input" msgid="3583258583521397548">"Inkinobho yokufaka izwi"</string> - <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Kwikhibhodi eyisisekelo"</string> - <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Ikhibhodi yezimpawu"</string> - <string name="voice_input_modes_off" msgid="3745699748218082014">"VALIWE"</string> - <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"I-mic kwikhibhodi eyisisekelo"</string> - <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Ikhibhodi yezimpawu ze-mic"</string> - <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo ngezwi kuvinjelwe"</string> + <string name="voice_input_disabled_summary" msgid="8141750303464726129">"Azikho izindlela zokufaka zezwi ezinikwe amandla. Hlola izilungiselelo zolimi kanye nezokufaka."</string> <string name="configure_input_method" msgid="373356270290742459">"Misa izindlela zokufakwayo"</string> <string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string> <string name="send_feedback" msgid="1780431884109392046">"Thumela impendulo"</string> <string name="select_language" msgid="3693815588777926848">"Izilimi zokufakwayo"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Thinta futhi ukuze ulondoloze"</string> <string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string> - <string name="prefs_enable_log" msgid="6620424505072963557">"Vumela impendulo yomsebenzisi"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"Siza ukuthuthukisa lo mhleli wendlela yokufaka ngokusithumela ngokuzenzakalela izibalo zokusetshenziswa nokukhubeka."</string> <string name="keyboard_layout" msgid="8451164783510487501">"Indikimba yekhibhodi"</string> <string name="subtype_en_GB" msgid="88170601942311355">"i-English(UK)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"i-English (US)"</string> <string name="subtype_es_US" msgid="5583145191430180200">"I-Spanish (US)"</string> - <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"I-English (UK) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"I-English (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"I-Spanish (US) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> - <string name="subtype_nepali_traditional" msgid="9032247506728040447">"<xliff:g id="LANGUAGE">%s</xliff:g> (Ezosiko)"</string> + <string name="subtype_with_layout_en_GB" msgid="1931018968641592304">"I-English (UK) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_with_layout_en_US" msgid="8809311287529805422">"I-English (US) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_with_layout_es_US" msgid="510930471167541338">"Isi-Spanish (US) ( <xliff:g id="KEYBOARD_LAYOUT">%s</xliff:g> )"</string> + <string name="subtype_generic_traditional" msgid="8584594350973800586">"Isi-<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Tradition)"</string> + <string name="subtype_generic_cyrillic" msgid="7486451947618138947">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Isi-Cyrillic)"</string> + <string name="subtype_generic_latin" msgid="9128716486310604145">"<xliff:g id="LANGUAGE_NAME">%s</xliff:g> (Isi-Latin)"</string> <string name="subtype_no_language" msgid="7137390094240139495">"Alikho ulimi (Alfabhethi)"</string> <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Alfabhethi (QWERTY)"</string> <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Alfabhethi (QWERTZ)"</string> @@ -147,9 +108,16 @@ <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Alfabhethi (Colemak)"</string> <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Alfabhethi (PC)"</string> <string name="subtype_emoji" msgid="7483586578074549196">"I-Emoji"</string> - <string name="keyboard_color_scheme" msgid="9192934113872818070">"Isikimu sombala"</string> - <string name="keyboard_color_scheme_white" msgid="6684064723850265438">"Okumhlophe"</string> - <string name="keyboard_color_scheme_blue" msgid="2488527224758177593">"Okuluhlaza okwesibhakabhaka"</string> + <!-- no translation found for keyboard_theme (4909551808526178852) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_white (8506588144096428751) --> + <skip /> + <!-- no translation found for keyboard_theme_holo_blue (192400518003397418) --> + <skip /> + <!-- no translation found for keyboard_theme_material_dark (2701178578784760596) --> + <skip /> + <!-- no translation found for keyboard_theme_material_light (3479400901818790331) --> + <skip /> <string name="custom_input_styles_title" msgid="8429952441821251512">"Izitayela zokufaka ngokwezifiso"</string> <string name="add_style" msgid="6163126614514489951">"Engeza isitayela"</string> <string name="add" msgid="8299699805688017798">"Engeza"</string> @@ -161,14 +129,13 @@ <string name="enable" msgid="5031294444630523247">"Nika amandla"</string> <string name="not_now" msgid="6172462888202790482">"Hhayi manje"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Isitayela sokufaka esifanayo sesivele sikhona: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> - <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Imodi yesitadi yokusebenziseka"</string> <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Ukulibazisa ukucindezela isikhashana ukhiye"</string> <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Ubude besikhathi sokudlidliza ukucindezela ukhiye"</string> <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Ivolumu yomsindo wokucindezela ukhiye"</string> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Funda ifayela elangaphandle lesichazamazwi"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Awekho amafayela wesichazamazwi kufolda yokulandiwe"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Khetha ifayela lesichazamazwi ukuze ulifake"</string> - <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"Ufuna ukufakela i-<xliff:g id="LOCALE_NAME">%s</xliff:g> leli fayela ngokweqiniso?"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="4782116251651288054">"Fakela ngempela leli fayela i-<xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"Kube nephutha"</string> <string name="button_default" msgid="3988017840431881491">"Okuzenzakalelayo"</string> <string name="setup_welcome_title" msgid="6112821709832031715">"Siyakwamukela ku-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> @@ -207,18 +174,19 @@ <string name="check_for_updates_now" msgid="8087688440916388581">"Qala kabusha"</string> <string name="last_update" msgid="730467549913588780">"Igcine ukulungiswa"</string> <string name="message_updating" msgid="4457761393932375219">"Ihlola izibuyekezo"</string> - <string name="message_loading" msgid="8689096636874758814">"Iyalayisha..."</string> + <string name="message_loading" msgid="5638680861387748936">"Iyalayisha..."</string> <string name="main_dict_description" msgid="3072821352793492143">"Isichazamazwi sakho esisemqoka"</string> <string name="cancel" msgid="6830980399865683324">"Khansela"</string> + <string name="go_to_settings" msgid="3876892339342569259">"Izilungiselelo"</string> <string name="install_dict" msgid="180852772562189365">"Faka"</string> <string name="cancel_download_dict" msgid="7843340278507019303">"Khansela"</string> <string name="delete_dict" msgid="756853268088330054">"Susa"</string> - <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Ulimi olukhethiwe kudivayisi yakho yeselula linesichazamazwi esitholakalayo.<br/> Sincoma <b>ukulanda</b> isichazamazwi sesi-<xliff:g id="LANGUAGE">%1$s</xliff:g> ukwenza kangcono isipiliyoni sakho sokuthayipha.<br/> <br/> Ukulanda ukungathatha iminithi noma amaminithi amabili nge-3G. Amashaja angasebenza uma ungenalo <b>icebo ledatha elinganqunyelwe</b>.<br/> Uma ungenasiqinisekiso sokuthi iliphi icebo ledatha onalo, sincoma ukuthola uxhumo lwe-Wi-Fi ukuze uqale ukulanda ngokuzenzakalelayo.<br/> <br/> Ithiphu: Ungalanda futhi ususe izichazamazwi ngokuya ku-<b>Ulimi nokungenayo</b> kumenyu ye-<b>Izilungiselelo</b> yedivayisi yakho yeselula."</string> + <string name="should_download_over_metered_prompt" msgid="1583881200688185508">"Ulimi olukhethiwe kudivayisi yakho yeselula lunesichazamazwi esitholakalayo.<br/> Sincoma <b>ukulanda</b> isichazamazwi se-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> ukuze sithuthukise umuzwa wakho wokuthayipha.<br/> <br/> Ukulanda kungathatha iminithi noma amabili ngaphezulu kwe-3G. Ukukhokhiswa kungasebenza uma unganalo <b>uhlelo lwedatha elingenamkhawulo</b>.<br/> Uma ungenaso isiqiniseko sokuthi ukuliphi uhlelo lwedatha, sincoma ukuthi uthole ukuxhumeka kwe-Wi-Fi ukuze uqale ukulanda ngokuzenzakalela.<br/> <br/> Ithiphu: Ungalanda uphinde ususe izichazamazwi ngokuya ku-<b>Ulimi nokokufaka</b> kumenyu ye-<b>Izilungiselelo</b> zedivayisi yakho yeselula."</string> <string name="download_over_metered" msgid="1643065851159409546">"Landa manje (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> <string name="do_not_download_over_metered" msgid="2176209579313941583">"Landa nge-Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="6514288591959117288">"Isichazamazwi se-<xliff:g id="LANGUAGE">%1$s</xliff:g> siyatholakala"</string> + <string name="dict_available_notification_title" msgid="4583842811218581658">"Isichazamazwi sitholakalela i-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g>"</string> <string name="dict_available_notification_description" msgid="1075194169443163487">"Cindezela ukuze ubuyekeze uphinde ulande"</string> - <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Ukulanda: iziphakamiso ze-<xliff:g id="LANGUAGE">%1$s</xliff:g> zizolunga maduze."</string> + <string name="toast_downloading_suggestions" msgid="6128155879830851739">"Ukulanda: iziphakamiso ze-<xliff:g id="LANGUAGE_NAME">%1$s</xliff:g> zizolunga maduze."</string> <string name="version_text" msgid="2715354215568469385">"Inguqulo engu-<xliff:g id="VERSION_NUMBER">%1$s</xliff:g>"</string> <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Engeza"</string> <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Faka kusichazamazwi"</string> diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 31945d020..396c166ab 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -32,8 +32,6 @@ <attr name="moreKeysKeyboardStyle" format="reference" /> <!-- MoreKeysKeyboardView style --> <attr name="moreKeysKeyboardViewStyle" format="reference" /> - <!-- MoreKeysKeyboardView container style --> - <attr name="moreKeysKeyboardContainerStyle" format="reference" /> <!-- Suggestions strip style --> <attr name="suggestionStripViewStyle" format="reference" /> <!-- Suggestion word style --> @@ -41,13 +39,17 @@ </declare-styleable> <declare-styleable name="KeyboardView"> - <!-- Image for the key. This image needs to be a StateListDrawable, with the following - possible states: normal, pressed, checkable, checkable+pressed, checkable+checked, - checkable+checked+pressed. --> + <!-- Background image for the key. This image needs to be a {@link StateListDrawable}, + with the following possible states: normal, pressed, checkable, checkable+pressed, + checkable+checked, checkable+checked+pressed. --> <attr name="keyBackground" format="reference" /> - <!-- Image for the functional key used in Emoji layout. --> - <attr name="keyBackgroundEmojiFunctional" format="reference" /> - + <!-- Background image for the functional key. This image needs to be a + {@link StateListDrawable}, with the following possible states: normal, pressed. --> + <attr name="functionalKeyBackground" format="reference" /> + <!-- Background image for the spacebar. This image needs to be a + {@link StateListDrawable}, with the following possible states: normal, pressed. --> + <attr name="spacebarBackground" format="reference" /> + <attr name="spacebarIconWidthRatio" format="float" /> <!-- Horizontal padding of left/right aligned key label to the edge of the key. --> <attr name="keyLabelHorizontalPadding" format="dimension" /> <!-- Right padding of hint letter to the edge of the key.--> @@ -69,12 +71,11 @@ </declare-styleable> <declare-styleable name="MainKeyboardView"> - <attr name="autoCorrectionSpacebarLedEnabled" format="boolean" /> - <attr name="autoCorrectionSpacebarLedIcon" format="reference" /> <!-- Size of the text for spacebar language label, in the proportion of key height. --> - <attr name="spacebarTextRatio" format="fraction" /> - <attr name="spacebarTextColor" format="color" /> - <attr name="spacebarTextShadowColor" format="color" /> + <attr name="languageOnSpacebarTextRatio" format="fraction" /> + <attr name="languageOnSpacebarTextColor" format="color" /> + <attr name="languageOnSpacebarTextShadowRadius" format="float" /> + <attr name="languageOnSpacebarTextShadowColor" format="color" /> <!-- Fadeout animator for spacebar language label. --> <attr name="languageOnSpacebarFinalAlpha" format="integer" /> <attr name="languageOnSpacebarFadeoutAnimator" format="reference" /> @@ -89,8 +90,8 @@ <attr name="touchNoiseThresholdTime" format="integer" /> <!-- Touch noise threshold distance in millimeter --> <attr name="touchNoiseThresholdDistance" format="dimension" /> - <!-- Sliding key input enable --> - <attr name="slidingKeyInputEnable" format="boolean" /> + <!-- Enable key selection by dragging finger --> + <attr name="keySelectionByDraggingFinger" format="boolean" /> <attr name="slidingKeyInputPreviewColor" format="color" /> <attr name="slidingKeyInputPreviewWidth" format="dimension" /> <attr name="slidingKeyInputPreviewBodyRatio" format="integer" /> @@ -103,12 +104,13 @@ <attr name="longPressShiftLockTimeout" format="integer" /> <!-- Ignore special key timeout while typing in millisecond. --> <attr name="ignoreAltCodeKeyTimeout" format="integer" /> - <!-- Layout resource for key press feedback.--> - <attr name="keyPreviewLayout" format="reference" /> + <!-- Background resource for key press feedback.--> + <attr name="keyPreviewBackground" format="reference" /> <!-- Vertical offset of the key press feedback from the key. --> <attr name="keyPreviewOffset" format="dimension" /> <!-- Height of the key press feedback popup. --> <attr name="keyPreviewHeight" format="dimension" /> + <!-- TODO: consolidate key preview linger timeout with the key preview animation parameters. --> <!-- Delay after key releasing and key press feedback dismissing in millisecond --> <attr name="keyPreviewLingerTimeout" format="integer" /> <!-- Layout resource for more keys keyboard --> @@ -168,11 +170,22 @@ </declare-styleable> <declare-styleable name="EmojiPalettesView"> - <attr name="emojiTabLabelColor" format="reference" /> + <attr name="categoryIndicatorEnabled" format="boolean" /> + <attr name="categoryIndicatorDrawable" format="reference" /> + <attr name="categoryIndicatorBackground" format="reference" /> + <attr name="categoryPageIndicatorColor" format="color" /> + <attr name="categoryPageIndicatorBackground" format="color" /> + <attr name="iconEmojiRecentsTab" format="reference" /> + <attr name="iconEmojiCategory1Tab" format="reference" /> + <attr name="iconEmojiCategory2Tab" format="reference" /> + <attr name="iconEmojiCategory3Tab" format="reference" /> + <attr name="iconEmojiCategory4Tab" format="reference" /> + <attr name="iconEmojiCategory5Tab" format="reference" /> + <attr name="iconEmojiCategory6Tab" format="reference" /> </declare-styleable> <declare-styleable name="SuggestionStripView"> - <attr name="suggestionStripOption" format="integer"> + <attr name="suggestionStripOptions" format="integer"> <!-- This should be aligned with SuggestionStripLayoutHelper.AUTO_CORRECT_* and etc. --> <flag name="autoCorrectBold" value="0x01" /> <flag name="autoCorrectUnderline" value="0x02" /> @@ -214,10 +227,14 @@ <attr name="iconSettingsKey" format="reference" /> <attr name="iconSpaceKey" format="reference" /> <attr name="iconEnterKey" format="reference" /> + <attr name="iconGoKey" format="reference" /> <attr name="iconSearchKey" format="reference" /> + <attr name="iconSendKey" format="reference" /> + <attr name="iconNextKey" format="reference" /> + <attr name="iconDoneKey" format="reference" /> + <attr name="iconPreviousKey" format="reference" /> <attr name="iconTabKey" format="reference" /> <attr name="iconShortcutKey" format="reference" /> - <attr name="iconShortcutForLabel" format="reference" /> <attr name="iconSpaceKeyForNumberLayout" format="reference" /> <attr name="iconShiftKeyShifted" format="reference" /> <attr name="iconShortcutKeyDisabled" format="reference" /> @@ -235,10 +252,6 @@ </declare-styleable> <declare-styleable name="Keyboard_Key"> - <!-- The unicode value that this key outputs. - Code value represented in hexadecimal prefixed with "0x" or code value reference using - "!code/<code_name>" notation. --> - <attr name="code" format="string" /> <!-- The alternate unicode value that this key outputs while typing. Code value represented in hexadecimal prefixed with "0x" or code value reference using "!code/<code_name>" notation. --> @@ -270,20 +283,22 @@ <flag name="altCodeWhileTyping" value="0x04" /> <flag name="enableLongPress" value="0x08" /> </attr> - <!-- 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 label, icon to display on the key. And code, outputText of the key. --> + <attr name="keySpec" format="string" /> <!-- The hint label to display on the key in conjunction with the label. --> <attr name="keyHintLabel" format="string" /> + <!-- The vertical adjustment of key hint label in proportion to its height. --> + <attr name="keyHintLabelVerticalAdjustment" format="fraction" /> <!-- The key label flags. --> <attr name="keyLabelFlags" format="integer"> <!-- This should be aligned with Key.LABEL_FLAGS__* --> <flag name="alignLeft" value="0x01" /> <flag name="alignRight" value="0x02" /> + <flag name="alignButtom" value="0x04" /> <flag name="alignLeftOfCenter" value="0x08" /> <flag name="fontNormal" value="0x10" /> <flag name="fontMonoSpace" value="0x20" /> + <flag name="fontDefault" value="0x30" /> <flag name="followKeyLargeLetterRatio" value="0x40" /> <flag name="followKeyLetterRatio" value="0x80" /> <flag name="followKeyLabelRatio" value="0xC0" /> @@ -292,24 +307,28 @@ <flag name="hasPopupHint" value="0x200" /> <flag name="hasShiftedLetterHint" value="0x400" /> <flag name="hasHintLabel" value="0x800" /> + <!-- These two flags are currently unused. Leave these for possible future use. --> <flag name="withIconLeft" value="0x1000" /> <flag name="withIconRight" value="0x2000" /> <flag name="autoXScale" value="0x4000" /> + <!-- The autoScale value implies autoXScale bit on to optimize scaling code path. --> + <flag name="autoScale" value="0xc000" /> <!-- If true, character case of code, altCode, moreKeys, keyOutputText, keyLabel, or keyHintLabel will never be subject to change. --> - <flag name="preserveCase" value="0x8000" /> + <flag name="preserveCase" value="0x10000" /> <!-- If true, use keyShiftedLetterHintActivatedColor for the shifted letter hint and keyTextInactivatedColor for the primary key top label. --> - <flag name="shiftedLetterActivated" value="0x10000" /> + <flag name="shiftedLetterActivated" value="0x20000" /> <!-- If true, use EditorInfo.actionLabel for the key label. --> - <flag name="fromCustomActionLabel" value="0x20000" /> + <flag name="fromCustomActionLabel" value="0x40000" /> + <!-- If true, use functionalTextColor instead of ketTextColor to drawing the label on + the key --> + <flag name="followFunctionalTextColor" value="0x80000" /> <!-- If true, disable keyHintLabel. --> <flag name="disableKeyHintLabel" value="0x40000000" /> <!-- If true, disable additionalMoreKeys. --> <flag name="disableAdditionalMoreKeys" value="0x80000000" /> </attr> - <!-- The icon to display on the key instead of the label. --> - <attr name="keyIcon" format="string" /> <!-- The icon for disabled key --> <attr name="keyIconDisabled" format="string" /> <!-- The icon to show in the popup preview. --> @@ -361,6 +380,8 @@ <attr name="keyTextShadowColor" format="color" /> <!-- Color to use for the label in a key when in inactivated state. --> <attr name="keyTextInactivatedColor" format="color" /> + <!-- Color to use for the label in a key that has followFunctionalTextColor keyLabelFlags. --> + <attr name="functionalTextColor" format="color" /> <!-- Key hint letter (= one character hint label) color --> <attr name="keyHintLetterColor" format="color" /> <!-- Key hint label color --> @@ -415,8 +436,6 @@ <attr name="navigatePrevious" format="boolean" /> <attr name="passwordInput" format="boolean" /> <attr name="clobberSettingsKey" format="boolean" /> - <attr name="shortcutKeyEnabled" format="boolean" /> - <attr name="shortcutKeyOnSymbols" format="boolean" /> <attr name="hasShortcutKey" format="boolean" /> <attr name="languageSwitchKeyEnabled" format="boolean" /> <attr name="isMultiLine" format="boolean" /> @@ -433,6 +452,7 @@ <!-- This should be aligned with KeyboardId.IME_ACTION_* --> <enum name="actionCustomLabel" value="0x100" /> </attr> + <attr name="isIconDefined" format="string" /> <attr name="localeCode" format="string" /> <attr name="languageCode" format="string" /> <attr name="countryCode" format="string" /> @@ -469,6 +489,19 @@ <attr name="enableProximityCharsCorrection" format="boolean" /> </declare-styleable> + <declare-styleable name="KeyboardLayoutSet_Feature"> + <!-- This should be aligned with ScriptUtils.SCRIPT_* --> + <attr name="supportedScript" format="enum"> + <enum name="latin" value="0" /> + <enum name="cyrillic" value="1" /> + <enum name="greek" value="2" /> + <enum name="arabic" value="3" /> + <enum name="hebrew" value="4" /> + <enum name="armenian" value="5" /> + <enum name="georgian" value="6" /> + </attr> + </declare-styleable> + <declare-styleable name="SeekBarDialogPreference"> <attr name="maxValue" format="integer" /> <attr name="minValue" format="integer" /> diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index 93f25a7f6..0eee08de2 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -19,27 +19,13 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- Color resources for Gingerbread theme. --> - <color name="highlight_color_gb">#FFFCAE00</color> - <color name="typed_word_color_gb">@android:color/white</color> - <color name="highlight_translucent_color_gb">#99FCAE00</color> - <color name="key_text_color_gb">@android:color/white</color> - <color name="key_text_shadow_color_gb">#BB000000</color> - <color name="key_text_inactivated_color_gb">#66E0E4E5</color> - <color name="key_hint_letter_color_gb">#80000000</color> - <color name="key_hint_label_color_gb">#E0E0E4E5</color> - <color name="key_shifted_letter_hint_inactivated_color_gb">#66E0E4E5</color> - <color name="key_shifted_letter_hint_activated_color_gb">#CCE0E4E5</color> - <color name="spacebar_text_color_gb">#FFC0C0C0</color> - <color name="spacebar_text_shadow_color_gb">#80000000</color> - <color name="gesture_floating_preview_color_gb">#C0000000</color> <!-- Color resources for IceCreamSandwich theme. Base color = 33B5E5 --> <!-- android:color/holo_blue_light value is #FF33B5E5 --> <color name="highlight_color_ics">#FF33B5E5</color> <color name="typed_word_color_ics">#D833B5E5</color> <color name="suggested_word_color_ics">#B233B5E5</color> <color name="highlight_translucent_color_ics">#9933B5E5</color> - <color name="key_text_shadow_color_holo">@android:color/transparent</color> + <color name="key_text_color_holo">@android:color/white</color> <color name="key_text_inactivated_color_holo">#66E0E4E5</color> <color name="key_hint_letter_color_holo">#80000000</color> <color name="key_hint_label_color_holo">#A0FFFFFF</color> @@ -48,24 +34,31 @@ <color name="spacebar_text_color_holo">#FFC0C0C0</color> <color name="spacebar_text_shadow_color_holo">#80000000</color> <color name="gesture_floating_preview_color_holo">#C0000000</color> + <color name="emoji_tab_page_indicator_background_holo">#111111</color> <!-- Color resources for KLP theme. Base color = F0F0F0 --> <color name="highlight_color_klp">#FFF0F0F0</color> <color name="typed_word_color_klp">#D8F0F0F0</color> <color name="suggested_word_color_klp">#B2F0F0F0</color> <color name="highlight_translucent_color_klp">#99E0E0E0</color> + <!-- Color resources for LXX theme. Base color = F0F0F0 --> + <color name="key_text_color_lxx_dark">#FFFFFF</color> + <color name="key_text_inactive_color_lxx_dark">#808184</color> + <color name="key_hint_letter_color_lxx_dark">#808184</color> + <color name="highlight_color_lxx_dark">#7FCAC3</color> + <color name="typed_word_color_lxx_dark">#D87FCAC3</color> + <color name="suggested_word_color_lxx_dark">#B27FCAC3</color> + <color name="highlight_translucent_color_lxx_dark">#997FCAC3</color> + <color name="keyboard_background_lxx_dark">#384248</color> + <color name="key_background_lxx_dark">#384248</color> + <color name="key_background_pressed_lxx_dark">#546872</color> + <color name="suggestions_strip_background_lxx_dark">#263238</color> + <color name="suggested_word_background_selected_lxx_dark">#384248</color> + <color name="gesture_floating_preview_color_lxx_dark">#C0000000</color> + <color name="emoji_tab_page_indicator_background_lxx_dark">#263238</color> <!-- Color resources for setup wizard and tutorial --> <color name="setup_background">#FFEBEBEB</color> <color name="setup_text_dark">#FF707070</color> <color name="setup_text_action">@android:color/holo_blue_light</color> <color name="setup_step_background">@android:color/background_light</color> <color name="setup_welcome_video_margin_color">#FFCCCCCC</color> - <color name="emoji_category_page_id_view_background">#FF000000</color> - <color name="emoji_category_page_id_view_foreground">#80FFFFFF</color> - - <!-- TODO: Color which should be included in the theme --> - <color name="emoji_key_background_color">#00000000</color> - <color name="emoji_key_pressed_background_color">#30FFFFFF</color> - - <color name="key_text_color_normal_holo">@android:color/white</color> - <color name="key_text_color_functional_holo">@android:color/white</color> </resources> diff --git a/java/res/values/config-auto-correction-thresholds.xml b/java/res/values/config-auto-correction-thresholds.xml new file mode 100644 index 000000000..7d94a42a4 --- /dev/null +++ b/java/res/values/config-auto-correction-thresholds.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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> + <!-- The array of auto correction threshold values. --> + <string-array name="auto_correction_threshold_values" translatable="false"> + <!-- Off, When auto correction setting is Off, this value is not used. --> + <item>floatMaxValue</item> + <!-- Modest : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. --> + <item>0.185</item> + <!-- Aggressive --> + <item>0.067</item> + <!-- Very Aggressive : Suggestion whose normalized score is greater than this value + will be subject to auto-correction. "floatNegativeInfinity" is a special marker + string for Float.NEGATIVE_INFINITY --> + <item>floatNegativeInfinity</item> + </string-array> + + <!-- The index of the auto correction threshold values array. --> + <string name="auto_correction_threshold_mode_index_off" translatable="false">0</string> + <string name="auto_correction_threshold_mode_index_modest" translatable="false">1</string> + <string name="auto_correction_threshold_mode_index_aggressive" translatable="false">2</string> + <string name="auto_correction_threshold_mode_index_very_aggressive" translatable="false">3</string> + + <!-- The array of the auto correction threshold settings values. --> + <string-array name="auto_correction_threshold_mode_indexes" translatable="false"> + <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_aggressive</item> + <item>@string/auto_correction_threshold_mode_index_very_aggressive</item> + </string-array> + <!-- The array of the human readable auto correction threshold settings entries. --> + <string-array name="auto_correction_threshold_modes" translatable="false"> + <item>@string/auto_correction_threshold_mode_off</item> + <item>@string/auto_correction_threshold_mode_modest</item> + <item>@string/auto_correction_threshold_mode_aggressive</item> + <item>@string/auto_correction_threshold_mode_very_aggressive</item> + </string-array> +</resources> diff --git a/java/res/values/config-common.xml b/java/res/values/config-common.xml new file mode 100644 index 000000000..063fbfb37 --- /dev/null +++ b/java/res/values/config-common.xml @@ -0,0 +1,147 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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_block_potentially_offensive">true</bool> + <!-- Default value for next word prediction: after entering a word and a space only, should we look + at input history to suggest a hopefully helpful suggestions for the next word? --> + <bool name="config_default_next_word_prediction">true</bool> + + <integer name="config_delay_update_shift_state">100</integer> + <integer name="config_double_space_period_timeout">1100</integer> + + <integer name="config_key_repeat_start_timeout">400</integer> + <integer name="config_key_repeat_interval">50</integer> + + <integer name="config_ignore_alt_code_key_timeout">350</integer> + + <integer name="config_key_preview_show_up_duration">17</integer> + <integer name="config_key_preview_dismiss_duration">53</integer> + <fraction name="config_key_preview_show_up_start_scale">98%</fraction> + <fraction name="config_key_preview_dismiss_end_scale">94%</fraction> + <!-- TODO: consolidate key preview linger timeout with the above animation parameters. --> + <integer name="config_key_preview_linger_timeout">70</integer> + <!-- Suppress showing key preview duration after batch input in millisecond --> + <integer name="config_suppress_key_preview_after_batch_input_duration">1000</integer> + + <bool name="config_default_vibration_enabled">true</bool> + <integer name="config_max_vibration_duration">100</integer> + + <integer name="config_default_longpress_key_timeout">300</integer> + <integer name="config_max_longpress_timeout">700</integer> + <integer name="config_min_longpress_timeout">100</integer> + <integer name="config_longpress_timeout_step">10</integer> + <integer name="config_accessibility_long_press_key_timeout">3000</integer> + <integer name="config_max_more_keys_column">5</integer> + <integer name="config_more_keys_keyboard_fadein_anim_time">0</integer> + <integer name="config_more_keys_keyboard_fadeout_anim_time">100</integer> + + <!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 --> + <integer name="config_longpress_shift_lock_timeout">1200</integer> + + <!-- Sliding key input preview parameters --> + <dimen name="config_sliding_key_input_preview_width">8.0dp</dimen> + <!-- Percentages of sliding key input preview body and shadow, in proportion to the width. + A negative value of the shadow ratio disables drawing shadow. --> + <!-- TODO: May use the shadow to alleviate rugged trail drawing. --> + <integer name="config_sliding_key_input_preview_body_ratio">100</integer> + <integer name="config_sliding_key_input_preview_shadow_ratio">-1</integer> + <dimen name="config_key_hysteresis_distance_for_sliding_modifier">8.0dp</dimen> + + <integer name="config_language_on_spacebar_final_alpha">128</integer> + <dimen name="config_language_on_spacebar_horizontal_margin">1dp</dimen> + + <integer name="config_gesture_floating_preview_text_linger_timeout">200</integer> + <integer name="config_gesture_trail_fadeout_start_delay">100</integer> + <integer name="config_gesture_trail_fadeout_duration">800</integer> + <integer name="config_gesture_trail_update_interval">20</integer> + <!-- Static threshold for gesture after fast typing (msec) --> + <integer name="config_gesture_static_time_threshold_after_fast_typing">500</integer> + <!-- Static threshold for starting gesture detection (keyWidth%/sec) --> + <fraction name="config_gesture_detect_fast_move_speed_threshold">150%</fraction> + <!-- Dynamic threshold for gesture after fast typing (msec) --> + <integer name="config_gesture_dynamic_threshold_decay_duration">450</integer> + <!-- Time based threshold values for gesture detection (msec) --> + <integer name="config_gesture_dynamic_time_threshold_from">300</integer> + <integer name="config_gesture_dynamic_time_threshold_to">20</integer> + <!-- Distance based threshold values for gesture detection (keyWidth%/sec) --> + <fraction name="config_gesture_dynamic_distance_threshold_from">600%</fraction> + <fraction name="config_gesture_dynamic_distance_threshold_to">50%</fraction> + <!-- Parameter for gesture sampling (keyWidth%/sec) --> + <fraction name="config_gesture_sampling_minimum_distance">16.6666%</fraction> + <!-- Parameters for gesture recognition (msec) and (keyWidth%/sec) --> + <integer name="config_gesture_recognition_minimum_time">100</integer> + <integer name="config_gesture_recognition_update_time">100</integer> + <fraction name="config_gesture_recognition_speed_threshold">550%</fraction> + + <integer name="config_keyboard_grid_width">32</integer> + <integer name="config_keyboard_grid_height">16</integer> + <dimen name="config_touch_noise_threshold_distance">12.6dp</dimen> + <integer name="config_touch_noise_threshold_time">40</integer> + + <!-- Common keyboard configuration. --> + <fraction name="config_keyboard_left_padding">0%p</fraction> + <fraction name="config_keyboard_right_padding">0%p</fraction> + <dimen name="config_keyboard_vertical_correction">0.0dp</dimen> + + <!-- Common key top visual configuration. --> + <dimen name="config_key_popup_hint_letter_padding">2dp</dimen> + + <!-- Common suggestion strip configuration. --> + <integer name="config_suggestions_count_in_strip">3</integer> + <fraction name="config_center_suggestion_percentile">36%</fraction> + <integer name="config_delay_update_suggestions">100</integer> + <integer name="config_delay_update_old_suggestions">300</integer> + + <!-- Common more suggestions configuraion. --> + <dimen name="config_more_suggestions_key_horizontal_padding">12dp</dimen> + <dimen name="config_more_suggestions_bottom_gap">6dp</dimen> + <dimen name="config_more_suggestions_modal_tolerance">32.0dp</dimen> + <fraction name="config_more_suggestions_info_ratio">18%</fraction> + + <!-- Common gesture trail parameters --> + <!-- Minimum distance between gesture trail sampling points. --> + <dimen name="config_gesture_trail_min_sampling_distance">9.6dp</dimen> + <!-- Maximum angular threshold between gesture trails interpolation segments in degree. --> + <integer name="config_gesture_trail_max_interpolation_angular_threshold">15</integer> + <!-- Maximum distance threshold between gesture trails interpolation segments. --> + <dimen name="config_gesture_trail_max_interpolation_distance_threshold">16.0dp</dimen> + <!-- Maximum number of gesture trail interpolation segments. --> + <integer name="config_gesture_trail_max_interpolation_segments">6</integer> + <dimen name="config_gesture_trail_start_width">10.0dp</dimen> + <dimen name="config_gesture_trail_end_width">2.5dp</dimen> + <!-- Percentages of gesture preview taril body and shadow, in proportion to the trail width. + A negative value of the shadow ratio disables drawing shadow. --> + <!-- TODO: May use the shadow to alleviate rugged trail drawing. --> + <integer name="config_gesture_trail_body_ratio">100</integer> + <integer name="config_gesture_trail_shadow_ratio">-1</integer> + + <!-- Common configuration of Emoji keyboard --> + <dimen name="config_emoji_category_page_id_height">2dp</dimen> + + <!-- Inset used in Accessibility mode to avoid accidental key presses when a finger slides off the screen. --> + <dimen name="config_accessibility_edge_slop">8dp</dimen> + + <integer name="config_user_dictionary_max_word_length">48</integer> + + <!-- Personalization configuration --> + <!-- -1 means periocical wipe of the personalization dict is disabled. --> + <integer name="config_personalization_dict_wipe_interval_in_days">-1</integer> +</resources> diff --git a/java/res/values/config-dictionary-pack.xml b/java/res/values/config-dictionary-pack.xml new file mode 100644 index 000000000..d076af452 --- /dev/null +++ b/java/res/values/config-dictionary-pack.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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. +*/ +--> + +<!-- Configuration values for Dictionary pack. --> +<resources> + <!-- Settings for the dictionary pack --> + <bool name="allow_over_metered">false</bool> + <bool name="allow_over_roaming">false</bool> + <bool name="dict_downloads_visible_in_download_UI">false</bool> + <bool name="metadata_downloads_visible_in_download_UI">false</bool> + <bool name="display_notification_for_auto_update">false</bool> + <bool name="display_notification_for_user_requested_update">false</bool> +</resources> diff --git a/java/res/values/config-per-form-factor.xml b/java/res/values/config-per-form-factor.xml new file mode 100644 index 000000000..67fc75134 --- /dev/null +++ b/java/res/values/config-per-form-factor.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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. +*/ +--> + +<!-- Configuration values for Small Phone. --> +<resources> + <bool name="config_enable_show_key_preview_popup_option">true</bool> + <!-- Whether or not Popup on key press is enabled by default --> + <bool name="config_default_key_preview_popup">true</bool> + <bool name="config_default_sound_enabled">false</bool> + <bool name="config_enable_show_voice_key_option">true</bool> + <bool name="config_key_selection_by_dragging_finger">true</bool> + <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if + false --> + <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool> +</resources> diff --git a/java/res/values/urls.xml b/java/res/values/config-screen-metrics.xml index a8e9ad7d3..99629944a 100644 --- a/java/res/values/urls.xml +++ b/java/res/values/config-screen-metrics.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2013, 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,6 +17,8 @@ ** limitations under the License. */ --> + <resources> - <string name="research_logger_upload_url" translatable="false"></string> + <!-- Must be aligned with {@link Constants#SCREEN_METRICS_SMALL_PHONE}. --> + <integer name="config_screen_metrics">0</integer> </resources> diff --git a/java/res/layout/key_preview_ics.xml b/java/res/values/config-spellchecker-thresholds.xml index 33b6947ef..e99ba6621 100644 --- a/java/res/layout/key_preview_ics.xml +++ b/java/res/values/config-spellchecker-thresholds.xml @@ -18,10 +18,8 @@ */ --> -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/keyboard_key_feedback_ics" - android:minWidth="32dp" - android:gravity="center" -/> +<resources> + <!-- Threshold of the normalized score of the best suggestion for the spell checker to declare + a word to be "recommended" --> + <string name="spellchecker_recommended_threshold_value" translatable="false">0.11</string> +</resources> diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 61779d4b5..709121392 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -18,120 +18,72 @@ */ --> +<!-- Configuration values for Small Phone Portrait. --> <resources> <bool name="config_use_fullscreen_mode">false</bool> - <bool name="config_enable_show_voice_key_option">true</bool> - <bool name="config_enable_show_option_of_key_preview_popup">true</bool> - <!-- TODO: Disable the following configuration for production. --> - <bool name="config_enable_usability_study_mode_option">true</bool> - <!-- Whether or not Popup on key press is enabled by default --> - <bool name="config_default_key_preview_popup">true</bool> - <!-- Default value for next word prediction: after entering a word and a space only, should we look - at input history to suggest a hopefully helpful suggestions for the next word? --> - <bool name="config_default_next_word_prediction">true</bool> - <bool name="config_default_sound_enabled">false</bool> - <bool name="config_default_vibration_enabled">true</bool> - <integer name="config_max_vibration_duration">100</integer> <!-- milliseconds --> - <integer name="config_delay_update_suggestions">100</integer> - <integer name="config_delay_update_old_suggestions">300</integer> - <integer name="config_delay_update_shift_state">100</integer> - <integer name="config_language_on_spacebar_final_alpha">128</integer> - <integer name="config_more_keys_keyboard_fadein_anim_time">0</integer> - <integer name="config_more_keys_keyboard_fadeout_anim_time">100</integer> - <integer name="config_keyboard_grid_width">32</integer> - <integer name="config_keyboard_grid_height">16</integer> - <integer name="config_double_space_period_timeout">1100</integer> - <!-- This configuration is an index of {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. --> - <string name="config_default_keyboard_theme_index" translatable="false">2</string> - <integer name="config_max_more_keys_column">5</integer> - <!-- - Configuration for MainKeyboardView - --> <dimen name="config_key_hysteresis_distance">8.0dp</dimen> - <dimen name="config_key_hysteresis_distance_for_sliding_modifier">8.0dp</dimen> - <integer name="config_touch_noise_threshold_time">40</integer> - <dimen name="config_touch_noise_threshold_distance">12.6dp</dimen> - <integer name="config_key_preview_linger_timeout">70</integer> - <bool name="config_sliding_key_input_enabled">true</bool> - <!-- Sliding key input preview parameters --> - <dimen name="config_sliding_key_input_preview_width">8.0dp</dimen> - <!-- Percentages of sliding key input preview body and shadow, in proportion to the width. - A negative value of the shadow ratio disables drawing shadow. --> - <!-- TODO: May use the shadow to alleviate rugged trail drawing. --> - <integer name="config_sliding_key_input_preview_body_ratio">100</integer> - <integer name="config_sliding_key_input_preview_shadow_ratio">-1</integer> - <integer name="config_key_repeat_start_timeout">400</integer> - <integer name="config_key_repeat_interval">50</integer> - <integer name="config_default_longpress_key_timeout">300</integer> <!-- milliseconds --> - <integer name="config_longpress_timeout_step">10</integer> <!-- milliseconds --> - <integer name="config_min_longpress_timeout">100</integer> <!-- milliseconds --> - <integer name="config_max_longpress_timeout">700</integer> <!-- milliseconds --> - <!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 --> - <integer name="config_longpress_shift_lock_timeout">1200</integer> <!-- milliseconds --> - <integer name="config_ignore_alt_code_key_timeout">350</integer> <!-- milliseconds --> - <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if - false --> - <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool> - <bool name="config_block_potentially_offensive">true</bool> - <integer name="config_gesture_floating_preview_text_linger_timeout">200</integer> - <integer name="config_gesture_trail_fadeout_start_delay">100</integer> - <integer name="config_gesture_trail_fadeout_duration">800</integer> - <integer name="config_gesture_trail_update_interval">20</integer> - <!-- Static threshold for gesture after fast typing (msec) --> - <integer name="config_gesture_static_time_threshold_after_fast_typing">500</integer> - <!-- Static threshold for starting gesture detection (keyWidth%/sec) --> - <fraction name="config_gesture_detect_fast_move_speed_threshold">150%</fraction> - <!-- Dynamic threshold for gesture after fast typing (msec) --> - <integer name="config_gesture_dynamic_threshold_decay_duration">450</integer> - <!-- Time based threshold values for gesture detection (msec) --> - <integer name="config_gesture_dynamic_time_threshold_from">300</integer> - <integer name="config_gesture_dynamic_time_threshold_to">20</integer> - <!-- Distance based threshold values for gesture detection (keyWidth%/sec) --> - <fraction name="config_gesture_dynamic_distance_threshold_from">600%</fraction> - <fraction name="config_gesture_dynamic_distance_threshold_to">50%</fraction> - <!-- Parameter for gesture sampling (keyWidth%/sec) --> - <fraction name="config_gesture_sampling_minimum_distance">16.6666%</fraction> - <!-- Parameters for gesture recognition (msec) and (keyWidth%/sec) --> - <integer name="config_gesture_recognition_minimum_time">100</integer> - <integer name="config_gesture_recognition_update_time">100</integer> - <fraction name="config_gesture_recognition_speed_threshold">550%</fraction> - <!-- Suppress showing key preview duration after batch input in millisecond --> - <integer name="config_suppress_key_preview_after_batch_input_duration">1000</integer> - <!-- - Configuration for auto correction - --> - <string-array name="auto_correction_threshold_values" translatable="false"> - <!-- Off, When auto correction setting is Off, this value is not used. --> - <item>floatMaxValue</item> - <!-- Modest : Suggestion whose normalized score is greater than this value - will be subject to auto-correction. --> - <item>0.185</item> - <!-- Aggressive --> - <item>0.067</item> - <!-- Very Aggressive : Suggestion whose normalized score is greater than this value - will be subject to auto-correction. "floatNegativeInfinity" is a special marker - string for Float.NEGATIVE_INFINITY --> - <item>floatNegativeInfinity</item> - </string-array> - <!-- Threshold of the normalized score of the best suggestion for the spell checker to declare - a word to be "recommended" --> - <string name="spellchecker_recommended_threshold_value" translatable="false">0.11</string> - <!-- Screen metrics for logging. - 0 = "mdpi phone screen" - 1 = "hdpi phone screen" - 2 = "mdpi 11 inch tablet screen" - 3 = "xhdpi phone screen?" - 4 = ? - --> - <integer name="log_screen_metrics">0</integer> - <!-- Settings for the dictionary pack --> - <bool name="allow_over_metered">false</bool> - <bool name="allow_over_roaming">false</bool> - <bool name="dict_downloads_visible_in_download_UI">false</bool> - <bool name="metadata_downloads_visible_in_download_UI">false</bool> - <bool name="display_notification_for_auto_update">false</bool> - <bool name="display_notification_for_user_requested_update">false</bool> + <!-- Preferable keyboard height in absolute scale: 1.285in --> + <!-- This config_default_keyboard_height value should match with keyboard-heights.xml --> + <dimen name="config_default_keyboard_height">205.6dp</dimen> + <fraction name="config_max_keyboard_height">46%p</fraction> + <fraction name="config_min_keyboard_height">-61.8%p</fraction> + <dimen name="config_more_keys_keyboard_key_height">52.8dp</dimen> + <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> + <!-- config_more_keys_keyboard_key_height x 1.2 --> + <dimen name="config_more_keys_keyboard_slide_allowance">63.36dp</dimen> + <dimen name="config_more_keys_keyboard_key_horizontal_padding">8dp</dimen> + + <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction> + <fraction name="config_keyboard_bottom_padding_holo">4.669%p</fraction> + <fraction name="config_key_vertical_gap_holo">6.127%p</fraction> + <fraction name="config_key_horizontal_gap_holo">1.739%p</fraction> + <!-- config_more_keys_keyboard_key_height x -0.5 --> + <dimen name="config_more_keys_keyboard_vertical_correction_holo">-26.4dp</dimen> + <dimen name="config_key_preview_offset_holo">8.0dp</dimen> + + <dimen name="config_key_preview_height">80dp</dimen> + <fraction name="config_key_preview_text_ratio">82%</fraction> + <fraction name="config_key_letter_ratio">55%</fraction> + <fraction name="config_key_large_letter_ratio">65%</fraction> + <fraction name="config_key_label_ratio">34%</fraction> + <fraction name="config_key_large_label_ratio">40%</fraction> + <fraction name="config_key_hint_letter_ratio">25%</fraction> + <fraction name="config_key_hint_label_ratio">44%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio">35%</fraction> + <fraction name="config_language_on_spacebar_text_ratio">33.735%</fraction> + <dimen name="config_key_label_horizontal_padding">4dp</dimen> + <dimen name="config_key_hint_letter_padding">1dp</dimen> + <dimen name="config_key_shifted_letter_hint_padding">2dp</dimen> + + <!-- For 5-row keyboard --> + <fraction name="config_key_vertical_gap_5row">3.20%p</fraction> + <fraction name="config_key_letter_ratio_5row">55%</fraction> + <fraction name="config_key_shifted_letter_hint_ratio_5row">41%</fraction> + + <dimen name="config_suggestions_strip_height">40dp</dimen> + <dimen name="config_suggestions_strip_horizontal_margin">36dp</dimen> + <dimen name="config_suggestions_strip_edge_key_width">36dp</dimen> + <dimen name="config_more_suggestions_row_height">40dp</dimen> + <integer name="config_max_more_suggestions_row">6</integer> + <fraction name="config_min_more_suggestions_width">90%</fraction> + <dimen name="config_suggestion_min_width">44dp</dimen> + <dimen name="config_suggestion_text_horizontal_padding">6dp</dimen> + <dimen name="config_suggestion_text_size">18dp</dimen> + <dimen name="config_more_suggestions_hint_text_size">27dp</dimen> + + <!-- Gesture floating preview text parameters --> + <dimen name="config_gesture_floating_preview_text_size">24dp</dimen> + <dimen name="config_gesture_floating_preview_text_offset">73dp</dimen> + <dimen name="config_gesture_floating_preview_horizontal_padding">24dp</dimen> + <dimen name="config_gesture_floating_preview_vertical_padding">16dp</dimen> + <dimen name="config_gesture_floating_preview_round_radius">2dp</dimen> + + <!-- Emoji keyboard --> + <fraction name="config_emoji_keyboard_key_width">14.2857%p</fraction> + <fraction name="config_emoji_keyboard_row_height">33%p</fraction> + <fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction> + <integer name="config_emoji_keyboard_max_page_key_count">21</integer> </resources> diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml deleted file mode 100644 index 4588b10eb..000000000 --- a/java/res/values/dimens.xml +++ /dev/null @@ -1,132 +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. -*/ ---> - -<resources> - <!-- Preferable keyboard height in absolute scale: 1.285in --> - <!-- This keyboardHeight value should match with keyboard-heights.xml --> - <dimen name="keyboardHeight">205.6dp</dimen> - <fraction name="maxKeyboardHeight">46%p</fraction> - <fraction name="minKeyboardHeight">-61.8%p</fraction> - - <dimen name="popup_key_height">52.8dp</dimen> - - <dimen name="more_keys_keyboard_key_horizontal_padding">8dp</dimen> - - <fraction name="keyboard_left_padding">0%p</fraction> - <fraction name="keyboard_right_padding">0%p</fraction> - - <fraction name="keyboard_top_padding_gb">1.556%p</fraction> - <fraction name="keyboard_bottom_padding_gb">4.669%p</fraction> - <fraction name="key_bottom_gap_gb">6.495%p</fraction> - <fraction name="key_horizontal_gap_gb">1.971%p</fraction> - - <fraction name="keyboard_top_padding_holo">2.335%p</fraction> - <fraction name="keyboard_bottom_padding_holo">4.669%p</fraction> - <fraction name="key_bottom_gap_holo">6.127%p</fraction> - <fraction name="key_horizontal_gap_holo">1.739%p</fraction> - - <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. --> - <!-- popup_key_height x 1.2 --> - <dimen name="more_keys_keyboard_slide_allowance">63.36dp</dimen> - <!-- popup_key_height x -1.0 --> - <dimen name="more_keys_keyboard_vertical_correction_gb">-52.8dp</dimen> - <dimen name="keyboard_vertical_correction">0.0dp</dimen> - - <fraction name="key_letter_ratio">55%</fraction> - <fraction name="key_large_letter_ratio">65%</fraction> - <fraction name="key_label_ratio">34%</fraction> - <fraction name="key_large_label_ratio">40%</fraction> - <fraction name="key_hint_letter_ratio">25%</fraction> - <fraction name="key_hint_label_ratio">44%</fraction> - <fraction name="key_uppercase_letter_ratio">35%</fraction> - <fraction name="key_preview_text_ratio">82%</fraction> - <fraction name="spacebar_text_ratio">33.735%</fraction> - <dimen name="key_preview_height">80dp</dimen> - <dimen name="key_preview_offset_gb">-8.0dp</dimen> - - <dimen name="key_label_horizontal_padding">4dp</dimen> - <dimen name="key_hint_letter_padding">1dp</dimen> - <dimen name="key_popup_hint_letter_padding">2dp</dimen> - <dimen name="key_uppercase_letter_padding">2dp</dimen> - - <!-- For 5-row keyboard --> - <fraction name="key_bottom_gap_5row">3.20%p</fraction> - <fraction name="key_letter_ratio_5row">64%</fraction> - <fraction name="key_uppercase_letter_ratio_5row">41%</fraction> - - <dimen name="key_preview_offset_holo">8.0dp</dimen> - <!-- popup_key_height x -0.5 --> - <dimen name="more_keys_keyboard_vertical_correction_holo">-26.4dp</dimen> - - <dimen name="suggestions_strip_height">40dp</dimen> - <dimen name="more_suggestions_key_horizontal_padding">12dp</dimen> - <dimen name="more_suggestions_row_height">40dp</dimen> - <dimen name="more_suggestions_bottom_gap">6dp</dimen> - <dimen name="more_suggestions_modal_tolerance">32.0dp</dimen> - <dimen name="more_suggestions_slide_allowance">16.0dp</dimen> - <integer name="max_more_suggestions_row">6</integer> - <fraction name="min_more_suggestions_width">90%</fraction> - <fraction name="more_suggestions_info_ratio">18%</fraction> - <dimen name="suggestions_strip_padding">0dp</dimen> - <dimen name="suggestion_min_width">44dp</dimen> - <dimen name="suggestion_padding">6dp</dimen> - <dimen name="suggestion_text_size">18dp</dimen> - <dimen name="more_suggestions_hint_text_size">27dp</dimen> - <integer name="suggestions_count_in_strip">3</integer> - <fraction name="center_suggestion_percentile">36%</fraction> - - <!-- Gesture trail parameters --> - <!-- Minimum distance between gesture trail sampling points. --> - <dimen name="gesture_trail_min_sampling_distance">9.6dp</dimen> - <!-- Maximum angular threshold between gesture trails interpolation segments in degree. --> - <integer name="gesture_trail_max_interpolation_angular_threshold">15</integer> - <!-- Maximum distance threshold between gesture trails interpolation segments. --> - <dimen name="gesture_trail_max_interpolation_distance_threshold">16.0dp</dimen> - <!-- Maximum number of gesture trail interpolation segments. --> - <integer name="gesture_trail_max_interpolation_segments">6</integer> - <dimen name="gesture_trail_start_width">10.0dp</dimen> - <dimen name="gesture_trail_end_width">2.5dp</dimen> - <!-- Percentages of gesture preview taril body and shadow, in proportion to the trail width. - A negative value of the shadow ratio disables drawing shadow. --> - <!-- TODO: May use the shadow to alleviate rugged trail drawing. --> - <integer name="gesture_trail_body_ratio">100</integer> - <integer name="gesture_trail_shadow_ratio">-1</integer> - <!-- Gesture floating preview text parameters --> - <dimen name="gesture_floating_preview_text_size">24dp</dimen> - <dimen name="gesture_floating_preview_text_offset">73dp</dimen> - <dimen name="gesture_floating_preview_horizontal_padding">24dp</dimen> - <dimen name="gesture_floating_preview_vertical_padding">16dp</dimen> - <dimen name="gesture_floating_preview_round_radius">2dp</dimen> - - <!-- Emoji keyboard --> - <fraction name="emoji_keyboard_key_width">14.2857%p</fraction> - <fraction name="emoji_keyboard_row_height">33%p</fraction> - <fraction name="emoji_keyboard_key_letter_size">68%p</fraction> - <integer name="emoji_keyboard_max_key_count">21</integer> - <dimen name="emoji_category_page_id_height">3dp</dimen> - - <!-- Inset used in Accessibility mode to avoid accidental key presses when a finger slides off the screen. --> - <dimen name="accessibility_edge_slop">8dp</dimen> - - <integer name="user_dictionary_max_word_length" translatable="false">48</integer> - - <dimen name="language_on_spacebar_horizontal_margin">1dp</dimen> - -</resources> diff --git a/java/res/values/donottranslate-config-important-notice.xml b/java/res/values/donottranslate-config-important-notice.xml new file mode 100644 index 000000000..7c6527c28 --- /dev/null +++ b/java/res/values/donottranslate-config-important-notice.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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> + <!-- The array of the text of the important notices displayed on the suggestion strip. --> + <string-array name="important_notice_title_array" translatable="false"> + <!-- empty --> + </string-array> + <!-- The array of the contents of the important notices. --> + <string-array name="important_notice_contents_array" translatable="false"> + <!-- empty --> + </string-array> +</resources> diff --git a/java/res/values/donottranslate-config-spacing-and-punctuations.xml b/java/res/values/donottranslate-config-spacing-and-punctuations.xml new file mode 100644 index 000000000..2faf578d2 --- /dev/null +++ b/java/res/values/donottranslate-config-spacing-and-punctuations.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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"> + <!-- TODO: these settings depend on the language. They should be put either in the dictionary + header, or in the subtype maybe? --> + <!-- Symbols that are suggested between words --> + <string name="suggested_punctuations">!,?,\\,,:,;,\",(,),\',-,/,@,_</string> + <!-- Symbols that are normally preceded by a space (used to add an auto-space before these) --> + <string name="symbols_preceded_by_space">([{&</string> + <!-- Symbols that are normally followed by a space (used to add an auto-space after these) --> + <string name="symbols_followed_by_space">.,;:!?)]}&</string> + <!-- Symbols that behave like a single punctuation when typed next to each other --> + <string name="symbols_clustering_together"></string> + <!-- Symbols that separate words --> + <!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) --> + <string name="symbols_word_separators">"	 
 "()[]{}*&<>+=|.,;:!?/_\"</string> + <!-- Word connectors --> + <string name="symbols_word_connectors">\'-</string> + <!-- The sentence separator code point, for capitalization --> + <!-- U+002E: "." FULL STOP ; 2Eh = 46d --> + <integer name="sentence_separator">46</integer> + <!-- Whether this language uses spaces between words --> + <bool name="current_language_has_spaces">true</bool> +</resources> diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index af5ec061b..83d082f82 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -18,25 +18,6 @@ */ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- TODO: these settings depend on the language. They should be put either in the dictionary - header, or in the subtype maybe? --> - <!-- Symbols that are suggested between words --> - <string name="suggested_punctuations">!,?,\\,,:,;,\",(,),\',-,/,@,_</string> - <!-- Symbols that are normally preceded by a space (used to add an auto-space before these) --> - <string name="symbols_preceded_by_space">([{&</string> - <!-- Symbols that are normally followed by a space (used to add an auto-space after these) --> - <string name="symbols_followed_by_space">.,;:!?)]}&</string> - <!-- Symbols that separate words --> - <!-- Don't remove the enclosing double quotes, they protect whitespace (not just U+0020) --> - <string name="symbols_word_separators">"	 \n"()[]{}*&<>+=|.,;:!?/_\"</string> - <!-- Word connectors --> - <string name="symbols_word_connectors">\'-</string> - <!-- The sentence separator code point, for capitalization --> - <!-- U+002E: "." FULL STOP ; 2Eh = 46d --> - <integer name="sentence_separator">46</integer> - <!-- Whether this language uses spaces between words --> - <bool name="current_language_has_spaces">true</bool> - <!-- Always show the suggestion strip --> <string name="prefs_suggestion_visibility_show_value">0</string> <!-- Show the suggestion strip only on portrait mode --> @@ -57,78 +38,15 @@ <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_aggressive">2</string> - <string name="auto_correction_threshold_mode_index_very_aggressive">3</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_aggressive</item> - <item>@string/auto_correction_threshold_mode_index_very_aggressive</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_aggressive</item> - <item>@string/auto_correction_threshold_mode_very_aggressive</item> - </string-array> - + <!-- For backward compatibility. + See {@link SettingsValues#needsToShowVoiceInputKey(SharedPreferences,Resources)} --> <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> <string name="prefs_force_non_distinct_multitouch">Force non-distinct multitouch</string> - <!-- Keyboard theme names --> - <string name="layout_gingerbread">Gingerbread</string> - <string name="layout_ics">IceCreamSandwich</string> - <string name="layout_klp">KeyLimePie</string> - - <!-- For keyboard theme switcher dialog --> - <string-array name="keyboard_layout_modes"> - <item>@string/layout_ics</item> - <item>@string/layout_gingerbread</item> - <item>@string/layout_klp</item> - </string-array> - <!-- An element must be an index of {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. --> - <string-array name="keyboard_layout_modes_values"> - <item>0</item> - <item>1</item> - <item>2</item> - </string-array> - - <!-- For keyboard color scheme option dialog. --> - <string-array name="keyboard_color_schemes"> - <item>@string/keyboard_color_scheme_white</item> - <item>@string/keyboard_color_scheme_blue</item> - </string-array> - <!-- An element must be an index of {@link KeyboardSwitcher#KEYBOARD_THEMES[]}. --> - <string-array name="keyboard_color_schemes_values"> - <item>2</item> - <item>0</item> - </string-array> - <!-- Subtype locale display name exceptions. For each exception, there should be related string resources for display name that may have explicit keyboard layout. The string resource name must be "subtype_<locale>" or @@ -219,6 +137,4 @@ <item>tr:AsciiCapable,SupportTouchPositionCorrection,EmojiCapable</item> <item>qwerty</item> </string-array> - - <string name="settings_warning_researcher_mode">Attention! You are using the special keyboard for research purposes.</string> </resources> diff --git a/java/res/values/keyboard-heights.xml b/java/res/values/keyboard-heights.xml index c651a89b3..12dd51d9d 100644 --- a/java/res/values/keyboard-heights.xml +++ b/java/res/values/keyboard-heights.xml @@ -33,7 +33,5 @@ <!-- Preferable keyboard height in absolute scale: 48.0mm --> <!-- Xoom --> <item>HARDWARE=stingray,283.1337</item> - <!-- Default value for unknown device: empty string --> - <item>,</item> </string-array> </resources> diff --git a/java/res/values/keyboard-icons-holo.xml b/java/res/values/keyboard-icons-holo.xml index b49e1d10b..669d2c07d 100644 --- a/java/res/values/keyboard-icons-holo.xml +++ b/java/res/values/keyboard-icons-holo.xml @@ -21,9 +21,6 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="KeyboardIcons.Holo"> <!-- Keyboard icons --> - <!-- TODO: The following holo icon for phone (drawable-hdpi and drawable-xhdpi) are missing. - sym_keyboard_123_mic_holo - --> <item name="iconShiftKey">@drawable/sym_keyboard_shift_holo_dark</item> <item name="iconDeleteKey">@drawable/sym_keyboard_delete_holo_dark</item> <item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo_dark</item> @@ -32,7 +29,6 @@ <item name="iconSearchKey">@drawable/sym_keyboard_search_holo_dark</item> <item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item> <item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo_dark</item> - <item name="iconShortcutForLabel">@drawable/sym_keyboard_label_mic_holo_dark</item> <item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_holo_dark</item> <item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_holo_dark</item> <item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_holo_dark</item> diff --git a/java/res/values/keyboard-icons-lxx-dark.xml b/java/res/values/keyboard-icons-lxx-dark.xml new file mode 100644 index 000000000..6e9c4d1c1 --- /dev/null +++ b/java/res/values/keyboard-icons-lxx-dark.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <style name="KeyboardIcons.LXX_Dark"> + <!-- Keyboard icons --> + <!-- TODO: Update those icons for LXX theme. --> + <item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item> + <item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item> + <item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item> + <item name="iconSpaceKey">@drawable/sym_keyboard_spacebar_lxx_dark</item> + <item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_dark</item> + <item name="iconGoKey">@drawable/sym_keyboard_go_lxx_dark</item> + <item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_dark</item> + <item name="iconSendKey">@drawable/sym_keyboard_send_lxx_dark</item> + <item name="iconNextKey">@drawable/sym_keyboard_next_lxx_dark</item> + <item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_dark</item> + <item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_dark</item> + <item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item> + <item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_dark</item> + <item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_holo_dark</item> + <item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_dark</item> + <item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_dark</item> + <item name="iconTabKeyPreview">@drawable/sym_keyboard_feedback_tab</item> + <item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_dark</item> + <item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_holo_dark</item> + <item name="iconZwjKey">@drawable/sym_keyboard_zwj_holo_dark</item> + <item name="iconEmojiKey">@drawable/sym_keyboard_smiley_lxx_dark</item> + </style> +</resources> diff --git a/java/res/values/keyboard-themes.xml b/java/res/values/keyboard-themes.xml new file mode 100644 index 000000000..28a34c315 --- /dev/null +++ b/java/res/values/keyboard-themes.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- For keyboard color scheme option dialog. --> + <string-array name="keyboard_theme_names" translatable="false"> + <!-- TODO: Implement Material Light theme. --> + <item>@string/keyboard_theme_material_dark</item> + <item>@string/keyboard_theme_holo_white</item> + <item>@string/keyboard_theme_holo_blue</item> + </string-array> + <!-- An element must be a keyboard theme id of {@link KeyboardTheme#THEME_ID_*}. --> + <string-array name="keyboard_theme_ids" translatable="false"> + <!-- TODO: Implement Material Light theme. --> + <item>3</item> + <item>2</item> + <item>0</item> + </string-array> +</resources> diff --git a/java/res/values/keypress-vibration-durations.xml b/java/res/values/keypress-vibration-durations.xml index cde4e4447..032b5fd91 100644 --- a/java/res/values/keypress-vibration-durations.xml +++ b/java/res/values/keypress-vibration-durations.xml @@ -59,7 +59,5 @@ <item>MODEL=XT1035:MANUFACTURER=motorola,18</item> <!-- Sony Xperia Z, Z Ultra --> <item>MODEL=C6603|C6806:MANUFACTURER=Sony,35</item> - <!-- Default value for unknown device. The negative value means system default. --> - <item>,-1</item> </string-array> </resources> diff --git a/java/res/values/keypress-volumes.xml b/java/res/values/keypress-volumes.xml index d359055c2..074581d00 100644 --- a/java/res/values/keypress-volumes.xml +++ b/java/res/values/keypress-volumes.xml @@ -26,7 +26,5 @@ <item>HARDWARE=grouper,0.3f</item> <item>HARDWARE=mako,0.3f</item> <item>HARDWARE=manta,0.2f</item> - <!-- Default value for unknown device. The negative value means system default. --> - <item>,-1.0f</item> </string-array> </resources> diff --git a/java/res/values/phantom-sudden-move-event-device-list.xml b/java/res/values/phantom-sudden-move-event-device-list.xml index 53002b31e..4f91cd389 100644 --- a/java/res/values/phantom-sudden-move-event-device-list.xml +++ b/java/res/values/phantom-sudden-move-event-device-list.xml @@ -23,7 +23,5 @@ See {@link com.android.inputmethod.keyboard.PointerTracker}. --> <!-- Xoom --> <item>HARDWARE=stingray,true</item> - <!-- Default value for unknown device --> - <item>,false</item> </string-array> </resources> diff --git a/java/res/values/platform-theme.xml b/java/res/values/platform-theme.xml new file mode 100644 index 000000000..8e131a2b0 --- /dev/null +++ b/java/res/values/platform-theme.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <style name="platformActivityTheme" parent="@android:style/Theme.Holo" /> + <style name="platformDialogTheme" parent="@android:style/Theme.Holo.Dialog" /> +</resources> diff --git a/java/res/values/research_strings.xml b/java/res/values/research_strings.xml deleted file mode 100644 index e73871109..000000000 --- a/java/res/values/research_strings.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Contents of note explaining what data is collected and how. --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_splash_content" translatable="false"></string> - <!-- Account type allowed for inclusion in user-invoked feedback logs [CHAR LIMIT=38] --> - <string name="research_account_type" translatable="false"></string> - <!-- Account domain allowed for inclusion in user-invoked feedback logs [CHAR LIMIT=38] --> - <string name="research_allowed_account_domain" translatable="false"></string> - - <!-- Menu option that lets user send feedback for research purposes about the IME [CHAR LIMIT=38] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_menu_option" translatable="false">Send feedback</string> - <!-- Title of dialog box that lets user send feedback for research purposes about the IME [CHAR LIMIT=38] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_dialog_title" translatable="false">Send feedback</string> - <!-- Hint to user about the text entry field where they should enter research feedback [CHAR LIMIT=40] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_hint" translatable="false">Enter your feedback here.</string> - <!-- Message informing the user that the feedback string must not be empty [CHAR LIMIT=100] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_empty_feedback_error_message" translatable="false">The feedback field must not be empty.</string> -</resources> diff --git a/java/res/values/strings-action-keys.xml b/java/res/values/strings-action-keys.xml index 7003784c6..96b2e7dda 100644 --- a/java/res/values/strings-action-keys.xml +++ b/java/res/values/strings-action-keys.xml @@ -29,6 +29,8 @@ <string name="label_done_key">Done</string> <!-- Label for soft enter key when it performs SEND action. Must be short to fit on key. 5 chars or less is preferable. [CHAR LIMIT=7] --> <string name="label_send_key">Send</string> + <!-- Label for soft enter key when it performs SEARCH action. Must be short to fit on key. 5 chars or less is preferable. [CHAR LIMIT=7] --> + <string name="label_search_key">Search</string> <!-- Label for "Pause" key of phone number keyboard. Must be short to fit on key. 5 chars or less is preferable. [CHAR LIMIT=7] --> <string name="label_pause_key">Pause</string> <!-- Label for "Wait" key of phone number keyboard. Must be short to fit on key. 5 chars or less is preferable. [CHAR LIMIT=7]--> diff --git a/java/res/values-hdpi/config.xml b/java/res/values/strings-config-important-notice.xml index 4cf3562fe..aa3cd109c 100644 --- a/java/res/values-hdpi/config.xml +++ b/java/res/values/strings-config-important-notice.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2011, The Android Open Source Project +** Copyright 2014, 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. @@ -19,12 +19,7 @@ --> <resources> - <!-- Screen metrics for logging. - 0 = "mdpi phone screen" - 1 = "hdpi phone screen" - 2 = "mdpi 11 inch tablet screen" - 3 = "xhdpi phone screen?" - 4 = ? - --> - <integer name="log_screen_metrics">1</integer> + <integer name="config_important_notice_version">0</integer> + <!-- Description for option enabling the use by the keyboards of sent/received messages, e-mail and typing history to improve suggestion accuracy [CHAR LIMIT=68] --> + <string name="use_personalized_dicts_summary">Learn from your communications and typed data to improve suggestions</string> </resources> diff --git a/java/res/values/strings-emoji-descriptions.xml b/java/res/values/strings-emoji-descriptions.xml new file mode 100644 index 000000000..8cbde264c --- /dev/null +++ b/java/res/values/strings-emoji-descriptions.xml @@ -0,0 +1,1671 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> +<!-- + These Emoji symbols are unsupported by TTS. + TODO: Remove this file when TTS/TalkBack support these Emoji symbols. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Spoken description for Unicode code point U+00A9: "©" COPYRIGHT SIGN --> + <string name="spoken_emoji_00A9">Copyright sign</string> + <!-- Spoken description for Unicode code point U+00AE: "®" REGISTERED SIGN --> + <string name="spoken_emoji_00AE">Registered sign</string> + <!-- Spoken description for Unicode code point U+203C: "‼" DOUBLE EXCLAMATION MARK --> + <string name="spoken_emoji_203C">Double exclamation mark</string> + <!-- Spoken description for Unicode code point U+2049: "⁉" EXCLAMATION QUESTION MARK --> + <string name="spoken_emoji_2049">Exclamation question mark</string> + <!-- Spoken description for Unicode code point U+2122: "™" TRADE MARK SIGN --> + <string name="spoken_emoji_2122">Trade mark sign</string> + <!-- Spoken description for Unicode code point U+2139: "ℹ" INFORMATION SOURCE --> + <string name="spoken_emoji_2139">Information source</string> + <!-- Spoken description for Unicode code point U+2194: "↔" LEFT RIGHT ARROW --> + <string name="spoken_emoji_2194">Left right arrow</string> + <!-- Spoken description for Unicode code point U+2195: "↕" UP DOWN ARROW --> + <string name="spoken_emoji_2195">Up down arrow</string> + <!-- Spoken description for Unicode code point U+2196: "↖" NORTH WEST ARROW --> + <string name="spoken_emoji_2196">North west arrow</string> + <!-- Spoken description for Unicode code point U+2197: "↗" NORTH EAST ARROW --> + <string name="spoken_emoji_2197">North east arrow</string> + <!-- Spoken description for Unicode code point U+2198: "↘" SOUTH EAST ARROW --> + <string name="spoken_emoji_2198">South east arrow</string> + <!-- Spoken description for Unicode code point U+2199: "↙" SOUTH WEST ARROW --> + <string name="spoken_emoji_2199">South west arrow</string> + <!-- Spoken description for Unicode code point U+21A9: "↩" LEFTWARDS ARROW WITH HOOK --> + <string name="spoken_emoji_21A9">Leftwards arrow with hook</string> + <!-- Spoken description for Unicode code point U+21AA: "↪" RIGHTWARDS ARROW WITH HOOK --> + <string name="spoken_emoji_21AA">Rightwards arrow with hook</string> + <!-- Spoken description for Unicode code point U+231A: "⌚" WATCH --> + <string name="spoken_emoji_231A">Watch</string> + <!-- Spoken description for Unicode code point U+231B: "⌛" HOURGLASS --> + <string name="spoken_emoji_231B">Hourglass</string> + <!-- Spoken description for Unicode code point U+23E9: "⏩" BLACK RIGHT-POINTING DOUBLE TRIANGLE --> + <string name="spoken_emoji_23E9">Black right-pointing double triangle</string> + <!-- Spoken description for Unicode code point U+23EA: "⏪" BLACK LEFT-POINTING DOUBLE TRIANGLE --> + <string name="spoken_emoji_23EA">Black left-pointing double triangle</string> + <!-- Spoken description for Unicode code point U+23EB: "⏫" BLACK UP-POINTING DOUBLE TRIANGLE --> + <string name="spoken_emoji_23EB">Black up-pointing double triangle</string> + <!-- Spoken description for Unicode code point U+23EC: "⏬" BLACK DOWN-POINTING DOUBLE TRIANGLE --> + <string name="spoken_emoji_23EC">Black down-pointing double triangle</string> + <!-- Spoken description for Unicode code point U+23F0: "⏰" ALARM CLOCK --> + <string name="spoken_emoji_23F0">Alarm clock</string> + <!-- Spoken description for Unicode code point U+23F3: "⏳" HOURGLASS WITH FLOWING SAND --> + <string name="spoken_emoji_23F3">Hourglass with flowing sand</string> + <!-- Spoken description for Unicode code point U+24C2: "Ⓜ" CIRCLED LATIN CAPITAL LETTER M --> + <string name="spoken_emoji_24C2">Circled latin capital letter m</string> + <!-- Spoken description for Unicode code point U+25AA: "▪" BLACK SMALL SQUARE --> + <string name="spoken_emoji_25AA">Black small square</string> + <!-- Spoken description for Unicode code point U+25AB: "▫" WHITE SMALL SQUARE --> + <string name="spoken_emoji_25AB">White small square</string> + <!-- Spoken description for Unicode code point U+25B6: "▶" BLACK RIGHT-POINTING TRIANGLE --> + <string name="spoken_emoji_25B6">Black right-pointing triangle</string> + <!-- Spoken description for Unicode code point U+25C0: "◀" BLACK LEFT-POINTING TRIANGLE --> + <string name="spoken_emoji_25C0">Black left-pointing triangle</string> + <!-- Spoken description for Unicode code point U+25FB: "◻" WHITE MEDIUM SQUARE --> + <string name="spoken_emoji_25FB">White medium square</string> + <!-- Spoken description for Unicode code point U+25FC: "◼" BLACK MEDIUM SQUARE --> + <string name="spoken_emoji_25FC">Black medium square</string> + <!-- Spoken description for Unicode code point U+25FD: "◽" WHITE MEDIUM SMALL SQUARE --> + <string name="spoken_emoji_25FD">White medium small square</string> + <!-- Spoken description for Unicode code point U+25FE: "◾" BLACK MEDIUM SMALL SQUARE --> + <string name="spoken_emoji_25FE">Black medium small square</string> + <!-- Spoken description for Unicode code point U+2600: "☀" BLACK SUN WITH RAYS --> + <string name="spoken_emoji_2600">Black sun with rays</string> + <!-- Spoken description for Unicode code point U+2601: "☁" CLOUD --> + <string name="spoken_emoji_2601">Cloud</string> + <!-- Spoken description for Unicode code point U+260E: "☎" BLACK TELEPHONE --> + <string name="spoken_emoji_260E">Black telephone</string> + <!-- Spoken description for Unicode code point U+2611: "☑" BALLOT BOX WITH CHECK --> + <string name="spoken_emoji_2611">Ballot box with check</string> + <!-- Spoken description for Unicode code point U+2614: "☔" UMBRELLA WITH RAIN DROPS --> + <string name="spoken_emoji_2614">Umbrella with rain drops</string> + <!-- Spoken description for Unicode code point U+2615: "☕" HOT BEVERAGE --> + <string name="spoken_emoji_2615">Hot beverage</string> + <!-- Spoken description for Unicode code point U+261D: "☝" WHITE UP POINTING INDEX --> + <string name="spoken_emoji_261D">White up pointing index</string> + <!-- Spoken description for Unicode code point U+263A: "☺" WHITE SMILING FACE --> + <string name="spoken_emoji_263A">White smiling face</string> + <!-- Spoken description for Unicode code point U+2648: "♈" ARIES --> + <string name="spoken_emoji_2648">Aries</string> + <!-- Spoken description for Unicode code point U+2649: "♉" TAURUS --> + <string name="spoken_emoji_2649">Taurus</string> + <!-- Spoken description for Unicode code point U+264A: "♊" GEMINI --> + <string name="spoken_emoji_264A">Gemini</string> + <!-- Spoken description for Unicode code point U+264B: "♋" CANCER --> + <string name="spoken_emoji_264B">Cancer</string> + <!-- Spoken description for Unicode code point U+264C: "♌" LEO --> + <string name="spoken_emoji_264C">Leo</string> + <!-- Spoken description for Unicode code point U+264D: "♍" VIRGO --> + <string name="spoken_emoji_264D">Virgo</string> + <!-- Spoken description for Unicode code point U+264E: "♎" LIBRA --> + <string name="spoken_emoji_264E">Libra</string> + <!-- Spoken description for Unicode code point U+264F: "♏" SCORPIUS --> + <string name="spoken_emoji_264F">Scorpius</string> + <!-- Spoken description for Unicode code point U+2650: "♐" SAGITTARIUS --> + <string name="spoken_emoji_2650">Sagittarius</string> + <!-- Spoken description for Unicode code point U+2651: "♑" CAPRICORN --> + <string name="spoken_emoji_2651">Capricorn</string> + <!-- Spoken description for Unicode code point U+2652: "♒" AQUARIUS --> + <string name="spoken_emoji_2652">Aquarius</string> + <!-- Spoken description for Unicode code point U+2653: "♓" PISCES --> + <string name="spoken_emoji_2653">Pisces</string> + <!-- Spoken description for Unicode code point U+2660: "♠" BLACK SPADE SUIT --> + <string name="spoken_emoji_2660">Black spade suit</string> + <!-- Spoken description for Unicode code point U+2663: "♣" BLACK CLUB SUIT --> + <string name="spoken_emoji_2663">Black club suit</string> + <!-- Spoken description for Unicode code point U+2665: "♥" BLACK HEART SUIT --> + <string name="spoken_emoji_2665">Black heart suit</string> + <!-- Spoken description for Unicode code point U+2666: "♦" BLACK DIAMOND SUIT --> + <string name="spoken_emoji_2666">Black diamond suit</string> + <!-- Spoken description for Unicode code point U+2668: "♨" HOT SPRINGS --> + <string name="spoken_emoji_2668">Hot springs</string> + <!-- Spoken description for Unicode code point U+267B: "♻" BLACK UNIVERSAL RECYCLING SYMBOL --> + <string name="spoken_emoji_267B">Black universal recycling symbol</string> + <!-- Spoken description for Unicode code point U+267F: "♿" WHEELCHAIR SYMBOL --> + <string name="spoken_emoji_267F">Wheelchair symbol</string> + <!-- Spoken description for Unicode code point U+2693: "⚓" ANCHOR --> + <string name="spoken_emoji_2693">Anchor</string> + <!-- Spoken description for Unicode code point U+26A0: "⚠" WARNING SIGN --> + <string name="spoken_emoji_26A0">Warning sign</string> + <!-- Spoken description for Unicode code point U+26A1: "⚡" HIGH VOLTAGE SIGN --> + <string name="spoken_emoji_26A1">High voltage sign</string> + <!-- Spoken description for Unicode code point U+26AA: "⚪" MEDIUM WHITE CIRCLE --> + <string name="spoken_emoji_26AA">Medium white circle</string> + <!-- Spoken description for Unicode code point U+26AB: "⚫" MEDIUM BLACK CIRCLE --> + <string name="spoken_emoji_26AB">Medium black circle</string> + <!-- Spoken description for Unicode code point U+26BD: "⚽" SOCCER BALL --> + <string name="spoken_emoji_26BD">Soccer ball</string> + <!-- Spoken description for Unicode code point U+26BE: "⚾" BASEBALL --> + <string name="spoken_emoji_26BE">Baseball</string> + <!-- Spoken description for Unicode code point U+26C4: "⛄" SNOWMAN WITHOUT SNOW --> + <string name="spoken_emoji_26C4">Snowman without snow</string> + <!-- Spoken description for Unicode code point U+26C5: "⛅" SUN BEHIND CLOUD --> + <string name="spoken_emoji_26C5">Sun behind cloud</string> + <!-- Spoken description for Unicode code point U+26CE: "⛎" OPHIUCHUS --> + <string name="spoken_emoji_26CE">Ophiuchus</string> + <!-- Spoken description for Unicode code point U+26D4: "⛔" NO ENTRY --> + <string name="spoken_emoji_26D4">No entry</string> + <!-- Spoken description for Unicode code point U+26EA: "⛪" CHURCH --> + <string name="spoken_emoji_26EA">Church</string> + <!-- Spoken description for Unicode code point U+26F2: "⛲" FOUNTAIN --> + <string name="spoken_emoji_26F2">Fountain</string> + <!-- Spoken description for Unicode code point U+26F3: "⛳" FLAG IN HOLE --> + <string name="spoken_emoji_26F3">Flag in hole</string> + <!-- Spoken description for Unicode code point U+26F5: "⛵" SAILBOAT --> + <string name="spoken_emoji_26F5">Sailboat</string> + <!-- Spoken description for Unicode code point U+26FA: "⛺" TENT --> + <string name="spoken_emoji_26FA">Tent</string> + <!-- Spoken description for Unicode code point U+26FD: "⛽" FUEL PUMP --> + <string name="spoken_emoji_26FD">Fuel pump</string> + <!-- Spoken description for Unicode code point U+2702: "✂" BLACK SCISSORS --> + <string name="spoken_emoji_2702">Black scissors</string> + <!-- Spoken description for Unicode code point U+2705: "✅" WHITE HEAVY CHECK MARK --> + <string name="spoken_emoji_2705">White heavy check mark</string> + <!-- Spoken description for Unicode code point U+2708: "✈" AIRPLANE --> + <string name="spoken_emoji_2708">Airplane</string> + <!-- Spoken description for Unicode code point U+2709: "✉" ENVELOPE --> + <string name="spoken_emoji_2709">Envelope</string> + <!-- Spoken description for Unicode code point U+270A: "✊" RAISED FIST --> + <string name="spoken_emoji_270A">Raised fist</string> + <!-- Spoken description for Unicode code point U+270B: "✋" RAISED HAND --> + <string name="spoken_emoji_270B">Raised hand</string> + <!-- Spoken description for Unicode code point U+270C: "✌" VICTORY HAND --> + <string name="spoken_emoji_270C">Victory hand</string> + <!-- Spoken description for Unicode code point U+270F: "✏" PENCIL --> + <string name="spoken_emoji_270F">Pencil</string> + <!-- Spoken description for Unicode code point U+2712: "✒" BLACK NIB --> + <string name="spoken_emoji_2712">Black nib</string> + <!-- Spoken description for Unicode code point U+2714: "✔" HEAVY CHECK MARK --> + <string name="spoken_emoji_2714">Heavy check mark</string> + <!-- Spoken description for Unicode code point U+2716: "✖" HEAVY MULTIPLICATION X --> + <string name="spoken_emoji_2716">Heavy multiplication x</string> + <!-- Spoken description for Unicode code point U+2728: "✨" SPARKLES --> + <string name="spoken_emoji_2728">Sparkles</string> + <!-- Spoken description for Unicode code point U+2733: "✳" EIGHT SPOKED ASTERISK --> + <string name="spoken_emoji_2733">Eight spoked asterisk</string> + <!-- Spoken description for Unicode code point U+2734: "✴" EIGHT POINTED BLACK STAR --> + <string name="spoken_emoji_2734">Eight pointed black star</string> + <!-- Spoken description for Unicode code point U+2744: "❄" SNOWFLAKE --> + <string name="spoken_emoji_2744">Snowflake</string> + <!-- Spoken description for Unicode code point U+2747: "❇" SPARKLE --> + <string name="spoken_emoji_2747">Sparkle</string> + <!-- Spoken description for Unicode code point U+274C: "❌" CROSS MARK --> + <string name="spoken_emoji_274C">Cross mark</string> + <!-- Spoken description for Unicode code point U+274E: "❎" NEGATIVE SQUARED CROSS MARK --> + <string name="spoken_emoji_274E">Negative squared cross mark</string> + <!-- Spoken description for Unicode code point U+2753: "❓" BLACK QUESTION MARK ORNAMENT --> + <string name="spoken_emoji_2753">Black question mark ornament</string> + <!-- Spoken description for Unicode code point U+2754: "❔" WHITE QUESTION MARK ORNAMENT --> + <string name="spoken_emoji_2754">White question mark ornament</string> + <!-- Spoken description for Unicode code point U+2755: "❕" WHITE EXCLAMATION MARK ORNAMENT --> + <string name="spoken_emoji_2755">White exclamation mark ornament</string> + <!-- Spoken description for Unicode code point U+2757: "❗" HEAVY EXCLAMATION MARK SYMBOL --> + <string name="spoken_emoji_2757">Heavy exclamation mark symbol</string> + <!-- Spoken description for Unicode code point U+2764: "❤" HEAVY BLACK HEART --> + <string name="spoken_emoji_2764">Heavy black heart</string> + <!-- Spoken description for Unicode code point U+2795: "➕" HEAVY PLUS SIGN --> + <string name="spoken_emoji_2795">Heavy plus sign</string> + <!-- Spoken description for Unicode code point U+2796: "➖" HEAVY MINUS SIGN --> + <string name="spoken_emoji_2796">Heavy minus sign</string> + <!-- Spoken description for Unicode code point U+2797: "➗" HEAVY DIVISION SIGN --> + <string name="spoken_emoji_2797">Heavy division sign</string> + <!-- Spoken description for Unicode code point U+27A1: "➡" BLACK RIGHTWARDS ARROW --> + <string name="spoken_emoji_27A1">Black rightwards arrow</string> + <!-- Spoken description for Unicode code point U+27B0: "➰" CURLY LOOP --> + <string name="spoken_emoji_27B0">Curly loop</string> + <!-- Spoken description for Unicode code point U+27BF: "➿" DOUBLE CURLY LOOP --> + <string name="spoken_emoji_27BF">Double curly loop</string> + <!-- Spoken description for Unicode code point U+2934: "⤴" ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS --> + <string name="spoken_emoji_2934">Arrow pointing rightwards then curving upwards</string> + <!-- Spoken description for Unicode code point U+2935: "⤵" ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS --> + <string name="spoken_emoji_2935">Arrow pointing rightwards then curving downwards</string> + <!-- Spoken description for Unicode code point U+2B05: "⬅" LEFTWARDS BLACK ARROW --> + <string name="spoken_emoji_2B05">Leftwards black arrow</string> + <!-- Spoken description for Unicode code point U+2B06: "⬆" UPWARDS BLACK ARROW --> + <string name="spoken_emoji_2B06">Upwards black arrow</string> + <!-- Spoken description for Unicode code point U+2B07: "⬇" DOWNWARDS BLACK ARROW --> + <string name="spoken_emoji_2B07">Downwards black arrow</string> + <!-- Spoken description for Unicode code point U+2B1B: "⬛" BLACK LARGE SQUARE --> + <string name="spoken_emoji_2B1B">Black large square</string> + <!-- Spoken description for Unicode code point U+2B1C: "⬜" WHITE LARGE SQUARE --> + <string name="spoken_emoji_2B1C">White large square</string> + <!-- Spoken description for Unicode code point U+2B50: "⭐" WHITE MEDIUM STAR --> + <string name="spoken_emoji_2B50">White medium star</string> + <!-- Spoken description for Unicode code point U+2B55: "⭕" HEAVY LARGE CIRCLE --> + <string name="spoken_emoji_2B55">Heavy large circle</string> + <!-- Spoken description for Unicode code point U+3030: "〰" WAVY DASH --> + <string name="spoken_emoji_3030">Wavy dash</string> + <!-- Spoken description for Unicode code point U+303D: "〽" PART ALTERNATION MARK --> + <string name="spoken_emoji_303D">Part alternation mark</string> + <!-- Spoken description for Unicode code point U+3297: "㊗" CIRCLED IDEOGRAPH CONGRATULATION --> + <string name="spoken_emoji_3297">Circled ideograph congratulation</string> + <!-- Spoken description for Unicode code point U+3299: "㊙" CIRCLED IDEOGRAPH SECRET --> + <string name="spoken_emoji_3299">Circled ideograph secret</string> + <!-- Spoken description for Unicode code point U+1F004: "🀄" MAHJONG TILE RED DRAGON --> + <string name="spoken_emoji_1F004">Mahjong tile red dragon</string> + <!-- Spoken description for Unicode code point U+1F0CF: "🃏" PLAYING CARD BLACK JOKER --> + <string name="spoken_emoji_1F0CF">Playing card black joker</string> + <!-- Spoken description for Unicode code point U+1F170: "🅰" NEGATIVE SQUARED LATIN CAPITAL LETTER A --> + <string name="spoken_emoji_1F170">Blood type A</string> + <!-- Spoken description for Unicode code point U+1F171: "🅱" NEGATIVE SQUARED LATIN CAPITAL LETTER B --> + <string name="spoken_emoji_1F171">Blood type B</string> + <!-- Spoken description for Unicode code point U+1F17E: "🅾" NEGATIVE SQUARED LATIN CAPITAL LETTER O --> + <string name="spoken_emoji_1F17E">Blood type O</string> + <!-- Spoken description for Unicode code point U+1F17F: "🅿" NEGATIVE SQUARED LATIN CAPITAL LETTER P --> + <string name="spoken_emoji_1F17F">Parking lot</string> + <!-- Spoken description for Unicode code point U+1F18E: "🆎" NEGATIVE SQUARED AB --> + <string name="spoken_emoji_1F18E">Blood type AB</string> + <!-- Spoken description for Unicode code point U+1F191: "🆑" SQUARED CL --> + <string name="spoken_emoji_1F191">Squared CL</string> + <!-- Spoken description for Unicode code point U+1F192: "🆒" SQUARED COOL --> + <string name="spoken_emoji_1F192">Squared cool</string> + <!-- Spoken description for Unicode code point U+1F193: "🆓" SQUARED FREE --> + <string name="spoken_emoji_1F193">Squared free</string> + <!-- Spoken description for Unicode code point U+1F194: "🆔" SQUARED ID --> + <string name="spoken_emoji_1F194">Squared ID</string> + <!-- Spoken description for Unicode code point U+1F195: "🆕" SQUARED NEW --> + <string name="spoken_emoji_1F195">Squared new</string> + <!-- Spoken description for Unicode code point U+1F196: "🆖" SQUARED NG --> + <string name="spoken_emoji_1F196">Squared N G</string> + <!-- Spoken description for Unicode code point U+1F197: "🆗" SQUARED OK --> + <string name="spoken_emoji_1F197">Squared OK</string> + <!-- Spoken description for Unicode code point U+1F198: "🆘" SQUARED SOS --> + <string name="spoken_emoji_1F198">Squared SOS</string> + <!-- Spoken description for Unicode code point U+1F199: "🆙" SQUARED UP WITH EXCLAMATION MARK --> + <string name="spoken_emoji_1F199">Squared up with exclamation mark</string> + <!-- Spoken description for Unicode code point U+1F19A: "🆚" SQUARED VS --> + <string name="spoken_emoji_1F19A">Squared vs</string> + <!-- Spoken description for Unicode code point U+1F201: "🈁" SQUARED KATAKANA KOKO --> + <string name="spoken_emoji_1F201">Squared katakana here</string> + <!-- Spoken description for Unicode code point U+1F202: "🈂" SQUARED KATAKANA SA --> + <string name="spoken_emoji_1F202">Squared katakana service</string> + <!-- Spoken description for Unicode code point U+1F21A: "🈚" SQUARED CJK UNIFIED IDEOGRAPH-7121 --> + <string name="spoken_emoji_1F21A">Squared ideograph charge-free</string> + <!-- Spoken description for Unicode code point U+1F22F: "🈯" SQUARED CJK UNIFIED IDEOGRAPH-6307 --> + <string name="spoken_emoji_1F22F">Squared ideograph reserved-seat</string> + <!-- Spoken description for Unicode code point U+1F232: "🈲" SQUARED CJK UNIFIED IDEOGRAPH-7981 --> + <string name="spoken_emoji_1F232">Squared ideograph prohibitation</string> + <!-- Spoken description for Unicode code point U+1F233: "🈳" SQUARED CJK UNIFIED IDEOGRAPH-7A7A --> + <string name="spoken_emoji_1F233">Squared ideograph vacancy</string> + <!-- Spoken description for Unicode code point U+1F234: "🈴" SQUARED CJK UNIFIED IDEOGRAPH-5408 --> + <string name="spoken_emoji_1F234">Squared ideograph acceptance</string> + <!-- Spoken description for Unicode code point U+1F235: "🈵" SQUARED CJK UNIFIED IDEOGRAPH-6E80 --> + <string name="spoken_emoji_1F235">Squared ideograph full occupancy</string> + <!-- Spoken description for Unicode code point U+1F236: "🈶" SQUARED CJK UNIFIED IDEOGRAPH-6709 --> + <string name="spoken_emoji_1F236">Squared ideograph paid</string> + <!-- Spoken description for Unicode code point U+1F237: "🈷" SQUARED CJK UNIFIED IDEOGRAPH-6708 --> + <string name="spoken_emoji_1F237">Squared ideograph monthly</string> + <!-- Spoken description for Unicode code point U+1F238: "🈸" SQUARED CJK UNIFIED IDEOGRAPH-7533 --> + <string name="spoken_emoji_1F238">Squared ideograph application</string> + <!-- Spoken description for Unicode code point U+1F239: "🈹" SQUARED CJK UNIFIED IDEOGRAPH-5272 --> + <string name="spoken_emoji_1F239">Squared ideograph discount</string> + <!-- Spoken description for Unicode code point U+1F23A: "🈺" SQUARED CJK UNIFIED IDEOGRAPH-55B6 --> + <string name="spoken_emoji_1F23A">Squared ideograph in business</string> + <!-- Spoken description for Unicode code point U+1F250: "🉐" CIRCLED IDEOGRAPH ADVANTAGE --> + <string name="spoken_emoji_1F250">Circled ideograph advantage</string> + <!-- Spoken description for Unicode code point U+1F251: "🉑" CIRCLED IDEOGRAPH ACCEPT --> + <string name="spoken_emoji_1F251">Circled ideograph accept</string> + <!-- Spoken description for Unicode code point U+1F300: "🌀" CYCLONE --> + <string name="spoken_emoji_1F300">Cyclone</string> + <!-- Spoken description for Unicode code point U+1F301: "🌁" FOGGY --> + <string name="spoken_emoji_1F301">Foggy</string> + <!-- Spoken description for Unicode code point U+1F302: "🌂" CLOSED UMBRELLA --> + <string name="spoken_emoji_1F302">Closed umbrella</string> + <!-- Spoken description for Unicode code point U+1F303: "🌃" NIGHT WITH STARS --> + <string name="spoken_emoji_1F303">Night with stars</string> + <!-- Spoken description for Unicode code point U+1F304: "🌄" SUNRISE OVER MOUNTAINS --> + <string name="spoken_emoji_1F304">Sunrise over mountains</string> + <!-- Spoken description for Unicode code point U+1F305: "🌅" SUNRISE --> + <string name="spoken_emoji_1F305">Sunrise</string> + <!-- Spoken description for Unicode code point U+1F306: "🌆" CITYSCAPE AT DUSK --> + <string name="spoken_emoji_1F306">Cityscape at dusk</string> + <!-- Spoken description for Unicode code point U+1F307: "🌇" SUNSET OVER BUILDINGS --> + <string name="spoken_emoji_1F307">Sunset over buildings</string> + <!-- Spoken description for Unicode code point U+1F308: "🌈" RAINBOW --> + <string name="spoken_emoji_1F308">Rainbow</string> + <!-- Spoken description for Unicode code point U+1F309: "🌉" BRIDGE AT NIGHT --> + <string name="spoken_emoji_1F309">Bridge at night</string> + <!-- Spoken description for Unicode code point U+1F30A: "🌊" WATER WAVE --> + <string name="spoken_emoji_1F30A">Water wave</string> + <!-- Spoken description for Unicode code point U+1F30B: "🌋" VOLCANO --> + <string name="spoken_emoji_1F30B">Volcano</string> + <!-- Spoken description for Unicode code point U+1F30C: "🌌" MILKY WAY --> + <string name="spoken_emoji_1F30C">Milky way</string> + <!-- Spoken description for Unicode code point U+1F30D: "🌍" EARTH GLOBE EUROPE-AFRICA --> + <string name="spoken_emoji_1F30D">Earth globe europe-africa</string> + <!-- Spoken description for Unicode code point U+1F30E: "🌎" EARTH GLOBE AMERICAS --> + <string name="spoken_emoji_1F30E">Earth globe americas</string> + <!-- Spoken description for Unicode code point U+1F30F: "🌏" EARTH GLOBE ASIA-AUSTRALIA --> + <string name="spoken_emoji_1F30F">Earth globe asia-australia</string> + <!-- Spoken description for Unicode code point U+1F310: "🌐" GLOBE WITH MERIDIANS --> + <string name="spoken_emoji_1F310">Globe with meridians</string> + <!-- Spoken description for Unicode code point U+1F311: "🌑" NEW MOON SYMBOL --> + <string name="spoken_emoji_1F311">New moon symbol</string> + <!-- Spoken description for Unicode code point U+1F312: "🌒" WAXING CRESCENT MOON SYMBOL --> + <string name="spoken_emoji_1F312">Waxing crescent moon symbol</string> + <!-- Spoken description for Unicode code point U+1F313: "🌓" FIRST QUARTER MOON SYMBOL --> + <string name="spoken_emoji_1F313">First quarter moon symbol</string> + <!-- Spoken description for Unicode code point U+1F314: "🌔" WAXING GIBBOUS MOON SYMBOL --> + <string name="spoken_emoji_1F314">Waxing gibbous moon symbol</string> + <!-- Spoken description for Unicode code point U+1F315: "🌕" FULL MOON SYMBOL --> + <string name="spoken_emoji_1F315">Full moon symbol</string> + <!-- Spoken description for Unicode code point U+1F316: "🌖" WANING GIBBOUS MOON SYMBOL --> + <string name="spoken_emoji_1F316">Waning gibbous moon symbol</string> + <!-- Spoken description for Unicode code point U+1F317: "🌗" LAST QUARTER MOON SYMBOL --> + <string name="spoken_emoji_1F317">Last quarter moon symbol</string> + <!-- Spoken description for Unicode code point U+1F318: "🌘" WANING CRESCENT MOON SYMBOL --> + <string name="spoken_emoji_1F318">Waning crescent moon symbol</string> + <!-- Spoken description for Unicode code point U+1F319: "🌙" CRESCENT MOON --> + <string name="spoken_emoji_1F319">Crescent moon</string> + <!-- Spoken description for Unicode code point U+1F31A: "🌚" NEW MOON WITH FACE --> + <string name="spoken_emoji_1F31A">New moon with face</string> + <!-- Spoken description for Unicode code point U+1F31B: "🌛" FIRST QUARTER MOON WITH FACE --> + <string name="spoken_emoji_1F31B">First quarter moon with face</string> + <!-- Spoken description for Unicode code point U+1F31C: "🌜" LAST QUARTER MOON WITH FACE --> + <string name="spoken_emoji_1F31C">Last quarter moon with face</string> + <!-- Spoken description for Unicode code point U+1F31D: "🌝" FULL MOON WITH FACE --> + <string name="spoken_emoji_1F31D">Full moon with face</string> + <!-- Spoken description for Unicode code point U+1F31E: "🌞" SUN WITH FACE --> + <string name="spoken_emoji_1F31E">Sun with face</string> + <!-- Spoken description for Unicode code point U+1F31F: "🌟" GLOWING STAR --> + <string name="spoken_emoji_1F31F">Glowing star</string> + <!-- Spoken description for Unicode code point U+1F320: "🌠" SHOOTING STAR --> + <string name="spoken_emoji_1F320">Shooting star</string> + <!-- Spoken description for Unicode code point U+1F330: "🌰" CHESTNUT --> + <string name="spoken_emoji_1F330">Chestnut</string> + <!-- Spoken description for Unicode code point U+1F331: "🌱" SEEDLING --> + <string name="spoken_emoji_1F331">Seedling</string> + <!-- Spoken description for Unicode code point U+1F332: "🌲" EVERGREEN TREE --> + <string name="spoken_emoji_1F332">Evergreen tree</string> + <!-- Spoken description for Unicode code point U+1F333: "🌳" DECIDUOUS TREE --> + <string name="spoken_emoji_1F333">Deciduous tree</string> + <!-- Spoken description for Unicode code point U+1F334: "🌴" PALM TREE --> + <string name="spoken_emoji_1F334">Palm tree</string> + <!-- Spoken description for Unicode code point U+1F335: "🌵" CACTUS --> + <string name="spoken_emoji_1F335">Cactus</string> + <!-- Spoken description for Unicode code point U+1F337: "🌷" TULIP --> + <string name="spoken_emoji_1F337">Tulip</string> + <!-- Spoken description for Unicode code point U+1F338: "🌸" CHERRY BLOSSOM --> + <string name="spoken_emoji_1F338">Cherry blossom</string> + <!-- Spoken description for Unicode code point U+1F339: "🌹" ROSE --> + <string name="spoken_emoji_1F339">Rose</string> + <!-- Spoken description for Unicode code point U+1F33A: "🌺" HIBISCUS --> + <string name="spoken_emoji_1F33A">Hibiscus</string> + <!-- Spoken description for Unicode code point U+1F33B: "🌻" SUNFLOWER --> + <string name="spoken_emoji_1F33B">Sunflower</string> + <!-- Spoken description for Unicode code point U+1F33C: "🌼" BLOSSOM --> + <string name="spoken_emoji_1F33C">Blossom</string> + <!-- Spoken description for Unicode code point U+1F33D: "🌽" EAR OF MAIZE --> + <string name="spoken_emoji_1F33D">Ear of maize</string> + <!-- Spoken description for Unicode code point U+1F33E: "🌾" EAR OF RICE --> + <string name="spoken_emoji_1F33E">Ear of rice</string> + <!-- Spoken description for Unicode code point U+1F33F: "🌿" HERB --> + <string name="spoken_emoji_1F33F">Herb</string> + <!-- Spoken description for Unicode code point U+1F340: "🍀" FOUR LEAF CLOVER --> + <string name="spoken_emoji_1F340">Four leaf clover</string> + <!-- Spoken description for Unicode code point U+1F341: "🍁" MAPLE LEAF --> + <string name="spoken_emoji_1F341">Maple leaf</string> + <!-- Spoken description for Unicode code point U+1F342: "🍂" FALLEN LEAF --> + <string name="spoken_emoji_1F342">Fallen leaf</string> + <!-- Spoken description for Unicode code point U+1F343: "🍃" LEAF FLUTTERING IN WIND --> + <string name="spoken_emoji_1F343">Leaf fluttering in wind</string> + <!-- Spoken description for Unicode code point U+1F344: "🍄" MUSHROOM --> + <string name="spoken_emoji_1F344">Mushroom</string> + <!-- Spoken description for Unicode code point U+1F345: "🍅" TOMATO --> + <string name="spoken_emoji_1F345">Tomato</string> + <!-- Spoken description for Unicode code point U+1F346: "🍆" AUBERGINE --> + <string name="spoken_emoji_1F346">Aubergine</string> + <!-- Spoken description for Unicode code point U+1F347: "🍇" GRAPES --> + <string name="spoken_emoji_1F347">Grapes</string> + <!-- Spoken description for Unicode code point U+1F348: "🍈" MELON --> + <string name="spoken_emoji_1F348">Melon</string> + <!-- Spoken description for Unicode code point U+1F349: "🍉" WATERMELON --> + <string name="spoken_emoji_1F349">Watermelon</string> + <!-- Spoken description for Unicode code point U+1F34A: "🍊" TANGERINE --> + <string name="spoken_emoji_1F34A">Tangerine</string> + <!-- Spoken description for Unicode code point U+1F34B: "🍋" LEMON --> + <string name="spoken_emoji_1F34B">Lemon</string> + <!-- Spoken description for Unicode code point U+1F34C: "🍌" BANANA --> + <string name="spoken_emoji_1F34C">Banana</string> + <!-- Spoken description for Unicode code point U+1F34D: "🍍" PINEAPPLE --> + <string name="spoken_emoji_1F34D">Pineapple</string> + <!-- Spoken description for Unicode code point U+1F34E: "🍎" RED APPLE --> + <string name="spoken_emoji_1F34E">Red apple</string> + <!-- Spoken description for Unicode code point U+1F34F: "🍏" GREEN APPLE --> + <string name="spoken_emoji_1F34F">Green apple</string> + <!-- Spoken description for Unicode code point U+1F350: "🍐" PEAR --> + <string name="spoken_emoji_1F350">Pear</string> + <!-- Spoken description for Unicode code point U+1F351: "🍑" PEACH --> + <string name="spoken_emoji_1F351">Peach</string> + <!-- Spoken description for Unicode code point U+1F352: "🍒" CHERRIES --> + <string name="spoken_emoji_1F352">Cherries</string> + <!-- Spoken description for Unicode code point U+1F353: "🍓" STRAWBERRY --> + <string name="spoken_emoji_1F353">Strawberry</string> + <!-- Spoken description for Unicode code point U+1F354: "🍔" HAMBURGER --> + <string name="spoken_emoji_1F354">Hamburger</string> + <!-- Spoken description for Unicode code point U+1F355: "🍕" SLICE OF PIZZA --> + <string name="spoken_emoji_1F355">Slice of pizza</string> + <!-- Spoken description for Unicode code point U+1F356: "🍖" MEAT ON BONE --> + <string name="spoken_emoji_1F356">Meat on bone</string> + <!-- Spoken description for Unicode code point U+1F357: "🍗" POULTRY LEG --> + <string name="spoken_emoji_1F357">Poultry leg</string> + <!-- Spoken description for Unicode code point U+1F358: "🍘" RICE CRACKER --> + <string name="spoken_emoji_1F358">Rice cracker</string> + <!-- Spoken description for Unicode code point U+1F359: "🍙" RICE BALL --> + <string name="spoken_emoji_1F359">Rice ball</string> + <!-- Spoken description for Unicode code point U+1F35A: "🍚" COOKED RICE --> + <string name="spoken_emoji_1F35A">Cooked rice</string> + <!-- Spoken description for Unicode code point U+1F35B: "🍛" CURRY AND RICE --> + <string name="spoken_emoji_1F35B">Curry and rice</string> + <!-- Spoken description for Unicode code point U+1F35C: "🍜" STEAMING BOWL --> + <string name="spoken_emoji_1F35C">Steaming bowl</string> + <!-- Spoken description for Unicode code point U+1F35D: "🍝" SPAGHETTI --> + <string name="spoken_emoji_1F35D">Spaghetti</string> + <!-- Spoken description for Unicode code point U+1F35E: "🍞" BREAD --> + <string name="spoken_emoji_1F35E">Bread</string> + <!-- Spoken description for Unicode code point U+1F35F: "🍟" FRENCH FRIES --> + <string name="spoken_emoji_1F35F">French fries</string> + <!-- Spoken description for Unicode code point U+1F360: "🍠" ROASTED SWEET POTATO --> + <string name="spoken_emoji_1F360">Roasted sweet potato</string> + <!-- Spoken description for Unicode code point U+1F361: "🍡" DANGO --> + <string name="spoken_emoji_1F361">Dango</string> + <!-- Spoken description for Unicode code point U+1F362: "🍢" ODEN --> + <string name="spoken_emoji_1F362">Oden</string> + <!-- Spoken description for Unicode code point U+1F363: "🍣" SUSHI --> + <string name="spoken_emoji_1F363">Sushi</string> + <!-- Spoken description for Unicode code point U+1F364: "🍤" FRIED SHRIMP --> + <string name="spoken_emoji_1F364">Fried shrimp</string> + <!-- Spoken description for Unicode code point U+1F365: "🍥" FISH CAKE WITH SWIRL DESIGN --> + <string name="spoken_emoji_1F365">Fish cake with swirl design</string> + <!-- Spoken description for Unicode code point U+1F366: "🍦" SOFT ICE CREAM --> + <string name="spoken_emoji_1F366">Soft ice cream</string> + <!-- Spoken description for Unicode code point U+1F367: "🍧" SHAVED ICE --> + <string name="spoken_emoji_1F367">Shaved ice</string> + <!-- Spoken description for Unicode code point U+1F368: "🍨" ICE CREAM --> + <string name="spoken_emoji_1F368">Ice cream</string> + <!-- Spoken description for Unicode code point U+1F369: "🍩" DOUGHNUT --> + <string name="spoken_emoji_1F369">Doughnut</string> + <!-- Spoken description for Unicode code point U+1F36A: "🍪" COOKIE --> + <string name="spoken_emoji_1F36A">Cookie</string> + <!-- Spoken description for Unicode code point U+1F36B: "🍫" CHOCOLATE BAR --> + <string name="spoken_emoji_1F36B">Chocolate bar</string> + <!-- Spoken description for Unicode code point U+1F36C: "🍬" CANDY --> + <string name="spoken_emoji_1F36C">Candy</string> + <!-- Spoken description for Unicode code point U+1F36D: "🍭" LOLLIPOP --> + <string name="spoken_emoji_1F36D">Lollipop</string> + <!-- Spoken description for Unicode code point U+1F36E: "🍮" CUSTARD --> + <string name="spoken_emoji_1F36E">Custard</string> + <!-- Spoken description for Unicode code point U+1F36F: "🍯" HONEY POT --> + <string name="spoken_emoji_1F36F">Honey pot</string> + <!-- Spoken description for Unicode code point U+1F370: "🍰" SHORTCAKE --> + <string name="spoken_emoji_1F370">Shortcake</string> + <!-- Spoken description for Unicode code point U+1F371: "🍱" BENTO BOX --> + <string name="spoken_emoji_1F371">Bento box</string> + <!-- Spoken description for Unicode code point U+1F372: "🍲" POT OF FOOD --> + <string name="spoken_emoji_1F372">Pot of food</string> + <!-- Spoken description for Unicode code point U+1F373: "🍳" COOKING --> + <string name="spoken_emoji_1F373">Cooking</string> + <!-- Spoken description for Unicode code point U+1F374: "🍴" FORK AND KNIFE --> + <string name="spoken_emoji_1F374">Fork and knife</string> + <!-- Spoken description for Unicode code point U+1F375: "🍵" TEACUP WITHOUT HANDLE --> + <string name="spoken_emoji_1F375">Teacup without handle</string> + <!-- Spoken description for Unicode code point U+1F376: "🍶" SAKE BOTTLE AND CUP --> + <string name="spoken_emoji_1F376">Sake bottle and cup</string> + <!-- Spoken description for Unicode code point U+1F377: "🍷" WINE GLASS --> + <string name="spoken_emoji_1F377">Wine glass</string> + <!-- Spoken description for Unicode code point U+1F378: "🍸" COCKTAIL GLASS --> + <string name="spoken_emoji_1F378">Cocktail glass</string> + <!-- Spoken description for Unicode code point U+1F379: "🍹" TROPICAL DRINK --> + <string name="spoken_emoji_1F379">Tropical drink</string> + <!-- Spoken description for Unicode code point U+1F37A: "🍺" BEER MUG --> + <string name="spoken_emoji_1F37A">Beer mug</string> + <!-- Spoken description for Unicode code point U+1F37B: "🍻" CLINKING BEER MUGS --> + <string name="spoken_emoji_1F37B">Clinking beer mugs</string> + <!-- Spoken description for Unicode code point U+1F37C: "🍼" BABY BOTTLE --> + <string name="spoken_emoji_1F37C">Baby bottle</string> + <!-- Spoken description for Unicode code point U+1F380: "🎀" RIBBON --> + <string name="spoken_emoji_1F380">Ribbon</string> + <!-- Spoken description for Unicode code point U+1F381: "🎁" WRAPPED PRESENT --> + <string name="spoken_emoji_1F381">Wrapped present</string> + <!-- Spoken description for Unicode code point U+1F382: "🎂" BIRTHDAY CAKE --> + <string name="spoken_emoji_1F382">Birthday cake</string> + <!-- Spoken description for Unicode code point U+1F383: "🎃" JACK-O-LANTERN --> + <string name="spoken_emoji_1F383">Jack-o-lantern</string> + <!-- Spoken description for Unicode code point U+1F384: "🎄" CHRISTMAS TREE --> + <string name="spoken_emoji_1F384">Christmas tree</string> + <!-- Spoken description for Unicode code point U+1F385: "🎅" FATHER CHRISTMAS --> + <string name="spoken_emoji_1F385">Father christmas</string> + <!-- Spoken description for Unicode code point U+1F386: "🎆" FIREWORKS --> + <string name="spoken_emoji_1F386">Fireworks</string> + <!-- Spoken description for Unicode code point U+1F387: "🎇" FIREWORK SPARKLER --> + <string name="spoken_emoji_1F387">Firework sparkler</string> + <!-- Spoken description for Unicode code point U+1F388: "🎈" BALLOON --> + <string name="spoken_emoji_1F388">Balloon</string> + <!-- Spoken description for Unicode code point U+1F389: "🎉" PARTY POPPER --> + <string name="spoken_emoji_1F389">Party popper</string> + <!-- Spoken description for Unicode code point U+1F38A: "🎊" CONFETTI BALL --> + <string name="spoken_emoji_1F38A">Confetti ball</string> + <!-- Spoken description for Unicode code point U+1F38B: "🎋" TANABATA TREE --> + <string name="spoken_emoji_1F38B">Tanabata tree</string> + <!-- Spoken description for Unicode code point U+1F38C: "🎌" CROSSED FLAGS --> + <string name="spoken_emoji_1F38C">Crossed flags</string> + <!-- Spoken description for Unicode code point U+1F38D: "🎍" PINE DECORATION --> + <string name="spoken_emoji_1F38D">Pine decoration</string> + <!-- Spoken description for Unicode code point U+1F38E: "🎎" JAPANESE DOLLS --> + <string name="spoken_emoji_1F38E">Japanese dolls</string> + <!-- Spoken description for Unicode code point U+1F38F: "🎏" CARP STREAMER --> + <string name="spoken_emoji_1F38F">Carp streamer</string> + <!-- Spoken description for Unicode code point U+1F390: "🎐" WIND CHIME --> + <string name="spoken_emoji_1F390">Wind chime</string> + <!-- Spoken description for Unicode code point U+1F391: "🎑" MOON VIEWING CEREMONY --> + <string name="spoken_emoji_1F391">Moon viewing ceremony</string> + <!-- Spoken description for Unicode code point U+1F392: "🎒" SCHOOL SATCHEL --> + <string name="spoken_emoji_1F392">School satchel</string> + <!-- Spoken description for Unicode code point U+1F393: "🎓" GRADUATION CAP --> + <string name="spoken_emoji_1F393">Graduation cap</string> + <!-- Spoken description for Unicode code point U+1F3A0: "🎠" CAROUSEL HORSE --> + <string name="spoken_emoji_1F3A0">Carousel horse</string> + <!-- Spoken description for Unicode code point U+1F3A1: "🎡" FERRIS WHEEL --> + <string name="spoken_emoji_1F3A1">Ferris wheel</string> + <!-- Spoken description for Unicode code point U+1F3A2: "🎢" ROLLER COASTER --> + <string name="spoken_emoji_1F3A2">Roller coaster</string> + <!-- Spoken description for Unicode code point U+1F3A3: "🎣" FISHING POLE AND FISH --> + <string name="spoken_emoji_1F3A3">Fishing pole and fish</string> + <!-- Spoken description for Unicode code point U+1F3A4: "🎤" MICROPHONE --> + <string name="spoken_emoji_1F3A4">Microphone</string> + <!-- Spoken description for Unicode code point U+1F3A5: "🎥" MOVIE CAMERA --> + <string name="spoken_emoji_1F3A5">Movie camera</string> + <!-- Spoken description for Unicode code point U+1F3A6: "🎦" CINEMA --> + <string name="spoken_emoji_1F3A6">Cinema</string> + <!-- Spoken description for Unicode code point U+1F3A7: "🎧" HEADPHONE --> + <string name="spoken_emoji_1F3A7">Headphone</string> + <!-- Spoken description for Unicode code point U+1F3A8: "🎨" ARTIST PALETTE --> + <string name="spoken_emoji_1F3A8">Artist palette</string> + <!-- Spoken description for Unicode code point U+1F3A9: "🎩" TOP HAT --> + <string name="spoken_emoji_1F3A9">Top hat</string> + <!-- Spoken description for Unicode code point U+1F3AA: "🎪" CIRCUS TENT --> + <string name="spoken_emoji_1F3AA">Circus tent</string> + <!-- Spoken description for Unicode code point U+1F3AB: "🎫" TICKET --> + <string name="spoken_emoji_1F3AB">Ticket</string> + <!-- Spoken description for Unicode code point U+1F3AC: "🎬" CLAPPER BOARD --> + <string name="spoken_emoji_1F3AC">Clapper board</string> + <!-- Spoken description for Unicode code point U+1F3AD: "🎭" PERFORMING ARTS --> + <string name="spoken_emoji_1F3AD">Performing arts</string> + <!-- Spoken description for Unicode code point U+1F3AE: "🎮" VIDEO GAME --> + <string name="spoken_emoji_1F3AE">Video game</string> + <!-- Spoken description for Unicode code point U+1F3AF: "🎯" DIRECT HIT --> + <string name="spoken_emoji_1F3AF">Direct hit</string> + <!-- Spoken description for Unicode code point U+1F3B0: "🎰" SLOT MACHINE --> + <string name="spoken_emoji_1F3B0">Slot machine</string> + <!-- Spoken description for Unicode code point U+1F3B1: "🎱" BILLIARDS --> + <string name="spoken_emoji_1F3B1">Billiards</string> + <!-- Spoken description for Unicode code point U+1F3B2: "🎲" GAME DIE --> + <string name="spoken_emoji_1F3B2">Game die</string> + <!-- Spoken description for Unicode code point U+1F3B3: "🎳" BOWLING --> + <string name="spoken_emoji_1F3B3">Bowling</string> + <!-- Spoken description for Unicode code point U+1F3B4: "🎴" FLOWER PLAYING CARDS --> + <string name="spoken_emoji_1F3B4">Flower playing cards</string> + <!-- Spoken description for Unicode code point U+1F3B5: "🎵" MUSICAL NOTE --> + <string name="spoken_emoji_1F3B5">Musical note</string> + <!-- Spoken description for Unicode code point U+1F3B6: "🎶" MULTIPLE MUSICAL NOTES --> + <string name="spoken_emoji_1F3B6">Multiple musical notes</string> + <!-- Spoken description for Unicode code point U+1F3B7: "🎷" SAXOPHONE --> + <string name="spoken_emoji_1F3B7">Saxophone</string> + <!-- Spoken description for Unicode code point U+1F3B8: "🎸" GUITAR --> + <string name="spoken_emoji_1F3B8">Guitar</string> + <!-- Spoken description for Unicode code point U+1F3B9: "🎹" MUSICAL KEYBOARD --> + <string name="spoken_emoji_1F3B9">Musical keyboard</string> + <!-- Spoken description for Unicode code point U+1F3BA: "🎺" TRUMPET --> + <string name="spoken_emoji_1F3BA">Trumpet</string> + <!-- Spoken description for Unicode code point U+1F3BB: "🎻" VIOLIN --> + <string name="spoken_emoji_1F3BB">Violin</string> + <!-- Spoken description for Unicode code point U+1F3BC: "🎼" MUSICAL SCORE --> + <string name="spoken_emoji_1F3BC">Musical score</string> + <!-- Spoken description for Unicode code point U+1F3BD: "🎽" RUNNING SHIRT WITH SASH --> + <string name="spoken_emoji_1F3BD">Running shirt with sash</string> + <!-- Spoken description for Unicode code point U+1F3BE: "🎾" TENNIS RACQUET AND BALL --> + <string name="spoken_emoji_1F3BE">Tennis racquet and ball</string> + <!-- Spoken description for Unicode code point U+1F3BF: "🎿" SKI AND SKI BOOT --> + <string name="spoken_emoji_1F3BF">Ski and ski boot</string> + <!-- Spoken description for Unicode code point U+1F3C0: "🏀" BASKETBALL AND HOOP --> + <string name="spoken_emoji_1F3C0">Basketball and hoop</string> + <!-- Spoken description for Unicode code point U+1F3C1: "🏁" CHEQUERED FLAG --> + <string name="spoken_emoji_1F3C1">Chequered flag</string> + <!-- Spoken description for Unicode code point U+1F3C2: "🏂" SNOWBOARDER --> + <string name="spoken_emoji_1F3C2">Snowboarder</string> + <!-- Spoken description for Unicode code point U+1F3C3: "🏃" RUNNER --> + <string name="spoken_emoji_1F3C3">Runner</string> + <!-- Spoken description for Unicode code point U+1F3C4: "🏄" SURFER --> + <string name="spoken_emoji_1F3C4">Surfer</string> + <!-- Spoken description for Unicode code point U+1F3C6: "🏆" TROPHY --> + <string name="spoken_emoji_1F3C6">Trophy</string> + <!-- Spoken description for Unicode code point U+1F3C7: "🏇" HORSE RACING --> + <string name="spoken_emoji_1F3C7">Horse racing</string> + <!-- Spoken description for Unicode code point U+1F3C8: "🏈" AMERICAN FOOTBALL --> + <string name="spoken_emoji_1F3C8">American football</string> + <!-- Spoken description for Unicode code point U+1F3C9: "🏉" RUGBY FOOTBALL --> + <string name="spoken_emoji_1F3C9">Rugby football</string> + <!-- Spoken description for Unicode code point U+1F3CA: "🏊" SWIMMER --> + <string name="spoken_emoji_1F3CA">Swimmer</string> + <!-- Spoken description for Unicode code point U+1F3E0: "🏠" HOUSE BUILDING --> + <string name="spoken_emoji_1F3E0">House building</string> + <!-- Spoken description for Unicode code point U+1F3E1: "🏡" HOUSE WITH GARDEN --> + <string name="spoken_emoji_1F3E1">House with garden</string> + <!-- Spoken description for Unicode code point U+1F3E2: "🏢" OFFICE BUILDING --> + <string name="spoken_emoji_1F3E2">Office building</string> + <!-- Spoken description for Unicode code point U+1F3E3: "🏣" JAPANESE POST OFFICE --> + <string name="spoken_emoji_1F3E3">Japanese post office</string> + <!-- Spoken description for Unicode code point U+1F3E4: "🏤" EUROPEAN POST OFFICE --> + <string name="spoken_emoji_1F3E4">European post office</string> + <!-- Spoken description for Unicode code point U+1F3E5: "🏥" HOSPITAL --> + <string name="spoken_emoji_1F3E5">Hospital</string> + <!-- Spoken description for Unicode code point U+1F3E6: "🏦" BANK --> + <string name="spoken_emoji_1F3E6">Bank</string> + <!-- Spoken description for Unicode code point U+1F3E7: "🏧" AUTOMATED TELLER MACHINE --> + <string name="spoken_emoji_1F3E7">Automated teller machine</string> + <!-- Spoken description for Unicode code point U+1F3E8: "🏨" HOTEL --> + <string name="spoken_emoji_1F3E8">Hotel</string> + <!-- Spoken description for Unicode code point U+1F3E9: "🏩" LOVE HOTEL --> + <string name="spoken_emoji_1F3E9">Love hotel</string> + <!-- Spoken description for Unicode code point U+1F3EA: "🏪" CONVENIENCE STORE --> + <string name="spoken_emoji_1F3EA">Convenience store</string> + <!-- Spoken description for Unicode code point U+1F3EB: "🏫" SCHOOL --> + <string name="spoken_emoji_1F3EB">School</string> + <!-- Spoken description for Unicode code point U+1F3EC: "🏬" DEPARTMENT STORE --> + <string name="spoken_emoji_1F3EC">Department store</string> + <!-- Spoken description for Unicode code point U+1F3ED: "🏭" FACTORY --> + <string name="spoken_emoji_1F3ED">Factory</string> + <!-- Spoken description for Unicode code point U+1F3EE: "🏮" IZAKAYA LANTERN --> + <string name="spoken_emoji_1F3EE">Izakaya lantern</string> + <!-- Spoken description for Unicode code point U+1F3EF: "🏯" JAPANESE CASTLE --> + <string name="spoken_emoji_1F3EF">Japanese castle</string> + <!-- Spoken description for Unicode code point U+1F3F0: "🏰" EUROPEAN CASTLE --> + <string name="spoken_emoji_1F3F0">European castle</string> + <!-- Spoken description for Unicode code point U+1F400: "🐀" RAT --> + <string name="spoken_emoji_1F400">Rat</string> + <!-- Spoken description for Unicode code point U+1F401: "🐁" MOUSE --> + <string name="spoken_emoji_1F401">Mouse</string> + <!-- Spoken description for Unicode code point U+1F402: "🐂" OX --> + <string name="spoken_emoji_1F402">Ox</string> + <!-- Spoken description for Unicode code point U+1F403: "🐃" WATER BUFFALO --> + <string name="spoken_emoji_1F403">Water buffalo</string> + <!-- Spoken description for Unicode code point U+1F404: "🐄" COW --> + <string name="spoken_emoji_1F404">Cow</string> + <!-- Spoken description for Unicode code point U+1F406: "🐆" LEOPARD --> + <string name="spoken_emoji_1F406">Leopard</string> + <!-- Spoken description for Unicode code point U+1F407: "🐇" RABBIT --> + <string name="spoken_emoji_1F407">Rabbit</string> + <!-- Spoken description for Unicode code point U+1F408: "🐈" CAT --> + <string name="spoken_emoji_1F408">Cat</string> + <!-- Spoken description for Unicode code point U+1F409: "🐉" DRAGON --> + <string name="spoken_emoji_1F409">Dragon</string> + <!-- Spoken description for Unicode code point U+1F40A: "🐊" CROCODILE --> + <string name="spoken_emoji_1F40A">Crocodile</string> + <!-- Spoken description for Unicode code point U+1F40B: "🐋" WHALE --> + <string name="spoken_emoji_1F40B">Whale</string> + <!-- Spoken description for Unicode code point U+1F40C: "🐌" SNAIL --> + <string name="spoken_emoji_1F40C">Snail</string> + <!-- Spoken description for Unicode code point U+1F40D: "🐍" SNAKE --> + <string name="spoken_emoji_1F40D">Snake</string> + <!-- Spoken description for Unicode code point U+1F40E: "🐎" HORSE --> + <string name="spoken_emoji_1F40E">Horse</string> + <!-- Spoken description for Unicode code point U+1F40F: "🐏" RAM --> + <string name="spoken_emoji_1F40F">Ram</string> + <!-- Spoken description for Unicode code point U+1F410: "🐐" GOAT --> + <string name="spoken_emoji_1F410">Goat</string> + <!-- Spoken description for Unicode code point U+1F411: "🐑" SHEEP --> + <string name="spoken_emoji_1F411">Sheep</string> + <!-- Spoken description for Unicode code point U+1F412: "🐒" MONKEY --> + <string name="spoken_emoji_1F412">Monkey</string> + <!-- Spoken description for Unicode code point U+1F413: "🐓" ROOSTER --> + <string name="spoken_emoji_1F413">Rooster</string> + <!-- Spoken description for Unicode code point U+1F414: "🐔" CHICKEN --> + <string name="spoken_emoji_1F414">Chicken</string> + <!-- Spoken description for Unicode code point U+1F415: "🐕" DOG --> + <string name="spoken_emoji_1F415">Dog</string> + <!-- Spoken description for Unicode code point U+1F416: "🐖" PIG --> + <string name="spoken_emoji_1F416">Pig</string> + <!-- Spoken description for Unicode code point U+1F417: "🐗" BOAR --> + <string name="spoken_emoji_1F417">Boar</string> + <!-- Spoken description for Unicode code point U+1F418: "🐘" ELEPHANT --> + <string name="spoken_emoji_1F418">Elephant</string> + <!-- Spoken description for Unicode code point U+1F419: "🐙" OCTOPUS --> + <string name="spoken_emoji_1F419">Octopus</string> + <!-- Spoken description for Unicode code point U+1F41A: "🐚" SPIRAL SHELL --> + <string name="spoken_emoji_1F41A">Spiral shell</string> + <!-- Spoken description for Unicode code point U+1F41B: "🐛" BUG --> + <string name="spoken_emoji_1F41B">Bug</string> + <!-- Spoken description for Unicode code point U+1F41C: "🐜" ANT --> + <string name="spoken_emoji_1F41C">Ant</string> + <!-- Spoken description for Unicode code point U+1F41D: "🐝" HONEYBEE --> + <string name="spoken_emoji_1F41D">Honeybee</string> + <!-- Spoken description for Unicode code point U+1F41E: "🐞" LADY BEETLE --> + <string name="spoken_emoji_1F41E">Lady beetle</string> + <!-- Spoken description for Unicode code point U+1F41F: "🐟" FISH --> + <string name="spoken_emoji_1F41F">Fish</string> + <!-- Spoken description for Unicode code point U+1F420: "🐠" TROPICAL FISH --> + <string name="spoken_emoji_1F420">Tropical fish</string> + <!-- Spoken description for Unicode code point U+1F421: "🐡" BLOWFISH --> + <string name="spoken_emoji_1F421">Blowfish</string> + <!-- Spoken description for Unicode code point U+1F422: "🐢" TURTLE --> + <string name="spoken_emoji_1F422">Turtle</string> + <!-- Spoken description for Unicode code point U+1F423: "🐣" HATCHING CHICK --> + <string name="spoken_emoji_1F423">Hatching chick</string> + <!-- Spoken description for Unicode code point U+1F424: "🐤" BABY CHICK --> + <string name="spoken_emoji_1F424">Baby chick</string> + <!-- Spoken description for Unicode code point U+1F425: "🐥" FRONT-FACING BABY CHICK --> + <string name="spoken_emoji_1F425">Front-facing baby chick</string> + <!-- Spoken description for Unicode code point U+1F426: "🐦" BIRD --> + <string name="spoken_emoji_1F426">Bird</string> + <!-- Spoken description for Unicode code point U+1F427: "🐧" PENGUIN --> + <string name="spoken_emoji_1F427">Penguin</string> + <!-- Spoken description for Unicode code point U+1F428: "🐨" KOALA --> + <string name="spoken_emoji_1F428">Koala</string> + <!-- Spoken description for Unicode code point U+1F429: "🐩" POODLE --> + <string name="spoken_emoji_1F429">Poodle</string> + <!-- Spoken description for Unicode code point U+1F42A: "🐪" DROMEDARY CAMEL --> + <string name="spoken_emoji_1F42A">Dromedary camel</string> + <!-- Spoken description for Unicode code point U+1F42B: "🐫" BACTRIAN CAMEL --> + <string name="spoken_emoji_1F42B">Bactrian camel</string> + <!-- Spoken description for Unicode code point U+1F42C: "🐬" DOLPHIN --> + <string name="spoken_emoji_1F42C">Dolphin</string> + <!-- Spoken description for Unicode code point U+1F42D: "🐭" MOUSE FACE --> + <string name="spoken_emoji_1F42D">Mouse face</string> + <!-- Spoken description for Unicode code point U+1F42E: "🐮" COW FACE --> + <string name="spoken_emoji_1F42E">Cow face</string> + <!-- Spoken description for Unicode code point U+1F42F: "🐯" TIGER FACE --> + <string name="spoken_emoji_1F42F">Tiger face</string> + <!-- Spoken description for Unicode code point U+1F430: "🐰" RABBIT FACE --> + <string name="spoken_emoji_1F430">Rabbit face</string> + <!-- Spoken description for Unicode code point U+1F431: "🐱" CAT FACE --> + <string name="spoken_emoji_1F431">Cat face</string> + <!-- Spoken description for Unicode code point U+1F432: "🐲" DRAGON FACE --> + <string name="spoken_emoji_1F432">Dragon face</string> + <!-- Spoken description for Unicode code point U+1F433: "🐳" SPOUTING WHALE --> + <string name="spoken_emoji_1F433">Spouting whale</string> + <!-- Spoken description for Unicode code point U+1F434: "🐴" HORSE FACE --> + <string name="spoken_emoji_1F434">Horse face</string> + <!-- Spoken description for Unicode code point U+1F435: "🐵" MONKEY FACE --> + <string name="spoken_emoji_1F435">Monkey face</string> + <!-- Spoken description for Unicode code point U+1F436: "🐶" DOG FACE --> + <string name="spoken_emoji_1F436">Dog face</string> + <!-- Spoken description for Unicode code point U+1F437: "🐷" PIG FACE --> + <string name="spoken_emoji_1F437">Pig face</string> + <!-- Spoken description for Unicode code point U+1F438: "🐸" FROG FACE --> + <string name="spoken_emoji_1F438">Frog face</string> + <!-- Spoken description for Unicode code point U+1F439: "🐹" HAMSTER FACE --> + <string name="spoken_emoji_1F439">Hamster face</string> + <!-- Spoken description for Unicode code point U+1F43A: "🐺" WOLF FACE --> + <string name="spoken_emoji_1F43A">Wolf face</string> + <!-- Spoken description for Unicode code point U+1F43B: "🐻" BEAR FACE --> + <string name="spoken_emoji_1F43B">Bear face</string> + <!-- Spoken description for Unicode code point U+1F43C: "🐼" PANDA FACE --> + <string name="spoken_emoji_1F43C">Panda face</string> + <!-- Spoken description for Unicode code point U+1F43D: "🐽" PIG NOSE --> + <string name="spoken_emoji_1F43D">Pig nose</string> + <!-- Spoken description for Unicode code point U+1F43E: "🐾" PAW PRINTS --> + <string name="spoken_emoji_1F43E">Paw prints</string> + <!-- Spoken description for Unicode code point U+1F440: "👀" EYES --> + <string name="spoken_emoji_1F440">Eyes</string> + <!-- Spoken description for Unicode code point U+1F442: "👂" EAR --> + <string name="spoken_emoji_1F442">Ear</string> + <!-- Spoken description for Unicode code point U+1F443: "👃" NOSE --> + <string name="spoken_emoji_1F443">Nose</string> + <!-- Spoken description for Unicode code point U+1F444: "👄" MOUTH --> + <string name="spoken_emoji_1F444">Mouth</string> + <!-- Spoken description for Unicode code point U+1F445: "👅" TONGUE --> + <string name="spoken_emoji_1F445">Tongue</string> + <!-- Spoken description for Unicode code point U+1F446: "👆" WHITE UP POINTING BACKHAND INDEX --> + <string name="spoken_emoji_1F446">White up pointing backhand index</string> + <!-- Spoken description for Unicode code point U+1F447: "👇" WHITE DOWN POINTING BACKHAND INDEX --> + <string name="spoken_emoji_1F447">White down pointing backhand index</string> + <!-- Spoken description for Unicode code point U+1F448: "👈" WHITE LEFT POINTING BACKHAND INDEX --> + <string name="spoken_emoji_1F448">White left pointing backhand index</string> + <!-- Spoken description for Unicode code point U+1F449: "👉" WHITE RIGHT POINTING BACKHAND INDEX --> + <string name="spoken_emoji_1F449">White right pointing backhand index</string> + <!-- Spoken description for Unicode code point U+1F44A: "👊" FISTED HAND SIGN --> + <string name="spoken_emoji_1F44A">Fisted hand sign</string> + <!-- Spoken description for Unicode code point U+1F44B: "👋" WAVING HAND SIGN --> + <string name="spoken_emoji_1F44B">Waving hand sign</string> + <!-- Spoken description for Unicode code point U+1F44C: "👌" OK HAND SIGN --> + <string name="spoken_emoji_1F44C">Ok hand sign</string> + <!-- Spoken description for Unicode code point U+1F44D: "👍" THUMBS UP SIGN --> + <string name="spoken_emoji_1F44D">Thumbs up sign</string> + <!-- Spoken description for Unicode code point U+1F44E: "👎" THUMBS DOWN SIGN --> + <string name="spoken_emoji_1F44E">Thumbs down sign</string> + <!-- Spoken description for Unicode code point U+1F44F: "👏" CLAPPING HANDS SIGN --> + <string name="spoken_emoji_1F44F">Clapping hands sign</string> + <!-- Spoken description for Unicode code point U+1F450: "👐" OPEN HANDS SIGN --> + <string name="spoken_emoji_1F450">Open hands sign</string> + <!-- Spoken description for Unicode code point U+1F451: "👑" CROWN --> + <string name="spoken_emoji_1F451">Crown</string> + <!-- Spoken description for Unicode code point U+1F452: "👒" WOMANS HAT --> + <string name="spoken_emoji_1F452">Womans hat</string> + <!-- Spoken description for Unicode code point U+1F453: "👓" EYEGLASSES --> + <string name="spoken_emoji_1F453">Eyeglasses</string> + <!-- Spoken description for Unicode code point U+1F454: "👔" NECKTIE --> + <string name="spoken_emoji_1F454">Necktie</string> + <!-- Spoken description for Unicode code point U+1F455: "👕" T-SHIRT --> + <string name="spoken_emoji_1F455">T-shirt</string> + <!-- Spoken description for Unicode code point U+1F456: "👖" JEANS --> + <string name="spoken_emoji_1F456">Jeans</string> + <!-- Spoken description for Unicode code point U+1F457: "👗" DRESS --> + <string name="spoken_emoji_1F457">Dress</string> + <!-- Spoken description for Unicode code point U+1F458: "👘" KIMONO --> + <string name="spoken_emoji_1F458">Kimono</string> + <!-- Spoken description for Unicode code point U+1F459: "👙" BIKINI --> + <string name="spoken_emoji_1F459">Bikini</string> + <!-- Spoken description for Unicode code point U+1F45A: "👚" WOMANS CLOTHES --> + <string name="spoken_emoji_1F45A">Womans clothes</string> + <!-- Spoken description for Unicode code point U+1F45B: "👛" PURSE --> + <string name="spoken_emoji_1F45B">Purse</string> + <!-- Spoken description for Unicode code point U+1F45C: "👜" HANDBAG --> + <string name="spoken_emoji_1F45C">Handbag</string> + <!-- Spoken description for Unicode code point U+1F45D: "👝" POUCH --> + <string name="spoken_emoji_1F45D">Pouch</string> + <!-- Spoken description for Unicode code point U+1F45E: "👞" MANS SHOE --> + <string name="spoken_emoji_1F45E">Mans shoe</string> + <!-- Spoken description for Unicode code point U+1F45F: "👟" ATHLETIC SHOE --> + <string name="spoken_emoji_1F45F">Athletic shoe</string> + <!-- Spoken description for Unicode code point U+1F460: "👠" HIGH-HEELED SHOE --> + <string name="spoken_emoji_1F460">High-heeled shoe</string> + <!-- Spoken description for Unicode code point U+1F461: "👡" WOMANS SANDAL --> + <string name="spoken_emoji_1F461">Womans sandal</string> + <!-- Spoken description for Unicode code point U+1F462: "👢" WOMANS BOOTS --> + <string name="spoken_emoji_1F462">Womans boots</string> + <!-- Spoken description for Unicode code point U+1F463: "👣" FOOTPRINTS --> + <string name="spoken_emoji_1F463">Footprints</string> + <!-- Spoken description for Unicode code point U+1F464: "👤" BUST IN SILHOUETTE --> + <string name="spoken_emoji_1F464">Bust in silhouette</string> + <!-- Spoken description for Unicode code point U+1F465: "👥" BUSTS IN SILHOUETTE --> + <string name="spoken_emoji_1F465">Busts in silhouette</string> + <!-- Spoken description for Unicode code point U+1F466: "👦" BOY --> + <string name="spoken_emoji_1F466">Boy</string> + <!-- Spoken description for Unicode code point U+1F467: "👧" GIRL --> + <string name="spoken_emoji_1F467">Girl</string> + <!-- Spoken description for Unicode code point U+1F468: "👨" MAN --> + <string name="spoken_emoji_1F468">Man</string> + <!-- Spoken description for Unicode code point U+1F469: "👩" WOMAN --> + <string name="spoken_emoji_1F469">Woman</string> + <!-- Spoken description for Unicode code point U+1F46A: "👪" FAMILY --> + <string name="spoken_emoji_1F46A">Family</string> + <!-- Spoken description for Unicode code point U+1F46B: "👫" MAN AND WOMAN HOLDING HANDS --> + <string name="spoken_emoji_1F46B">Man and woman holding hands</string> + <!-- Spoken description for Unicode code point U+1F46C: "👬" TWO MEN HOLDING HANDS --> + <string name="spoken_emoji_1F46C">Two men holding hands</string> + <!-- Spoken description for Unicode code point U+1F46D: "👭" TWO WOMEN HOLDING HANDS --> + <string name="spoken_emoji_1F46D">Two women holding hands</string> + <!-- Spoken description for Unicode code point U+1F46E: "👮" POLICE OFFICER --> + <string name="spoken_emoji_1F46E">Police officer</string> + <!-- Spoken description for Unicode code point U+1F46F: "👯" WOMAN WITH BUNNY EARS --> + <string name="spoken_emoji_1F46F">Woman with bunny ears</string> + <!-- Spoken description for Unicode code point U+1F470: "👰" BRIDE WITH VEIL --> + <string name="spoken_emoji_1F470">Bride with veil</string> + <!-- Spoken description for Unicode code point U+1F471: "👱" PERSON WITH BLOND HAIR --> + <string name="spoken_emoji_1F471">Person with blond hair</string> + <!-- Spoken description for Unicode code point U+1F472: "👲" MAN WITH GUA PI MAO --> + <string name="spoken_emoji_1F472">Man with gua pi mao</string> + <!-- Spoken description for Unicode code point U+1F473: "👳" MAN WITH TURBAN --> + <string name="spoken_emoji_1F473">Man with turban</string> + <!-- Spoken description for Unicode code point U+1F474: "👴" OLDER MAN --> + <string name="spoken_emoji_1F474">Older man</string> + <!-- Spoken description for Unicode code point U+1F475: "👵" OLDER WOMAN --> + <string name="spoken_emoji_1F475">Older woman</string> + <!-- Spoken description for Unicode code point U+1F476: "👶" BABY --> + <string name="spoken_emoji_1F476">Baby</string> + <!-- Spoken description for Unicode code point U+1F477: "👷" CONSTRUCTION WORKER --> + <string name="spoken_emoji_1F477">Construction worker</string> + <!-- Spoken description for Unicode code point U+1F478: "👸" PRINCESS --> + <string name="spoken_emoji_1F478">Princess</string> + <!-- Spoken description for Unicode code point U+1F479: "👹" JAPANESE OGRE --> + <string name="spoken_emoji_1F479">Japanese ogre</string> + <!-- Spoken description for Unicode code point U+1F47A: "👺" JAPANESE GOBLIN --> + <string name="spoken_emoji_1F47A">Japanese goblin</string> + <!-- Spoken description for Unicode code point U+1F47B: "👻" GHOST --> + <string name="spoken_emoji_1F47B">Ghost</string> + <!-- Spoken description for Unicode code point U+1F47C: "👼" BABY ANGEL --> + <string name="spoken_emoji_1F47C">Baby angel</string> + <!-- Spoken description for Unicode code point U+1F47D: "👽" EXTRATERRESTRIAL ALIEN --> + <string name="spoken_emoji_1F47D">Extraterrestrial alien</string> + <!-- Spoken description for Unicode code point U+1F47E: "👾" ALIEN MONSTER --> + <string name="spoken_emoji_1F47E">Alien monster</string> + <!-- Spoken description for Unicode code point U+1F47F: "👿" IMP --> + <string name="spoken_emoji_1F47F">Imp</string> + <!-- Spoken description for Unicode code point U+1F480: "💀" SKULL --> + <string name="spoken_emoji_1F480">Skull</string> + <!-- Spoken description for Unicode code point U+1F481: "💁" INFORMATION DESK PERSON --> + <string name="spoken_emoji_1F481">Information desk person</string> + <!-- Spoken description for Unicode code point U+1F482: "💂" GUARDSMAN --> + <string name="spoken_emoji_1F482">Guardsman</string> + <!-- Spoken description for Unicode code point U+1F483: "💃" DANCER --> + <string name="spoken_emoji_1F483">Dancer</string> + <!-- Spoken description for Unicode code point U+1F484: "💄" LIPSTICK --> + <string name="spoken_emoji_1F484">Lipstick</string> + <!-- Spoken description for Unicode code point U+1F485: "💅" NAIL POLISH --> + <string name="spoken_emoji_1F485">Nail polish</string> + <!-- Spoken description for Unicode code point U+1F486: "💆" FACE MASSAGE --> + <string name="spoken_emoji_1F486">Face massage</string> + <!-- Spoken description for Unicode code point U+1F487: "💇" HAIRCUT --> + <string name="spoken_emoji_1F487">Haircut</string> + <!-- Spoken description for Unicode code point U+1F488: "💈" BARBER POLE --> + <string name="spoken_emoji_1F488">Barber pole</string> + <!-- Spoken description for Unicode code point U+1F489: "💉" SYRINGE --> + <string name="spoken_emoji_1F489">Syringe</string> + <!-- Spoken description for Unicode code point U+1F48A: "💊" PILL --> + <string name="spoken_emoji_1F48A">Pill</string> + <!-- Spoken description for Unicode code point U+1F48B: "💋" KISS MARK --> + <string name="spoken_emoji_1F48B">Kiss mark</string> + <!-- Spoken description for Unicode code point U+1F48C: "💌" LOVE LETTER --> + <string name="spoken_emoji_1F48C">Love letter</string> + <!-- Spoken description for Unicode code point U+1F48D: "💍" RING --> + <string name="spoken_emoji_1F48D">Ring</string> + <!-- Spoken description for Unicode code point U+1F48E: "💎" GEM STONE --> + <string name="spoken_emoji_1F48E">Gem stone</string> + <!-- Spoken description for Unicode code point U+1F48F: "💏" KISS --> + <string name="spoken_emoji_1F48F">Kiss</string> + <!-- Spoken description for Unicode code point U+1F490: "💐" BOUQUET --> + <string name="spoken_emoji_1F490">Bouquet</string> + <!-- Spoken description for Unicode code point U+1F491: "💑" COUPLE WITH HEART --> + <string name="spoken_emoji_1F491">Couple with heart</string> + <!-- Spoken description for Unicode code point U+1F492: "💒" WEDDING --> + <string name="spoken_emoji_1F492">Wedding</string> + <!-- Spoken description for Unicode code point U+1F493: "💓" BEATING HEART --> + <string name="spoken_emoji_1F493">Beating heart</string> + <!-- Spoken description for Unicode code point U+1F494: "💔" BROKEN HEART --> + <string name="spoken_emoji_1F494">Broken heart</string> + <!-- Spoken description for Unicode code point U+1F495: "💕" TWO HEARTS --> + <string name="spoken_emoji_1F495">Two hearts</string> + <!-- Spoken description for Unicode code point U+1F496: "💖" SPARKLING HEART --> + <string name="spoken_emoji_1F496">Sparkling heart</string> + <!-- Spoken description for Unicode code point U+1F497: "💗" GROWING HEART --> + <string name="spoken_emoji_1F497">Growing heart</string> + <!-- Spoken description for Unicode code point U+1F498: "💘" HEART WITH ARROW --> + <string name="spoken_emoji_1F498">Heart with arrow</string> + <!-- Spoken description for Unicode code point U+1F499: "💙" BLUE HEART --> + <string name="spoken_emoji_1F499">Blue heart</string> + <!-- Spoken description for Unicode code point U+1F49A: "💚" GREEN HEART --> + <string name="spoken_emoji_1F49A">Green heart</string> + <!-- Spoken description for Unicode code point U+1F49B: "💛" YELLOW HEART --> + <string name="spoken_emoji_1F49B">Yellow heart</string> + <!-- Spoken description for Unicode code point U+1F49C: "💜" PURPLE HEART --> + <string name="spoken_emoji_1F49C">Purple heart</string> + <!-- Spoken description for Unicode code point U+1F49D: "💝" HEART WITH RIBBON --> + <string name="spoken_emoji_1F49D">Heart with ribbon</string> + <!-- Spoken description for Unicode code point U+1F49E: "💞" REVOLVING HEARTS --> + <string name="spoken_emoji_1F49E">Revolving hearts</string> + <!-- Spoken description for Unicode code point U+1F49F: "💟" HEART DECORATION --> + <string name="spoken_emoji_1F49F">Heart decoration</string> + <!-- Spoken description for Unicode code point U+1F4A0: "💠" DIAMOND SHAPE WITH A DOT INSIDE --> + <string name="spoken_emoji_1F4A0">Diamond shape with a dot inside</string> + <!-- Spoken description for Unicode code point U+1F4A1: "💡" ELECTRIC LIGHT BULB --> + <string name="spoken_emoji_1F4A1">Electric light bulb</string> + <!-- Spoken description for Unicode code point U+1F4A2: "💢" ANGER SYMBOL --> + <string name="spoken_emoji_1F4A2">Anger symbol</string> + <!-- Spoken description for Unicode code point U+1F4A3: "💣" BOMB --> + <string name="spoken_emoji_1F4A3">Bomb</string> + <!-- Spoken description for Unicode code point U+1F4A4: "💤" SLEEPING SYMBOL --> + <string name="spoken_emoji_1F4A4">Sleeping symbol</string> + <!-- Spoken description for Unicode code point U+1F4A5: "💥" COLLISION SYMBOL --> + <string name="spoken_emoji_1F4A5">Collision symbol</string> + <!-- Spoken description for Unicode code point U+1F4A6: "💦" SPLASHING SWEAT SYMBOL --> + <string name="spoken_emoji_1F4A6">Splashing sweat symbol</string> + <!-- Spoken description for Unicode code point U+1F4A7: "💧" DROPLET --> + <string name="spoken_emoji_1F4A7">Droplet</string> + <!-- Spoken description for Unicode code point U+1F4A8: "💨" DASH SYMBOL --> + <string name="spoken_emoji_1F4A8">Dash symbol</string> + <!-- Spoken description for Unicode code point U+1F4A9: "💩" PILE OF POO --> + <string name="spoken_emoji_1F4A9">Pile of poo</string> + <!-- Spoken description for Unicode code point U+1F4AA: "💪" FLEXED BICEPS --> + <string name="spoken_emoji_1F4AA">Flexed biceps</string> + <!-- Spoken description for Unicode code point U+1F4AB: "💫" DIZZY SYMBOL --> + <string name="spoken_emoji_1F4AB">Dizzy symbol</string> + <!-- Spoken description for Unicode code point U+1F4AC: "💬" SPEECH BALLOON --> + <string name="spoken_emoji_1F4AC">Speech balloon</string> + <!-- Spoken description for Unicode code point U+1F4AD: "💭" THOUGHT BALLOON --> + <string name="spoken_emoji_1F4AD">Thought balloon</string> + <!-- Spoken description for Unicode code point U+1F4AE: "💮" WHITE FLOWER --> + <string name="spoken_emoji_1F4AE">White flower</string> + <!-- Spoken description for Unicode code point U+1F4AF: "💯" HUNDRED POINTS SYMBOL --> + <string name="spoken_emoji_1F4AF">Hundred points symbol</string> + <!-- Spoken description for Unicode code point U+1F4B0: "💰" MONEY BAG --> + <string name="spoken_emoji_1F4B0">Money bag</string> + <!-- Spoken description for Unicode code point U+1F4B1: "💱" CURRENCY EXCHANGE --> + <string name="spoken_emoji_1F4B1">Currency exchange</string> + <!-- Spoken description for Unicode code point U+1F4B2: "💲" HEAVY DOLLAR SIGN --> + <string name="spoken_emoji_1F4B2">Heavy dollar sign</string> + <!-- Spoken description for Unicode code point U+1F4B3: "💳" CREDIT CARD --> + <string name="spoken_emoji_1F4B3">Credit card</string> + <!-- Spoken description for Unicode code point U+1F4B4: "💴" BANKNOTE WITH YEN SIGN --> + <string name="spoken_emoji_1F4B4">Banknote with yen sign</string> + <!-- Spoken description for Unicode code point U+1F4B5: "💵" BANKNOTE WITH DOLLAR SIGN --> + <string name="spoken_emoji_1F4B5">Banknote with dollar sign</string> + <!-- Spoken description for Unicode code point U+1F4B6: "💶" BANKNOTE WITH EURO SIGN --> + <string name="spoken_emoji_1F4B6">Banknote with euro sign</string> + <!-- Spoken description for Unicode code point U+1F4B7: "💷" BANKNOTE WITH POUND SIGN --> + <string name="spoken_emoji_1F4B7">Banknote with pound sign</string> + <!-- Spoken description for Unicode code point U+1F4B8: "💸" MONEY WITH WINGS --> + <string name="spoken_emoji_1F4B8">Money with wings</string> + <!-- Spoken description for Unicode code point U+1F4B9: "💹" CHART WITH UPWARDS TREND AND YEN SIGN --> + <string name="spoken_emoji_1F4B9">Chart with upwards trend and yen sign</string> + <!-- Spoken description for Unicode code point U+1F4BA: "💺" SEAT --> + <string name="spoken_emoji_1F4BA">Seat</string> + <!-- Spoken description for Unicode code point U+1F4BB: "💻" PERSONAL COMPUTER --> + <string name="spoken_emoji_1F4BB">Personal computer</string> + <!-- Spoken description for Unicode code point U+1F4BC: "💼" BRIEFCASE --> + <string name="spoken_emoji_1F4BC">Briefcase</string> + <!-- Spoken description for Unicode code point U+1F4BD: "💽" MINIDISC --> + <string name="spoken_emoji_1F4BD">Minidisc</string> + <!-- Spoken description for Unicode code point U+1F4BE: "💾" FLOPPY DISK --> + <string name="spoken_emoji_1F4BE">Floppy disk</string> + <!-- Spoken description for Unicode code point U+1F4BF: "💿" OPTICAL DISC --> + <string name="spoken_emoji_1F4BF">Optical disc</string> + <!-- Spoken description for Unicode code point U+1F4C0: "📀" DVD --> + <string name="spoken_emoji_1F4C0">Dvd</string> + <!-- Spoken description for Unicode code point U+1F4C1: "📁" FILE FOLDER --> + <string name="spoken_emoji_1F4C1">File folder</string> + <!-- Spoken description for Unicode code point U+1F4C2: "📂" OPEN FILE FOLDER --> + <string name="spoken_emoji_1F4C2">Open file folder</string> + <!-- Spoken description for Unicode code point U+1F4C3: "📃" PAGE WITH CURL --> + <string name="spoken_emoji_1F4C3">Page with curl</string> + <!-- Spoken description for Unicode code point U+1F4C4: "📄" PAGE FACING UP --> + <string name="spoken_emoji_1F4C4">Page facing up</string> + <!-- Spoken description for Unicode code point U+1F4C5: "📅" CALENDAR --> + <string name="spoken_emoji_1F4C5">Calendar</string> + <!-- Spoken description for Unicode code point U+1F4C6: "📆" TEAR-OFF CALENDAR --> + <string name="spoken_emoji_1F4C6">Tear-off calendar</string> + <!-- Spoken description for Unicode code point U+1F4C7: "📇" CARD INDEX --> + <string name="spoken_emoji_1F4C7">Card index</string> + <!-- Spoken description for Unicode code point U+1F4C8: "📈" CHART WITH UPWARDS TREND --> + <string name="spoken_emoji_1F4C8">Chart with upwards trend</string> + <!-- Spoken description for Unicode code point U+1F4C9: "📉" CHART WITH DOWNWARDS TREND --> + <string name="spoken_emoji_1F4C9">Chart with downwards trend</string> + <!-- Spoken description for Unicode code point U+1F4CA: "📊" BAR CHART --> + <string name="spoken_emoji_1F4CA">Bar chart</string> + <!-- Spoken description for Unicode code point U+1F4CB: "📋" CLIPBOARD --> + <string name="spoken_emoji_1F4CB">Clipboard</string> + <!-- Spoken description for Unicode code point U+1F4CC: "📌" PUSHPIN --> + <string name="spoken_emoji_1F4CC">Pushpin</string> + <!-- Spoken description for Unicode code point U+1F4CD: "📍" ROUND PUSHPIN --> + <string name="spoken_emoji_1F4CD">Round pushpin</string> + <!-- Spoken description for Unicode code point U+1F4CE: "📎" PAPERCLIP --> + <string name="spoken_emoji_1F4CE">Paperclip</string> + <!-- Spoken description for Unicode code point U+1F4CF: "📏" STRAIGHT RULER --> + <string name="spoken_emoji_1F4CF">Straight ruler</string> + <!-- Spoken description for Unicode code point U+1F4D0: "📐" TRIANGULAR RULER --> + <string name="spoken_emoji_1F4D0">Triangular ruler</string> + <!-- Spoken description for Unicode code point U+1F4D1: "📑" BOOKMARK TABS --> + <string name="spoken_emoji_1F4D1">Bookmark tabs</string> + <!-- Spoken description for Unicode code point U+1F4D2: "📒" LEDGER --> + <string name="spoken_emoji_1F4D2">Ledger</string> + <!-- Spoken description for Unicode code point U+1F4D3: "📓" NOTEBOOK --> + <string name="spoken_emoji_1F4D3">Notebook</string> + <!-- Spoken description for Unicode code point U+1F4D4: "📔" NOTEBOOK WITH DECORATIVE COVER --> + <string name="spoken_emoji_1F4D4">Notebook with decorative cover</string> + <!-- Spoken description for Unicode code point U+1F4D5: "📕" CLOSED BOOK --> + <string name="spoken_emoji_1F4D5">Closed book</string> + <!-- Spoken description for Unicode code point U+1F4D6: "📖" OPEN BOOK --> + <string name="spoken_emoji_1F4D6">Open book</string> + <!-- Spoken description for Unicode code point U+1F4D7: "📗" GREEN BOOK --> + <string name="spoken_emoji_1F4D7">Green book</string> + <!-- Spoken description for Unicode code point U+1F4D8: "📘" BLUE BOOK --> + <string name="spoken_emoji_1F4D8">Blue book</string> + <!-- Spoken description for Unicode code point U+1F4D9: "📙" ORANGE BOOK --> + <string name="spoken_emoji_1F4D9">Orange book</string> + <!-- Spoken description for Unicode code point U+1F4DA: "📚" BOOKS --> + <string name="spoken_emoji_1F4DA">Books</string> + <!-- Spoken description for Unicode code point U+1F4DB: "📛" NAME BADGE --> + <string name="spoken_emoji_1F4DB">Name badge</string> + <!-- Spoken description for Unicode code point U+1F4DC: "📜" SCROLL --> + <string name="spoken_emoji_1F4DC">Scroll</string> + <!-- Spoken description for Unicode code point U+1F4DD: "📝" MEMO --> + <string name="spoken_emoji_1F4DD">Memo</string> + <!-- Spoken description for Unicode code point U+1F4DE: "📞" TELEPHONE RECEIVER --> + <string name="spoken_emoji_1F4DE">Telephone receiver</string> + <!-- Spoken description for Unicode code point U+1F4DF: "📟" PAGER --> + <string name="spoken_emoji_1F4DF">Pager</string> + <!-- Spoken description for Unicode code point U+1F4E0: "📠" FAX MACHINE --> + <string name="spoken_emoji_1F4E0">Fax machine</string> + <!-- Spoken description for Unicode code point U+1F4E1: "📡" SATELLITE ANTENNA --> + <string name="spoken_emoji_1F4E1">Satellite antenna</string> + <!-- Spoken description for Unicode code point U+1F4E2: "📢" PUBLIC ADDRESS LOUDSPEAKER --> + <string name="spoken_emoji_1F4E2">Public address loudspeaker</string> + <!-- Spoken description for Unicode code point U+1F4E3: "📣" CHEERING MEGAPHONE --> + <string name="spoken_emoji_1F4E3">Cheering megaphone</string> + <!-- Spoken description for Unicode code point U+1F4E4: "📤" OUTBOX TRAY --> + <string name="spoken_emoji_1F4E4">Outbox tray</string> + <!-- Spoken description for Unicode code point U+1F4E5: "📥" INBOX TRAY --> + <string name="spoken_emoji_1F4E5">Inbox tray</string> + <!-- Spoken description for Unicode code point U+1F4E6: "📦" PACKAGE --> + <string name="spoken_emoji_1F4E6">Package</string> + <!-- Spoken description for Unicode code point U+1F4E7: "📧" E-MAIL SYMBOL --> + <string name="spoken_emoji_1F4E7">E-mail symbol</string> + <!-- Spoken description for Unicode code point U+1F4E8: "📨" INCOMING ENVELOPE --> + <string name="spoken_emoji_1F4E8">Incoming envelope</string> + <!-- Spoken description for Unicode code point U+1F4E9: "📩" ENVELOPE WITH DOWNWARDS ARROW ABOVE --> + <string name="spoken_emoji_1F4E9">Envelope with downwards arrow above</string> + <!-- Spoken description for Unicode code point U+1F4EA: "📪" CLOSED MAILBOX WITH LOWERED FLAG --> + <string name="spoken_emoji_1F4EA">Closed mailbox with lowered flag</string> + <!-- Spoken description for Unicode code point U+1F4EB: "📫" CLOSED MAILBOX WITH RAISED FLAG --> + <string name="spoken_emoji_1F4EB">Closed mailbox with raised flag</string> + <!-- Spoken description for Unicode code point U+1F4EC: "📬" OPEN MAILBOX WITH RAISED FLAG --> + <string name="spoken_emoji_1F4EC">Open mailbox with raised flag</string> + <!-- Spoken description for Unicode code point U+1F4ED: "📭" OPEN MAILBOX WITH LOWERED FLAG --> + <string name="spoken_emoji_1F4ED">Open mailbox with lowered flag</string> + <!-- Spoken description for Unicode code point U+1F4EE: "📮" POSTBOX --> + <string name="spoken_emoji_1F4EE">Postbox</string> + <!-- Spoken description for Unicode code point U+1F4EF: "📯" POSTAL HORN --> + <string name="spoken_emoji_1F4EF">Postal horn</string> + <!-- Spoken description for Unicode code point U+1F4F0: "📰" NEWSPAPER --> + <string name="spoken_emoji_1F4F0">Newspaper</string> + <!-- Spoken description for Unicode code point U+1F4F1: "📱" MOBILE PHONE --> + <string name="spoken_emoji_1F4F1">Mobile phone</string> + <!-- Spoken description for Unicode code point U+1F4F2: "📲" MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT --> + <string name="spoken_emoji_1F4F2">Mobile phone with rightwards arrow at left</string> + <!-- Spoken description for Unicode code point U+1F4F3: "📳" VIBRATION MODE --> + <string name="spoken_emoji_1F4F3">Vibration mode</string> + <!-- Spoken description for Unicode code point U+1F4F4: "📴" MOBILE PHONE OFF --> + <string name="spoken_emoji_1F4F4">Mobile phone off</string> + <!-- Spoken description for Unicode code point U+1F4F5: "📵" NO MOBILE PHONES --> + <string name="spoken_emoji_1F4F5">No mobile phones</string> + <!-- Spoken description for Unicode code point U+1F4F6: "📶" ANTENNA WITH BARS --> + <string name="spoken_emoji_1F4F6">Antenna with bars</string> + <!-- Spoken description for Unicode code point U+1F4F7: "📷" CAMERA --> + <string name="spoken_emoji_1F4F7">Camera</string> + <!-- Spoken description for Unicode code point U+1F4F9: "📹" VIDEO CAMERA --> + <string name="spoken_emoji_1F4F9">Video camera</string> + <!-- Spoken description for Unicode code point U+1F4FA: "📺" TELEVISION --> + <string name="spoken_emoji_1F4FA">Television</string> + <!-- Spoken description for Unicode code point U+1F4FB: "📻" RADIO --> + <string name="spoken_emoji_1F4FB">Radio</string> + <!-- Spoken description for Unicode code point U+1F4FC: "📼" VIDEOCASSETTE --> + <string name="spoken_emoji_1F4FC">Videocassette</string> + <!-- Spoken description for Unicode code point U+1F500: "🔀" TWISTED RIGHTWARDS ARROWS --> + <string name="spoken_emoji_1F500">Twisted rightwards arrows</string> + <!-- Spoken description for Unicode code point U+1F501: "🔁" CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS --> + <string name="spoken_emoji_1F501">Clockwise rightwards and leftwards open circle arrows</string> + <!-- Spoken description for Unicode code point U+1F502: "🔂" CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY --> + <string name="spoken_emoji_1F502">Clockwise rightwards and leftwards open circle arrows with circled one overlay</string> + <!-- Spoken description for Unicode code point U+1F503: "🔃" CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS --> + <string name="spoken_emoji_1F503">Clockwise downwards and upwards open circle arrows</string> + <!-- Spoken description for Unicode code point U+1F504: "🔄" ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS --> + <string name="spoken_emoji_1F504">Anticlockwise downwards and upwards open circle arrows</string> + <!-- Spoken description for Unicode code point U+1F505: "🔅" LOW BRIGHTNESS SYMBOL --> + <string name="spoken_emoji_1F505">Low brightness symbol</string> + <!-- Spoken description for Unicode code point U+1F506: "🔆" HIGH BRIGHTNESS SYMBOL --> + <string name="spoken_emoji_1F506">High brightness symbol</string> + <!-- Spoken description for Unicode code point U+1F507: "🔇" SPEAKER WITH CANCELLATION STROKE --> + <string name="spoken_emoji_1F507">Speaker with cancellation stroke</string> + <!-- Spoken description for Unicode code point U+1F508: "🔈" SPEAKER --> + <string name="spoken_emoji_1F508">Speaker</string> + <!-- Spoken description for Unicode code point U+1F509: "🔉" SPEAKER WITH ONE SOUND WAVE --> + <string name="spoken_emoji_1F509">Speaker with one sound wave</string> + <!-- Spoken description for Unicode code point U+1F50A: "🔊" SPEAKER WITH THREE SOUND WAVES --> + <string name="spoken_emoji_1F50A">Speaker with three sound waves</string> + <!-- Spoken description for Unicode code point U+1F50B: "🔋" BATTERY --> + <string name="spoken_emoji_1F50B">Battery</string> + <!-- Spoken description for Unicode code point U+1F50C: "🔌" ELECTRIC PLUG --> + <string name="spoken_emoji_1F50C">Electric plug</string> + <!-- Spoken description for Unicode code point U+1F50D: "🔍" LEFT-POINTING MAGNIFYING GLASS --> + <string name="spoken_emoji_1F50D">Left-pointing magnifying glass</string> + <!-- Spoken description for Unicode code point U+1F50E: "🔎" RIGHT-POINTING MAGNIFYING GLASS --> + <string name="spoken_emoji_1F50E">Right-pointing magnifying glass</string> + <!-- Spoken description for Unicode code point U+1F50F: "🔏" LOCK WITH INK PEN --> + <string name="spoken_emoji_1F50F">Lock with ink pen</string> + <!-- Spoken description for Unicode code point U+1F510: "🔐" CLOSED LOCK WITH KEY --> + <string name="spoken_emoji_1F510">Closed lock with key</string> + <!-- Spoken description for Unicode code point U+1F511: "🔑" KEY --> + <string name="spoken_emoji_1F511">Key</string> + <!-- Spoken description for Unicode code point U+1F512: "🔒" LOCK --> + <string name="spoken_emoji_1F512">Lock</string> + <!-- Spoken description for Unicode code point U+1F513: "🔓" OPEN LOCK --> + <string name="spoken_emoji_1F513">Open lock</string> + <!-- Spoken description for Unicode code point U+1F514: "🔔" BELL --> + <string name="spoken_emoji_1F514">Bell</string> + <!-- Spoken description for Unicode code point U+1F515: "🔕" BELL WITH CANCELLATION STROKE --> + <string name="spoken_emoji_1F515">Bell with cancellation stroke</string> + <!-- Spoken description for Unicode code point U+1F516: "🔖" BOOKMARK --> + <string name="spoken_emoji_1F516">Bookmark</string> + <!-- Spoken description for Unicode code point U+1F517: "🔗" LINK SYMBOL --> + <string name="spoken_emoji_1F517">Link symbol</string> + <!-- Spoken description for Unicode code point U+1F518: "🔘" RADIO BUTTON --> + <string name="spoken_emoji_1F518">Radio button</string> + <!-- Spoken description for Unicode code point U+1F519: "🔙" BACK WITH LEFTWARDS ARROW ABOVE --> + <string name="spoken_emoji_1F519">Back with leftwards arrow above</string> + <!-- Spoken description for Unicode code point U+1F51A: "🔚" END WITH LEFTWARDS ARROW ABOVE --> + <string name="spoken_emoji_1F51A">End with leftwards arrow above</string> + <!-- Spoken description for Unicode code point U+1F51B: "🔛" ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE --> + <string name="spoken_emoji_1F51B">On with exclamation mark with left right arrow above</string> + <!-- Spoken description for Unicode code point U+1F51C: "🔜" SOON WITH RIGHTWARDS ARROW ABOVE --> + <string name="spoken_emoji_1F51C">Soon with rightwards arrow above</string> + <!-- Spoken description for Unicode code point U+1F51D: "🔝" TOP WITH UPWARDS ARROW ABOVE --> + <string name="spoken_emoji_1F51D">Top with upwards arrow above</string> + <!-- Spoken description for Unicode code point U+1F51E: "🔞" NO ONE UNDER EIGHTEEN SYMBOL --> + <string name="spoken_emoji_1F51E">No one under eighteen symbol</string> + <!-- Spoken description for Unicode code point U+1F51F: "🔟" KEYCAP TEN --> + <string name="spoken_emoji_1F51F">Keycap ten</string> + <!-- Spoken description for Unicode code point U+1F520: "🔠" INPUT SYMBOL FOR LATIN CAPITAL LETTERS --> + <string name="spoken_emoji_1F520">Input symbol for latin capital letters</string> + <!-- Spoken description for Unicode code point U+1F521: "🔡" INPUT SYMBOL FOR LATIN SMALL LETTERS --> + <string name="spoken_emoji_1F521">Input symbol for latin small letters</string> + <!-- Spoken description for Unicode code point U+1F522: "🔢" INPUT SYMBOL FOR NUMBERS --> + <string name="spoken_emoji_1F522">Input symbol for numbers</string> + <!-- Spoken description for Unicode code point U+1F523: "🔣" INPUT SYMBOL FOR SYMBOLS --> + <string name="spoken_emoji_1F523">Input symbol for symbols</string> + <!-- Spoken description for Unicode code point U+1F524: "🔤" INPUT SYMBOL FOR LATIN LETTERS --> + <string name="spoken_emoji_1F524">Input symbol for latin letters</string> + <!-- Spoken description for Unicode code point U+1F525: "🔥" FIRE --> + <string name="spoken_emoji_1F525">Fire</string> + <!-- Spoken description for Unicode code point U+1F526: "🔦" ELECTRIC TORCH --> + <string name="spoken_emoji_1F526">Electric torch</string> + <!-- Spoken description for Unicode code point U+1F527: "🔧" WRENCH --> + <string name="spoken_emoji_1F527">Wrench</string> + <!-- Spoken description for Unicode code point U+1F528: "🔨" HAMMER --> + <string name="spoken_emoji_1F528">Hammer</string> + <!-- Spoken description for Unicode code point U+1F529: "🔩" NUT AND BOLT --> + <string name="spoken_emoji_1F529">Nut and bolt</string> + <!-- Spoken description for Unicode code point U+1F52A: "🔪" HOCHO --> + <string name="spoken_emoji_1F52A">Hocho</string> + <!-- Spoken description for Unicode code point U+1F52B: "🔫" PISTOL --> + <string name="spoken_emoji_1F52B">Pistol</string> + <!-- Spoken description for Unicode code point U+1F52C: "🔬" MICROSCOPE --> + <string name="spoken_emoji_1F52C">Microscope</string> + <!-- Spoken description for Unicode code point U+1F52D: "🔭" TELESCOPE --> + <string name="spoken_emoji_1F52D">Telescope</string> + <!-- Spoken description for Unicode code point U+1F52E: "🔮" CRYSTAL BALL --> + <string name="spoken_emoji_1F52E">Crystal ball</string> + <!-- Spoken description for Unicode code point U+1F52F: "🔯" SIX POINTED STAR WITH MIDDLE DOT --> + <string name="spoken_emoji_1F52F">Six pointed star with middle dot</string> + <!-- Spoken description for Unicode code point U+1F530: "🔰" JAPANESE SYMBOL FOR BEGINNER --> + <string name="spoken_emoji_1F530">Japanese symbol for beginner</string> + <!-- Spoken description for Unicode code point U+1F531: "🔱" TRIDENT EMBLEM --> + <string name="spoken_emoji_1F531">Trident emblem</string> + <!-- Spoken description for Unicode code point U+1F532: "🔲" BLACK SQUARE BUTTON --> + <string name="spoken_emoji_1F532">Black square button</string> + <!-- Spoken description for Unicode code point U+1F533: "🔳" WHITE SQUARE BUTTON --> + <string name="spoken_emoji_1F533">White square button</string> + <!-- Spoken description for Unicode code point U+1F534: "🔴" LARGE RED CIRCLE --> + <string name="spoken_emoji_1F534">Large red circle</string> + <!-- Spoken description for Unicode code point U+1F535: "🔵" LARGE BLUE CIRCLE --> + <string name="spoken_emoji_1F535">Large blue circle</string> + <!-- Spoken description for Unicode code point U+1F536: "🔶" LARGE ORANGE DIAMOND --> + <string name="spoken_emoji_1F536">Large orange diamond</string> + <!-- Spoken description for Unicode code point U+1F537: "🔷" LARGE BLUE DIAMOND --> + <string name="spoken_emoji_1F537">Large blue diamond</string> + <!-- Spoken description for Unicode code point U+1F538: "🔸" SMALL ORANGE DIAMOND --> + <string name="spoken_emoji_1F538">Small orange diamond</string> + <!-- Spoken description for Unicode code point U+1F539: "🔹" SMALL BLUE DIAMOND --> + <string name="spoken_emoji_1F539">Small blue diamond</string> + <!-- Spoken description for Unicode code point U+1F53A: "🔺" UP-POINTING RED TRIANGLE --> + <string name="spoken_emoji_1F53A">Up-pointing red triangle</string> + <!-- Spoken description for Unicode code point U+1F53B: "🔻" DOWN-POINTING RED TRIANGLE --> + <string name="spoken_emoji_1F53B">Down-pointing red triangle</string> + <!-- Spoken description for Unicode code point U+1F53C: "🔼" UP-POINTING SMALL RED TRIANGLE --> + <string name="spoken_emoji_1F53C">Up-pointing small red triangle</string> + <!-- Spoken description for Unicode code point U+1F53D: "🔽" DOWN-POINTING SMALL RED TRIANGLE --> + <string name="spoken_emoji_1F53D">Down-pointing small red triangle</string> + <!-- Spoken description for Unicode code point U+1F550: "🕐" CLOCK FACE ONE OCLOCK --> + <string name="spoken_emoji_1F550">Clock face one oclock</string> + <!-- Spoken description for Unicode code point U+1F551: "🕑" CLOCK FACE TWO OCLOCK --> + <string name="spoken_emoji_1F551">Clock face two oclock</string> + <!-- Spoken description for Unicode code point U+1F552: "🕒" CLOCK FACE THREE OCLOCK --> + <string name="spoken_emoji_1F552">Clock face three oclock</string> + <!-- Spoken description for Unicode code point U+1F553: "🕓" CLOCK FACE FOUR OCLOCK --> + <string name="spoken_emoji_1F553">Clock face four oclock</string> + <!-- Spoken description for Unicode code point U+1F554: "🕔" CLOCK FACE FIVE OCLOCK --> + <string name="spoken_emoji_1F554">Clock face five oclock</string> + <!-- Spoken description for Unicode code point U+1F555: "🕕" CLOCK FACE SIX OCLOCK --> + <string name="spoken_emoji_1F555">Clock face six oclock</string> + <!-- Spoken description for Unicode code point U+1F556: "🕖" CLOCK FACE SEVEN OCLOCK --> + <string name="spoken_emoji_1F556">Clock face seven oclock</string> + <!-- Spoken description for Unicode code point U+1F557: "🕗" CLOCK FACE EIGHT OCLOCK --> + <string name="spoken_emoji_1F557">Clock face eight oclock</string> + <!-- Spoken description for Unicode code point U+1F558: "🕘" CLOCK FACE NINE OCLOCK --> + <string name="spoken_emoji_1F558">Clock face nine oclock</string> + <!-- Spoken description for Unicode code point U+1F559: "🕙" CLOCK FACE TEN OCLOCK --> + <string name="spoken_emoji_1F559">Clock face ten oclock</string> + <!-- Spoken description for Unicode code point U+1F55A: "🕚" CLOCK FACE ELEVEN OCLOCK --> + <string name="spoken_emoji_1F55A">Clock face eleven oclock</string> + <!-- Spoken description for Unicode code point U+1F55B: "🕛" CLOCK FACE TWELVE OCLOCK --> + <string name="spoken_emoji_1F55B">Clock face twelve oclock</string> + <!-- Spoken description for Unicode code point U+1F55C: "🕜" CLOCK FACE ONE-THIRTY --> + <string name="spoken_emoji_1F55C">Clock face one-thirty</string> + <!-- Spoken description for Unicode code point U+1F55D: "🕝" CLOCK FACE TWO-THIRTY --> + <string name="spoken_emoji_1F55D">Clock face two-thirty</string> + <!-- Spoken description for Unicode code point U+1F55E: "🕞" CLOCK FACE THREE-THIRTY --> + <string name="spoken_emoji_1F55E">Clock face three-thirty</string> + <!-- Spoken description for Unicode code point U+1F55F: "🕟" CLOCK FACE FOUR-THIRTY --> + <string name="spoken_emoji_1F55F">Clock face four-thirty</string> + <!-- Spoken description for Unicode code point U+1F560: "🕠" CLOCK FACE FIVE-THIRTY --> + <string name="spoken_emoji_1F560">Clock face five-thirty</string> + <!-- Spoken description for Unicode code point U+1F561: "🕡" CLOCK FACE SIX-THIRTY --> + <string name="spoken_emoji_1F561">Clock face six-thirty</string> + <!-- Spoken description for Unicode code point U+1F562: "🕢" CLOCK FACE SEVEN-THIRTY --> + <string name="spoken_emoji_1F562">Clock face seven-thirty</string> + <!-- Spoken description for Unicode code point U+1F563: "🕣" CLOCK FACE EIGHT-THIRTY --> + <string name="spoken_emoji_1F563">Clock face eight-thirty</string> + <!-- Spoken description for Unicode code point U+1F564: "🕤" CLOCK FACE NINE-THIRTY --> + <string name="spoken_emoji_1F564">Clock face nine-thirty</string> + <!-- Spoken description for Unicode code point U+1F565: "🕥" CLOCK FACE TEN-THIRTY --> + <string name="spoken_emoji_1F565">Clock face ten-thirty</string> + <!-- Spoken description for Unicode code point U+1F566: "🕦" CLOCK FACE ELEVEN-THIRTY --> + <string name="spoken_emoji_1F566">Clock face eleven-thirty</string> + <!-- Spoken description for Unicode code point U+1F567: "🕧" CLOCK FACE TWELVE-THIRTY --> + <string name="spoken_emoji_1F567">Clock face twelve-thirty</string> + <!-- Spoken description for Unicode code point U+1F5FB: "🗻" MOUNT FUJI --> + <string name="spoken_emoji_1F5FB">Mount fuji</string> + <!-- Spoken description for Unicode code point U+1F5FC: "🗼" TOKYO TOWER --> + <string name="spoken_emoji_1F5FC">Tokyo tower</string> + <!-- Spoken description for Unicode code point U+1F5FD: "🗽" STATUE OF LIBERTY --> + <string name="spoken_emoji_1F5FD">Statue of liberty</string> + <!-- Spoken description for Unicode code point U+1F5FE: "🗾" SILHOUETTE OF JAPAN --> + <string name="spoken_emoji_1F5FE">Silhouette of japan</string> + <!-- Spoken description for Unicode code point U+1F5FF: "🗿" MOYAI --> + <string name="spoken_emoji_1F5FF">Moyai</string> + <!-- Spoken description for Unicode code point U+1F600: "😀" GRINNING FACE --> + <string name="spoken_emoji_1F600">Grinning face</string> + <!-- Spoken description for Unicode code point U+1F601: "😁" GRINNING FACE WITH SMILING EYES --> + <string name="spoken_emoji_1F601">Grinning face with smiling eyes</string> + <!-- Spoken description for Unicode code point U+1F602: "😂" FACE WITH TEARS OF JOY --> + <string name="spoken_emoji_1F602">Face with tears of joy</string> + <!-- Spoken description for Unicode code point U+1F603: "😃" SMILING FACE WITH OPEN MOUTH --> + <string name="spoken_emoji_1F603">Smiling face with open mouth</string> + <!-- Spoken description for Unicode code point U+1F604: "😄" SMILING FACE WITH OPEN MOUTH AND SMILING EYES --> + <string name="spoken_emoji_1F604">Smiling face with open mouth and smiling eyes</string> + <!-- Spoken description for Unicode code point U+1F605: "😅" SMILING FACE WITH OPEN MOUTH AND COLD SWEAT --> + <string name="spoken_emoji_1F605">Smiling face with open mouth and cold sweat</string> + <!-- Spoken description for Unicode code point U+1F606: "😆" SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES --> + <string name="spoken_emoji_1F606">Smiling face with open mouth and tightly-closed eyes</string> + <!-- Spoken description for Unicode code point U+1F607: "😇" SMILING FACE WITH HALO --> + <string name="spoken_emoji_1F607">Smiling face with halo</string> + <!-- Spoken description for Unicode code point U+1F608: "😈" SMILING FACE WITH HORNS --> + <string name="spoken_emoji_1F608">Smiling face with horns</string> + <!-- Spoken description for Unicode code point U+1F609: "😉" WINKING FACE --> + <string name="spoken_emoji_1F609">Winking face</string> + <!-- Spoken description for Unicode code point U+1F60A: "😊" SMILING FACE WITH SMILING EYES --> + <string name="spoken_emoji_1F60A">Smiling face with smiling eyes</string> + <!-- Spoken description for Unicode code point U+1F60B: "😋" FACE SAVOURING DELICIOUS FOOD --> + <string name="spoken_emoji_1F60B">Face savouring delicious food</string> + <!-- Spoken description for Unicode code point U+1F60C: "😌" RELIEVED FACE --> + <string name="spoken_emoji_1F60C">Relieved face</string> + <!-- Spoken description for Unicode code point U+1F60D: "😍" SMILING FACE WITH HEART-SHAPED EYES --> + <string name="spoken_emoji_1F60D">Smiling face with heart-shaped eyes</string> + <!-- Spoken description for Unicode code point U+1F60E: "😎" SMILING FACE WITH SUNGLASSES --> + <string name="spoken_emoji_1F60E">Smiling face with sunglasses</string> + <!-- Spoken description for Unicode code point U+1F60F: "😏" SMIRKING FACE --> + <string name="spoken_emoji_1F60F">Smirking face</string> + <!-- Spoken description for Unicode code point U+1F610: "😐" NEUTRAL FACE --> + <string name="spoken_emoji_1F610">Neutral face</string> + <!-- Spoken description for Unicode code point U+1F611: "😑" EXPRESSIONLESS FACE --> + <string name="spoken_emoji_1F611">Expressionless face</string> + <!-- Spoken description for Unicode code point U+1F612: "😒" UNAMUSED FACE --> + <string name="spoken_emoji_1F612">Unamused face</string> + <!-- Spoken description for Unicode code point U+1F613: "😓" FACE WITH COLD SWEAT --> + <string name="spoken_emoji_1F613">Face with cold sweat</string> + <!-- Spoken description for Unicode code point U+1F614: "😔" PENSIVE FACE --> + <string name="spoken_emoji_1F614">Pensive face</string> + <!-- Spoken description for Unicode code point U+1F615: "😕" CONFUSED FACE --> + <string name="spoken_emoji_1F615">Confused face</string> + <!-- Spoken description for Unicode code point U+1F616: "😖" CONFOUNDED FACE --> + <string name="spoken_emoji_1F616">Confounded face</string> + <!-- Spoken description for Unicode code point U+1F617: "😗" KISSING FACE --> + <string name="spoken_emoji_1F617">Kissing face</string> + <!-- Spoken description for Unicode code point U+1F618: "😘" FACE THROWING A KISS --> + <string name="spoken_emoji_1F618">Face throwing a kiss</string> + <!-- Spoken description for Unicode code point U+1F619: "😙" KISSING FACE WITH SMILING EYES --> + <string name="spoken_emoji_1F619">Kissing face with smiling eyes</string> + <!-- Spoken description for Unicode code point U+1F61A: "😚" KISSING FACE WITH CLOSED EYES --> + <string name="spoken_emoji_1F61A">Kissing face with closed eyes</string> + <!-- Spoken description for Unicode code point U+1F61B: "😛" FACE WITH STUCK-OUT TONGUE --> + <string name="spoken_emoji_1F61B">Face with stuck-out tongue</string> + <!-- Spoken description for Unicode code point U+1F61C: "😜" FACE WITH STUCK-OUT TONGUE AND WINKING EYE --> + <string name="spoken_emoji_1F61C">Face with stuck-out tongue and winking eye</string> + <!-- Spoken description for Unicode code point U+1F61D: "😝" FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES --> + <string name="spoken_emoji_1F61D">Face with stuck-out tongue and tightly-closed eyes</string> + <!-- Spoken description for Unicode code point U+1F61E: "😞" DISAPPOINTED FACE --> + <string name="spoken_emoji_1F61E">Disappointed face</string> + <!-- Spoken description for Unicode code point U+1F61F: "😟" WORRIED FACE --> + <string name="spoken_emoji_1F61F">Worried face</string> + <!-- Spoken description for Unicode code point U+1F620: "😠" ANGRY FACE --> + <string name="spoken_emoji_1F620">Angry face</string> + <!-- Spoken description for Unicode code point U+1F621: "😡" POUTING FACE --> + <string name="spoken_emoji_1F621">Pouting face</string> + <!-- Spoken description for Unicode code point U+1F622: "😢" CRYING FACE --> + <string name="spoken_emoji_1F622">Crying face</string> + <!-- Spoken description for Unicode code point U+1F623: "😣" PERSEVERING FACE --> + <string name="spoken_emoji_1F623">Persevering face</string> + <!-- Spoken description for Unicode code point U+1F624: "😤" FACE WITH LOOK OF TRIUMPH --> + <string name="spoken_emoji_1F624">Face with look of triumph</string> + <!-- Spoken description for Unicode code point U+1F625: "😥" DISAPPOINTED BUT RELIEVED FACE --> + <string name="spoken_emoji_1F625">Disappointed but relieved face</string> + <!-- Spoken description for Unicode code point U+1F626: "😦" FROWNING FACE WITH OPEN MOUTH --> + <string name="spoken_emoji_1F626">Frowning face with open mouth</string> + <!-- Spoken description for Unicode code point U+1F627: "😧" ANGUISHED FACE --> + <string name="spoken_emoji_1F627">Anguished face</string> + <!-- Spoken description for Unicode code point U+1F628: "😨" FEARFUL FACE --> + <string name="spoken_emoji_1F628">Fearful face</string> + <!-- Spoken description for Unicode code point U+1F629: "😩" WEARY FACE --> + <string name="spoken_emoji_1F629">Weary face</string> + <!-- Spoken description for Unicode code point U+1F62A: "😪" SLEEPY FACE --> + <string name="spoken_emoji_1F62A">Sleepy face</string> + <!-- Spoken description for Unicode code point U+1F62B: "😫" TIRED FACE --> + <string name="spoken_emoji_1F62B">Tired face</string> + <!-- Spoken description for Unicode code point U+1F62C: "😬" GRIMACING FACE --> + <string name="spoken_emoji_1F62C">Grimacing face</string> + <!-- Spoken description for Unicode code point U+1F62D: "😭" LOUDLY CRYING FACE --> + <string name="spoken_emoji_1F62D">Loudly crying face</string> + <!-- Spoken description for Unicode code point U+1F62E: "😮" FACE WITH OPEN MOUTH --> + <string name="spoken_emoji_1F62E">Face with open mouth</string> + <!-- Spoken description for Unicode code point U+1F62F: "😯" HUSHED FACE --> + <string name="spoken_emoji_1F62F">Hushed face</string> + <!-- Spoken description for Unicode code point U+1F630: "😰" FACE WITH OPEN MOUTH AND COLD SWEAT --> + <string name="spoken_emoji_1F630">Face with open mouth and cold sweat</string> + <!-- Spoken description for Unicode code point U+1F631: "😱" FACE SCREAMING IN FEAR --> + <string name="spoken_emoji_1F631">Face screaming in fear</string> + <!-- Spoken description for Unicode code point U+1F632: "😲" ASTONISHED FACE --> + <string name="spoken_emoji_1F632">Astonished face</string> + <!-- Spoken description for Unicode code point U+1F633: "😳" FLUSHED FACE --> + <string name="spoken_emoji_1F633">Flushed face</string> + <!-- Spoken description for Unicode code point U+1F634: "😴" SLEEPING FACE --> + <string name="spoken_emoji_1F634">Sleeping face</string> + <!-- Spoken description for Unicode code point U+1F635: "😵" DIZZY FACE --> + <string name="spoken_emoji_1F635">Dizzy face</string> + <!-- Spoken description for Unicode code point U+1F636: "😶" FACE WITHOUT MOUTH --> + <string name="spoken_emoji_1F636">Face without mouth</string> + <!-- Spoken description for Unicode code point U+1F637: "😷" FACE WITH MEDICAL MASK --> + <string name="spoken_emoji_1F637">Face with medical mask</string> + <!-- Spoken description for Unicode code point U+1F638: "😸" GRINNING CAT FACE WITH SMILING EYES --> + <string name="spoken_emoji_1F638">Grinning cat face with smiling eyes</string> + <!-- Spoken description for Unicode code point U+1F639: "😹" CAT FACE WITH TEARS OF JOY --> + <string name="spoken_emoji_1F639">Cat face with tears of joy</string> + <!-- Spoken description for Unicode code point U+1F63A: "😺" SMILING CAT FACE WITH OPEN MOUTH --> + <string name="spoken_emoji_1F63A">Smiling cat face with open mouth</string> + <!-- Spoken description for Unicode code point U+1F63B: "😻" SMILING CAT FACE WITH HEART-SHAPED EYES --> + <string name="spoken_emoji_1F63B">Smiling cat face with heart-shaped eyes</string> + <!-- Spoken description for Unicode code point U+1F63C: "😼" CAT FACE WITH WRY SMILE --> + <string name="spoken_emoji_1F63C">Cat face with wry smile</string> + <!-- Spoken description for Unicode code point U+1F63D: "😽" KISSING CAT FACE WITH CLOSED EYES --> + <string name="spoken_emoji_1F63D">Kissing cat face with closed eyes</string> + <!-- Spoken description for Unicode code point U+1F63E: "😾" POUTING CAT FACE --> + <string name="spoken_emoji_1F63E">Pouting cat face</string> + <!-- Spoken description for Unicode code point U+1F63F: "😿" CRYING CAT FACE --> + <string name="spoken_emoji_1F63F">Crying cat face</string> + <!-- Spoken description for Unicode code point U+1F640: "🙀" WEARY CAT FACE --> + <string name="spoken_emoji_1F640">Weary cat face</string> + <!-- Spoken description for Unicode code point U+1F645: "🙅" FACE WITH NO GOOD GESTURE --> + <string name="spoken_emoji_1F645">Face with no good gesture</string> + <!-- Spoken description for Unicode code point U+1F646: "🙆" FACE WITH OK GESTURE --> + <string name="spoken_emoji_1F646">Face with ok gesture</string> + <!-- Spoken description for Unicode code point U+1F647: "🙇" PERSON BOWING DEEPLY --> + <string name="spoken_emoji_1F647">Person bowing deeply</string> + <!-- Spoken description for Unicode code point U+1F648: "🙈" SEE-NO-EVIL MONKEY --> + <string name="spoken_emoji_1F648">See-no-evil monkey</string> + <!-- Spoken description for Unicode code point U+1F649: "🙉" HEAR-NO-EVIL MONKEY --> + <string name="spoken_emoji_1F649">Hear-no-evil monkey</string> + <!-- Spoken description for Unicode code point U+1F64A: "🙊" SPEAK-NO-EVIL MONKEY --> + <string name="spoken_emoji_1F64A">Speak-no-evil monkey</string> + <!-- Spoken description for Unicode code point U+1F64B: "🙋" HAPPY PERSON RAISING ONE HAND --> + <string name="spoken_emoji_1F64B">Happy person raising one hand</string> + <!-- Spoken description for Unicode code point U+1F64C: "🙌" PERSON RAISING BOTH HANDS IN CELEBRATION --> + <string name="spoken_emoji_1F64C">Person raising both hands in celebration</string> + <!-- Spoken description for Unicode code point U+1F64D: "🙍" PERSON FROWNING --> + <string name="spoken_emoji_1F64D">Person frowning</string> + <!-- Spoken description for Unicode code point U+1F64E: "🙎" PERSON WITH POUTING FACE --> + <string name="spoken_emoji_1F64E">Person with pouting face</string> + <!-- Spoken description for Unicode code point U+1F64F: "🙏" PERSON WITH FOLDED HANDS --> + <string name="spoken_emoji_1F64F">Person with folded hands</string> + <!-- Spoken description for Unicode code point U+1F680: "🚀" ROCKET --> + <string name="spoken_emoji_1F680">Rocket</string> + <!-- Spoken description for Unicode code point U+1F681: "🚁" HELICOPTER --> + <string name="spoken_emoji_1F681">Helicopter</string> + <!-- Spoken description for Unicode code point U+1F682: "🚂" STEAM LOCOMOTIVE --> + <string name="spoken_emoji_1F682">Steam locomotive</string> + <!-- Spoken description for Unicode code point U+1F683: "🚃" RAILWAY CAR --> + <string name="spoken_emoji_1F683">Railway car</string> + <!-- Spoken description for Unicode code point U+1F684: "🚄" HIGH-SPEED TRAIN --> + <string name="spoken_emoji_1F684">High-speed train</string> + <!-- Spoken description for Unicode code point U+1F685: "🚅" HIGH-SPEED TRAIN WITH BULLET NOSE --> + <string name="spoken_emoji_1F685">High-speed train with bullet nose</string> + <!-- Spoken description for Unicode code point U+1F686: "🚆" TRAIN --> + <string name="spoken_emoji_1F686">Train</string> + <!-- Spoken description for Unicode code point U+1F687: "🚇" METRO --> + <string name="spoken_emoji_1F687">Metro</string> + <!-- Spoken description for Unicode code point U+1F688: "🚈" LIGHT RAIL --> + <string name="spoken_emoji_1F688">Light rail</string> + <!-- Spoken description for Unicode code point U+1F689: "🚉" STATION --> + <string name="spoken_emoji_1F689">Station</string> + <!-- Spoken description for Unicode code point U+1F68A: "🚊" TRAM --> + <string name="spoken_emoji_1F68A">Tram</string> + <!-- Spoken description for Unicode code point U+1F68B: "🚋" TRAM CAR --> + <string name="spoken_emoji_1F68B">Tram car</string> + <!-- Spoken description for Unicode code point U+1F68C: "🚌" BUS --> + <string name="spoken_emoji_1F68C">Bus</string> + <!-- Spoken description for Unicode code point U+1F68D: "🚍" ONCOMING BUS --> + <string name="spoken_emoji_1F68D">Oncoming bus</string> + <!-- Spoken description for Unicode code point U+1F68E: "🚎" TROLLEYBUS --> + <string name="spoken_emoji_1F68E">Trolleybus</string> + <!-- Spoken description for Unicode code point U+1F68F: "🚏" BUS STOP --> + <string name="spoken_emoji_1F68F">Bus stop</string> + <!-- Spoken description for Unicode code point U+1F690: "🚐" MINIBUS --> + <string name="spoken_emoji_1F690">Minibus</string> + <!-- Spoken description for Unicode code point U+1F691: "🚑" AMBULANCE --> + <string name="spoken_emoji_1F691">Ambulance</string> + <!-- Spoken description for Unicode code point U+1F692: "🚒" FIRE ENGINE --> + <string name="spoken_emoji_1F692">Fire engine</string> + <!-- Spoken description for Unicode code point U+1F693: "🚓" POLICE CAR --> + <string name="spoken_emoji_1F693">Police car</string> + <!-- Spoken description for Unicode code point U+1F694: "🚔" ONCOMING POLICE CAR --> + <string name="spoken_emoji_1F694">Oncoming police car</string> + <!-- Spoken description for Unicode code point U+1F695: "🚕" TAXI --> + <string name="spoken_emoji_1F695">Taxi</string> + <!-- Spoken description for Unicode code point U+1F696: "🚖" ONCOMING TAXI --> + <string name="spoken_emoji_1F696">Oncoming taxi</string> + <!-- Spoken description for Unicode code point U+1F697: "🚗" AUTOMOBILE --> + <string name="spoken_emoji_1F697">Automobile</string> + <!-- Spoken description for Unicode code point U+1F698: "🚘" ONCOMING AUTOMOBILE --> + <string name="spoken_emoji_1F698">Oncoming automobile</string> + <!-- Spoken description for Unicode code point U+1F699: "🚙" RECREATIONAL VEHICLE --> + <string name="spoken_emoji_1F699">Recreational vehicle</string> + <!-- Spoken description for Unicode code point U+1F69A: "🚚" DELIVERY TRUCK --> + <string name="spoken_emoji_1F69A">Delivery truck</string> + <!-- Spoken description for Unicode code point U+1F69B: "🚛" ARTICULATED LORRY --> + <string name="spoken_emoji_1F69B">Articulated lorry</string> + <!-- Spoken description for Unicode code point U+1F69C: "🚜" TRACTOR --> + <string name="spoken_emoji_1F69C">Tractor</string> + <!-- Spoken description for Unicode code point U+1F69D: "🚝" MONORAIL --> + <string name="spoken_emoji_1F69D">Monorail</string> + <!-- Spoken description for Unicode code point U+1F69E: "🚞" MOUNTAIN RAILWAY --> + <string name="spoken_emoji_1F69E">Mountain railway</string> + <!-- Spoken description for Unicode code point U+1F69F: "🚟" SUSPENSION RAILWAY --> + <string name="spoken_emoji_1F69F">Suspension railway</string> + <!-- Spoken description for Unicode code point U+1F6A0: "🚠" MOUNTAIN CABLEWAY --> + <string name="spoken_emoji_1F6A0">Mountain cableway</string> + <!-- Spoken description for Unicode code point U+1F6A1: "🚡" AERIAL TRAMWAY --> + <string name="spoken_emoji_1F6A1">Aerial tramway</string> + <!-- Spoken description for Unicode code point U+1F6A2: "🚢" SHIP --> + <string name="spoken_emoji_1F6A2">Ship</string> + <!-- Spoken description for Unicode code point U+1F6A3: "🚣" ROWBOAT --> + <string name="spoken_emoji_1F6A3">Rowboat</string> + <!-- Spoken description for Unicode code point U+1F6A4: "🚤" SPEEDBOAT --> + <string name="spoken_emoji_1F6A4">Speedboat</string> + <!-- Spoken description for Unicode code point U+1F6A5: "🚥" HORIZONTAL TRAFFIC LIGHT --> + <string name="spoken_emoji_1F6A5">Horizontal traffic light</string> + <!-- Spoken description for Unicode code point U+1F6A6: "🚦" VERTICAL TRAFFIC LIGHT --> + <string name="spoken_emoji_1F6A6">Vertical traffic light</string> + <!-- Spoken description for Unicode code point U+1F6A7: "🚧" CONSTRUCTION SIGN --> + <string name="spoken_emoji_1F6A7">Construction sign</string> + <!-- Spoken description for Unicode code point U+1F6A8: "🚨" POLICE CARS REVOLVING LIGHT --> + <string name="spoken_emoji_1F6A8">Police cars revolving light</string> + <!-- Spoken description for Unicode code point U+1F6A9: "🚩" TRIANGULAR FLAG ON POST --> + <string name="spoken_emoji_1F6A9">Triangular flag on post</string> + <!-- Spoken description for Unicode code point U+1F6AA: "🚪" DOOR --> + <string name="spoken_emoji_1F6AA">Door</string> + <!-- Spoken description for Unicode code point U+1F6AB: "🚫" NO ENTRY SIGN --> + <string name="spoken_emoji_1F6AB">No entry sign</string> + <!-- Spoken description for Unicode code point U+1F6AC: "🚬" SMOKING SYMBOL --> + <string name="spoken_emoji_1F6AC">Smoking symbol</string> + <!-- Spoken description for Unicode code point U+1F6AD: "🚭" NO SMOKING SYMBOL --> + <string name="spoken_emoji_1F6AD">No smoking symbol</string> + <!-- Spoken description for Unicode code point U+1F6AE: "🚮" PUT LITTER IN ITS PLACE SYMBOL --> + <string name="spoken_emoji_1F6AE">Put litter in its place symbol</string> + <!-- Spoken description for Unicode code point U+1F6AF: "🚯" DO NOT LITTER SYMBOL --> + <string name="spoken_emoji_1F6AF">Do not litter symbol</string> + <!-- Spoken description for Unicode code point U+1F6B0: "🚰" POTABLE WATER SYMBOL --> + <string name="spoken_emoji_1F6B0">Potable water symbol</string> + <!-- Spoken description for Unicode code point U+1F6B1: "🚱" NON-POTABLE WATER SYMBOL --> + <string name="spoken_emoji_1F6B1">Non-potable water symbol</string> + <!-- Spoken description for Unicode code point U+1F6B2: "🚲" BICYCLE --> + <string name="spoken_emoji_1F6B2">Bicycle</string> + <!-- Spoken description for Unicode code point U+1F6B3: "🚳" NO BICYCLES --> + <string name="spoken_emoji_1F6B3">No bicycles</string> + <!-- Spoken description for Unicode code point U+1F6B4: "🚴" BICYCLIST --> + <string name="spoken_emoji_1F6B4">Bicyclist</string> + <!-- Spoken description for Unicode code point U+1F6B5: "🚵" MOUNTAIN BICYCLIST --> + <string name="spoken_emoji_1F6B5">Mountain bicyclist</string> + <!-- Spoken description for Unicode code point U+1F6B6: "🚶" PEDESTRIAN --> + <string name="spoken_emoji_1F6B6">Pedestrian</string> + <!-- Spoken description for Unicode code point U+1F6B7: "🚷" NO PEDESTRIANS --> + <string name="spoken_emoji_1F6B7">No pedestrians</string> + <!-- Spoken description for Unicode code point U+1F6B8: "🚸" CHILDREN CROSSING --> + <string name="spoken_emoji_1F6B8">Children crossing</string> + <!-- Spoken description for Unicode code point U+1F6B9: "🚹" MENS SYMBOL --> + <string name="spoken_emoji_1F6B9">Mens symbol</string> + <!-- Spoken description for Unicode code point U+1F6BA: "🚺" WOMENS SYMBOL --> + <string name="spoken_emoji_1F6BA">Womens symbol</string> + <!-- Spoken description for Unicode code point U+1F6BB: "🚻" RESTROOM --> + <string name="spoken_emoji_1F6BB">Restroom</string> + <!-- Spoken description for Unicode code point U+1F6BC: "🚼" BABY SYMBOL --> + <string name="spoken_emoji_1F6BC">Baby symbol</string> + <!-- Spoken description for Unicode code point U+1F6BD: "🚽" TOILET --> + <string name="spoken_emoji_1F6BD">Toilet</string> + <!-- Spoken description for Unicode code point U+1F6BE: "🚾" WATER CLOSET --> + <string name="spoken_emoji_1F6BE">Water closet</string> + <!-- Spoken description for Unicode code point U+1F6BF: "🚿" SHOWER --> + <string name="spoken_emoji_1F6BF">Shower</string> + <!-- Spoken description for Unicode code point U+1F6C0: "🛀" BATH --> + <string name="spoken_emoji_1F6C0">Bath</string> + <!-- Spoken description for Unicode code point U+1F6C1: "🛁" BATHTUB --> + <string name="spoken_emoji_1F6C1">Bathtub</string> + <!-- Spoken description for Unicode code point U+1F6C2: "🛂" PASSPORT CONTROL --> + <string name="spoken_emoji_1F6C2">Passport control</string> + <!-- Spoken description for Unicode code point U+1F6C3: "🛃" CUSTOMS --> + <string name="spoken_emoji_1F6C3">Customs</string> + <!-- Spoken description for Unicode code point U+1F6C4: "🛄" BAGGAGE CLAIM --> + <string name="spoken_emoji_1F6C4">Baggage claim</string> + <!-- Spoken description for Unicode code point U+1F6C5: "🛅" LEFT LUGGAGE --> + <string name="spoken_emoji_1F6C5">Left luggage</string> +</resources> diff --git a/java/res/values/strings-letter-descriptions.xml b/java/res/values/strings-letter-descriptions.xml new file mode 100644 index 000000000..297b6bed2 --- /dev/null +++ b/java/res/values/strings-letter-descriptions.xml @@ -0,0 +1,384 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> +<!-- + These accented letters (spoken_accented_letter_*) are unsupported by TTS. + These symbols (spoken_symbol_*) are also unsupported by TTS. + TODO: Remove these string resources when TTS/TalkBack support these letters. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Spoken description for Unicode code point U+00AA: "ª" FEMININE ORDINAL INDICATOR --> + <string name="spoken_accented_letter_00AA">Feminine ordinal indicator</string> + <!-- Spoken description for Unicode code point U+00B5: "µ" MICRO SIGN --> + <string name="spoken_accented_letter_00B5">Micro sign</string> + <!-- Spoken description for Unicode code point U+00BA: "º" MASCULINE ORDINAL INDICATOR --> + <string name="spoken_accented_letter_00BA">Masculine ordinal indicator</string> + <!-- Spoken description for Unicode code point U+00DF: "ß" LATIN SMALL LETTER SHARP S --> + <string name="spoken_accented_letter_00DF">Sharp S</string> + <!-- Spoken description for Unicode code point U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE --> + <string name="spoken_accented_letter_00E0">A, grave</string> + <!-- Spoken description for Unicode code point U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE --> + <string name="spoken_accented_letter_00E1">A, acute</string> + <!-- Spoken description for Unicode code point U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_00E2">A, circumflex</string> + <!-- Spoken description for Unicode code point U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE --> + <string name="spoken_accented_letter_00E3">A, tilde</string> + <!-- Spoken description for Unicode code point U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS --> + <string name="spoken_accented_letter_00E4">A, diaeresis</string> + <!-- Spoken description for Unicode code point U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE --> + <string name="spoken_accented_letter_00E5">A, ring above</string> + <!-- Spoken description for Unicode code point U+00E6: "æ" LATIN SMALL LETTER AE --> + <string name="spoken_accented_letter_00E6">A, E, ligature</string> + <!-- Spoken description for Unicode code point U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA --> + <string name="spoken_accented_letter_00E7">C, cedilla</string> + <!-- Spoken description for Unicode code point U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE --> + <string name="spoken_accented_letter_00E8">E, grave</string> + <!-- Spoken description for Unicode code point U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE --> + <string name="spoken_accented_letter_00E9">E, acute</string> + <!-- Spoken description for Unicode code point U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_00EA">E, circumflex</string> + <!-- Spoken description for Unicode code point U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS --> + <string name="spoken_accented_letter_00EB">E, diaeresis</string> + <!-- Spoken description for Unicode code point U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE --> + <string name="spoken_accented_letter_00EC">I, grave</string> + <!-- Spoken description for Unicode code point U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE --> + <string name="spoken_accented_letter_00ED">I, acute</string> + <!-- Spoken description for Unicode code point U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_00EE">I, circumflex</string> + <!-- Spoken description for Unicode code point U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS --> + <string name="spoken_accented_letter_00EF">I, diaeresis</string> + <!-- Spoken description for Unicode code point U+00F0: "ð" LATIN SMALL LETTER ETH --> + <string name="spoken_accented_letter_00F0">Eth</string> + <!-- Spoken description for Unicode code point U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE --> + <string name="spoken_accented_letter_00F1">N, tilde</string> + <!-- Spoken description for Unicode code point U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE --> + <string name="spoken_accented_letter_00F2">O, grave</string> + <!-- Spoken description for Unicode code point U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE --> + <string name="spoken_accented_letter_00F3">O, acute</string> + <!-- Spoken description for Unicode code point U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_00F4">O, circumflex</string> + <!-- Spoken description for Unicode code point U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE --> + <string name="spoken_accented_letter_00F5">O, tilde</string> + <!-- Spoken description for Unicode code point U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS --> + <string name="spoken_accented_letter_00F6">O, diaeresis</string> + <!-- Spoken description for Unicode code point U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE --> + <string name="spoken_accented_letter_00F8">O, stroke</string> + <!-- Spoken description for Unicode code point U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE --> + <string name="spoken_accented_letter_00F9">U, grave</string> + <!-- Spoken description for Unicode code point U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE --> + <string name="spoken_accented_letter_00FA">U, acute</string> + <!-- Spoken description for Unicode code point U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_00FB">U, circumflex</string> + <!-- Spoken description for Unicode code point U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS --> + <string name="spoken_accented_letter_00FC">U, diaeresis</string> + <!-- Spoken description for Unicode code point U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE --> + <string name="spoken_accented_letter_00FD">Y, acute</string> + <!-- Spoken description for Unicode code point U+00FE: "þ" LATIN SMALL LETTER THORN --> + <string name="spoken_accented_letter_00FE">Thorn</string> + <!-- Spoken description for Unicode code point U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS --> + <string name="spoken_accented_letter_00FF">Y, diaeresis</string> + <!-- Spoken description for Unicode code point U+0101: "ā" LATIN SMALL LETTER A WITH MACRON --> + <string name="spoken_accented_letter_0101">A, macron</string> + <!-- Spoken description for Unicode code point U+0103: "ă" LATIN SMALL LETTER A WITH BREVE --> + <string name="spoken_accented_letter_0103">A, breve</string> + <!-- Spoken description for Unicode code point U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK --> + <string name="spoken_accented_letter_0105">A, ogonek</string> + <!-- Spoken description for Unicode code point U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE --> + <string name="spoken_accented_letter_0107">C, acute</string> + <!-- Spoken description for Unicode code point U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_0109">C, circumflex</string> + <!-- Spoken description for Unicode code point U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE --> + <string name="spoken_accented_letter_010B">C, dot above</string> + <!-- Spoken description for Unicode code point U+010D: "č" LATIN SMALL LETTER C WITH CARON --> + <string name="spoken_accented_letter_010D">C, caron</string> + <!-- Spoken description for Unicode code point U+010F: "ď" LATIN SMALL LETTER D WITH CARON --> + <string name="spoken_accented_letter_010F">D, caron</string> + <!-- Spoken description for Unicode code point U+0111: "đ" LATIN SMALL LETTER D WITH STROKE --> + <string name="spoken_accented_letter_0111">D, stroke</string> + <!-- Spoken description for Unicode code point U+0113: "ē" LATIN SMALL LETTER E WITH MACRON --> + <string name="spoken_accented_letter_0113">E, macron</string> + <!-- Spoken description for Unicode code point U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE --> + <string name="spoken_accented_letter_0115">E, breve</string> + <!-- Spoken description for Unicode code point U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE --> + <string name="spoken_accented_letter_0117">E, dot above</string> + <!-- Spoken description for Unicode code point U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK --> + <string name="spoken_accented_letter_0119">E, ogonek</string> + <!-- Spoken description for Unicode code point U+011B: "ě" LATIN SMALL LETTER E WITH CARON --> + <string name="spoken_accented_letter_011B">E, caron</string> + <!-- Spoken description for Unicode code point U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_011D">G, circumflex</string> + <!-- Spoken description for Unicode code point U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE --> + <string name="spoken_accented_letter_011F">G, breve</string> + <!-- Spoken description for Unicode code point U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE --> + <string name="spoken_accented_letter_0121">G, dot above</string> + <!-- Spoken description for Unicode code point U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA --> + <string name="spoken_accented_letter_0123">G, cedilla</string> + <!-- Spoken description for Unicode code point U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_0125">H, circumflex</string> + <!-- Spoken description for Unicode code point U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE --> + <string name="spoken_accented_letter_0127">H, stroke</string> + <!-- Spoken description for Unicode code point U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE --> + <string name="spoken_accented_letter_0129">I, tilde</string> + <!-- Spoken description for Unicode code point U+012B: "ī" LATIN SMALL LETTER I WITH MACRON --> + <string name="spoken_accented_letter_012B">I, macron</string> + <!-- Spoken description for Unicode code point U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE --> + <string name="spoken_accented_letter_012D">I, breve</string> + <!-- Spoken description for Unicode code point U+012F: "į" LATIN SMALL LETTER I WITH OGONEK --> + <string name="spoken_accented_letter_012F">I, ogonek</string> + <!-- Spoken description for Unicode code point U+0131: "ı" LATIN SMALL LETTER DOTLESS I --> + <string name="spoken_accented_letter_0131">Dotless I</string> + <!-- Spoken description for Unicode code point U+0133: "ij" LATIN SMALL LIGATURE IJ --> + <string name="spoken_accented_letter_0133">I, J, ligature</string> + <!-- Spoken description for Unicode code point U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_0135">J, circumflex</string> + <!-- Spoken description for Unicode code point U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA --> + <string name="spoken_accented_letter_0137">K, cedilla</string> + <!-- Spoken description for Unicode code point U+0138: "ĸ" LATIN SMALL LETTER KRA --> + <string name="spoken_accented_letter_0138">Kra</string> + <!-- Spoken description for Unicode code point U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE --> + <string name="spoken_accented_letter_013A">L, acute</string> + <!-- Spoken description for Unicode code point U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA --> + <string name="spoken_accented_letter_013C">L, cedilla</string> + <!-- Spoken description for Unicode code point U+013E: "ľ" LATIN SMALL LETTER L WITH CARON --> + <string name="spoken_accented_letter_013E">L, caron</string> + <!-- Spoken description for Unicode code point U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT --> + <string name="spoken_accented_letter_0140">L, middle dot</string> + <!-- Spoken description for Unicode code point U+0142: "ł" LATIN SMALL LETTER L WITH STROKE --> + <string name="spoken_accented_letter_0142">L, stroke</string> + <!-- Spoken description for Unicode code point U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE --> + <string name="spoken_accented_letter_0144">N, acute</string> + <!-- Spoken description for Unicode code point U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA --> + <string name="spoken_accented_letter_0146">N, cedilla</string> + <!-- Spoken description for Unicode code point U+0148: "ň" LATIN SMALL LETTER N WITH CARON --> + <string name="spoken_accented_letter_0148">N, caron</string> + <!-- Spoken description for Unicode code point U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE --> + <string name="spoken_accented_letter_0149">N, preceded by apostrophe</string> + <!-- Spoken description for Unicode code point U+014B: "ŋ" LATIN SMALL LETTER ENG --> + <string name="spoken_accented_letter_014B">Eng</string> + <!-- Spoken description for Unicode code point U+014D: "ō" LATIN SMALL LETTER O WITH MACRON --> + <string name="spoken_accented_letter_014D">O, macron</string> + <!-- Spoken description for Unicode code point U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE --> + <string name="spoken_accented_letter_014F">O, breve</string> + <!-- Spoken description for Unicode code point U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE --> + <string name="spoken_accented_letter_0151">O, double acute</string> + <!-- Spoken description for Unicode code point U+0153: "œ" LATIN SMALL LIGATURE OE --> + <string name="spoken_accented_letter_0153">O, E, ligature</string> + <!-- Spoken description for Unicode code point U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE --> + <string name="spoken_accented_letter_0155">R, acute</string> + <!-- Spoken description for Unicode code point U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA --> + <string name="spoken_accented_letter_0157">R, cedilla</string> + <!-- Spoken description for Unicode code point U+0159: "ř" LATIN SMALL LETTER R WITH CARON --> + <string name="spoken_accented_letter_0159">R, caron</string> + <!-- Spoken description for Unicode code point U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE --> + <string name="spoken_accented_letter_015B">S, acute</string> + <!-- Spoken description for Unicode code point U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_015D">S, circumflex</string> + <!-- Spoken description for Unicode code point U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA --> + <string name="spoken_accented_letter_015F">S, cedilla</string> + <!-- Spoken description for Unicode code point U+0161: "š" LATIN SMALL LETTER S WITH CARON --> + <string name="spoken_accented_letter_0161">S, caron</string> + <!-- Spoken description for Unicode code point U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA --> + <string name="spoken_accented_letter_0163">T, cedilla</string> + <!-- Spoken description for Unicode code point U+0165: "ť" LATIN SMALL LETTER T WITH CARON --> + <string name="spoken_accented_letter_0165">T, caron</string> + <!-- Spoken description for Unicode code point U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE --> + <string name="spoken_accented_letter_0167">T, stroke</string> + <!-- Spoken description for Unicode code point U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE --> + <string name="spoken_accented_letter_0169">U, tilde</string> + <!-- Spoken description for Unicode code point U+016B: "ū" LATIN SMALL LETTER U WITH MACRON --> + <string name="spoken_accented_letter_016B">U, macron</string> + <!-- Spoken description for Unicode code point U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE --> + <string name="spoken_accented_letter_016D">U, breve</string> + <!-- Spoken description for Unicode code point U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE --> + <string name="spoken_accented_letter_016F">U, ring above</string> + <!-- Spoken description for Unicode code point U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE --> + <string name="spoken_accented_letter_0171">U, double acute</string> + <!-- Spoken description for Unicode code point U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK --> + <string name="spoken_accented_letter_0173">U, ogonek</string> + <!-- Spoken description for Unicode code point U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_0175">W, circumflex</string> + <!-- Spoken description for Unicode code point U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX --> + <string name="spoken_accented_letter_0177">Y, circumflex</string> + <!-- Spoken description for Unicode code point U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE --> + <string name="spoken_accented_letter_017A">Z, acute</string> + <!-- Spoken description for Unicode code point U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE --> + <string name="spoken_accented_letter_017C">Z, dot above</string> + <!-- Spoken description for Unicode code point U+017E: "ž" LATIN SMALL LETTER Z WITH CARON --> + <string name="spoken_accented_letter_017E">Z, caron</string> + <!-- Spoken description for Unicode code point U+017F: "ſ" LATIN SMALL LETTER LONG S --> + <string name="spoken_accented_letter_017F">Long S</string> + <!-- Spoken description for Unicode code point U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN --> + <string name="spoken_accented_letter_01A1">O, horn</string> + <!-- Spoken description for Unicode code point U+01B0: "ư" LATIN SMALL LETTER U WITH HORN --> + <string name="spoken_accented_letter_01B0">U, horn</string> + <!-- Spoken description for Unicode code point U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW --> + <string name="spoken_accented_letter_0219">S, comma below</string> + <!-- Spoken description for Unicode code point U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW --> + <string name="spoken_accented_letter_021B">T, comma below</string> + <!-- Spoken description for Unicode code point U+0259: "ə" LATIN SMALL LETTER SCHWA --> + <string name="spoken_accented_letter_0259">Schwa</string> + <!-- Spoken description for Unicode code point U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW --> + <string name="spoken_accented_letter_1EA1">A, dot below</string> + <!-- Spoken description for Unicode code point U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1EA3">A, hook above</string> + <!-- Spoken description for Unicode code point U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE --> + <string name="spoken_accented_letter_1EA5">A, circumflex and acute</string> + <!-- Spoken description for Unicode code point U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE --> + <string name="spoken_accented_letter_1EA7">A, circumflex and grave</string> + <!-- Spoken description for Unicode code point U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE --> + <string name="spoken_accented_letter_1EA9">A, circumflex and hook above</string> + <!-- Spoken description for Unicode code point U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE --> + <string name="spoken_accented_letter_1EAB">A, circumflex and tilde</string> + <!-- Spoken description for Unicode code point U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW --> + <string name="spoken_accented_letter_1EAD">A, circumflex and dot below</string> + <!-- Spoken description for Unicode code point U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE --> + <string name="spoken_accented_letter_1EAF">A, breve and acute</string> + <!-- Spoken description for Unicode code point U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE --> + <string name="spoken_accented_letter_1EB1">A, breve and grave</string> + <!-- Spoken description for Unicode code point U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE --> + <string name="spoken_accented_letter_1EB3">A, breve and hook above</string> + <!-- Spoken description for Unicode code point U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE --> + <string name="spoken_accented_letter_1EB5">A, breve and tilde</string> + <!-- Spoken description for Unicode code point U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW --> + <string name="spoken_accented_letter_1EB7">A, breve and dot below</string> + <!-- Spoken description for Unicode code point U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW --> + <string name="spoken_accented_letter_1EB9">E, dot below</string> + <!-- Spoken description for Unicode code point U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1EBB">E, hook above</string> + <!-- Spoken description for Unicode code point U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE --> + <string name="spoken_accented_letter_1EBD">E, tilde</string> + <!-- Spoken description for Unicode code point U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE --> + <string name="spoken_accented_letter_1EBF">E, circumflex and acute</string> + <!-- Spoken description for Unicode code point U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE --> + <string name="spoken_accented_letter_1EC1">E, circumflex and grave</string> + <!-- Spoken description for Unicode code point U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE --> + <string name="spoken_accented_letter_1EC3">E, circumflex and hook above</string> + <!-- Spoken description for Unicode code point U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE --> + <string name="spoken_accented_letter_1EC5">E, circumflex and tilde</string> + <!-- Spoken description for Unicode code point U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW --> + <string name="spoken_accented_letter_1EC7">E, circumflex and dot below</string> + <!-- Spoken description for Unicode code point U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1EC9">I, hook above</string> + <!-- Spoken description for Unicode code point U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW --> + <string name="spoken_accented_letter_1ECB">I, dot below</string> + <!-- Spoken description for Unicode code point U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW --> + <string name="spoken_accented_letter_1ECD">O, dot below</string> + <!-- Spoken description for Unicode code point U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1ECF">O, hook above</string> + <!-- Spoken description for Unicode code point U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE --> + <string name="spoken_accented_letter_1ED1">O, circumflex and acute</string> + <!-- Spoken description for Unicode code point U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE --> + <string name="spoken_accented_letter_1ED3">O, circumflex and grave</string> + <!-- Spoken description for Unicode code point U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE --> + <string name="spoken_accented_letter_1ED5">O, circumflex and hook above</string> + <!-- Spoken description for Unicode code point U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE --> + <string name="spoken_accented_letter_1ED7">O, circumflex and tilde</string> + <!-- Spoken description for Unicode code point U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW --> + <string name="spoken_accented_letter_1ED9">O, circumflex and dot below</string> + <!-- Spoken description for Unicode code point U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE --> + <string name="spoken_accented_letter_1EDB">O, horn and acute</string> + <!-- Spoken description for Unicode code point U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE --> + <string name="spoken_accented_letter_1EDD">O, horn and grave</string> + <!-- Spoken description for Unicode code point U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE --> + <string name="spoken_accented_letter_1EDF">O, horn and hook above</string> + <!-- Spoken description for Unicode code point U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE --> + <string name="spoken_accented_letter_1EE1">O, horn and tilde</string> + <!-- Spoken description for Unicode code point U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW --> + <string name="spoken_accented_letter_1EE3">O, horn and dot below</string> + <!-- Spoken description for Unicode code point U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW --> + <string name="spoken_accented_letter_1EE5">U, dot below</string> + <!-- Spoken description for Unicode code point U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1EE7">U, hook above</string> + <!-- Spoken description for Unicode code point U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE --> + <string name="spoken_accented_letter_1EE9">U, horn and acute</string> + <!-- Spoken description for Unicode code point U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE --> + <string name="spoken_accented_letter_1EEB">U, horn and grave</string> + <!-- Spoken description for Unicode code point U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE --> + <string name="spoken_accented_letter_1EED">U, horn and hook above</string> + <!-- Spoken description for Unicode code point U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE --> + <string name="spoken_accented_letter_1EEF">U, horn and tilde</string> + <!-- Spoken description for Unicode code point U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW --> + <string name="spoken_accented_letter_1EF1">U, horn and dot below</string> + <!-- Spoken description for Unicode code point U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE --> + <string name="spoken_accented_letter_1EF3">Y, grave</string> + <!-- Spoken description for Unicode code point U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW --> + <string name="spoken_accented_letter_1EF5">Y, dot below</string> + <!-- Spoken description for Unicode code point U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE --> + <string name="spoken_accented_letter_1EF7">Y, hook above</string> + <!-- Spoken description for Unicode code point U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE --> + <string name="spoken_accented_letter_1EF9">Y, tilde</string> + <!-- Spoken description for Unicode code point U+00A1: "¡" INVERTED EXCLAMATION MARK --> + <string name="spoken_symbol_00A1">Inverted exclamation mark</string> + <!-- Spoken description for Unicode code point U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK --> + <string name="spoken_symbol_00AB">Left-pointing double angle quotation mark</string> + <!-- Spoken description for Unicode code point U+00B7: "·" MIDDLE DOT --> + <string name="spoken_symbol_00B7">Middle dot</string> + <!-- Spoken description for Unicode code point U+00B9: "¹" SUPERSCRIPT ONE --> + <string name="spoken_symbol_00B9">Superscript one</string> + <!-- Spoken description for Unicode code point U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> + <string name="spoken_symbol_00BB">Right-pointing double angle quotation mark</string> + <!-- Spoken description for Unicode code point U+00BF: "¿" INVERTED QUESTION MARK --> + <string name="spoken_symbol_00BF">Inverted question mark</string> + <!-- Spoken description for Unicode code point U+2018: "‘" LEFT SINGLE QUOTATION MARK --> + <string name="spoken_symbol_2018">Left single quotation mark</string> + <!-- Spoken description for Unicode code point U+2019: "’" RIGHT SINGLE QUOTATION MARK --> + <string name="spoken_symbol_2019">Right single quotation mark</string> + <!-- Spoken description for Unicode code point U+201A: "‚" SINGLE LOW-9 QUOTATION MARK --> + <string name="spoken_symbol_201A">Single low-9 quotation mark</string> + <!-- Spoken description for Unicode code point U+201C: "“" LEFT DOUBLE QUOTATION MARK --> + <string name="spoken_symbol_201C">Left double quotation mark</string> + <!-- Spoken description for Unicode code point U+201D: "”" RIGHT DOUBLE QUOTATION MARK --> + <string name="spoken_symbol_201D">Right double quotation mark</string> + <!-- Spoken description for Unicode code point U+2020: "†" DAGGER --> + <string name="spoken_symbol_2020">Dagger</string> + <!-- Spoken description for Unicode code point U+2021: "‡" DOUBLE DAGGER --> + <string name="spoken_symbol_2021">Double dagger</string> + <!-- Spoken description for Unicode code point U+2030: "‰" PER MILLE SIGN --> + <string name="spoken_symbol_2030">Per mille sign</string> + <!-- Spoken description for Unicode code point U+2032: "′" PRIME --> + <string name="spoken_symbol_2032">Prime</string> + <!-- Spoken description for Unicode code point U+2033: "″" DOUBLE PRIME --> + <string name="spoken_symbol_2033">Double prime</string> + <!-- Spoken description for Unicode code point U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK --> + <string name="spoken_symbol_2039">Single left-pointing angle quotation mark</string> + <!-- Spoken description for Unicode code point U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK --> + <string name="spoken_symbol_203A">Single right-pointing angle quotation mark</string> + <!-- Spoken description for Unicode code point U+2074: "⁴" SUPERSCRIPT FOUR --> + <string name="spoken_symbol_2074">Superscript four</string> + <!-- Spoken description for Unicode code point U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N --> + <string name="spoken_symbol_207F">Superscript latin small letter n</string> + <!-- Spoken description for Unicode code point U+20B1: "₱" PESO SIGN --> + <string name="spoken_symbol_20B1">Peso sign</string> + <!-- Spoken description for Unicode code point U+2105: "℅" CARE OF --> + <string name="spoken_symbol_2105">Care of</string> + <!-- Spoken description for Unicode code point U+2192: "→" RIGHTWARDS ARROW --> + <string name="spoken_symbol_2192">Rightwards arrow</string> + <!-- Spoken description for Unicode code point U+2193: "↓" DOWNWARDS ARROW --> + <string name="spoken_symbol_2193">Downwards arrow</string> + <!-- Spoken description for Unicode code point U+2205: "∅" EMPTY SET --> + <string name="spoken_symbol_2205">Empty set</string> + <!-- Spoken description for Unicode code point U+2206: "∆" INCREMENT --> + <string name="spoken_symbol_2206">Increment</string> + <!-- Spoken description for Unicode code point U+2264: "≤" LESS-THAN OR EQUAL TO --> + <string name="spoken_symbol_2264">Less-than or equal to</string> + <!-- Spoken description for Unicode code point U+2265: "≥" GREATER-THAN OR EQUAL TO --> + <string name="spoken_symbol_2265">Greater-than or equal to</string> + <!-- Spoken description for Unicode code point U+2605: "★" BLACK STAR --> + <string name="spoken_symbol_2605">Black star</string> +</resources> diff --git a/java/res/values/strings-production.xml b/java/res/values/strings-production.xml new file mode 100644 index 000000000..8064b9949 --- /dev/null +++ b/java/res/values/strings-production.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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> + <!-- Description for option to enable sending usage statistics --> + <string name="enable_metrics_logging_summary" translatable="false"></string> +</resources> diff --git a/java/res/values/strings-talkback-descriptions.xml b/java/res/values/strings-talkback-descriptions.xml new file mode 100644 index 000000000..80c7bdbf0 --- /dev/null +++ b/java/res/values/strings-talkback-descriptions.xml @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Spoken description to let the user know that when typing in a password, they can plug in a headset in to hear spoken descriptions of the keys they type. [CHAR LIMIT=NONE] --> + <string name="spoken_use_headphones">Plug in a headset to hear password keys spoken aloud.</string> + + <!-- Spoken description for the currently entered text --> + <string name="spoken_current_text_is">Current text is "%s"</string> + <!-- Spoken description when there is no text entered --> + <string name="spoken_no_text_entered">No text entered</string> + + <!-- Spoken description to let the user know what auto-correction will be performed when a key is pressed. An auto-correction replaces a single word with one or more words. --> + <string name="spoken_auto_correct"><xliff:g id="KEY_NAME" example="Space">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g></string> + <!-- Spoken description used during obscured (e.g. password) entry to let the user know that auto-correction will be performed when a key is pressed. --> + <string name="spoken_auto_correct_obscured"><xliff:g id="KEY_NAME" example="Space">%1$s</xliff:g> performs auto-correction</string> + + <!-- Spoken description for unknown keyboard keys. --> + <string name="spoken_description_unknown">Unknown character</string> + <!-- Spoken description for the "Shift" keyboard key when "Shift" is off. --> + <string name="spoken_description_shift">Shift</string> + <!-- Spoken description for the "Shift" keyboard key in symbols mode. --> + <string name="spoken_description_symbols_shift">More symbols</string> + <!-- Spoken description for the "Shift" keyboard key when "Shift" is on. --> + <string name="spoken_description_shift_shifted">Shift</string> + <!-- Spoken description for the "Shift" keyboard key in 2nd symbols (a.k.a. symbols shift) mode. --> + <string name="spoken_description_symbols_shift_shifted">Symbols</string> + <!-- Spoken description for the "Shift" keyboard key when "Caps lock" is on. --> + <string name="spoken_description_caps_lock">Shift</string> + <!-- Spoken description for the "Delete" keyboard key. --> + <string name="spoken_description_delete">Delete</string> + <!-- Spoken description for the "To Symbol" keyboard key. --> + <string name="spoken_description_to_symbol">Symbols</string> + <!-- Spoken description for the "To Alpha" keyboard key. --> + <string name="spoken_description_to_alpha">Letters</string> + <!-- Spoken description for the "To Numbers" keyboard key. --> + <string name="spoken_description_to_numeric">Numbers</string> + <!-- Spoken description for the "Settings" keyboard key. --> + <string name="spoken_description_settings">Settings</string> + <!-- Spoken description for the "Tab" keyboard key. --> + <string name="spoken_description_tab">Tab</string> + <!-- Spoken description for the "Space" keyboard key. --> + <string name="spoken_description_space">Space</string> + <!-- Spoken description for the "Mic" keyboard key. --> + <string name="spoken_description_mic">Voice input</string> + <!-- Spoken description for the "Emoji" keyboard key. --> + <string name="spoken_description_emoji">Emoji</string> + <!-- Spoken description for the "Return" keyboard key. --> + <string name="spoken_description_return">Return</string> + <!-- Spoken description for the "Search" keyboard key. --> + <string name="spoken_description_search">Search</string> + <!-- Spoken description for the "U+2022" (BULLET) keyboard key. --> + <string name="spoken_description_dot">Dot</string> + <!-- Spoken description for the "Switch language" keyboard key. --> + <string name="spoken_description_language_switch">Switch language</string> + <!-- Spoken description for the "Next" action keyboard key. --> + <string name="spoken_description_action_next">Next</string> + <!-- Spoken description for the "Previous" action keyboard key. --> + <string name="spoken_description_action_previous">Previous</string> + + <!-- Spoken feedback after turning "Shift" mode on. --> + <string name="spoken_description_shiftmode_on">Shift enabled</string> + <!-- Spoken feedback after turning "Caps lock" mode on. --> + <string name="spoken_description_shiftmode_locked">Caps lock enabled</string> + <!-- Spoken feedback after changing to the symbols keyboard. --> + <string name="spoken_description_mode_symbol">Symbols mode</string> + <!-- Spoken feedback after changing to the 2nd symbols (a.k.a. symbols shift) keyboard. --> + <string name="spoken_description_mode_symbol_shift">More symbols mode</string> + <!-- Spoken feedback after changing to the alphanumeric keyboard. --> + <string name="spoken_description_mode_alpha">Letters mode</string> + <!-- Spoken feedback after changing to the phone dialer keyboard. --> + <string name="spoken_description_mode_phone">Phone mode</string> + <!-- Spoken feedback after changing to the shifted phone dialer (symbols) keyboard. --> + <string name="spoken_description_mode_phone_shift">Phone symbols mode</string> + + <!-- Spoken feedback when the keyboard is hidden. --> + <string name="announce_keyboard_hidden">Keyboard hidden</string> + <!-- Spoken feedback when the keyboard mode changes. --> + <string name="announce_keyboard_mode">Showing <xliff:g id="KEYBOARD_MODE" example="email">%s</xliff:g> keyboard</string> + <!-- Description of the keyboard mode for entering dates. --> + <string name="keyboard_mode_date">date</string> + <!-- Description of the keyboard mode for entering dates and times. --> + <string name="keyboard_mode_date_time">date and time</string> + <!-- Description of the keyboard mode for entering email addresses. --> + <string name="keyboard_mode_email">email</string> + <!-- Description of the keyboard mode for entering text messages. --> + <string name="keyboard_mode_im">messaging</string> + <!-- Description of the keyboard mode for entering numbers. --> + <string name="keyboard_mode_number">number</string> + <!-- Description of the keyboard mode for entering phone numbers. --> + <string name="keyboard_mode_phone">phone</string> + <!-- Description of the keyboard mode for entering generic text. --> + <string name="keyboard_mode_text">text</string> + <!-- Description of the keyboard mode for entering times. --> + <string name="keyboard_mode_time">time</string> + <!-- Description of the keyboard mode for entering URLs. --> + <string name="keyboard_mode_url">URL</string> + + <!-- Description of the emoji category icon of Recents. --> + <string name="spoken_descrption_emoji_category_recents">Recents</string> + <!-- Description of the emoji category icon of People. --> + <string name="spoken_descrption_emoji_category_people">People</string> + <!-- Description of the emoji category icon of Objects. --> + <string name="spoken_descrption_emoji_category_objects">Objects</string> + <!-- Description of the emoji category icon of Nature. --> + <string name="spoken_descrption_emoji_category_nature">Nature</string> + <!-- Description of the emoji category icon of Places. --> + <string name="spoken_descrption_emoji_category_places">Places</string> + <!-- Description of the emoji category icon of Symbols. --> + <string name="spoken_descrption_emoji_category_symbols">Symbols</string> + <!-- Description of the emoji category icon of Emoticons. --> + <string name="spoken_descrption_emoji_category_emoticons">Emoticons</string> + + <!-- Description of an upper case letter of LOWER_LETTER. --> + <string name="spoken_description_upper_case">Capital <xliff:g id="LOWER_LETTER" example="A, E, ligature">%s</xliff:g></string> + <!-- Spoken description for Unicode code point U+0049: "I" LATIN CAPITAL LETTER I + Note that depending on locale, the lower-case of this letter is U+0069 or U+0131. --> + <string name="spoken_letter_0049">Capital I</string> + <!-- Spoken description for Unicode code point U+0130: "İ" LATIN CAPITAL LETTER I WITH DOT ABOVE + Note that depending on locale, the lower-case of this letter is U+0069 or U+0131. --> + <string name="spoken_letter_0130">Capital I, dot above</string> + <!-- Spoken description for unknown symbol code point. --> + <string name="spoken_symbol_unknown">Unknown symbol</string> + <!-- Spoken description for unknown emoji code point. --> + <string name="spoken_emoji_unknown">Unknown emoji</string> + + <!-- Spoken descriptions when opening a more keys keyboard that has alternative characters. --> + <string name="spoken_open_more_keys_keyboard">Alternative characters are available</string> + <!-- Spoken descriptions when closing a more keys keyboard that has alternative characters. --> + <string name="spoken_close_more_keys_keyboard">Alternative characters are dismissed</string> + + <!-- Spoken descriptions when opening a more suggestions panel that has alternative suggested words. --> + <string name="spoken_open_more_suggestions">Alternative suggestions are available</string> + <!-- Spoken descriptions when closing a more suggestions panel that has alternative suggested words. --> + <string name="spoken_close_more_suggestions">Alternative suggestions are dismissed</string> +</resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 11b3ea3af..9ec3f469c 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -21,9 +21,6 @@ <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] --> <string name="english_ime_input_options">Input options</string> - <!-- Title for Latin keyboard research log dialog, which contains special commands for users that contribute data for research. [CHAR LIMIT=33] --> - <string name="english_ime_research_log">Research Log Commands</string> - <!-- Title for the spell checker option to turn on/off contact names lookup [CHAR LIMIT=25] --> <string name="use_contacts_for_spellchecking_option_title">Look up contact names</string> @@ -39,22 +36,18 @@ <!-- 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> - <!-- Category title for general settings for Android keyboard --> - <string name="general_category">General</string> - - <!-- Category title for text prediction --> - <string name="correction_category">Text correction</string> - - <!-- Category title for gesture typing --> - <string name="gesture_typing_category">Gesture typing</string> - - <!-- Category title for misc options --> - <string name="misc_category">Other options</string> - - <!-- Option name for advanced settings screen [CHAR LIMIT=25] --> - <string name="advanced_settings">Advanced settings</string> - <!-- Option summary for advanced settings screen [CHAR LIMIT=65 (two lines) or 30 (fits on one line, preferable)] --> - <string name="advanced_settings_summary">Options for experts</string> + <!-- Settings screen title for input preferences [CHAR LIMIT=25]--> + <string name="settings_screen_input">Input preferences</string> + <!-- Settings screen title for appearance preferences [CHAR LIMIT=25] --> + <string name="settings_screen_appearances">Appearance</string> + <!-- Settings screen title for multi lingual options [CHAR_LIMIT=25] --> + <string name="settings_screen_multi_lingual">Multi lingual options</string> + <!-- Settings screen title for gesture typing preferences [CHAR_LIMIT=25] --> + <string name="settings_screen_gesture">Gesture typing preferences</string> + <!-- Settings screen title for text correction options [CHAR_LIMIT=25] --> + <string name="settings_screen_correction">Text correction</string> + <!-- Settings screen title for advanced settings [CHAR LIMIT=25] --> + <string name="settings_screen_advanced">Advanced</string> <!-- Option name for including other IMEs in the language switch list [CHAR LIMIT=30] --> <string name="include_other_imes_in_language_switch_list">Switch to other input methods</string> @@ -78,7 +71,7 @@ <string name="key_preview_popup_dismiss_default_delay">Default</string> <!-- Units abbreviation for the duration (milliseconds) [CHAR LIMIT=10] --> - <string name="abbreviation_unit_milliseconds"><xliff:g id="milliseconds">%s</xliff:g>ms</string> + <string name="abbreviation_unit_milliseconds"><xliff:g id="MILLISECONDS">%s</xliff:g>ms</string> <!-- The text that represents the current settings value is the system default [CHAR LIMIT=25] --> <string name="settings_system_default">System default</string> @@ -87,6 +80,12 @@ <!-- Description for option enabling or disabling the use of names of people in Contacts for suggestion and correction [CHAR LIMIT=65] --> <string name="use_contacts_dict_summary">Use names from Contacts for suggestions and corrections</string> + <!-- Option name for enabling the use by the keyboards of sent/received messages, e-mail and typing history to improve suggestion accuracy [CHAR LIMIT=25] --> + <string name="use_personalized_dicts">Personalized suggestions</string> + + <!-- Option to enable sending usage statistics --> + <string name="enable_metrics_logging">"Improve <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string> + <!-- Option name for enabling or disabling the double-space period feature that lets double tap on spacebar insert a period followed by a space [CHAR LIMIT=30] --> <string name="use_double_space_period">Double-space period</string> <!-- Description for option enabling or disabling the double-space period feature that lets double tap on spacebar insert a period followed by a space [CHAR LIMIT=65] --> @@ -147,118 +146,15 @@ <string name="gesture_floating_preview_text">Dynamic floating preview</string> <!-- Description for "gesture_floating_preview_text" option. The user can see a suggested word floating under the moving finger during a gesture input. [CHAR LIMIT=65]--> <string name="gesture_floating_preview_text_summary">See the suggested word while gesturing</string> - - <!-- Indicates that a word has been added to the dictionary --> - <string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string> - - <!-- Spoken description to let the user know that when typing in a password, they can plug in a headset in to hear spoken descriptions of the keys they type. [CHAR LIMIT=NONE] --> - <string name="spoken_use_headphones">Plug in a headset to hear password keys spoken aloud.</string> - - <!-- Spoken description for the currently entered text --> - <string name="spoken_current_text_is">Current text is "%s"</string> - <!-- Spoken description when there is no text entered --> - <string name="spoken_no_text_entered">No text entered</string> - - <!-- Spoken description to let the user know what auto-correction will be performed when a key is pressed. An auto-correction replaces a single word with one or more words. --> - <string name="spoken_auto_correct"><xliff:g id="key" example="Space">%1$s</xliff:g> corrects <xliff:g id="original_word">%2$s</xliff:g> to <xliff:g id="corrected">%3$s</xliff:g></string> - <!-- Spoken description used during obscured (e.g. password) entry to let the user know that auto-correction will be performed when a key is pressed. --> - <string name="spoken_auto_correct_obscured"><xliff:g id="key" example="Space">%1$s</xliff:g> performs auto-correction</string> - - <!-- Spoken description for unknown keyboard keys. --> - <string name="spoken_description_unknown">Key code %d</string> - <!-- Spoken description for the "Shift" keyboard key when "Shift" is off. --> - <string name="spoken_description_shift">Shift</string> - <!-- Spoken description for the "Shift" keyboard key when "Shift" is on. --> - <string name="spoken_description_shift_shifted">Shift on (tap to disable)</string> - <!-- Spoken description for the "Shift" keyboard key when "Caps lock" is on. --> - <string name="spoken_description_caps_lock">Caps lock on (tap to disable)</string> - <!-- Spoken description for the "Delete" keyboard key. --> - <string name="spoken_description_delete">Delete</string> - <!-- Spoken description for the "To Symbol" keyboard key. --> - <string name="spoken_description_to_symbol">Symbols</string> - <!-- Spoken description for the "To Alpha" keyboard key. --> - <string name="spoken_description_to_alpha">Letters</string> - <!-- Spoken description for the "To Numbers" keyboard key. --> - <string name="spoken_description_to_numeric">Numbers</string> - <!-- Spoken description for the "Settings" keyboard key. --> - <string name="spoken_description_settings">Settings</string> - <!-- Spoken description for the "Tab" keyboard key. --> - <string name="spoken_description_tab">Tab</string> - <!-- Spoken description for the "Space" keyboard key. --> - <string name="spoken_description_space">Space</string> - <!-- Spoken description for the "Mic" keyboard key. --> - <string name="spoken_description_mic">Voice input</string> - <!-- Spoken description for the "Smiley" keyboard key. --> - <string name="spoken_description_smiley">Smiley face</string> - <!-- Spoken description for the "Return" keyboard key. --> - <string name="spoken_description_return">Return</string> - <!-- Spoken description for the "Search" keyboard key. --> - <string name="spoken_description_search">Search</string> - <!-- Spoken description for the "U+2022" (BULLET) keyboard key. --> - <string name="spoken_description_dot">Dot</string> - <!-- Spoken description for the "Switch language" keyboard key. --> - <string name="spoken_description_language_switch">Switch language</string> - <!-- Spoken description for the "Next" action keyboard key. --> - <string name="spoken_description_action_next">Next</string> - <!-- Spoken description for the "Previous" action keyboard key. --> - <string name="spoken_description_action_previous">Previous</string> - - <!-- Spoken feedback after turning "Shift" mode on. --> - <string name="spoken_description_shiftmode_on">Shift enabled</string> - <!-- Spoken feedback after turning "Caps lock" mode on. --> - <string name="spoken_description_shiftmode_locked">Caps lock enabled</string> - <!-- Spoken feedback after turning "Shift" mode off. --> - <string name="spoken_description_shiftmode_off">Shift disabled</string> - - <!-- Spoken feedback after changing to the symbols keyboard. --> - <string name="spoken_description_mode_symbol">Symbols mode</string> - <!-- Spoken feedback after changing to the alphanumeric keyboard. --> - <string name="spoken_description_mode_alpha">Letters mode</string> - <!-- Spoken feedback after changing to the phone dialer keyboard. --> - <string name="spoken_description_mode_phone">Phone mode</string> - <!-- Spoken feedback after changing to the shifted phone dialer (symbols) keyboard. --> - <string name="spoken_description_mode_phone_shift">Phone symbols mode</string> - - <!-- Spoken feedback when the keyboard is hidden. --> - <string name="announce_keyboard_hidden">Keyboard hidden</string> - <!-- Spoken feedback when the keyboard mode changes. --> - <string name="announce_keyboard_mode">Showing <xliff:g id="mode" example="email">%s</xliff:g> keyboard</string> - <!-- Description of the keyboard mode for entering dates. --> - <string name="keyboard_mode_date">date</string> - <!-- Description of the keyboard mode for entering dates and times. --> - <string name="keyboard_mode_date_time">date and time</string> - <!-- Description of the keyboard mode for entering email addresses. --> - <string name="keyboard_mode_email">email</string> - <!-- Description of the keyboard mode for entering text messages. --> - <string name="keyboard_mode_im">messaging</string> - <!-- Description of the keyboard mode for entering numbers. --> - <string name="keyboard_mode_number">number</string> - <!-- Description of the keyboard mode for entering phone numbers. --> - <string name="keyboard_mode_phone">phone</string> - <!-- Description of the keyboard mode for entering generic text. --> - <string name="keyboard_mode_text">text</string> - <!-- Description of the keyboard mode for entering times. --> - <string name="keyboard_mode_time">time</string> - <!-- Description of the keyboard mode for entering URLs. --> - <string name="keyboard_mode_url">URL</string> + <!-- Option to enable space aware gesture input. The user can input multiple words by gliding through the space key during a gesture input. [CHAR LIMIT=30]--> + <string name="gesture_space_aware">Phrase gesture</string> + <!-- Description for "gesture_space_aware" option. The user can input multiple words by gliding through the space key during a gesture input.[CHAR LIMIT=65]--> + <string name="gesture_space_aware_summary">Input spaces during gestures by gliding to the space key</string> <!-- Preferences item for enabling speech input --> <string name="voice_input">Voice input key</string> - - <!-- 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> + <!-- The summary text to describe the reason why the "Voice input key" option is disabled. [CHAR LIMIT=100] --> + <string name="voice_input_disabled_summary">No voice input methods enabled. Check Language & input settings.</string> <!-- Title for configuring input method settings [CHAR LIMIT=35] --> <string name="configure_input_method">Configure input methods</string> @@ -266,68 +162,8 @@ <!-- Title for input language selection screen --> <string name="language_selection_title">Input languages</string> - <!-- Title for dialog option to let users cancel logging and delete log for this session [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_do_not_log_this_session" translatable="false">Suspend logging</string> - <!-- Title for dialog option to let users reenable logging [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_enable_session_logging" translatable="false">Enable logging</string> - <!-- Toast notification that the system is processing the request to delete the log for this session [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_notify_session_log_deleting" translatable="false">Deleting session log</string> - <!-- Toast notification that the system has successfully deleted the log for this session [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_notify_logging_suspended" translatable="false">Logging temporarily suspended. To disable permanently, go to Android Keyboard Settings</string> - <!-- Toast notification that the system has failed to delete the log for this session [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_notify_session_log_not_deleted" translatable="false">Session log NOT deleted</string> - <!-- Toast notification that the system is enabling logging [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_notify_session_logging_enabled" translatable="false">Session logging enabled</string> - - <!-- Text for checkbox option to include user data in feedback for research purposes [CHAR LIMIT=50] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_include_history_label" translatable="false">Include session history</string> - <!-- Text for checkbox option to include user account name in feedback for research purposes [CHAR LIMIT=50] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_include_account_name_label" translatable="false">Include account name</string> - <!-- Text for checkbox option to include a recording in feedback for research purposes [CHAR LIMIT=50] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_include_recording_label" translatable="false">Include recorded demonstration</string> - <!-- Dialog button choice to send research feedback [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_send" translatable="false">Send</string> - <!-- Dialog button choice to cancel sending research feedback [CHAR LIMIT=35] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_cancel" translatable="false">Cancel</string> - <!-- Temporary notification to provide user with instructions about stopping a recording - - operation[CHAR LIMIT=100] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_demonstration_instructions" translatable="false">Please demonstrate the issue you are writing about.\n\nWhen finished, select the \"Bug?\" button again."</string> <!-- Title of a preference to send feedback. [CHAR LIMIT=30]--> <string name="send_feedback">Send feedback</string> - <!-- Temporary notification of recording failure [CHAR LIMIT=100] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_feedback_recording_failure" translatable="false">Recording cancelled due to timeout</string> - <!-- Toast notification to ask user to quit the research feedback dialog to perform this operation [CHAR LIMIT=100] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_please_exit_feedback_form" translatable="false">Please exit the feedback dialog to access the research log menu</string> - - <!-- Title of dialog shown at start informing users about contributing research usage data--> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_splash_title" translatable="false">Warning</string> - - <!-- Toast message informing users that logging has been disabled --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_logging_disabled" translatable="false">Logging Disabled</string> - - <!-- Name for the research uploading service to be displayed to users. [CHAR LIMIT=50] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_log_uploader_name" translatable="false">Research Uploader Service</string> - - <!-- Name for the research replaying service to be displayed to users. [CHAR LIMIT=50] --> - <!-- TODO: remove translatable=false attribute once text is stable --> - <string name="research_log_replayer_name" translatable="false">Research Replayer Service</string> <!-- Preference for input language selection --> <string name="select_language">Input languages</string> @@ -338,40 +174,43 @@ <!-- Inform the user that a particular language has an available dictionary --> <string name="has_dictionary">Dictionary available</string> - <!-- Preferences item for enabling to send user statistics for development only diagnostics --> - <string name="prefs_enable_log">Enable user feedback</string> - <!-- Description for enabling to send user statistics for development only diagnostics --> - <string name="prefs_description_log">Help improve this input method editor by automatically sending usage statistics and crash reports</string> - <!-- Title of the item to change the keyboard theme [CHAR LIMIT=20]--> <string name="keyboard_layout">Keyboard theme</string> - <!-- Description for English (United Kingdom) keyboard subtype [CHAR LIMIT=25] --> + <!-- Description for English (UK) keyboard subtype [CHAR LIMIT=25] + (UK) should be an abbreviation of United Kingdom to fit in the CHAR LIMIT. --> <string name="subtype_en_GB">English (UK)</string> - <!-- Description for English (United States) keyboard subtype [CHAR LIMIT=25] --> + <!-- Description for English (US) keyboard subtype [CHAR LIMIT=25] + (US) should be an abbreviation of United States to fit in the CHAR LIMIT. --> <string name="subtype_en_US">English (US)</string> - <!-- Description for Spanish (United States) keyboard subtype [CHAR LIMIT=25] --> + <!-- Description for Spanish (US) keyboard subtype [CHAR LIMIT=25] + (US) should be an abbreviation of United States to fit in the CHAR LIMIT. --> <string name="subtype_es_US">Spanish (US)</string> - <!-- Description for English (United Kingdom) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + <!-- Description for English (UK) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + (UK) should be an abbreviation of United Kingdom to fit in the CHAR LIMIT. This should be identical to subtype_en_GB aside from the trailing (%s). --> - <string name="subtype_with_layout_en_GB">English (UK) (<xliff:g id="layout">%s</xliff:g>)</string> - <!-- Description for English (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + <string name="subtype_with_layout_en_GB">English (UK) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string> + <!-- Description for English (US) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + (US) should be an abbreviation of United States to fit in the CHAR LIMIT. This should be identical to subtype_en_US aside from the trailing (%s). --> - <string name="subtype_with_layout_en_US">English (US) (<xliff:g id="layout">%s</xliff:g>)</string> - <!-- Description for Spanish (United States) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + <string name="subtype_with_layout_en_US">English (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string> + <!-- Description for Spanish (US) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] + (US) should be an abbreviation of United Statesn to fit in the CHAR LIMIT. This should be identical to subtype_es_US aside from the trailing (%s). --> - <string name="subtype_with_layout_es_US">Spanish (US) (<xliff:g id="layout">%s</xliff:g>)</string> - <!-- Description for Nepali (Traditional) keyboard subtype [CHAR LIMIT=25] --> - <string name="subtype_nepali_traditional"><xliff:g id="language">%s</xliff:g> (Traditional)</string> - <!-- TODO: Uncomment once we can handle IETF language tag with script name specified. - Description for Serbian Cyrillic keyboard subtype [CHAR LIMIT=25] - <string name="subtype_serbian_cyrillic">Serbian (Cyrillic)</string> - Description for Serbian Latin keyboard subtype [CHAR LIMIT=25] - <string name="subtype_serbian_latin">Serbian (Latin)</string> - Description for Serbian Latin keyboard subtype with explicit keyboard layout [CHAR LIMIT=25] - This should be identical to subtype_serbian_latin aside from the trailing (%s). - <string name="subtype_with_layout_sr-Latn">Serbian (Latin) (<xliff:g id="layout">%s</xliff:g>)</string> - --> + <string name="subtype_with_layout_es_US">Spanish (US) (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string> + <!-- Description for "LANGUAGE_NAME" (Traditional) keyboard subtype [CHAR LIMIT=25] + (Traditional) can be an abbreviation to fit in the CHAR LIMIT. --> + <string name="subtype_generic_traditional"><xliff:g id="LANGUAGE_NAME" example="Nepali">%s</xliff:g> (Traditional)</string> + <!-- Description for "LANGUAGE_NAME" (Compact) keyboard subtype [CHAR LIMIT=25] + (Compact) can be an abbreviation to fit in the CHAR LIMIT. + TODO: Remove translatable=false once we are settled down with the naming. --> + <string name="subtype_generic_compact" translatable="false"><xliff:g id="LANGUAGE_NAME" example="Hindi">%s</xliff:g> (Compact)</string> + <!-- Description for "LANGUAGE_NAME" (Cyrillic) keyboard subtype [CHAR LIMIT=25] + (Cyrillic) can be an abbreviation to fit in the CHAR LIMIT. --> + <string name="subtype_generic_cyrillic"><xliff:g id="LANGUAGE_NAME" example="Serbian">%s</xliff:g> (Cyrillic)</string> + <!-- Description for "LANGUAGE_NAME" (Latin) keyboard subtype [CHAR LIMIT=25] + (Latin) can be an abbreviation to fit in the CHAR LIMIT. --> + <string name="subtype_generic_latin"><xliff:g id="LANGUAGE_NAME" example="Serbian">%s</xliff:g> (Latin)</string> <!-- This string is displayed in a language list that allows to choose a language for suggestions in a software keyboard. This setting won't give suggestions in any particular language, hence "No language". @@ -452,12 +291,16 @@ mobile devices. [CHAR LIMIT=25] --> <!-- Description for Emoji keyboard subtype [CHAR LIMIT=25] --> <string name="subtype_emoji">Emoji</string> - <!-- Title of the preference settings for switching keyboard color scheme [CHAR LIMIT=35] --> - <string name="keyboard_color_scheme">Color scheme</string> - <!-- The keyboard color scheme name, White [CHAR LIMIT=16] --> - <string name="keyboard_color_scheme_white">White</string> - <!-- The keyboard color scheme name, Blue [CHAR LIMIT=16] --> - <string name="keyboard_color_scheme_blue">Blue</string> + <!-- Title of the preference settings for switching keyboard theme [CHAR LIMIT=35] --> + <string name="keyboard_theme">Keyboard theme</string> + <!-- The keyboard theme name, Holo White [CHAR LIMIT=25] --> + <string name="keyboard_theme_holo_white">Holo White</string> + <!-- The keyboard theme name, Holo Blue [CHAR LIMIT=25] --> + <string name="keyboard_theme_holo_blue">Holo Blue</string> + <!-- The keyboard theme name, Material Dark [CHAR LIMIT=25] --> + <string name="keyboard_theme_material_dark">Material Dark</string> + <!-- The keyboard theme name, Material Light [CHAR LIMIT=25] --> + <string name="keyboard_theme_material_light">Material Light</string> <!-- Title of the preference settings for custom input styles (language and keyboard layout pairs) [CHAR LIMIT=35]--> <string name="custom_input_styles_title">Custom input styles</string> @@ -480,36 +323,40 @@ mobile devices. [CHAR LIMIT=25] --> <!-- Title of the button to postpone enabling a custom input style entry in the settings dialog [CHAR LIMIT=15] --> <string name="not_now">Not now</string> <!-- Toast text to describe the same input style already exists [CHAR LIMIT=64]--> - <string name="custom_input_style_already_exists">"The same input style already exists: <xliff:g id="input_style_name">%s</xliff:g>"</string> + <string name="custom_input_style_already_exists">"The same input style already exists: <xliff:g id="INPUT_STYLE_NAME" example="English (Dvorak)">%s</xliff:g>"</string> - <!-- Title of an option for usability study mode --> - <string name="prefs_usability_study_mode">Usability study mode</string> <!-- Title of the settings for key long press delay [CHAR LIMIT=35] --> <string name="prefs_key_longpress_timeout_settings">Key long press delay</string> <!-- Title of the settings for keypress vibration duration [CHAR LIMIT=35] --> <string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration</string> <!-- Title of the settings for keypress sound volume [CHAR LIMIT=35] --> <string name="prefs_keypress_sound_volume_settings">Keypress sound volume</string> + <!-- Title of the settings for key popup show up animation duration (in milliseconds) [CHAR LIMIT=35] --> + <string name="prefs_key_popup_show_up_duration_settings" translatable="false">Key popup show up duration</string> + <!-- Title of the settings for key popup dismiss animation duration (in milliseconds) [CHAR LIMIT=35] --> + <string name="prefs_key_popup_dismiss_duration_settings" translatable="false">Key popup dismiss duration</string> + <!-- Title of the settings for key popup show up animation start scale (in percentile) [CHAR LIMIT=35] --> + <string name="prefs_key_popup_show_up_start_scale_settings" translatable="false">Key popup show up start scale</string> + <!-- Title of the settings for key popup dismiss animation end scale (in percentile) [CHAR LIMIT=35] --> + <string name="prefs_key_popup_dismiss_end_scale_settings" translatable="false">Key popup dismiss end scale</string> <!-- Title of the settings for reading an external dictionary file --> <string name="prefs_read_external_dictionary">Read external dictionary file</string> - <!-- Title of the settings for using only personalization dictionary --> - <string name="prefs_use_only_personalization_dictionary" translatable="false">Use only personalization dictionary</string> - <!-- Title of the settings for boosting personalization dictionary --> - <string name="prefs_boost_personalization_dictionary" translatable="false">Boost personalization dictionary</string> <!-- Message to show when there are no files to install as an external dictionary [CHAR LIMIT=100] --> <string name="read_external_dictionary_no_files_message">No dictionary files in the Downloads folder</string> <!-- Title of the dialog that selects a file to install as an external dictionary [CHAR LIMIT=50] --> <string name="read_external_dictionary_multiple_files_title">Select a dictionary file to install</string> <!-- Title of the confirmation dialog to install a file as an external dictionary [CHAR LIMIT=50] --> - <string name="read_external_dictionary_confirm_install_message">Really install this file for <xliff:g id="locale_name">%s</xliff:g>?</string> + <string name="read_external_dictionary_confirm_install_message">Really install this file for <xliff:g id="LANGUAGE_NAME" example="English">%s</xliff:g>?</string> <!-- Title for an error dialog that contains the details of the error in the body [CHAR LIMIT=80] --> <string name="error">There was an error</string> + <!-- Title of the settings group for dumpping dictionary files that have been created on the device [CHAR LIMIT=35] --> + <string name="prefs_dump_dynamic_dicts" translatable="false">Dump dictionary</string> <!-- Title of the button to revert to the default value of the device in the settings dialog [CHAR LIMIT=15] --> <string name="button_default">Default</string> <!-- Title of the setup wizard welcome screen. [CHAR LIMT=40] --> - <string name="setup_welcome_title">"Welcome to <xliff:g id="application_name">%s</xliff:g>"</string> + <string name="setup_welcome_title">"Welcome to <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string> <!-- Additional title of the setup wizard welcome screen, just below the setup_welcome_title. [CHAR_LIMIT=64] --> <string name="setup_welcome_additional_description">with Gesture Typing</string> <!-- The label of the button that starts the setup wizard. [CHAR_LIMIT=64] --> @@ -517,23 +364,23 @@ mobile devices. [CHAR LIMIT=25] --> <!-- The label of the button that navigates the user to the next step of the setup wizard. [CHAR_LIMIT=64] --> <string name="setup_next_action">Next step</string> <!-- Title of the setup wizard. [CHAR LIMT=40] --> - <string name="setup_steps_title">"Setting up <xliff:g id="application_name">%s</xliff:g>"</string> + <string name="setup_steps_title">"Setting up <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string> <!-- Ordinal number of the 1st step in the setup wizard. [CHAR LIMIT=5] --> <string name="setup_step1_bullet" translatable="false">1</string> <!-- Title of the 1st step in the setup wizard. [CHAR LIMIT=64] --> - <string name="setup_step1_title">"Enable <xliff:g id="application_name">%s</xliff:g>"</string> + <string name="setup_step1_title">"Enable <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string> <!-- Detailed instruction of the 1st step in the setup wizard. [CHAR LIMIT=120] --> - <string name="setup_step1_instruction">"Please check \"<xliff:g id="application_name">%s</xliff:g>\" in your Language & input settings. This will authorize it to run on your device."</string> + <string name="setup_step1_instruction">"Please check \"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>\" in your Language & input settings. This will authorize it to run on your device."</string> <!-- Detailed instruction of the already finished 1st step in the setup wizard. [CHAR LIMIT=120] --> - <string name="setup_step1_finished_instruction">"<xliff:g id="application_name">%s</xliff:g> is already enabled in your Language & input settings, so this step is done. On to the next one!"</string> + <string name="setup_step1_finished_instruction">"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g> is already enabled in your Language & input settings, so this step is done. On to the next one!"</string> <!-- The label of the button that triggers the Language & input settings in order to enable the keyboard. [CHAR_LIMIT=64] --> <string name="setup_step1_action">Enable in Settings</string> <!-- Ordinal number of the 2nd step in the setup wizard. [CHAR LIMIT=5] --> <string name="setup_step2_bullet" translatable="false">2</string> <!-- Title of the 2nd step in the setup wizard. [CHAR LIMIT=64] --> - <string name="setup_step2_title">"Switch to <xliff:g id="application_name">%s</xliff:g>"</string> + <string name="setup_step2_title">"Switch to <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>"</string> <!-- Detailed instruction of the 2nd step in the setup wizard. [CHAR LIMIT=120] --> - <string name="setup_step2_instruction">"Next, select \"<xliff:g id="application_name">%s</xliff:g>\" as your active text-input method."</string> + <string name="setup_step2_instruction">"Next, select \"<xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>\" as your active text-input method."</string> <!-- The label of the button that triggers the choose input method dialog in order to select the keyboard. [CHAR_LIMIT=64] --> <string name="setup_step2_action">Switch input methods</string> <!-- Ordinal number of the 3rd step in the setup wizard. [CHAR LIMIT=5] --> @@ -541,7 +388,7 @@ mobile devices. [CHAR LIMIT=25] --> <!-- Title of the 3rd step in the setup wizard. [CHAR LIMIT=64] --> <string name="setup_step3_title">"Congratulations, you're all set!"</string> <!-- Detailed instruction of the 3rd step in the setup wizard. [CHAR LIMIT=120] --> - <string name="setup_step3_instruction">Now you can type in all your favorite apps with <xliff:g id="application_name">%s</xliff:g>.</string> + <string name="setup_step3_instruction">Now you can type in all your favorite apps with <xliff:g id="APPLICATION_NAME" example="Android Keyboard">%s</xliff:g>.</string> <!-- The label of the button that triggers the screen for configuaring additional languages of the keyboard. [CHAR_LIMIT=64] --> <string name="setup_step3_action">Configure additional languages</string> <!-- The label of the button that finishes the setup wizard. [CHAR_LIMIT=64] --> @@ -592,13 +439,15 @@ mobile devices. [CHAR LIMIT=25] --> <!-- Message to display in a dialog box while we are actively updating the word list [CHAR LIMIT=60] --> <string name="message_updating">Checking for updates</string> <!-- Message to display while the add-on dictionary list is updating [no space constraints on this, there is plenty of space but shorter is better because it's only on the screen for a second] --> - <string name="message_loading">Loading...</string> + <string name="message_loading">Loading…</string> <!-- String to explain this dictionary is the main dictionary for this language [CHAR_LIMIT=30] --> <string name="main_dict_description">Main dictionary</string> <!-- Standard message to dismiss a dialog box --> <string name="cancel">Cancel</string> + <!-- Title of the button in a dialog box. The button takes the user to the keyboard settings. [CHAR LIMIT=15] --> + <string name="go_to_settings">Settings</string> <!-- Action to download and install a dictionary [CHAR_LIMIT=15] --> <string name="install_dict">Install</string> @@ -609,24 +458,24 @@ mobile devices. [CHAR LIMIT=25] --> <!-- Message in the popup informing the user a dictionary is available for their language, and asking for a decision to download over their mobile data plan or not. The reason we ask for this is, the data is large and may be downloaded over a paid-per-megabyte connection but a dictionary is also essential to type comfortably, so we ask the user. This only pops in selected cases, when there is no dictionary at all currently, and the only available network seems to be metered. The "Language & input" part should be set to the actual name of the option (message ID 5292716747264442359 in the translation console). [CHAR_LIMIT=700] --> <string name="should_download_over_metered_prompt">The selected language on your mobile device has an available dictionary.<br/> -We recommend <b>downloading</b> the <xliff:g id="language" example="English">%1$s</xliff:g> dictionary to improve your typing experience.<br/> +We recommend <b>downloading</b> the <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device.</string> - <string name="download_over_metered">Download now (<xliff:g id="size_in_megabytes" example="0.7">%1$.1f</xliff:g>MB)</string> + <string name="download_over_metered">Download now (<xliff:g id="SIZE_IN_MEGABYTES" example="0.7">%1$.1f</xliff:g>MB)</string> <string name="do_not_download_over_metered">Download over Wi-Fi</string> <!-- The text of the "dictionary available" notification. --> - <string name="dict_available_notification_title">A dictionary is available for <xliff:g id="language" example="English">%1$s</xliff:g></string> + <string name="dict_available_notification_title">A dictionary is available for <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g></string> <!-- The small subtext in the "dictionary available" notification. --> <string name="dict_available_notification_description">Press to review and download</string> <!-- The text of the toast warning a download is starting automatically to enable suggestions for the selected language [CHAR LIMIT=100] --> - <string name="toast_downloading_suggestions">Downloading: suggestions for <xliff:g id="language" example="English">%1$s</xliff:g> will be ready soon.</string> + <string name="toast_downloading_suggestions">Downloading: suggestions for <xliff:g id="LANGUAGE_NAME" example="English">%1$s</xliff:g> will be ready soon.</string> <!-- Version text [CHAR LIMIT=30]--> - <string name="version_text">Version <xliff:g id="version_number" example="1.0.1864.643521">%1$s</xliff:g></string> + <string name="version_text">Version <xliff:g id="VERSION_NUMBER" example="1.0.1864.643521">%1$s</xliff:g></string> <!-- User dictionary settings --> <!-- User dictionary settings. The summary of the listem item to go into the User dictionary settings screen. --> diff --git a/java/res/values/themes-common.xml b/java/res/values/themes-common.xml index 298936d9c..2b2a80aed 100644 --- a/java/res/values/themes-common.xml +++ b/java/res/values/themes-common.xml @@ -25,49 +25,49 @@ <item name="touchPositionCorrectionData">@array/touch_position_correction_data_default</item> <item name="rowHeight">25%p</item> <item name="moreKeysTemplate">@xml/kbd_more_keys_keyboard_template</item> - <item name="keyboardLeftPadding">@fraction/keyboard_left_padding</item> - <item name="keyboardRightPadding">@fraction/keyboard_right_padding</item> + <item name="keyboardLeftPadding">@fraction/config_keyboard_left_padding</item> + <item name="keyboardRightPadding">@fraction/config_keyboard_right_padding</item> <item name="maxMoreKeysColumn">@integer/config_max_more_keys_column</item> </style> <style name="KeyboardView"> <item name="keyBackground">@drawable/btn_keyboard_key_klp</item> - <item name="keyLetterSize">@fraction/key_letter_ratio</item> - <item name="keyLargeLetterRatio">@fraction/key_large_letter_ratio</item> - <item name="keyLabelSize">@fraction/key_label_ratio</item> - <item name="keyLargeLabelRatio">@fraction/key_large_label_ratio</item> - <item name="keyHintLetterRatio">@fraction/key_hint_letter_ratio</item> - <item name="keyHintLabelRatio">@fraction/key_hint_label_ratio</item> - <item name="keyShiftedLetterHintRatio">@fraction/key_uppercase_letter_ratio</item> + <item name="keyLetterSize">@fraction/config_key_letter_ratio</item> + <item name="keyLargeLetterRatio">@fraction/config_key_large_letter_ratio</item> + <item name="keyLabelSize">@fraction/config_key_label_ratio</item> + <item name="keyLargeLabelRatio">@fraction/config_key_large_label_ratio</item> + <item name="keyHintLetterRatio">@fraction/config_key_hint_letter_ratio</item> + <item name="keyHintLabelRatio">@fraction/config_key_hint_label_ratio</item> + <item name="keyShiftedLetterHintRatio">@fraction/config_key_shifted_letter_hint_ratio</item> <item name="keyTypeface">normal</item> - <item name="keyLabelHorizontalPadding">@dimen/key_label_horizontal_padding</item> - <item name="keyHintLetterPadding">@dimen/key_hint_letter_padding</item> - <item name="keyPopupHintLetterPadding">@dimen/key_popup_hint_letter_padding</item> - <item name="keyShiftedLetterHintPadding">@dimen/key_uppercase_letter_padding</item> - <item name="keyPreviewTextRatio">@fraction/key_preview_text_ratio</item> - <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item> + <item name="keyLabelHorizontalPadding">@dimen/config_key_label_horizontal_padding</item> + <item name="keyHintLetterPadding">@dimen/config_key_hint_letter_padding</item> + <item name="keyPopupHintLetterPadding">@dimen/config_key_popup_hint_letter_padding</item> + <item name="keyShiftedLetterHintPadding">@dimen/config_key_shifted_letter_hint_padding</item> + <item name="keyPreviewTextRatio">@fraction/config_key_preview_text_ratio</item> + <item name="verticalCorrection">@dimen/config_keyboard_vertical_correction</item> <item name="backgroundDimAlpha">128</item> - <item name="gestureFloatingPreviewTextSize">@dimen/gesture_floating_preview_text_size</item> - <item name="gestureFloatingPreviewTextOffset">@dimen/gesture_floating_preview_text_offset</item> - <item name="gestureFloatingPreviewHorizontalPadding">@dimen/gesture_floating_preview_horizontal_padding</item> - <item name="gestureFloatingPreviewVerticalPadding">@dimen/gesture_floating_preview_vertical_padding</item> - <item name="gestureFloatingPreviewRoundRadius">@dimen/gesture_floating_preview_round_radius</item> - <item name="gestureTrailMinSamplingDistance">@dimen/gesture_trail_min_sampling_distance</item> - <item name="gestureTrailMaxInterpolationAngularThreshold">@integer/gesture_trail_max_interpolation_angular_threshold</item> - <item name="gestureTrailMaxInterpolationDistanceThreshold">@dimen/gesture_trail_max_interpolation_distance_threshold</item> - <item name="gestureTrailMaxInterpolationSegments">@integer/gesture_trail_max_interpolation_segments</item> + <item name="gestureFloatingPreviewTextSize">@dimen/config_gesture_floating_preview_text_size</item> + <item name="gestureFloatingPreviewTextOffset">@dimen/config_gesture_floating_preview_text_offset</item> + <item name="gestureFloatingPreviewHorizontalPadding">@dimen/config_gesture_floating_preview_horizontal_padding</item> + <item name="gestureFloatingPreviewVerticalPadding">@dimen/config_gesture_floating_preview_vertical_padding</item> + <item name="gestureFloatingPreviewRoundRadius">@dimen/config_gesture_floating_preview_round_radius</item> + <item name="gestureTrailMinSamplingDistance">@dimen/config_gesture_trail_min_sampling_distance</item> + <item name="gestureTrailMaxInterpolationAngularThreshold">@integer/config_gesture_trail_max_interpolation_angular_threshold</item> + <item name="gestureTrailMaxInterpolationDistanceThreshold">@dimen/config_gesture_trail_max_interpolation_distance_threshold</item> + <item name="gestureTrailMaxInterpolationSegments">@integer/config_gesture_trail_max_interpolation_segments</item> <item name="gestureTrailFadeoutStartDelay">@integer/config_gesture_trail_fadeout_start_delay</item> <item name="gestureTrailFadeoutDuration">@integer/config_gesture_trail_fadeout_duration</item> <item name="gestureTrailUpdateInterval">@integer/config_gesture_trail_update_interval</item> - <item name="gestureTrailStartWidth">@dimen/gesture_trail_start_width</item> - <item name="gestureTrailEndWidth">@dimen/gesture_trail_end_width</item> - <item name="gestureTrailBodyRatio">@integer/gesture_trail_body_ratio</item> - <item name="gestureTrailShadowRatio">@integer/gesture_trail_shadow_ratio</item> + <item name="gestureTrailStartWidth">@dimen/config_gesture_trail_start_width</item> + <item name="gestureTrailEndWidth">@dimen/config_gesture_trail_end_width</item> + <item name="gestureTrailBodyRatio">@integer/config_gesture_trail_body_ratio</item> + <item name="gestureTrailShadowRatio">@integer/config_gesture_trail_shadow_ratio</item> <!-- Common attributes of MainKeyboardView --> <item name="keyHysteresisDistance">@dimen/config_key_hysteresis_distance</item> <item name="keyHysteresisDistanceForSlidingModifier">@dimen/config_key_hysteresis_distance_for_sliding_modifier</item> <item name="touchNoiseThresholdTime">@integer/config_touch_noise_threshold_time</item> <item name="touchNoiseThresholdDistance">@dimen/config_touch_noise_threshold_distance</item> - <item name="slidingKeyInputEnable">@bool/config_sliding_key_input_enabled</item> + <item name="keySelectionByDraggingFinger">@bool/config_key_selection_by_dragging_finger</item> <item name="slidingKeyInputPreviewWidth">@dimen/config_sliding_key_input_preview_width</item> <item name="slidingKeyInputPreviewBodyRatio">@integer/config_sliding_key_input_preview_body_ratio</item> <item name="slidingKeyInputPreviewShadowRatio">@integer/config_sliding_key_input_preview_shadow_ratio</item> @@ -75,11 +75,12 @@ <item name="keyRepeatInterval">@integer/config_key_repeat_interval</item> <item name="longPressShiftLockTimeout">@integer/config_longpress_shift_lock_timeout</item> <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item> - <item name="keyPreviewHeight">@dimen/key_preview_height</item> + <item name="keyPreviewHeight">@dimen/config_key_preview_height</item> + <!-- TODO: consolidate key preview linger timeout with the key preview animation parameters. --> <item name="keyPreviewLingerTimeout">@integer/config_key_preview_linger_timeout</item> <item name="moreKeysKeyboardLayout">@layout/more_keys_keyboard</item> <item name="showMoreKeysKeyboardAtTouchedPoint">@bool/config_show_more_keys_keyboard_at_touched_point</item> - <item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item> + <item name="languageOnSpacebarTextRatio">@fraction/config_language_on_spacebar_text_ratio</item> <item name="languageOnSpacebarFinalAlpha">@integer/config_language_on_spacebar_final_alpha</item> <item name="languageOnSpacebarFadeoutAnimator">@anim/language_on_spacebar_fadeout</item> <!-- Remove animations for now because it could drain a non-negligible amount of battery while typing. @@ -106,26 +107,32 @@ parent="KeyboardView" /> <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, for instance delete button, need themed {@link KeyboardView} attributes. --> - <style - name="EmojiPalettesView" - parent="KeyboardView" - > - <item name="emojiTabLabelColor">@color/emoji_tab_label_color_holo</item> - </style> + <style name="EmojiPalettesView" /> <style name="MoreKeysKeyboard" /> <style name="MoreKeysKeyboardView" parent="MainKeyboardView" /> <style name="MoreKeysKeyboardContainer" /> - <style name="SuggestionStripView"> - <item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item> - <item name="centerSuggestionPercentile">@fraction/center_suggestion_percentile</item> - <item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item> - <item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item> + <style name="SuggestionStripView" /> + <style name="SuggestionWord"> + <item name="android:minWidth">@dimen/config_suggestion_min_width</item> + <item name="android:textSize">@dimen/config_suggestion_text_size</item> + <item name="android:gravity">center</item> + <item name="android:paddingLeft">@dimen/config_suggestion_text_horizontal_padding</item> + <item name="android:paddingTop">0dp</item> + <item name="android:paddingRight">@dimen/config_suggestion_text_horizontal_padding</item> + <item name="android:paddingBottom">0dp</item> + <!-- Provide audio and haptic feedback by ourselves based on the keyboard settings. + We just need to ignore the system's audio and haptic feedback settings. --> + <item name="android:hapticFeedbackEnabled">false</item> + <item name="android:soundEffectsEnabled">false</item> + <item name="android:focusable">false</item> + <item name="android:clickable">false</item> + <item name="android:singleLine">true</item> + <item name="android:ellipsize">none</item> </style> - <style name="SuggestionWord" /> <style name="MoreKeysKeyboardAnimation"> <item name="android:windowEnterAnimation">@anim/more_keys_keyboard_fadein</item> <item name="android:windowExitAnimation">@anim/more_keys_keyboard_fadeout</item> </style> -</resources>
\ No newline at end of file +</resources> diff --git a/java/res/values/themes-gb.xml b/java/res/values/themes-gb.xml deleted file mode 100644 index f52695f55..000000000 --- a/java/res/values/themes-gb.xml +++ /dev/null @@ -1,146 +0,0 @@ -<?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. -*/ ---> - -<resources> - <style name="KeyboardTheme.GB" parent="KeyboardIcons.GB"> - <item name="keyboardStyle">@style/Keyboard.GB</item> - <item name="keyboardViewStyle">@style/KeyboardView.GB</item> - <item name="mainKeyboardViewStyle">@style/MainKeyboardView.GB</item> - <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.GB</item> - <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.GB</item> - <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.GB</item> - <item name="moreKeysKeyboardContainerStyle">@style/MoreKeysKeyboardContainer.GB</item> - <item name="suggestionStripViewStyle">@style/SuggestionStripView.GB</item> - <item name="suggestionWordStyle">@style/SuggestionWord.GB</item> - </style> - <style name="KeyboardIcons.GB"> - <!-- Keyboard icons --> - <item name="iconShiftKey">@drawable/sym_keyboard_shift_holo_dark</item> - <item name="iconDeleteKey">@drawable/sym_keyboard_delete_holo_dark</item> - <item name="iconSettingsKey">@drawable/sym_keyboard_settings_holo_dark</item> - <item name="iconSpaceKey">@drawable/sym_keyboard_space_holo_dark</item> - <item name="iconEnterKey">@drawable/sym_keyboard_return_holo_dark</item> - <item name="iconSearchKey">@drawable/sym_keyboard_search_holo_dark</item> - <item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item> - <item name="iconShortcutKey">@drawable/sym_keyboard_mic_holo_dark</item> - <item name="iconShortcutForLabel">@drawable/sym_keyboard_label_mic_holo_dark</item> - <item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space</item> - <item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_holo_dark</item> - <!-- TODO: Needs non-holo disabled shortcut icon drawable --> - <item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_holo_dark</item> - <item name="iconTabKeyPreview">@drawable/sym_keyboard_feedback_tab</item> - <item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_dark</item> - <!-- TODO: Needs dedicated black theme ZWNJ and ZWJ icons --> - <item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_holo_dark</item> - <item name="iconZwjKey">@drawable/sym_keyboard_zwj_holo_dark</item> - <item name="iconEmojiKey">@drawable/sym_keyboard_smiley_holo_dark</item> - </style> - <style - name="Keyboard.GB" - parent="Keyboard" - > - <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] --> - <item name="themeId">1</item> - <item name="touchPositionCorrectionData">@array/touch_position_correction_data_gb</item> - <item name="keyboardTopPadding">@fraction/keyboard_top_padding_gb</item> - <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_gb</item> - <item name="horizontalGap">@fraction/key_horizontal_gap_gb</item> - <item name="verticalGap">@fraction/key_bottom_gap_gb</item> - </style> - <style - name="KeyboardView.GB" - parent="KeyboardView" - > - <item name="android:background">@drawable/keyboard_background_gb</item> - <item name="keyBackground">@drawable/btn_keyboard_key_gb</item> - <item name="keyTypeface">bold</item> - <item name="keyTextColor">@color/key_text_color_gb</item> - <item name="keyTextInactivatedColor">@color/key_text_inactivated_color_gb</item> - <item name="keyHintLetterColor">@color/key_hint_letter_color_gb</item> - <item name="keyHintLabelColor">@color/key_hint_label_color_gb</item> - <item name="keyShiftedLetterHintInactivatedColor">@color/key_shifted_letter_hint_inactivated_color_gb</item> - <item name="keyShiftedLetterHintActivatedColor">@color/key_shifted_letter_hint_activated_color_gb</item> - <item name="keyPreviewTextColor">@color/key_text_color_gb</item> - <item name="keyTextShadowColor">@color/key_text_shadow_color_gb</item> - <item name="keyTextShadowRadius">2.75</item> - </style> - <style - name="MainKeyboardView.GB" - parent="KeyboardView.GB" - > - <item name="keyPreviewLayout">@layout/key_preview_gb</item> - <item name="keyPreviewOffset">@dimen/key_preview_offset_gb</item> - <item name="gestureFloatingPreviewTextColor">@color/highlight_color_gb</item> - <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_gb</item> - <item name="gestureTrailColor">@color/highlight_color_gb</item> - <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_gb</item> - <item name="autoCorrectionSpacebarLedEnabled">true</item> - <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_gb</item> - <item name="spacebarTextColor">@color/spacebar_text_color_gb</item> - <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_gb</item> - </style> - <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, - for instance delete button, need themed {@link KeyboardView} attributes. --> - <style - name="EmojiPalettesView.GB" - parent="KeyboardView.GB" - > - <item name="keyBackground">@drawable/btn_keyboard_key_functional_gb</item> - <item name="emojiTabLabelColor">@color/emoji_tab_label_color_gb</item> - </style> - <style - name="MoreKeysKeyboard.GB" - parent="Keyboard.GB" - > - <item name="keyboardTopPadding">0%p</item> - <item name="keyboardBottomPadding">0%p</item> - <item name="horizontalGap">0%p</item> - <item name="touchPositionCorrectionData">@null</item> - </style> - <style - name="MoreKeysKeyboardView.GB" - parent="KeyboardView.GB" - > - <item name="android:background">@null</item> - <item name="keyBackground">@drawable/btn_keyboard_key_popup_gb</item> - <item name="keyTypeface">normal</item> - <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_gb</item> - </style> - <style - name="MoreKeysKeyboardContainer.GB" - > - <item name="android:background">@drawable/keyboard_popup_panel_background_gb</item> - </style> - <style - name="SuggestionStripView.GB" - parent="SuggestionStripView" - > - <item name="android:background">@drawable/keyboard_suggest_strip_gb</item> - <item name="suggestionStripOption">autoCorrectBold|validTypedWordBold</item> - <item name="colorValidTypedWord">@color/highlight_color_gb</item> - <item name="colorTypedWord">@color/typed_word_color_gb</item> - <item name="colorAutoCorrect">@color/highlight_color_gb</item> - <item name="colorSuggested">@color/highlight_color_gb</item> - <item name="alphaObsoleted">50%</item> - </style> - <style name="SuggestionWord.GB"> - <item name="android:background">@drawable/btn_suggestion_gb</item> - </style> -</resources> diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml index 432ad5122..073ae90b9 100644 --- a/java/res/values/themes-ics.xml +++ b/java/res/values/themes-ics.xml @@ -26,7 +26,6 @@ <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.ICS</item> <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.ICS</item> <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.ICS</item> - <item name="moreKeysKeyboardContainerStyle">@style/MoreKeysKeyboardContainer.ICS</item> <item name="suggestionStripViewStyle">@style/SuggestionStripView.ICS</item> <item name="suggestionWordStyle">@style/SuggestionWord.ICS</item> </style> @@ -36,10 +35,10 @@ > <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] --> <item name="themeId">2</item> - <item name="keyboardTopPadding">@fraction/keyboard_top_padding_holo</item> - <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_holo</item> - <item name="horizontalGap">@fraction/key_horizontal_gap_holo</item> - <item name="verticalGap">@fraction/key_bottom_gap_holo</item> + <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item> + <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item> + <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item> + <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item> <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item> </style> <style @@ -48,40 +47,52 @@ > <item name="android:background">@drawable/keyboard_background_holo</item> <item name="keyBackground">@drawable/btn_keyboard_key_ics</item> + <item name="functionalKeyBackground">@drawable/btn_keyboard_key_functional_ics</item> + <item name="spacebarBackground">@drawable/btn_keyboard_spacebar_ics</item> <item name="keyTypeface">bold</item> <item name="keyTextColor">@color/key_text_color_holo</item> <item name="keyTextInactivatedColor">@color/key_text_inactivated_color_holo</item> + <item name="functionalTextColor">@color/key_text_color_holo</item> <item name="keyHintLetterColor">@color/key_hint_letter_color_holo</item> <item name="keyHintLabelColor">@color/key_hint_label_color_holo</item> <item name="keyShiftedLetterHintInactivatedColor">@color/key_shifted_letter_hint_inactivated_color_holo</item> <item name="keyShiftedLetterHintActivatedColor">@color/key_shifted_letter_hint_activated_color_holo</item> <item name="keyPreviewTextColor">@color/key_text_color_holo</item> - <item name="keyTextShadowColor">@color/key_text_shadow_color_holo</item> - <item name="keyTextShadowRadius">0.0</item> + <!-- A negative value to disable key text shadow layer. --> + <item name="keyTextShadowRadius">-1.0</item> </style> <style name="MainKeyboardView.ICS" parent="KeyboardView.ICS" > - <item name="keyPreviewLayout">@layout/key_preview_ics</item> - <item name="keyPreviewOffset">@dimen/key_preview_offset_holo</item> + <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_ics</item> + <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item> <item name="gestureFloatingPreviewTextColor">@color/highlight_color_ics</item> <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item> <item name="gestureTrailColor">@color/highlight_color_ics</item> <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_ics</item> - <item name="autoCorrectionSpacebarLedEnabled">false</item> - <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item> - <item name="spacebarTextColor">@color/spacebar_text_color_holo</item> - <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item> + <item name="languageOnSpacebarTextColor">@color/spacebar_text_color_holo</item> + <item name="languageOnSpacebarTextShadowRadius">1.0</item> + <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item> </style> <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, for instance delete button, need themed {@link KeyboardView} attributes. --> <style name="EmojiPalettesView.ICS" - parent="KeyboardView.ICS" + parent="MainKeyboardView.ICS" > - <item name="keyBackgroundEmojiFunctional">@drawable/btn_keyboard_key_functional_ics</item> - <item name="emojiTabLabelColor">@color/emoji_tab_label_color_holo</item> + <item name="categoryIndicatorEnabled">true</item> + <item name="categoryIndicatorDrawable">@drawable/emoji_category_tab_selected_ics</item> + <item name="categoryIndicatorBackground">@drawable/emoji_category_tab_unselected_holo_dark</item> + <item name="categoryPageIndicatorColor">@color/highlight_color_ics</item> + <item name="categoryPageIndicatorBackground">@color/emoji_tab_page_indicator_background_holo</item> + <item name="iconEmojiRecentsTab">@drawable/ic_emoji_recents_holo_dark</item> + <item name="iconEmojiCategory1Tab">@drawable/ic_emoji_people_holo_dark</item> + <item name="iconEmojiCategory2Tab">@drawable/ic_emoji_objects_holo_dark</item> + <item name="iconEmojiCategory3Tab">@drawable/ic_emoji_nature_holo_dark</item> + <item name="iconEmojiCategory4Tab">@drawable/ic_emoji_places_holo_dark</item> + <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> + <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> </style> <style name="MoreKeysKeyboard.ICS" @@ -96,29 +107,32 @@ name="MoreKeysKeyboardView.ICS" parent="KeyboardView.ICS" > - <item name="android:background">@null</item> + <item name="android:background">@drawable/keyboard_popup_panel_background_ics</item> <item name="keyBackground">@drawable/btn_keyboard_key_popup_ics</item> <item name="keyTypeface">normal</item> - <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_holo</item> - </style> - <style - name="MoreKeysKeyboardContainer.ICS" - > - <item name="android:background">@drawable/keyboard_popup_panel_background_ics</item> + <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item> </style> <style name="SuggestionStripView.ICS" - parent="SuggestionStripView" + parent="KeyboardView.ICS" > + <item name="suggestionsCountInStrip">@integer/config_suggestions_count_in_strip</item> + <item name="centerSuggestionPercentile">@fraction/config_center_suggestion_percentile</item> + <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item> + <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item> <item name="android:background">@drawable/keyboard_suggest_strip_holo</item> - <item name="suggestionStripOption">autoCorrectBold|validTypedWordBold</item> + <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item> <item name="colorValidTypedWord">@color/typed_word_color_ics</item> <item name="colorTypedWord">@color/typed_word_color_ics</item> <item name="colorAutoCorrect">@color/highlight_color_ics</item> <item name="colorSuggested">@color/suggested_word_color_ics</item> <item name="alphaObsoleted">70%</item> </style> - <style name="SuggestionWord.ICS"> + <style + name="SuggestionWord.ICS" + parent="SuggestionWord" + > <item name="android:background">@drawable/btn_suggestion_ics</item> + <item name="android:textColor">@color/highlight_color_ics</item> </style> </resources> diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml index a3730019d..f895de572 100644 --- a/java/res/values/themes-klp.xml +++ b/java/res/values/themes-klp.xml @@ -26,7 +26,6 @@ <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.KLP</item> <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.KLP</item> <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.KLP</item> - <item name="moreKeysKeyboardContainerStyle">@style/MoreKeysKeyboardContainer.KLP</item> <item name="suggestionStripViewStyle">@style/SuggestionStripView.KLP</item> <item name="suggestionWordStyle">@style/SuggestionWord.KLP</item> </style> @@ -36,10 +35,10 @@ > <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] --> <item name="themeId">0</item> - <item name="keyboardTopPadding">@fraction/keyboard_top_padding_holo</item> - <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_holo</item> - <item name="horizontalGap">@fraction/key_horizontal_gap_holo</item> - <item name="verticalGap">@fraction/key_bottom_gap_holo</item> + <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item> + <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item> + <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item> + <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item> <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item> </style> <style @@ -48,40 +47,52 @@ > <item name="android:background">@drawable/keyboard_background_holo</item> <item name="keyBackground">@drawable/btn_keyboard_key_klp</item> + <item name="functionalKeyBackground">@drawable/btn_keyboard_key_functional_klp</item> + <item name="spacebarBackground">@drawable/btn_keyboard_spacebar_klp</item> <item name="keyTypeface">bold</item> <item name="keyTextColor">@color/key_text_color_holo</item> <item name="keyTextInactivatedColor">@color/key_text_inactivated_color_holo</item> + <item name="functionalTextColor">@color/key_text_color_holo</item> <item name="keyHintLetterColor">@color/key_hint_letter_color_holo</item> <item name="keyHintLabelColor">@color/key_hint_label_color_holo</item> <item name="keyShiftedLetterHintInactivatedColor">@color/key_shifted_letter_hint_inactivated_color_holo</item> <item name="keyShiftedLetterHintActivatedColor">@color/key_shifted_letter_hint_activated_color_holo</item> <item name="keyPreviewTextColor">@color/key_text_color_holo</item> - <item name="keyTextShadowColor">@color/key_text_shadow_color_holo</item> - <item name="keyTextShadowRadius">0.0</item> + <!-- A negative value to disable key text shadow layer. --> + <item name="keyTextShadowRadius">-1.0</item> </style> <style name="MainKeyboardView.KLP" parent="KeyboardView.KLP" > - <item name="keyPreviewLayout">@layout/key_preview_klp</item> - <item name="keyPreviewOffset">@dimen/key_preview_offset_holo</item> + <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_klp</item> + <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item> <item name="gestureFloatingPreviewTextColor">@color/highlight_color_klp</item> <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item> <item name="gestureTrailColor">@color/highlight_color_klp</item> <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_klp</item> - <item name="autoCorrectionSpacebarLedEnabled">false</item> - <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item> - <item name="spacebarTextColor">@color/spacebar_text_color_holo</item> - <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item> + <item name="languageOnSpacebarTextColor">@color/spacebar_text_color_holo</item> + <item name="languageOnSpacebarTextShadowRadius">1.0</item> + <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item> </style> <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, for instance delete button, need themed {@link KeyboardView} attributes. --> <style name="EmojiPalettesView.KLP" - parent="KeyboardView.KLP" + parent="MainKeyboardView.KLP" > - <item name="keyBackgroundEmojiFunctional">@drawable/btn_keyboard_key_functional_klp</item> - <item name="emojiTabLabelColor">@color/emoji_tab_label_color_holo</item> + <item name="categoryIndicatorEnabled">true</item> + <item name="categoryIndicatorDrawable">@drawable/emoji_category_tab_selected_klp</item> + <item name="categoryIndicatorBackground">@drawable/emoji_category_tab_unselected_holo_dark</item> + <item name="categoryPageIndicatorColor">@color/highlight_color_klp</item> + <item name="categoryPageIndicatorBackground">@color/emoji_tab_page_indicator_background_holo</item> + <item name="iconEmojiRecentsTab">@drawable/ic_emoji_recents_holo_dark</item> + <item name="iconEmojiCategory1Tab">@drawable/ic_emoji_people_holo_dark</item> + <item name="iconEmojiCategory2Tab">@drawable/ic_emoji_objects_holo_dark</item> + <item name="iconEmojiCategory3Tab">@drawable/ic_emoji_nature_holo_dark</item> + <item name="iconEmojiCategory4Tab">@drawable/ic_emoji_places_holo_dark</item> + <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> + <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> </style> <style name="MoreKeysKeyboard.KLP" @@ -96,29 +107,32 @@ name="MoreKeysKeyboardView.KLP" parent="KeyboardView.KLP" > - <item name="android:background">@null</item> + <item name="android:background">@drawable/keyboard_popup_panel_background_klp</item> <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item> <item name="keyTypeface">normal</item> - <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_holo</item> - </style> - <style - name="MoreKeysKeyboardContainer.KLP" - > - <item name="android:background">@drawable/keyboard_popup_panel_background_klp</item> + <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item> </style> <style name="SuggestionStripView.KLP" - parent="SuggestionStripView" + parent="KeyboardView.KLP" > + <item name="suggestionsCountInStrip">@integer/config_suggestions_count_in_strip</item> + <item name="centerSuggestionPercentile">@fraction/config_center_suggestion_percentile</item> + <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item> + <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item> <item name="android:background">@drawable/keyboard_suggest_strip_holo</item> - <item name="suggestionStripOption">autoCorrectBold|validTypedWordBold</item> + <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item> <item name="colorValidTypedWord">@color/typed_word_color_klp</item> <item name="colorTypedWord">@color/typed_word_color_klp</item> <item name="colorAutoCorrect">@color/highlight_color_klp</item> <item name="colorSuggested">@color/suggested_word_color_klp</item> <item name="alphaObsoleted">70%</item> </style> - <style name="SuggestionWord.KLP"> + <style + name="SuggestionWord.KLP" + parent="SuggestionWord" + > <item name="android:background">@drawable/btn_suggestion_klp</item> + <item name="android:textColor">@color/highlight_color_klp</item> </style> </resources> diff --git a/java/res/values/themes-lxx-dark.xml b/java/res/values/themes-lxx-dark.xml new file mode 100644 index 000000000..1db8f428e --- /dev/null +++ b/java/res/values/themes-lxx-dark.xml @@ -0,0 +1,139 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + <style name="KeyboardTheme.LXX_Dark" parent="KeyboardIcons.LXX_Dark"> + <item name="keyboardStyle">@style/Keyboard.LXX_Dark</item> + <item name="keyboardViewStyle">@style/KeyboardView.LXX_Dark</item> + <item name="mainKeyboardViewStyle">@style/MainKeyboardView.LXX_Dark</item> + <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.LXX_Dark</item> + <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.LXX_Dark</item> + <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.LXX_Dark</item> + <item name="suggestionStripViewStyle">@style/SuggestionStripView.LXX_Dark</item> + <item name="suggestionWordStyle">@style/SuggestionWord.LXX_Dark</item> + </style> + <style + name="Keyboard.LXX_Dark" + parent="Keyboard" + > + <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] --> + <item name="themeId">3</item> + <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item> + <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item> + <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item> + <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item> + <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item> + </style> + <style + name="KeyboardView.LXX_Dark" + parent="KeyboardView" + > + <item name="android:background">@color/keyboard_background_lxx_dark</item> + <item name="keyBackground">@drawable/btn_keyboard_key_lxx_dark</item> + <item name="functionalKeyBackground">@drawable/btn_keyboard_key_functional_lxx_dark</item> + <item name="spacebarBackground">@drawable/btn_keyboard_spacebar_lxx_dark</item> + <item name="spacebarIconWidthRatio">0.9</item> + <item name="keyTypeface">normal</item> + <item name="keyTextColor">@color/key_text_color_lxx_dark</item> + <item name="keyTextInactivatedColor">@color/key_text_inactive_color_lxx_dark</item> + <item name="functionalTextColor">@color/key_hint_letter_color_lxx_dark</item> + <item name="keyHintLetterColor">@color/key_hint_letter_color_lxx_dark</item> + <item name="keyHintLabelColor">@color/key_text_inactive_color_lxx_dark</item> + <item name="keyShiftedLetterHintInactivatedColor">@color/key_text_inactive_color_lxx_dark</item> + <item name="keyShiftedLetterHintActivatedColor">@color/key_text_color_lxx_dark</item> + <item name="keyPreviewTextColor">@color/key_text_color_lxx_dark</item> + <!-- A negative value to disable key text shadow layer. --> + <item name="keyTextShadowRadius">-1.0</item> + </style> + <style + name="MainKeyboardView.LXX_Dark" + parent="KeyboardView.LXX_Dark" + > + <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_lxx_dark</item> + <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item> + <item name="gestureFloatingPreviewTextColor">@color/highlight_color_lxx_dark</item> + <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_lxx_dark</item> + <item name="gestureTrailColor">@color/highlight_color_lxx_dark</item> + <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_lxx_dark</item> + <item name="languageOnSpacebarTextColor">@color/key_text_inactive_color_lxx_dark</item> + <!-- A negative value to disable text shadow layer. --> + <item name="languageOnSpacebarTextShadowRadius">-1.0</item> + </style> + <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, + for instance delete button, need themed {@link KeyboardView} attributes. --> + <style + name="EmojiPalettesView.LXX_Dark" + parent="MainKeyboardView.LXX_Dark" + > + <item name="categoryIndicatorEnabled">false</item> + <item name="categoryPageIndicatorColor">@color/highlight_color_lxx_dark</item> + <item name="categoryPageIndicatorBackground">@color/emoji_tab_page_indicator_background_lxx_dark</item> + <!-- TODO: Update those icons to LXX_Dark theme. --> + <item name="iconEmojiRecentsTab">@drawable/ic_emoji_recents_holo_dark</item> + <item name="iconEmojiCategory1Tab">@drawable/ic_emoji_people_holo_dark</item> + <item name="iconEmojiCategory2Tab">@drawable/ic_emoji_objects_holo_dark</item> + <item name="iconEmojiCategory3Tab">@drawable/ic_emoji_nature_holo_dark</item> + <item name="iconEmojiCategory4Tab">@drawable/ic_emoji_places_holo_dark</item> + <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> + <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> + </style> + <style + name="MoreKeysKeyboard.LXX_Dark" + parent="Keyboard.LXX_Dark" + > + <item name="keyboardTopPadding">0%p</item> + <item name="keyboardBottomPadding">0%p</item> + <item name="horizontalGap">0%p</item> + <item name="touchPositionCorrectionData">@null</item> + </style> + <style + name="MoreKeysKeyboardView.LXX_Dark" + parent="KeyboardView.LXX_Dark" + > + <item name="android:background">@drawable/keyboard_popup_panel_background_lxx_dark</item> + <!-- Reuse KLP key background --> + <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item> + <item name="keyTypeface">normal</item> + <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item> + </style> + <style + name="SuggestionStripView.LXX_Dark" + parent="KeyboardView.LXX_Dark" + > + <item name="suggestionsCountInStrip">@integer/config_suggestions_count_in_strip</item> + <item name="centerSuggestionPercentile">@fraction/config_center_suggestion_percentile</item> + <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item> + <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item> + <item name="android:background">@color/suggestions_strip_background_lxx_dark</item> + <item name="suggestionStripOptions">autoCorrectBold|validTypedWordBold</item> + <item name="colorValidTypedWord">@color/typed_word_color_lxx_dark</item> + <item name="colorTypedWord">@color/typed_word_color_lxx_dark</item> + <item name="colorAutoCorrect">@color/highlight_color_lxx_dark</item> + <item name="colorSuggested">@color/suggested_word_color_lxx_dark</item> + <item name="alphaObsoleted">70%</item> + </style> + <style + name="SuggestionWord.LXX_Dark" + parent="SuggestionWord" + > + <item name="android:background">@drawable/btn_suggestion_lxx_dark</item> + <item name="android:textColor">@color/highlight_color_lxx_dark</item> + </style> +</resources> diff --git a/java/res/values/touch-position-correction.xml b/java/res/values/touch-position-correction.xml index becec0e0a..e090d106b 100644 --- a/java/res/values/touch-position-correction.xml +++ b/java/res/values/touch-position-correction.xml @@ -37,26 +37,6 @@ </string-array> <string-array - name="touch_position_correction_data_gb" - translatable="false" - > - <!-- First row --> - <item>0.0091285</item> - <item>0.1193203</item> - <item>0.1622607</item> - - <!-- Second row --> - <item>-0.0233128</item> - <item>0.1379798</item> - <item>0.1585229</item> - - <!-- Third row --> - <item>-0.0080185</item> - <item>0.1911477</item> - <item>0.1570948</item> - </string-array> - - <string-array name="touch_position_correction_data_holo" translatable="false" > diff --git a/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml b/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml index 4d8b446a2..c7d446014 100644 --- a/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml +++ b/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml @@ -20,7 +20,7 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:keyWidth="5%p" - latin:rowHeight="@dimen/popup_key_height" + latin:rowHeight="@dimen/config_more_keys_keyboard_key_height" style="?attr/moreKeysKeyboardStyle" > </Keyboard> diff --git a/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml b/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml index d90a5884e..fbe8cfcc0 100644 --- a/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml +++ b/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml @@ -20,7 +20,7 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:keyWidth="8%p" - latin:rowHeight="@dimen/popup_key_height" + latin:rowHeight="@dimen/config_more_keys_keyboard_key_height" style="?attr/moreKeysKeyboardStyle" > </Keyboard> diff --git a/java/res/xml-sw600dp/key_shortcut.xml b/java/res/xml-sw600dp/key_comma.xml index 87fc75cd5..67199e237 100644 --- a/java/res/xml-sw600dp/key_shortcut.xml +++ b/java/res/xml-sw600dp/key_comma.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, 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. @@ -21,33 +21,27 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > + <!-- The table comma key which may have settings as popup key. --> + <!-- Kept as a separate file for cleaner overriding by an overlay. --> + <key-style + latin:styleName="baseTabletCommaKeyStyle" + latin:keySpec="!text/keyspec_tablet_comma" + latin:keyHintLabel="!text/keyhintlabel_tablet_comma" + latin:keyLabelFlags="hasPopupHint" + latin:parentStyle="hasShiftedLetterHintStyle" /> <switch> <case - latin:shortcutKeyEnabled="true" - latin:clobberSettingsKey="false" - > - <Key - latin:keyStyle="shortcutKeyStyle" - latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/settings_as_more_key" /> - </case> - <case - latin:shortcutKeyEnabled="true" latin:clobberSettingsKey="true" > <Key - latin:keyStyle="shortcutKeyStyle" /> + latin:moreKeys="!text/morekeys_tablet_comma" + latin:keyStyle="baseTabletCommaKeyStyle" /> </case> - <case - latin:shortcutKeyEnabled="false" - latin:clobberSettingsKey="false" - > - <Key - latin:keyStyle="settingsKeyStyle" /> - </case> - <!-- shortcutKeyEnabled="false" clobberSettingsKey="true" --> + <!-- clobberSettingsKey="false" --> <default> - <Spacer /> + <Key + latin:moreKeys="!text/morekeys_tablet_comma,!text/keyspec_settings" + latin:keyStyle="baseTabletCommaKeyStyle" /> </default> </switch> </merge> diff --git a/java/res/xml-sw600dp/key_f1.xml b/java/res/xml-sw600dp/key_f1.xml index ac0053236..ba78a6430 100644 --- a/java/res/xml-sw600dp/key_f1.xml +++ b/java/res/xml-sw600dp/key_f1.xml @@ -23,37 +23,14 @@ > <switch> <case - latin:keyboardLayoutSetElement="symbols" - latin:mode="url" - > - <Key - latin:keyLabel=":" /> - </case> - <case - latin:keyboardLayoutSetElement="symbols" - > - <Key - latin:keyLabel="\@" /> - </case> - <!-- keyboardLayoutSetElement != "symbols" --> - <case latin:mode="email" > <Key - latin:keyLabel="\@" /> - </case> - <case - latin:mode="url" - > - <Key - latin:keyLabel="/" - latin:keyHintLabel=":" - latin:moreKeys=":" - latin:keyStyle="hasShiftedLetterHintStyle" /> + latin:keySpec="\@" /> </case> <default> <Key - latin:keyLabel="/" /> + latin:keySpec="/" /> </default> </switch> </merge> diff --git a/java/res/xml-sw600dp/key_period.xml b/java/res/xml-sw600dp/key_period.xml new file mode 100644 index 000000000..d2909d82d --- /dev/null +++ b/java/res/xml-sw600dp/key_period.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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" +> + <!-- The table period key which may have different label depending on locale --> + <!-- Kept as a separate file for cleaner overriding by an overlay. --> + <switch> + <case + latin:languageCode="hi" + latin:keyboardLayoutSet="hindi_compact" + > + <!-- U+0964: "।" DEVANAGARI DANDA --> + <Key + latin:keySpec="\u0964" + latin:keyLabelFlags="hasPopupHint" + latin:moreKeys="!autoColumnOrder!8,\\,,.,',#,),(,/,;,@,:,-,",+,\\%,&" + latin:backgroundType="functional" /> + </case> + <default> + <Key + latin:keySpec="!text/keyspec_tablet_period" + latin:keyHintLabel="!text/keyhintlabel_tablet_period" + latin:keyLabelFlags="hasPopupHint" + latin:moreKeys="!text/morekeys_tablet_period" + latin:backgroundType="functional" + latin:keyStyle="hasShiftedLetterHintStyle" /> + </default> + </switch> +</merge> diff --git a/java/res/xml-sw600dp/key_question_exclamation.xml b/java/res/xml-sw600dp/key_question_exclamation.xml index 860a0be77..edee5c5dd 100644 --- a/java/res/xml-sw600dp/key_question_exclamation.xml +++ b/java/res/xml-sw600dp/key_question_exclamation.xml @@ -26,11 +26,11 @@ latin:mode="email|url" > <Key - latin:keyLabel="-" /> + latin:keySpec="-" /> </case> <default> <Key - latin:keyLabel="\?" + latin:keySpec="\?" latin:keyHintLabel="!" latin:moreKeys="!" latin:keyStyle="hasShiftedLetterHintStyle" /> diff --git a/java/res/xml/key_azerty3_right.xml b/java/res/xml-sw600dp/key_settings.xml index 65789ea69..45915e948 100644 --- a/java/res/xml/key_azerty3_right.xml +++ b/java/res/xml-sw600dp/key_settings.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, 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. @@ -23,15 +23,14 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" + latin:clobberSettingsKey="false" > <Key - latin:keyLabel="\?" /> + latin:keyStyle="settingsKeyStyle" /> </case> + <!-- clobberSettingsKey="true" --> <default> - <Key - latin:keyLabel="\'" - latin:moreKeys="!text/more_keys_for_single_quote" /> + <Spacer /> </default> </switch> </merge> diff --git a/java/res/xml-sw600dp/key_space_5kw.xml b/java/res/xml-sw600dp/key_space_5kw.xml index 86af89f50..71ae5fd8f 100644 --- a/java/res/xml-sw600dp/key_space_5kw.xml +++ b/java/res/xml-sw600dp/key_space_5kw.xml @@ -23,7 +23,7 @@ > <switch> <case - latin:languageCode="fa" + latin:languageCode="fa|ne" latin:languageSwitchKeyEnabled="true" > <Key @@ -35,7 +35,7 @@ latin:keyStyle="zwnjKeyStyle" /> </case> <case - latin:languageCode="fa" + latin:languageCode="fa|ne" latin:languageSwitchKeyEnabled="false" > <Key diff --git a/java/res/xml-sw600dp/key_space_symbols.xml b/java/res/xml-sw600dp/key_space_symbols.xml index 07aa7d179..b3cb5ac78 100644 --- a/java/res/xml-sw600dp/key_space_symbols.xml +++ b/java/res/xml-sw600dp/key_space_symbols.xml @@ -21,6 +21,7 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <include - latin:keyboardLayout="@xml/key_space_5kw" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="45.0%p" /> </merge> diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml index d817add11..7de276901 100644 --- a/java/res/xml-sw600dp/key_styles_common.xml +++ b/java/res/xml-sw600dp/key_styles_common.xml @@ -35,11 +35,13 @@ latin:keyLabelFlags="hasShiftedLetterHint" /> </default> </switch> + <!-- Base key style for the key which may have settings key as more keys. --> + <include + latin:keyboardLayout="@xml/key_styles_settings" /> <!-- Functional key styles --> <!-- Base style for shift key. A single space is used for dummy label in moreKeys. --> <key-style latin:styleName="baseForShiftKeyStyle" - latin:code="!code/key_shift" latin:keyActionFlags="noKeyPreview" latin:keyLabelFlags="preserveCase" latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" /> @@ -49,7 +51,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key_shifted" + latin:keySpec="!icon/shift_key_shifted|!code/key_shift" latin:backgroundType="stickyOff" latin:parentStyle="baseForShiftKeyStyle" /> </case> @@ -58,77 +60,57 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key_shifted" + latin:keySpec="!icon/shift_key_shifted|!code/key_shift" latin:backgroundType="stickyOn" latin:parentStyle="baseForShiftKeyStyle" /> </case> <default> <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key" + latin:keySpec="!icon/shift_key|!code/key_shift" latin:backgroundType="stickyOff" latin:parentStyle="baseForShiftKeyStyle" /> </default> </switch> <key-style latin:styleName="deleteKeyStyle" - latin:code="!code/key_delete" - latin:keyIcon="!icon/delete_key" + latin:keySpec="!icon/delete_key|!code/key_delete" latin:keyActionFlags="isRepeatable|noKeyPreview" latin:backgroundType="functional" /> <include latin:keyboardLayout="@xml/key_styles_enter" /> - <!-- Override defaultEnterKeyStyle in key_styles_enter.xml --> - <key-style - latin:styleName="defaultEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/enter_key" - latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio" - latin:keyActionFlags="noKeyPreview" - latin:backgroundType="functional" - latin:parentStyle="navigateMoreKeysStyle" /> + <!-- TODO: Currently there is no way to specify icon alignment per theme. --> <key-style latin:styleName="spaceKeyStyle" - latin:code="!code/key_space" + latin:keySpec="!icon/space_key|!code/key_space" latin:keyActionFlags="noKeyPreview|enableLongPress" /> <!-- U+200C: ZERO WIDTH NON-JOINER U+200D: ZERO WIDTH JOINER --> <key-style latin:styleName="zwnjKeyStyle" - latin:code="0x200C" - latin:keyIcon="!icon/zwnj_key" + latin:keySpec="!icon/zwnj_key|‌" latin:moreKeys="!icon/zwj_key|‍" latin:keyLabelFlags="hasPopupHint" latin:keyActionFlags="noKeyPreview" /> <key-style - latin:styleName="smileyKeyStyle" - latin:keyLabel=":-)" - latin:keyOutputText=":-) " - latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/more_keys_for_smiley" /> - <key-style latin:styleName="shortcutKeyStyle" - latin:code="!code/key_shortcut" - latin:keyIcon="!icon/shortcut_key" + latin:keySpec="!icon/shortcut_key|!code/key_shortcut" latin:keyIconDisabled="!icon/shortcut_key_disabled" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="languageSwitchKeyStyle" - latin:code="!code/key_language_switch" - latin:keyIcon="!icon/language_switch_key" + latin:keySpec="!icon/language_switch_key|!code/key_language_switch" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress" latin:altCode="!code/key_space" /> <key-style latin:styleName="emojiKeyStyle" - latin:code="!code/key_emoji" - latin:keyIcon="!icon/emoji_key" + latin:keySpec="!icon/emoji_key|!code/key_emoji" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="settingsKeyStyle" - latin:code="!code/key_settings" - latin:keyIcon="!icon/settings_key" + latin:keySpec="!icon/settings_key|!code/key_settings" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <switch> @@ -138,8 +120,7 @@ > <key-style latin:styleName="tabKeyStyle" - latin:code="!code/key_action_previous" - latin:keyIcon="!icon/tab_key" + latin:keySpec="!icon/tab_key|!code/key_action_previous" latin:keyIconPreview="!icon/tab_key_preview" latin:backgroundType="functional" /> </case> @@ -149,49 +130,42 @@ > <key-style latin:styleName="tabKeyStyle" - latin:code="!code/key_action_next" - latin:keyIcon="!icon/tab_key" + latin:keySpec="!icon/tab_key|!code/key_action_next" latin:keyIconPreview="!icon/tab_key_preview" latin:backgroundType="functional" /> </case> <default> <key-style latin:styleName="tabKeyStyle" - latin:code="!code/key_tab" - latin:keyIcon="!icon/tab_key" + latin:keySpec="!icon/tab_key|!code/key_tab" latin:keyIconPreview="!icon/tab_key_preview" latin:backgroundType="functional" /> </default> </switch> <key-style latin:styleName="baseForLayoutSwitchKeyStyle" - latin:keyLabelFlags="preserveCase" + latin:keyLabelFlags="preserveCase|followFunctionalTextColor" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> <key-style latin:styleName="toSymbolKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:keyLabel="!text/label_to_symbol_key" + latin:keySpec="!text/keylabel_to_symbol|!code/key_switch_alpha_symbol" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="toAlphaKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:keyLabel="!text/label_to_alpha_key" + latin:keySpec="!text/keylabel_to_alpha|!code/key_switch_alpha_symbol" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="toMoreSymbolKeyStyle" - latin:code="!code/key_shift" - latin:keyLabel="!text/label_to_more_symbol_for_tablet_key" + latin:keySpec="!text/keylabel_tablet_to_more_symbol|!code/key_shift" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="backFromMoreSymbolKeyStyle" - latin:code="!code/key_shift" - latin:keyLabel="!text/label_to_symbol_key" + latin:keySpec="!text/keylabel_to_symbol|!code/key_shift" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="comKeyStyle" - latin:keyLabel="!text/keylabel_for_popular_domain" + latin:keySpec="!text/keyspec_popular_domain" latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase" - latin:keyOutputText="!text/keylabel_for_popular_domain" - latin:moreKeys="!text/more_keys_for_popular_domain" /> + latin:moreKeys="!text/morekeys_popular_domain" /> </merge> diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml index 1d8ccfae3..740bf3543 100644 --- a/java/res/xml-sw600dp/key_styles_enter.xml +++ b/java/res/xml-sw600dp/key_styles_enter.xml @@ -21,7 +21,7 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <!-- TODO: Stop using many conditional cases for emoji_key_as_more_key. There are way too many to maintain. --> + <!-- TODO: Stop using many conditional cases for keyspec_emoji_key. There are way too many to maintain. --> <!-- Navigate more keys style --> <switch> <!-- latin:passwordInput="true" --> @@ -32,7 +32,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:imeAction="actionNext" @@ -48,7 +48,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:imeAction="actionPrevious" @@ -64,7 +64,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/action_previous_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_action_previous,!text/keyspec_action_next" /> </case> <case latin:navigateNext="true" @@ -73,7 +73,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:navigateNext="false" @@ -82,7 +82,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:navigateNext="false" @@ -99,22 +99,11 @@ <!-- Enter key style --> <key-style latin:styleName="defaultEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/enter_key" - latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio" + latin:keySpec="!icon/enter_key|!code/key_enter" + latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio|followFunctionalTextColor" latin:keyActionFlags="noKeyPreview" - latin:backgroundType="functional" - latin:parentStyle="navigateMoreKeysStyle" /> - <key-style - latin:styleName="shiftEnterKeyStyle" - latin:code="!code/key_shift_enter" - latin:parentStyle="defaultEnterKeyStyle" /> - <key-style - latin:styleName="defaultActionEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/undefined" latin:backgroundType="action" - latin:parentStyle="defaultEnterKeyStyle" /> + latin:parentStyle="navigateMoreKeysStyle" /> <switch> <!-- Shift + Enter in textMultiLine field. --> <case @@ -123,63 +112,125 @@ > <key-style latin:styleName="enterKeyStyle" - latin:parentStyle="shiftEnterKeyStyle" /> + latin:keySpec="!icon/enter_key|!code/key_shift_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionGo" + latin:isIconDefined="go_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/go_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionGo" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_go_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_go_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionNext" + latin:isIconDefined="next_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/next_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionNext" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_next_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionPrevious" + latin:isIconDefined="previous_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_next_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/previous_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionPrevious" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_previous_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_previous_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionDone" + latin:isIconDefined="done_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/done_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionDone" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_done_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_done_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSend" + latin:isIconDefined="send_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_send_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/send_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionSend" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_send_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSearch" + latin:isIconDefined="search_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyIcon="!icon/search_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/search_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionSearch" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_search_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionCustomLabel" > <key-style latin:styleName="enterKeyStyle" + latin:keySpec="dummy_label|!code/key_enter" latin:keyLabelFlags="fromCustomActionLabel" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:parentStyle="defaultEnterKeyStyle" /> </case> <!-- imeAction is either actionNone or actionUnspecified. --> <default> diff --git a/java/res/xml-sw600dp/keys_arabic3_left.xml b/java/res/xml-sw600dp/keys_arabic3_left.xml index 0f2ccc0ac..87ca1055e 100644 --- a/java/res/xml-sw600dp/keys_arabic3_left.xml +++ b/java/res/xml-sw600dp/keys_arabic3_left.xml @@ -23,10 +23,8 @@ > <!-- U+0630: "ذ" ARABIC LETTER THAL --> <Key - latin:keyLabel="ذ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ذ" /> <!-- U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE --> <Key - latin:keyLabel="ئ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ئ" /> </merge> diff --git a/java/res/xml-sw600dp/keys_comma_period.xml b/java/res/xml-sw600dp/keys_comma_period.xml deleted file mode 100644 index 7604e033d..000000000 --- a/java/res/xml-sw600dp/keys_comma_period.xml +++ /dev/null @@ -1,103 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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="email|url" - > - <Key - latin:keyLabel="," - latin:keyHintLabel="-" - latin:moreKeys="-" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="_" - latin:moreKeys="_" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - </case> - <case - latin:languageCode="ar" - > - <Key - latin:keyLabel="!text/keylabel_for_apostrophe" - latin:keyHintLabel="!text/keyhintlabel_for_apostrophe" - latin:moreKeys="!text/more_keys_for_apostrophe" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_arabic_diacritics" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_arabic_diacritics" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - </case> - <case - latin:languageCode="fa" - > - <Key - latin:keyLabel="!text/keylabel_for_apostrophe" - latin:keyHintLabel="!text/keyhintlabel_for_apostrophe" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_apostrophe" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_arabic_diacritics" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_arabic_diacritics" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - </case> - <case - latin:languageCode="hy" - > - <!-- U+055D: "՝" ARMENIAN COMMA --> - <Key - latin:keyLabel="՝" - latin:backgroundType="functional" /> - <!-- U+0589: "։" ARMENIAN FULL STOP --> - <Key - latin:keyLabel="։" - latin:keyLabelFlags="hasPopupHint" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_punctuation" /> - </case> - <default> - <Key - latin:keyLabel="!text/keylabel_for_tablet_comma" - latin:keyHintLabel="!text/keyhintlabel_for_tablet_comma" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_tablet_comma" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_period" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_period" /> - </default> - </switch> -</merge> diff --git a/java/res/xml-sw600dp/keys_dvorak_123.xml b/java/res/xml-sw600dp/keys_dvorak_123.xml index 58416abb4..91ceb1c43 100644 --- a/java/res/xml-sw600dp/keys_dvorak_123.xml +++ b/java/res/xml-sw600dp/keys_dvorak_123.xml @@ -26,31 +26,31 @@ latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" > <Key - latin:keyLabel=""" + latin:keySpec=""" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <Key - latin:keyLabel="<" + latin:keySpec="<" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <Key - latin:keyLabel=">" + latin:keySpec=">" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> </case> <default> <Key - latin:keyLabel="\'" + latin:keySpec="\'" latin:keyHintLabel="1" latin:additionalMoreKeys="1" latin:moreKeys="!,"" /> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyHintLabel="2" latin:additionalMoreKeys="2" latin:moreKeys="\?,<" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyHintLabel="3" latin:additionalMoreKeys="3" latin:moreKeys=">" /> diff --git a/java/res/xml-sw600dp/keys_exclamation_question.xml b/java/res/xml-sw600dp/keys_exclamation_question.xml index cd38282ee..cf2c61ead 100644 --- a/java/res/xml-sw600dp/keys_exclamation_question.xml +++ b/java/res/xml-sw600dp/keys_exclamation_question.xml @@ -22,7 +22,11 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="!" /> + latin:keySpec="!" + latin:moreKeys="!text/morekeys_exclamation" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="\?" /> + latin:keySpec="\?" + latin:moreKeys="!text/morekeys_question" + latin:keyLabelFlags="fontDefault" /> </merge> diff --git a/java/res/xml-sw600dp/keys_farsi3_right.xml b/java/res/xml-sw600dp/keys_farsi3_right.xml index 3c91ae92d..c832d5542 100644 --- a/java/res/xml-sw600dp/keys_farsi3_right.xml +++ b/java/res/xml-sw600dp/keys_farsi3_right.xml @@ -23,10 +23,8 @@ > <!-- U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE --> <Key - latin:keyLabel="آ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="آ" /> <!-- U+0686: "چ" ARABIC LETTER TCHEH --> <Key - latin:keyLabel="چ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="چ" /> </merge> diff --git a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml index 324e025ed..76ac6bbdd 100644 --- a/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml +++ b/java/res/xml-sw600dp/keys_pcqwerty2_right3.xml @@ -23,20 +23,20 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel="[" + latin:keySpec="[" latin:keyHintLabel="{" latin:additionalMoreKeys="{" latin:keyStyle="hasShiftedLetterHintStyle" /> <Key - latin:keyLabel="]" + latin:keySpec="]" latin:keyHintLabel="}" latin:additionalMoreKeys="}" latin:keyStyle="hasShiftedLetterHintStyle" /> <Key - latin:keyLabel="\\" + latin:keySpec="\\" latin:keyHintLabel="|" latin:additionalMoreKeys="\\|" latin:keyStyle="hasShiftedLetterHintStyle" /> @@ -44,11 +44,11 @@ <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> <Key - latin:keyLabel="{" /> + latin:keySpec="{" /> <Key - latin:keyLabel="}" /> + latin:keySpec="}" /> <Key - latin:keyLabel="|" /> + latin:keySpec="|" /> </default> </switch> </merge>
\ No newline at end of file diff --git a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml index 254b5e571..f18fb507c 100644 --- a/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml +++ b/java/res/xml-sw600dp/keys_pcqwerty3_right2.xml @@ -23,15 +23,15 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel=";" + latin:keySpec=";" latin:keyHintLabel=":" latin:additionalMoreKeys=":" latin:keyStyle="hasShiftedLetterHintStyle" /> <Key - latin:keyLabel="\'" + latin:keySpec="\'" latin:keyHintLabel=""" latin:additionalMoreKeys=""" latin:keyStyle="hasShiftedLetterHintStyle" @@ -40,9 +40,9 @@ <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> <Key - latin:keyLabel=":" /> + latin:keySpec=":" /> <Key - latin:keyLabel=""" + latin:keySpec=""" latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" /> </default> </switch> diff --git a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml index 774ff8d05..9ac718cd8 100644 --- a/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml +++ b/java/res/xml-sw600dp/keys_pcqwerty4_right3.xml @@ -23,24 +23,24 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel="," + latin:keySpec="," latin:keyHintLabel="<" latin:additionalMoreKeys="<" latin:keyStyle="hasShiftedLetterHintStyle" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyHintLabel=">" latin:additionalMoreKeys=">" latin:keyStyle="hasShiftedLetterHintStyle" /> <Key - latin:keyLabel="/" + latin:keySpec="/" latin:keyHintLabel="\?" latin:additionalMoreKeys="\?" latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_question" /> + latin:moreKeys="!text/morekeys_question" /> </case> <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> @@ -51,14 +51,14 @@ U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> <Key - latin:keyLabel="<" + latin:keySpec="<" latin:moreKeys="!fixedColumnOrder!3,‹,≤,«" /> <Key - latin:keyLabel=">" + latin:keySpec=">" latin:moreKeys="!fixedColumnOrder!3,›,≥,»" /> <Key - latin:keyLabel="\?" - latin:moreKeys="!text/more_keys_for_symbols_question" /> + latin:keySpec="\?" + latin:moreKeys="!text/morekeys_question" /> </default> </switch> </merge> diff --git a/java/res/xml-sw600dp/row_dvorak4.xml b/java/res/xml-sw600dp/row_dvorak4.xml index 11b403452..ab2b5603d 100644 --- a/java/res/xml-sw600dp/row_dvorak4.xml +++ b/java/res/xml-sw600dp/row_dvorak4.xml @@ -29,20 +29,20 @@ latin:keyStyle="toSymbolKeyStyle" latin:keyWidth="10.0%p" /> <include - latin:keyboardLayout="@xml/key_shortcut" /> - <include - latin:keyboardLayout="@xml/key_f1" /> + latin:keyboardLayout="@xml/key_settings" /> + <Key + latin:keySpec="_" + latin:keyHintLabel="-" + latin:moreKeys="-" + latin:keyStyle="hasShiftedLetterHintStyle" /> <include latin:keyXPos="28.0%p" latin:keyboardLayout="@xml/key_space_5kw" latin:backgroundType="normal" /> <include + latin:keyboardLayout="@xml/key_f1" /> + <include latin:keyboardLayout="@xml/key_question_exclamation" /> - <Key - latin:keyLabel="-" - latin:keyHintLabel="_" - latin:moreKeys="_" - latin:keyStyle="hasShiftedLetterHintStyle" /> <include latin:keyboardLayout="@xml/key_f2" /> </Row> diff --git a/java/res/xml-sw600dp/row_pcqwerty5.xml b/java/res/xml-sw600dp/row_pcqwerty5.xml index b854f1051..ac07f11c2 100644 --- a/java/res/xml-sw600dp/row_pcqwerty5.xml +++ b/java/res/xml-sw600dp/row_pcqwerty5.xml @@ -24,37 +24,32 @@ <Row latin:keyWidth="7.0%p" > + <include + latin:keyWidth="9.0%p" + latin:keyboardLayout="@xml/key_settings" /> <switch> <case latin:languageSwitchKeyEnabled="true" > <Key latin:keyStyle="languageSwitchKeyStyle" - latin:keyWidth="9.0%p" - latin:backgroundType="functional" /> - </case> - </switch> - <Key - latin:keyStyle="spaceKeyStyle" - latin:keyXPos="25.5%p" - latin:keyWidth="49.0%p" /> - <switch> - <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" - > - <include - latin:keyXPos="-9.0%p" - latin:keyWidth="9.0%p" - latin:keyboardLayout="@xml/key_shortcut" /> + latin:keyXPos="22.0%p" + latin:keyWidth="9.0%p" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="40.0%p" /> </case> - <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> - <include - latin:keyXPos="-9.0%p" - latin:keyWidth="9.0%p" - latin:backgroundType="functional" - latin:keyboardLayout="@xml/key_f2" /> + <Key + latin:keyStyle="spaceKeyStyle" + latin:keyXPos="29.0%p" + latin:keyWidth="42.0%p" /> </default> </switch> + <include + latin:keyXPos="-9.0%p" + latin:keyWidth="9.0%p" + latin:backgroundType="functional" + latin:keyboardLayout="@xml/key_f2" /> </Row> </merge> diff --git a/java/res/xml-sw600dp/row_qwerty4.xml b/java/res/xml-sw600dp/row_qwerty4.xml index 7969dd8a5..0eb86f2d4 100644 --- a/java/res/xml-sw600dp/row_qwerty4.xml +++ b/java/res/xml-sw600dp/row_qwerty4.xml @@ -29,15 +29,18 @@ latin:keyStyle="toSymbolKeyStyle" latin:keyWidth="10.0%p" /> <include - latin:keyboardLayout="@xml/key_shortcut" /> - <include - latin:keyboardLayout="@xml/key_f1" /> + latin:keyboardLayout="@xml/key_comma" /> + <Key + latin:keySpec="_" /> + <!-- Space key. --> <include latin:keyXPos="28.0%p" latin:keyboardLayout="@xml/key_space_5kw" latin:backgroundType="normal" /> <include - latin:keyboardLayout="@xml/keys_comma_period" /> + latin:keyboardLayout="@xml/key_f1" /> + <include + latin:keyboardLayout="@xml/key_period" /> <include latin:keyboardLayout="@xml/key_f2" /> </Row> diff --git a/java/res/xml-sw600dp/rowkeys_dvorak3.xml b/java/res/xml-sw600dp/rowkeys_dvorak3.xml index 2148bb2c7..e58d6dbef 100644 --- a/java/res/xml-sw600dp/rowkeys_dvorak3.xml +++ b/java/res/xml-sw600dp/rowkeys_dvorak3.xml @@ -22,26 +22,26 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="q" /> + latin:keySpec="q" /> <Key - latin:keyLabel="j" - latin:moreKeys="!text/more_keys_for_j" /> + latin:keySpec="j" + latin:moreKeys="!text/morekeys_j" /> <Key - latin:keyLabel="k" - latin:moreKeys="!text/more_keys_for_k" /> + latin:keySpec="k" + latin:moreKeys="!text/morekeys_k" /> <Key - latin:keyLabel="x" /> + latin:keySpec="x" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> <Key - latin:keyLabel="w" - latin:moreKeys="!text/more_keys_for_w" /> + latin:keySpec="w" + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> <Key - latin:keyLabel="z" - latin:moreKeys="!text/more_keys_for_z" /> + latin:keySpec="z" + latin:moreKeys="!text/morekeys_z" /> </merge> diff --git a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml index 254d3fdba..e4b824f80 100644 --- a/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml +++ b/java/res/xml-sw600dp/rowkeys_pcqwerty1.xml @@ -21,87 +21,98 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:keyLabel="`" - latin:keyHintLabel="~" - latin:additionalMoreKeys="~" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="1" - latin:keyHintLabel="!" - latin:additionalMoreKeys="!" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_exclamation,!text/more_keys_for_symbols_1" /> - <Key - latin:keyLabel="2" - latin:keyHintLabel="\@" - latin:additionalMoreKeys="\@" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_2" /> - <Key - latin:keyLabel="3" - latin:keyHintLabel="\#" - latin:additionalMoreKeys="\#" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_3" /> - <Key - latin:keyLabel="4" - latin:keyHintLabel="$" - latin:additionalMoreKeys="$" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_4" /> - <Key - latin:keyLabel="5" - latin:keyHintLabel="%" - latin:additionalMoreKeys="\\%" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_5" /> - <Key - latin:keyLabel="6" - latin:keyHintLabel="^" - latin:additionalMoreKeys="^" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_6" /> - <Key - latin:keyLabel="7" - latin:keyHintLabel="&" - latin:additionalMoreKeys="&" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_7" /> - <Key - latin:keyLabel="8" - latin:keyHintLabel="*" - latin:additionalMoreKeys="*" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_8" /> - <Key - latin:keyLabel="9" - latin:keyHintLabel="(" - latin:additionalMoreKeys="(" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_9" /> - <Key - latin:keyLabel="0" - latin:keyHintLabel=")" - latin:additionalMoreKeys=")" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="!text/more_keys_for_symbols_0" /> - <!-- U+2013: "–" EN DASH - U+2014: "—" EM DASH - U+00B7: "·" MIDDLE DOT --> - <Key - latin:keyLabel="-" - latin:keyHintLabel="_" - latin:additionalMoreKeys="_" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="–,—,·" /> - <!-- U+221E: "∞" INFINITY - U+2260: "≠" NOT EQUAL TO - U+2248: "≈" ALMOST EQUAL TO --> - <Key - latin:keyLabel="=" - latin:keyHintLabel="+" - latin:additionalMoreKeys="+" - latin:keyStyle="hasShiftedLetterHintStyle" - latin:moreKeys="∞,≠,≈" /> + <switch> + <case + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" + > + <Key + latin:keySpec="`" + latin:keyHintLabel="~" + latin:additionalMoreKeys="~" + latin:keyStyle="hasShiftedLetterHintStyle" /> + <Key + latin:keySpec="1" + latin:keyHintLabel="!" + latin:additionalMoreKeys="!" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_exclamation,!text/morekeys_symbols_1" /> + <Key + latin:keySpec="2" + latin:keyHintLabel="\@" + latin:additionalMoreKeys="\@" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_2" /> + <Key + latin:keySpec="3" + latin:keyHintLabel="\#" + latin:additionalMoreKeys="\#" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_3" /> + <Key + latin:keySpec="4" + latin:keyHintLabel="$" + latin:additionalMoreKeys="$" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_4" /> + <Key + latin:keySpec="5" + latin:keyHintLabel="%" + latin:additionalMoreKeys="\\%" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_5" /> + <Key + latin:keySpec="6" + latin:keyHintLabel="^" + latin:additionalMoreKeys="^" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_6" /> + <Key + latin:keySpec="7" + latin:keyHintLabel="&" + latin:additionalMoreKeys="&" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_7" /> + <Key + latin:keySpec="8" + latin:keyHintLabel="*" + latin:additionalMoreKeys="*" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_8" /> + <Key + latin:keySpec="9" + latin:keyHintLabel="(" + latin:additionalMoreKeys="(" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_9" /> + <Key + latin:keySpec="0" + latin:keyHintLabel=")" + latin:additionalMoreKeys=")" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="!text/morekeys_symbols_0" /> + <!-- U+2013: "–" EN DASH + U+2014: "—" EM DASH + U+00B7: "·" MIDDLE DOT --> + <Key + latin:keySpec="-" + latin:keyHintLabel="_" + latin:additionalMoreKeys="_" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="–,—,·" /> + <!-- U+221E: "∞" INFINITY + U+2260: "≠" NOT EQUAL TO + U+2248: "≈" ALMOST EQUAL TO --> + <Key + latin:keySpec="=" + latin:keyHintLabel="+" + latin:additionalMoreKeys="+" + latin:keyStyle="hasShiftedLetterHintStyle" + latin:moreKeys="∞,≠,≈" /> + </case> + <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" --> + <default> + <include + latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" /> + </default> + </switch> </merge> diff --git a/java/res/xml-sw600dp/rows_arabic.xml b/java/res/xml-sw600dp/rows_arabic.xml index 5a28d4572..1b7b4161e 100644 --- a/java/res/xml-sw600dp/rows_arabic.xml +++ b/java/res/xml-sw600dp/rows_arabic.xml @@ -18,35 +18,31 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic1" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic2" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic2" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic3" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic3" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_armenian_phonetic.xml b/java/res/xml-sw600dp/rows_armenian_phonetic.xml index 9bc2a1821..ebd16cba0 100644 --- a/java/res/xml-sw600dp/rows_armenian_phonetic.xml +++ b/java/res/xml-sw600dp/rows_armenian_phonetic.xml @@ -18,53 +18,46 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic1" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> - </Row> + </Row> <Row latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic2" /> - <include - latin:keyboardLayout="@xml/key_armenian_xeh" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic2" /> + <include latin:keyboardLayout="@xml/key_armenian_xeh" /> </Row> <Row latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic3" /> - <include - latin:keyboardLayout="@xml/key_armenian_sha" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic3" /> + <include latin:keyboardLayout="@xml/key_armenian_sha" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.8889%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic4" /> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic4" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_bengali.xml b/java/res/xml-sw600dp/rows_bengali.xml new file mode 100644 index 000000000..10b3e4fb5 --- /dev/null +++ b/java/res/xml-sw600dp/rows_bengali.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali2" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_colemak.xml b/java/res/xml-sw600dp/rows_colemak.xml index ab059da83..7559bfb96 100644 --- a/java/res/xml-sw600dp/rows_colemak.xml +++ b/java/res/xml-sw600dp/rows_colemak.xml @@ -28,8 +28,6 @@ > <include latin:keyboardLayout="@xml/rowkeys_colemak1" /> - <include - latin:keyboardLayout="@xml/key_colemak_colon" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> diff --git a/java/res/xml-sw600dp/rows_farsi.xml b/java/res/xml-sw600dp/rows_farsi.xml index a353b67c7..1d098df9a 100644 --- a/java/res/xml-sw600dp/rows_farsi.xml +++ b/java/res/xml-sw600dp/rows_farsi.xml @@ -18,36 +18,33 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_farsi1" /> + <include latin:keyboardLayout="@xml/rowkeys_farsi1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_farsi2" /> + <include latin:keyboardLayout="@xml/rowkeys_farsi2" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > <include latin:keyboardLayout="@xml/rowkeys_farsi3" latin:keyXPos="4.091%p" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_greek.xml b/java/res/xml-sw600dp/rows_greek.xml index 066dc47fb..60ee478d8 100644 --- a/java/res/xml-sw600dp/rows_greek.xml +++ b/java/res/xml-sw600dp/rows_greek.xml @@ -27,8 +27,6 @@ latin:keyWidth="9.0%p" > <include - latin:keyboardLayout="@xml/key_greek_semicolon" /> - <include latin:keyboardLayout="@xml/rowkeys_greek1" /> <Key latin:keyStyle="deleteKeyStyle" diff --git a/java/res/xml-sw600dp/rows_hebrew.xml b/java/res/xml-sw600dp/rows_hebrew.xml index 852e17683..86b34202f 100644 --- a/java/res/xml-sw600dp/rows_hebrew.xml +++ b/java/res/xml-sw600dp/rows_hebrew.xml @@ -45,8 +45,10 @@ latin:keyWidth="9.0%p" > <include - latin:keyboardLayout="@xml/rowkeys_hebrew3" - latin:keyXPos="10.0%p" /> + latin:keyboardLayout="@xml/rowkeys_hebrew3" /> + <include + latin:keyboardLayout="@xml/keys_exclamation_question" + latin:keyWidth="9.5%p" /> </Row> <include latin:keyboardLayout="@xml/row_qwerty4" /> diff --git a/java/res/xml-sw600dp/rows_hindi.xml b/java/res/xml-sw600dp/rows_hindi.xml index ca581be14..42b92a72a 100644 --- a/java/res/xml-sw600dp/rows_hindi.xml +++ b/java/res/xml-sw600dp/rows_hindi.xml @@ -18,40 +18,35 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_hindi1" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_hindi2" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi2" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_hindi3" /> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_hindi_compact.xml b/java/res/xml-sw600dp/rows_hindi_compact.xml new file mode 100644 index 000000000..649345169 --- /dev/null +++ b/java/res/xml-sw600dp/rows_hindi_compact.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact2" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_khmer.xml b/java/res/xml-sw600dp/rows_khmer.xml index 2824a5c2f..800a3ee57 100644 --- a/java/res/xml-sw600dp/rows_khmer.xml +++ b/java/res/xml-sw600dp/rows_khmer.xml @@ -18,55 +18,48 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer1" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> - </Row> + </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer2" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer2" /> </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer3" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer3" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal|autoXScale" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_khmer4" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer4" /> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <Spacer /> </case> <default> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> </default> </switch> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_lao.xml b/java/res/xml-sw600dp/rows_lao.xml index 446d9bd5a..264e2d9ed 100644 --- a/java/res/xml-sw600dp/rows_lao.xml +++ b/java/res/xml-sw600dp/rows_lao.xml @@ -18,55 +18,48 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao1" /> + <include latin:keyboardLayout="@xml/rowkeys_lao1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> - </Row> + </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao2" /> + <include latin:keyboardLayout="@xml/rowkeys_lao2" /> </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao3" /> + <include latin:keyboardLayout="@xml/rowkeys_lao3" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_lao4" /> + <include latin:keyboardLayout="@xml/rowkeys_lao4" /> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <Spacer /> </case> <default> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> </default> </switch> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_marathi.xml b/java/res/xml-sw600dp/rows_marathi.xml new file mode 100644 index 000000000..c77bea567 --- /dev/null +++ b/java/res/xml-sw600dp/rows_marathi.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi2" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_myanmar.xml b/java/res/xml-sw600dp/rows_myanmar.xml new file mode 100644 index 000000000..20d9d8ab2 --- /dev/null +++ b/java/res/xml-sw600dp/rows_myanmar.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar2" /> + </Row> + <Row + latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar3" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="9.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" /> + <include latin:keyboardLayout="@xml/rowkeys_myanmar4" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_nepali_romanized.xml b/java/res/xml-sw600dp/rows_nepali_romanized.xml index 21d1dc6e0..fe73fbd9e 100644 --- a/java/res/xml-sw600dp/rows_nepali_romanized.xml +++ b/java/res/xml-sw600dp/rows_nepali_romanized.xml @@ -18,40 +18,35 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized1" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized2" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized2" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized3" /> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_nepali_traditional.xml b/java/res/xml-sw600dp/rows_nepali_traditional.xml index 90703da76..e56271f21 100644 --- a/java/res/xml-sw600dp/rows_nepali_traditional.xml +++ b/java/res/xml-sw600dp/rows_nepali_traditional.xml @@ -18,40 +18,35 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional1" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional2" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional2" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_left6" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_right5" /> - </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_left6" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_right5" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml index 37bf2e808..757e77933 100644 --- a/java/res/xml-sw600dp/rows_number_normal.xml +++ b/java/res/xml-sw600dp/rows_number_normal.xml @@ -23,29 +23,29 @@ > <Row> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="+" + latin:keySpec="+" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="1" + latin:keySpec="1" latin:keyStyle="numKeyStyle" latin:keyXPos="31%p" /> <Key - latin:keyLabel="2" + latin:keySpec="2" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="3" + latin:keySpec="3" latin:keyStyle="numKeyStyle" /> <Key latin:keyStyle="deleteKeyStyle" @@ -58,7 +58,7 @@ latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="/" + latin:keySpec="/" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> @@ -67,30 +67,30 @@ latin:mode="time|datetime" > <Key - latin:keyLabel="," + latin:keySpec="," latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_am_pm" + latin:moreKeys="!text/morekeys_am_pm" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> </case> <default> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> </default> </switch> <Key - latin:keyLabel="4" + latin:keySpec="4" latin:keyStyle="numKeyStyle" latin:keyXPos="31%p" /> <Key - latin:keyLabel="5" + latin:keySpec="5" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="6" + latin:keySpec="6" latin:keyStyle="numKeyStyle" /> <Key latin:keyStyle="enterKeyStyle" @@ -99,12 +99,12 @@ </Row> <Row> <Key - latin:keyLabel="(" + latin:keySpec="(" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel=")" + latin:keySpec=")" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> @@ -113,28 +113,28 @@ latin:mode="time|datetime" > <Key - latin:keyLabel=":" + latin:keySpec=":" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> </case> <default> <Key - latin:keyLabel="=" + latin:keySpec="=" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> </default> </switch> <Key - latin:keyLabel="7" + latin:keySpec="7" latin:keyStyle="numKeyStyle" latin:keyXPos="31%p" /> <Key - latin:keyLabel="8" + latin:keySpec="8" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="9" + latin:keySpec="9" latin:keyStyle="numKeyStyle" /> <!-- Note: This Spacer prevents the above key from being marked as a right edge key. --> <Spacer /> @@ -148,10 +148,10 @@ latin:keyStyle="numStarKeyStyle" latin:keyXPos="31%p" /> <Key - latin:keyLabel="0" + latin:keySpec="0" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="\#" + latin:keySpec="\#" latin:keyStyle="numKeyStyle" /> <!-- Note: This Spacer prevents the above key from being marked as a right edge key. --> <Spacer diff --git a/java/res/xml-sw600dp/rows_pcqwerty.xml b/java/res/xml-sw600dp/rows_pcqwerty.xml index 8714815ef..73b7e473e 100644 --- a/java/res/xml-sw600dp/rows_pcqwerty.xml +++ b/java/res/xml-sw600dp/rows_pcqwerty.xml @@ -26,19 +26,8 @@ <Row latin:keyWidth="7.0%p" > - <switch> - <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" - > - <include - latin:keyboardLayout="@xml/rowkeys_pcqwerty1" /> - </case> - <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> - <default> - <include - latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" /> - </default> - </switch> + <include + latin:keyboardLayout="@xml/rowkeys_pcqwerty1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> @@ -56,7 +45,7 @@ latin:keyWidth="7.0%p" > <Spacer - latin:keyWidth="12.0%p" /> + latin:keyWidth="10.0%p" /> <include latin:keyboardLayout="@xml/rowkeys_pcqwerty3" /> <Key diff --git a/java/res/xml-sw600dp/rows_phone.xml b/java/res/xml-sw600dp/rows_phone.xml index c4799bbcd..9022bc532 100644 --- a/java/res/xml-sw600dp/rows_phone.xml +++ b/java/res/xml-sw600dp/rows_phone.xml @@ -27,12 +27,12 @@ latin:keyboardLayout="@xml/key_styles_number" /> <Row> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="+" + latin:keySpec="+" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> @@ -54,12 +54,12 @@ </Row> <Row> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> @@ -81,17 +81,17 @@ </Row> <Row> <Key - latin:keyLabel="(" + latin:keySpec="(" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel=")" + latin:keySpec=")" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> <Key - latin:keyLabel="N" + latin:keySpec="N" latin:keyStyle="numKeyStyle" latin:keyWidth="10%p" latin:backgroundType="functional" /> @@ -116,7 +116,7 @@ <Key latin:keyStyle="num0KeyStyle" /> <Key - latin:keyLabel="\#" + latin:keySpec="\#" latin:keyStyle="numKeyStyle" /> </Row> </merge> diff --git a/java/res/xml-sw600dp/rows_sinhala.xml b/java/res/xml-sw600dp/rows_sinhala.xml new file mode 100644 index 000000000..278602820 --- /dev/null +++ b/java/res/xml-sw600dp/rows_sinhala.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_sinhala1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_sinhala2" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" /> + <include latin:keyboardLayout="@xml/rowkeys_sinhala3" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_swiss.xml b/java/res/xml-sw600dp/rows_swiss.xml new file mode 100644 index 000000000..4f4ca85b4 --- /dev/null +++ b/java/res/xml-sw600dp/rows_swiss.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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/key_styles_common" /> + <Row + latin:keyWidth="8.182%p" + > + <include + latin:keyboardLayout="@xml/rowkeys_swiss1" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + > + <include + latin:keyboardLayout="@xml/rowkeys_swiss2" /> + <Key + latin:keyStyle="enterKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <Row + latin:keyWidth="8.182%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.0%p" /> + <Spacer + latin:keyWidth="3.181%p" /> + <include + latin:keyboardLayout="@xml/rowkeys_qwertz3" /> + <include + latin:keyboardLayout="@xml/keys_exclamation_question" /> + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyXPos="-10.0%p" + latin:keyWidth="fillRight" /> + </Row> + <include + latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml-sw600dp/rows_symbols.xml b/java/res/xml-sw600dp/rows_symbols.xml index cf94b06ed..a915c3351 100644 --- a/java/res/xml-sw600dp/rows_symbols.xml +++ b/java/res/xml-sw600dp/rows_symbols.xml @@ -51,9 +51,9 @@ latin:keyStyle="toMoreSymbolKeyStyle" latin:keyWidth="10.0%p" /> <Key - latin:keyLabel="\\" /> + latin:keySpec="\\" /> <Key - latin:keyLabel="=" /> + latin:keySpec="=" /> <include latin:keyboardLayout="@xml/rowkeys_symbols3" /> <Key @@ -62,6 +62,7 @@ </Row> <Row latin:keyWidth="9.0%p" + latin:backgroundType="functional" > <Key latin:keyStyle="toAlphaKeyStyle" diff --git a/java/res/xml-sw600dp/rows_symbols_shift.xml b/java/res/xml-sw600dp/rows_symbols_shift.xml index 92299f65d..7ead4d5b1 100644 --- a/java/res/xml-sw600dp/rows_symbols_shift.xml +++ b/java/res/xml-sw600dp/rows_symbols_shift.xml @@ -54,16 +54,17 @@ latin:keyboardLayout="@xml/rowkeys_symbols_shift3" /> <!-- U+00A1: "¡" INVERTED EXCLAMATION MARK --> <Key - latin:keyLabel="¡" /> + latin:keySpec="¡" /> <!-- U+00BF: "¿" INVERTED QUESTION MARK --> <Key - latin:keyLabel="¿" /> + latin:keySpec="¿" /> <Key latin:keyStyle="backFromMoreSymbolKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row latin:keyWidth="9.0%p" + latin:backgroundType="functional" > <Key latin:keyStyle="toAlphaKeyStyle" diff --git a/java/res/xml-sw600dp/rows_thai.xml b/java/res/xml-sw600dp/rows_thai.xml index 7738c7f04..2006056a4 100644 --- a/java/res/xml-sw600dp/rows_thai.xml +++ b/java/res/xml-sw600dp/rows_thai.xml @@ -18,31 +18,29 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_thai1" /> + <include latin:keyboardLayout="@xml/rowkeys_thai1" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> - </Row> + </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > <include latin:keyboardLayout="@xml/rowkeys_thai2" latin:keyXPos="2.5%p" /> - <include - latin:keyboardLayout="@xml/key_thai_kho_khuat" /> + <include latin:keyboardLayout="@xml/key_thai_kho_khuat" /> </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > <include latin:keyboardLayout="@xml/rowkeys_thai3" @@ -53,24 +51,20 @@ </Row> <Row latin:keyWidth="7.5%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.0%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_thai4" /> + <include latin:keyboardLayout="@xml/rowkeys_thai4" /> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <Spacer /> </case> <default> - <include - latin:keyboardLayout="@xml/keys_exclamation_question" /> + <include latin:keyboardLayout="@xml/keys_exclamation_question" /> </default> </switch> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml-v16/key_devanagari_sign_anusvara.xml b/java/res/xml-v16/key_devanagari_sign_anusvara.xml deleted file mode 100644 index 27c7bff5a..000000000 --- a/java/res/xml-v16/key_devanagari_sign_anusvara.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- The code point U+25CC for key label is needed because the font rendering system prior to - API version 16 can't automatically render dotted circle for incomplete combining letter - of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the - counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <!-- U+0902: "ं" DEVANAGARI SIGN ANUSVARA --> - <Key - latin:keyLabel="ं" - latin:keyLabelFlags="fontNormal" /> -</merge> diff --git a/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml b/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml deleted file mode 100644 index 0316a7bde..000000000 --- a/java/res/xml-v16/key_devanagari_vowel_sign_candra_o.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- The code point U+25CC for key label is needed because the font rendering system prior to - API version 16 can't automatically render dotted circle for incomplete combining letter - of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the - counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> - <Key - latin:keyLabel="ॉ" - latin:keyLabelFlags="fontNormal" /> -</merge> diff --git a/java/res/xml-v16/keystyle_devanagari_sign_anusvara.xml b/java/res/xml-v16/keystyle_devanagari_sign_anusvara.xml new file mode 100644 index 000000000..d5491d29d --- /dev/null +++ b/java/res/xml-v16/keystyle_devanagari_sign_anusvara.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA + U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU + U+093C: "़" DEVANAGARI SIGN NUKTA --> + <key-style + latin:styleName="moreKeysDevanagariSignAnusvara" + latin:moreKeys="ः,ँ,़" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA + U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU --> + <key-style + latin:styleName="moreKeysDevanagariSignAnusvara" + latin:moreKeys="ः,ँ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariSignAnusvara" /> + </default> + </switch> + <!-- U+0902: "ं" DEVANAGARI SIGN ANUSVARA --> + <key-style + latin:styleName="baseKeyDevanagariSignAnusvara" + latin:parentStyle="moreKeysDevanagariSignAnusvara" + latin:keySpec="ं" /> +</merge> diff --git a/java/res/xml-v16/key_devanagari_sign_candrabindu.xml b/java/res/xml-v16/keystyle_devanagari_sign_candrabindu.xml index 03017dd78..ef8dec37c 100644 --- a/java/res/xml-v16/key_devanagari_sign_candrabindu.xml +++ b/java/res/xml-v16/keystyle_devanagari_sign_candrabindu.xml @@ -22,27 +22,21 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > - <!-- U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU - U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> + <case latin:keyboardLayoutSet="hindi"> + <!-- U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> <key-style latin:styleName="moreKeysDevanagariSignCandrabindu" latin:moreKeys="ॅ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariSignCandrabindu" /> + <key-style latin:styleName="moreKeysDevanagariSignCandrabindu" /> </default> </switch> <!-- U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU --> - <Key - latin:keyStyle="moreKeysDevanagariSignCandrabindu" - latin:keyLabel="ँ" - latin:keyLabelFlags="fontNormal" /> + <key-style + latin:styleName="baseKeyDevanagariSignCandrabindu" + latin:parentStyle="moreKeysDevanagariSignCandrabindu" + latin:keySpec="ँ" /> </merge> diff --git a/java/res/xml-v16/key_devanagari_sign_nukta.xml b/java/res/xml-v16/keystyle_devanagari_sign_nukta.xml index 09c347706..734d0600a 100644 --- a/java/res/xml-v16/key_devanagari_sign_nukta.xml +++ b/java/res/xml-v16/keystyle_devanagari_sign_nukta.xml @@ -22,28 +22,29 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+097D: "ॽ" DEVANAGARI LETTER GLOTTAL STOP U+0970: "॰" DEVANAGARI ABBREVIATION SIGN U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> - <key-style + <key-style latin:styleName="moreKeysDevanagariSignNukta" latin:moreKeys="ॽ,॰,ऽ" /> </case> + <case latin:keyboardLayoutSet="nepali_romanized"> + <!-- U+093C: "़" DEVANAGARI SIGN NUKTA --> + <key-style + latin:styleName="moreKeysDevanagariSignNukta" + latin:moreKeys="़" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariSignNukta" /> + <key-style latin:styleName="moreKeysDevanagariSignNukta" /> </default> </switch> <!-- U+093C: "़" DEVANAGARI SIGN NUKTA --> - <Key - latin:keyStyle="moreKeysDevanagariSignNukta" - latin:keyLabel="़" - latin:keyLabelFlags="fontNormal" /> + <key-style + latin:styleName="baseKeyDevanagariSignNukta" + latin:parentStyle="moreKeysDevanagariSignNukta" + latin:keySpec="़" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_sign_virama.xml b/java/res/xml-v16/keystyle_devanagari_sign_virama.xml index a2fbf53d3..0300e4a8b 100644 --- a/java/res/xml-v16/keystyle_devanagari_sign_virama.xml +++ b/java/res/xml-v16/keystyle_devanagari_sign_virama.xml @@ -22,12 +22,27 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+094D: "्" DEVANAGARI SIGN VIRAMA --> + <key-style + latin:styleName="moreKeysDevanagariSignVirama" + latin:moreKeys="्" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0905: "अ" DEVANAGARI LETTER A --> + <key-style + latin:styleName="moreKeysDevanagariSignVirama" + latin:moreKeys="अ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariSignVirama" /> + </default> + </switch> <!-- U+094D: "्" DEVANAGARI SIGN VIRAMA --> <key-style latin:styleName="baseKeyDevanagariSignVirama" - latin:keyLabel="्" - latin:keyLabelFlags="fontNormal" /> + latin:parentStyle="moreKeysDevanagariSignVirama" + latin:keySpec="्" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml b/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml index ac56cb77b..ea64a1009 100644 --- a/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml +++ b/java/res/xml-v16/keystyle_devanagari_sign_visarga.xml @@ -22,12 +22,9 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA --> <key-style latin:styleName="baseKeyDevanagariSignVisarga" - latin:keyLabel="ः" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ः" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml index 8e256032c..1e638507a 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_aa.xml @@ -22,28 +22,34 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+093E/U+0902: "ां" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN ANUSVARA U+093E/U+0901: "ाँ" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN CANDRABINDU --> <key-style latin:styleName="moreKeysDevanagariVowelSignAa" latin:moreKeys="ां,ाँ,%" /> </case> - <default> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+093E: "ा" DEVANAGARI VOWEL SIGN AA --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAa" + latin:moreKeys="ा,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0906: "आ" DEVANAGARI LETTER AA --> <key-style - latin:styleName="moreKeysDevanagariVowelSignAa" /> + latin:styleName="moreKeysDevanagariVowelSignAa" + latin:moreKeys="आ,%" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignAa" /> </default> </switch> <!-- U+093E: "ा" DEVANAGARI VOWEL SIGN AA --> <key-style latin:styleName="baseKeyDevanagariVowelSignAa" latin:parentStyle="moreKeysDevanagariVowelSignAa" - latin:keyLabel="ा" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ा" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml index e79033971..acb289406 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ai.xml @@ -22,35 +22,39 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0948/U+0902: "ैं" DEVANAGARI VOWEL SIGN AI/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAi" latin:moreKeys="ैं,%" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0948: "ै" DEVANAGARI VOWEL SIGN AI --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAi" + latin:moreKeys="ै,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0910: "ऐ" DEVANAGARI LETTER AI --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAi" + latin:moreKeys="ऐ,%" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAi" latin:moreKeys="श्र" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignAi" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignAi" /> </default> </switch> <!-- U+0948: "ै" DEVANAGARI VOWEL SIGN AI --> <key-style latin:styleName="baseKeyDevanagariVowelSignAi" latin:parentStyle="moreKeysDevanagariVowelSignAi" - latin:keyLabel="ै" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ै" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml index 43387a388..e2c367784 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_au.xml @@ -22,27 +22,33 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!--U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAu" latin:moreKeys="ौं,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+094C: "ौ" DEVANAGARI VOWEL SIGN AU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAu" + latin:moreKeys="ौ,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0914: "औ" DEVANAGARI LETTER AU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAu" + latin:moreKeys="औ,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignAu" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignAu" /> </default> </switch> <!-- U+094C: "ौ" DEVANAGARI VOWEL SIGN AU --> <key-style latin:styleName="baseKeyDevanagariVowelSignAu" latin:parentStyle="moreKeysDevanagariVowelSignAu" - latin:keyLabel="ौ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ौ" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_e.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_e.xml new file mode 100644 index 000000000..75ad44f34 --- /dev/null +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_e.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraE" + latin:moreKeys="ॅ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090D: "ऍ" DEVANAGARI LETTER CANDRA E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraE" + latin:moreKeys="ऍ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignCandraE" /> + </default> + </switch> + <!-- U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> + <key-style + latin:styleName="baseKeyDevanagariVowelSignCandraE" + latin:parentStyle="moreKeysDevanagariVowelSignCandraE" + latin:keySpec="ॅ" /> +</merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_o.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_o.xml new file mode 100644 index 000000000..e1a4c613c --- /dev/null +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_candra_o.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraO" + latin:moreKeys="ॉ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0911: "ऑ" DEVANAGARI LETTER CANDRA O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraO" + latin:moreKeys="ऑ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignCandraO" /> + </default> + </switch> + <!-- U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> + <key-style + latin:styleName="baseKeyDevanagariVowelSignCandraO" + latin:parentStyle="moreKeysDevanagariVowelSignCandraO" + latin:keySpec="ॉ" /> +</merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml index c70d9d944..6a99eace0 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_e.xml @@ -22,21 +22,27 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0947/U+0902: "ें" DEVANAGARI VOWEL SIGN E/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignE" latin:moreKeys="ें" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0947: "े" DEVANAGARI VOWEL SIGN E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignE" + latin:moreKeys="े" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090F: "ए" DEVANAGARI LETTER SHORT E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignE" + latin:moreKeys="ए" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+0903: "ः" DEVANAGARI SIGN VISARGA U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> <key-style @@ -44,14 +50,12 @@ latin:moreKeys="ः,ऽ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignE" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignE" /> </default> </switch> <!-- U+0947: "े" DEVANAGARI VOWEL SIGN E --> <key-style latin:styleName="baseKeyDevanagariVowelSignE" latin:parentStyle="moreKeysDevanagariVowelSignE" - latin:keyLabel="े" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="े" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml index 845c1b02e..b66149d28 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_i.xml @@ -22,27 +22,33 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+093F/U+0902: "िं" DEVANAGARI VOWEL SIGN I/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignI" latin:moreKeys="िं" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+093F: "ि" DEVANAGARI VOWEL SIGN I --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignI" + latin:moreKeys="ि" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0907: "इ" DEVANAGARI LETTER I --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignI" + latin:moreKeys="इ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignI" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignI" /> </default> </switch> <!-- U+093F: "ि" DEVANAGARI VOWEL SIGN I --> <key-style latin:styleName="baseKeyDevanagariVowelSignI" latin:parentStyle="moreKeysDevanagariVowelSignI" - latin:keyLabel="ि" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ि" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml index 0de9650be..97e500713 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_ii.xml @@ -22,27 +22,33 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0940/U+0902: "ीं" DEVANAGARI VOWEL SIGN II/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignIi" latin:moreKeys="ीं,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0940: "ी" DEVANAGARI VOWEL SIGN II --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignIi" + latin:moreKeys="ी,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0908: "ई" DEVANAGARI LETTER II --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignIi" + latin:moreKeys="ई,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignIi" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignIi" /> </default> </switch> <!-- U+0940: "ी" DEVANAGARI VOWEL SIGN II --> <key-style latin:styleName="baseKeyDevanagariVowelSignIi" latin:parentStyle="moreKeysDevanagariVowelSignIi" - latin:keyLabel="ी" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ी" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml index 06f07fac9..7cec76d43 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_o.xml @@ -22,29 +22,35 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > - <!-- U+094B/U+0902: "қं" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA + <case latin:keyboardLayoutSet="hindi"> + <!-- U+094B/U+0902: "ों" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O U+094A: "ॊ" DEVANAGARI VOWEL SIGN SHORT O --> <key-style latin:styleName="moreKeysDevanagariVowelSignO" latin:moreKeys="ों,ॉ,ॊ" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+094B: "ो" DEVANAGARI VOWEL SIGN O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignO" + latin:moreKeys="ो" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0913: "ओ" DEVANAGARI LETTER O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignO" + latin:moreKeys="ओ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignO" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignO" /> </default> </switch> <!-- U+094B: "ो" DEVANAGARI VOWEL SIGN O --> <key-style latin:styleName="baseKeyDevanagariVowelSignO" latin:parentStyle="moreKeysDevanagariVowelSignO" - latin:keyLabel="ो" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ो" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml index 469a27bdf..c14f920bc 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_u.xml @@ -22,28 +22,34 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0941/U+0902: "ुं" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN ANUSVARA U+0941/U+0901: "ुँ" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN CANDRABINDU --> <key-style latin:styleName="moreKeysDevanagariVowelSignU" latin:moreKeys="ुं,ुँ" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0941: "ु" DEVANAGARI VOWEL SIGN U --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignU" + latin:moreKeys="ु" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0909: "उ" DEVANAGARI LETTER U --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignU" + latin:moreKeys="उ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignU" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignU" /> </default> </switch> <!-- U+0941: "ु" DEVANAGARI VOWEL SIGN U --> <key-style latin:styleName="baseKeyDevanagariVowelSignU" latin:parentStyle="moreKeysDevanagariVowelSignU" - latin:keyLabel="ु" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ु" /> </merge> diff --git a/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml index 25867c086..3134de7c8 100644 --- a/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_uu.xml @@ -22,28 +22,34 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0942/U+0902: "ूं" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN ANUSVARA U+0942/U+0901: "ूँ" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN CANDRABINDU --> <key-style latin:styleName="moreKeysDevanagariVowelSignUu" latin:moreKeys="ूं,ूँ,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+0942: "ू" DEVANAGARI VOWEL SIGN UU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignUu" + latin:moreKeys="ू,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090A: "ऊ" DEVANAGARI LETTER UU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignUu" + latin:moreKeys="ऊ,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignUu" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignUu" /> </default> </switch> <!-- U+0942: "ू" DEVANAGARI VOWEL SIGN UU --> <key-style latin:styleName="baseKeyDevanagariVowelSignUu" latin:parentStyle="moreKeysDevanagariVowelSignUu" - latin:keyLabel="ू" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ू" /> </merge> diff --git a/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml b/java/res/xml-v16/keystyle_devanagari_vowel_sign_vocalic_r.xml index 4dd3e85cc..da510c1f5 100644 --- a/java/res/xml-v16/key_devanagari_vowel_sign_vocalic_r.xml +++ b/java/res/xml-v16/keystyle_devanagari_vowel_sign_vocalic_r.xml @@ -22,34 +22,42 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+0944: "ॄ" DEVANAGARI VOWEL SIGN VOCALIC RR --> <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" latin:moreKeys="ॄ" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R + U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignVocalicR" + latin:moreKeys="ऋ,ृ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0931: "ऱ" DEVANAGARI LETTER RRA + U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R + U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignVocalicR" + latin:moreKeys="ऱ,ऋ,ृ" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+0913: "ओ" DEVANAGARI LETTER O --> <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" latin:moreKeys="ओ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignVocalicR" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" /> </default> </switch> <!-- U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> - <Key - latin:keyStyle="moreKeysDevanagariVowelSignVocalicR" - latin:keyLabel="ृ" - latin:keyLabelFlags="fontNormal" /> + <key-style + latin:styleName="baseKeyDevanagariVowelSignVocalicR" + latin:parentStyle="moreKeysDevanagariVowelSignVocalicR" + latin:keySpec="ृ" /> </merge> diff --git a/java/res/xml/kbd_armenian_phonetic.xml b/java/res/xml/kbd_armenian_phonetic.xml index 1eb3c7e7d..da12870ed 100644 --- a/java/res/xml/kbd_armenian_phonetic.xml +++ b/java/res/xml/kbd_armenian_phonetic.xml @@ -21,9 +21,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:rowHeight="20%p" - latin:verticalGap="@fraction/key_bottom_gap_5row" - latin:keyLetterSize="@fraction/key_letter_ratio_5row" - latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" > <include diff --git a/java/res/xml-sw600dp/key_azerty3_right.xml b/java/res/xml/kbd_bengali.xml index a5a6e9526..879a897df 100644 --- a/java/res/xml-sw600dp/key_azerty3_right.xml +++ b/java/res/xml/kbd_bengali.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,12 +18,9 @@ */ --> -<merge +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:keyLabel=":" - latin:keyHintLabel=";" - latin:moreKeys=";" - latin:keyStyle="hasShiftedLetterHintStyle" /> -</merge> + <include + latin:keyboardLayout="@xml/rows_bengali" /> +</Keyboard> diff --git a/java/res/xml/kbd_emoji_category1.xml b/java/res/xml/kbd_emoji_category1.xml index c11a83017..5145ea9d3 100644 --- a/java/res/xml/kbd_emoji_category1.xml +++ b/java/res/xml/kbd_emoji_category1.xml @@ -20,9 +20,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_faces" diff --git a/java/res/xml/kbd_emoji_category2.xml b/java/res/xml/kbd_emoji_category2.xml index d3e5890ea..ac8784f4b 100644 --- a/java/res/xml/kbd_emoji_category2.xml +++ b/java/res/xml/kbd_emoji_category2.xml @@ -20,9 +20,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_objects" diff --git a/java/res/xml/kbd_emoji_category3.xml b/java/res/xml/kbd_emoji_category3.xml index 0efafa814..88c4db92b 100644 --- a/java/res/xml/kbd_emoji_category3.xml +++ b/java/res/xml/kbd_emoji_category3.xml @@ -20,9 +20,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_nature" diff --git a/java/res/xml/kbd_emoji_category4.xml b/java/res/xml/kbd_emoji_category4.xml index e5291207f..262384d80 100644 --- a/java/res/xml/kbd_emoji_category4.xml +++ b/java/res/xml/kbd_emoji_category4.xml @@ -20,9 +20,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_places" diff --git a/java/res/xml/kbd_emoji_category5.xml b/java/res/xml/kbd_emoji_category5.xml index 1836879d6..bf823f978 100644 --- a/java/res/xml/kbd_emoji_category5.xml +++ b/java/res/xml/kbd_emoji_category5.xml @@ -20,9 +20,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_symbols" diff --git a/java/res/xml/kbd_emoji_category6.xml b/java/res/xml/kbd_emoji_category6.xml index b47ebfec0..edb82fc64 100644 --- a/java/res/xml/kbd_emoji_category6.xml +++ b/java/res/xml/kbd_emoji_category6.xml @@ -20,10 +20,10 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" latin:keyLetterSize="90%p" latin:keyLabelSize="60%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:textsArray="@array/emoji_emoticons" diff --git a/java/res/xml/kbd_emoji_recents.xml b/java/res/xml/kbd_emoji_recents.xml index 73926ecc0..edf3872c1 100644 --- a/java/res/xml/kbd_emoji_recents.xml +++ b/java/res/xml/kbd_emoji_recents.xml @@ -20,10 +20,10 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - latin:keyWidth="@fraction/emoji_keyboard_key_width" - latin:keyLetterSize="@fraction/emoji_keyboard_key_letter_size" + latin:keyWidth="@fraction/config_emoji_keyboard_key_width" + latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size" latin:keyLabelSize="60%p" - latin:rowHeight="@fraction/emoji_keyboard_row_height" + latin:rowHeight="@fraction/config_emoji_keyboard_row_height" > <GridRows latin:codesArray="@array/emoji_recents" diff --git a/java/res/xml-sw600dp/key_colemak_colon.xml b/java/res/xml/kbd_hindi_compact.xml index a5a6e9526..7502bba9e 100644 --- a/java/res/xml-sw600dp/key_colemak_colon.xml +++ b/java/res/xml/kbd_hindi_compact.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,12 +18,9 @@ */ --> -<merge +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:keyLabel=":" - latin:keyHintLabel=";" - latin:moreKeys=";" - latin:keyStyle="hasShiftedLetterHintStyle" /> -</merge> + <include + latin:keyboardLayout="@xml/rows_hindi_compact" /> +</Keyboard> diff --git a/java/res/xml/kbd_khmer.xml b/java/res/xml/kbd_khmer.xml index 7a2337a48..d703e78f7 100644 --- a/java/res/xml/kbd_khmer.xml +++ b/java/res/xml/kbd_khmer.xml @@ -21,9 +21,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:rowHeight="20%p" - latin:verticalGap="@fraction/key_bottom_gap_5row" - latin:keyLetterSize="@fraction/key_letter_ratio_5row" - latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" > <include diff --git a/java/res/xml/kbd_lao.xml b/java/res/xml/kbd_lao.xml index 2bba330de..6f7709562 100644 --- a/java/res/xml/kbd_lao.xml +++ b/java/res/xml/kbd_lao.xml @@ -21,9 +21,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:rowHeight="20%p" - latin:verticalGap="@fraction/key_bottom_gap_5row" - latin:keyLetterSize="@fraction/key_letter_ratio_5row" - latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" > <include diff --git a/java/res/xml-sw600dp/key_greek_semicolon.xml b/java/res/xml/kbd_marathi.xml index 3f09419b1..4328cd6d3 100644 --- a/java/res/xml-sw600dp/key_greek_semicolon.xml +++ b/java/res/xml/kbd_marathi.xml @@ -2,7 +2,7 @@ <!-- /* ** -** Copyright 2012, The Android Open Source Project +** Copyright 2014, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -18,12 +18,9 @@ */ --> -<merge +<Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:keyLabel=";" - latin:keyHintLabel=":" - latin:moreKeys=":" - latin:keyStyle="hasShiftedLetterHintStyle" /> -</merge> + <include + latin:keyboardLayout="@xml/rows_marathi" /> +</Keyboard> diff --git a/java/res/xml/kbd_more_keys_keyboard_template.xml b/java/res/xml/kbd_more_keys_keyboard_template.xml index 537973d03..7104ec7e0 100644 --- a/java/res/xml/kbd_more_keys_keyboard_template.xml +++ b/java/res/xml/kbd_more_keys_keyboard_template.xml @@ -20,7 +20,7 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:keyWidth="10%p" - latin:rowHeight="@dimen/popup_key_height" + latin:rowHeight="@dimen/config_more_keys_keyboard_key_height" style="?attr/moreKeysKeyboardStyle" > </Keyboard> diff --git a/java/res/xml/kbd_myanmar.xml b/java/res/xml/kbd_myanmar.xml new file mode 100644 index 000000000..af997b1c8 --- /dev/null +++ b/java/res/xml/kbd_myanmar.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:rowHeight="20%p" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" + latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" +> + <include + latin:keyboardLayout="@xml/rows_myanmar" /> +</Keyboard> diff --git a/java/res/xml/kbd_pcqwerty.xml b/java/res/xml/kbd_pcqwerty.xml index 5155bc510..045696451 100644 --- a/java/res/xml/kbd_pcqwerty.xml +++ b/java/res/xml/kbd_pcqwerty.xml @@ -21,9 +21,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:rowHeight="20%p" - latin:verticalGap="@fraction/key_bottom_gap_5row" - latin:keyLetterSize="@fraction/key_letter_ratio_5row" - latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" > <include diff --git a/java/res/xml/kbd_sinhala.xml b/java/res/xml/kbd_sinhala.xml new file mode 100644 index 000000000..6c0f4bc05 --- /dev/null +++ b/java/res/xml/kbd_sinhala.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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" +> + <include + latin:keyboardLayout="@xml/rows_sinhala" /> +</Keyboard> diff --git a/java/res/xml/kbd_suggestions_pane_template.xml b/java/res/xml/kbd_suggestions_pane_template.xml index 21316e6bb..5b4f60673 100644 --- a/java/res/xml/kbd_suggestions_pane_template.xml +++ b/java/res/xml/kbd_suggestions_pane_template.xml @@ -20,6 +20,6 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:keyWidth="10%p" - latin:rowHeight="@dimen/more_suggestions_row_height" + latin:rowHeight="@dimen/config_more_suggestions_row_height" > </Keyboard> diff --git a/java/res/xml/kbd_swiss.xml b/java/res/xml/kbd_swiss.xml new file mode 100644 index 000000000..c64ad1103 --- /dev/null +++ b/java/res/xml/kbd_swiss.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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" +> + <include + latin:keyboardLayout="@xml/rows_swiss" /> +</Keyboard> diff --git a/java/res/xml/kbd_thai.xml b/java/res/xml/kbd_thai.xml index 294bffb5b..7e65217f9 100644 --- a/java/res/xml/kbd_thai.xml +++ b/java/res/xml/kbd_thai.xml @@ -21,9 +21,9 @@ <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" latin:rowHeight="20%p" - latin:verticalGap="@fraction/key_bottom_gap_5row" - latin:keyLetterSize="@fraction/key_letter_ratio_5row" - latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row" + latin:verticalGap="@fraction/config_key_vertical_gap_5row" + latin:keyLetterSize="@fraction/config_key_letter_ratio_5row" + latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row" latin:touchPositionCorrectionData="@array/touch_position_correction_data_default" > <include diff --git a/java/res/xml/key_armenian_sha.xml b/java/res/xml/key_armenian_sha.xml index 3865c1984..111d4263b 100644 --- a/java/res/xml/key_armenian_sha.xml +++ b/java/res/xml/key_armenian_sha.xml @@ -23,6 +23,5 @@ > <!-- U+0577: "շ" ARMENIAN SMALL LETTER SHA --> <Key - latin:keyLabel="շ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="շ" /> </merge> diff --git a/java/res/xml/key_armenian_xeh.xml b/java/res/xml/key_armenian_xeh.xml index 007a5802d..3bbc405dc 100644 --- a/java/res/xml/key_armenian_xeh.xml +++ b/java/res/xml/key_armenian_xeh.xml @@ -23,6 +23,5 @@ > <!-- U+056D: "խ" ARMENIAN SMALL LETTER XEH --> <Key - latin:keyLabel="խ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="խ" /> </merge> diff --git a/java/res/xml/key_colemak_colon.xml b/java/res/xml/key_colemak_colon.xml deleted file mode 100644 index 307b4ebca..000000000 --- a/java/res/xml/key_colemak_colon.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" - > - <Key - latin:keyLabel=";" - latin:keyHintLabel="0" - latin:additionalMoreKeys="0" /> - </case> - <default> - <Key - latin:keyLabel=":" - latin:keyHintLabel="0" - latin:additionalMoreKeys="0" - latin:moreKeys=";" /> - </default> - </switch> -</merge> diff --git a/java/res/xml/key_devanagari_sign_anusvara.xml b/java/res/xml/key_devanagari_sign_anusvara.xml deleted file mode 100644 index 0acd3bcd4..000000000 --- a/java/res/xml/key_devanagari_sign_anusvara.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- The code point U+25CC for key label is needed because the font rendering system prior to - API version 16 can't automatically render dotted circle for incomplete combining letter - of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the - counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <!-- U+25CC: "◌" DOTTED CIRCLE - U+0902: "ं" DEVANAGARI SIGN ANUSVARA --> - <Key - latin:keyLabel="◌ं" - latin:code="0x0902" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> -</merge> diff --git a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml b/java/res/xml/key_devanagari_vowel_sign_candra_o.xml deleted file mode 100644 index 370fc5405..000000000 --- a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- The code point U+25CC for key label is needed because the font rendering system prior to - API version 16 can't automatically render dotted circle for incomplete combining letter - of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the - counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <!-- U+25CC: "◌" DOTTED CIRCLE - U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> - <Key - latin:keyLabel="◌ॉ" - latin:code="0x0949" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> -</merge> diff --git a/java/res/xml/key_f1.xml b/java/res/xml/key_f1.xml index 72e38cb1a..7bd7385a1 100644 --- a/java/res/xml/key_f1.xml +++ b/java/res/xml/key_f1.xml @@ -26,29 +26,21 @@ latin:mode="url" > <Key - latin:keyLabel="/" - latin:keyStyle="f1MoreKeysStyle" /> + latin:keySpec="/" + latin:keyStyle="settingsMoreKeysStyle" /> </case> <case latin:mode="email" > <Key - latin:keyLabel="\@" - latin:keyStyle="f1MoreKeysStyle" /> + latin:keySpec="\@" + latin:keyStyle="settingsMoreKeysStyle" /> </case> - <case - latin:hasShortcutKey="true" - > - <Key - latin:keyStyle="shortcutKeyStyle" /> - </case> - <!-- latin:hasShortcutKey="false" --> <default> <Key - latin:keyLabel="!text/keylabel_for_comma" + latin:keySpec="!text/keyspec_comma" latin:keyLabelFlags="hasPopupHint" - latin:additionalMoreKeys="!text/more_keys_for_comma,!text/shortcut_as_more_key" - latin:keyStyle="f1MoreKeysStyle" /> + latin:keyStyle="settingsMoreKeysStyle" /> </default> </switch> </merge> diff --git a/java/res/xml/key_greek_semicolon.xml b/java/res/xml/key_greek_semicolon.xml deleted file mode 100644 index ae73a59f6..000000000 --- a/java/res/xml/key_greek_semicolon.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" - > - <Key - latin:keyLabel=":" - latin:keyHintLabel="1" - latin:moreKeys=";" - latin:additionalMoreKeys="1" /> - </case> - <default> - <Key - latin:keyLabel=";" - latin:keyHintLabel="1" - latin:moreKeys=":" - latin:additionalMoreKeys="1" /> - </default> - </switch> -</merge> diff --git a/java/res/xml/key_nepali_traditional_period.xml b/java/res/xml/key_period.xml index 1c389b009..e1d4bbdf7 100644 --- a/java/res/xml/key_nepali_traditional_period.xml +++ b/java/res/xml/key_period.xml @@ -18,32 +18,42 @@ */ --> -<!-- The code point U+25CC for key label is needed because the font rendering system prior to - API version 16 can't automatically render dotted circle for incomplete combining letter - of Hindi. The files named res/xml/{key,keys}_nepali*.xml have this U+25CC hack, although the - counterpart files named res/xml-v16/{key,keys}_nepali*.xml don't have this hack. --> <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <switch> <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" + latin:languageCode="hi" + latin:keyboardLayoutSet="hindi_compact" > + <!-- U+0964: "।" DEVANAGARI DANDA --> <Key - latin:keyLabel="," + latin:keySpec="\u0964" + latin:keyLabelFlags="hasPopupHint" + latin:moreKeys="!autoColumnOrder!9,\\,,.,?,!,#,),(,/,;,',@,:,-,",+,\\%,&" latin:backgroundType="functional" /> </case> - <default> + <case + latin:languageCode="ne" + latin:keyboardLayoutSet="nepali_traditional" + > <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> - <!-- U+002E: "." FULL STOP --> <Key latin:keyStyle="baseKeyDevanagariSignVirama" latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!fixedColumnOrder!9,.,!text/more_keys_for_punctuation" + latin:moreKeys="!text/morekeys_punctuation" + latin:backgroundType="functional" /> + </case> + <default> + <Key + latin:keySpec="!text/keyspec_period" + latin:keyHintLabel="!text/keyhintlabel_period" + latin:keyLabelFlags="hasPopupHint|hasShiftedLetterHint" + latin:moreKeys="!text/morekeys_period" latin:backgroundType="functional" /> </default> </switch> diff --git a/java/res/xml/key_space_3kw.xml b/java/res/xml/key_space_3kw.xml deleted file mode 100644 index 20ec882df..000000000 --- a/java/res/xml/key_space_3kw.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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:languageSwitchKeyEnabled="true" - > - <Key - latin:keyStyle="languageSwitchKeyStyle" /> - <Key - latin:keyStyle="spaceKeyStyle" - latin:keyWidth="20%p" /> - </case> - <!-- languageSwitchKeyEnabled="false" --> - <default> - <Key - latin:keyStyle="spaceKeyStyle" - latin:keyWidth="30%p" /> - </default> - </switch> -</merge> diff --git a/java/res/xml/key_space_symbols.xml b/java/res/xml/key_space_symbols.xml index 1efc4ff4e..0ce522889 100644 --- a/java/res/xml/key_space_symbols.xml +++ b/java/res/xml/key_space_symbols.xml @@ -21,6 +21,8 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <include - latin:keyboardLayout="@xml/key_space_3kw" /> + <Key + latin:backgroundType="normal" + latin:keyStyle="spaceKeyStyle" + latin:keyWidth="30%p" /> </merge> diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml index c9d87bfd4..8b3bb2e5c 100644 --- a/java/res/xml/key_styles_common.xml +++ b/java/res/xml/key_styles_common.xml @@ -35,14 +35,13 @@ latin:keyLabelFlags="hasShiftedLetterHint" /> </default> </switch> - <!-- Base key style for the key which may have settings or tab key as popup key. --> + <!-- Base key style for the key which may have settings key as more keys. --> <include - latin:keyboardLayout="@xml/key_styles_f1" /> + latin:keyboardLayout="@xml/key_styles_settings" /> <!-- Functional key styles --> <!-- Base style for shift key. A single space is used for dummy label in moreKeys. --> <key-style latin:styleName="baseForShiftKeyStyle" - latin:code="!code/key_shift" latin:keyActionFlags="noKeyPreview" latin:keyLabelFlags="preserveCase" latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" /> @@ -52,7 +51,7 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key_shifted" + latin:keySpec="!icon/shift_key_shifted|!code/key_shift" latin:backgroundType="stickyOff" latin:parentStyle="baseForShiftKeyStyle" /> </case> @@ -61,155 +60,98 @@ > <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key_shifted" + latin:keySpec="!icon/shift_key_shifted|!code/key_shift" latin:backgroundType="stickyOn" latin:parentStyle="baseForShiftKeyStyle" /> </case> <default> <key-style latin:styleName="shiftKeyStyle" - latin:keyIcon="!icon/shift_key" + latin:keySpec="!icon/shift_key|!code/key_shift" latin:backgroundType="stickyOff" latin:parentStyle="baseForShiftKeyStyle" /> </default> </switch> <key-style latin:styleName="deleteKeyStyle" - latin:code="!code/key_delete" - latin:keyIcon="!icon/delete_key" + latin:keySpec="!icon/delete_key|!code/key_delete" latin:keyActionFlags="isRepeatable|noKeyPreview" latin:backgroundType="functional" /> + <!-- emojiKeyStyle must be defined before including @xml/key_syles_enter. --> + <key-style + latin:styleName="emojiKeyStyle" + latin:keySpec="!icon/emoji_key|!code/key_emoji" + latin:keyActionFlags="noKeyPreview" + latin:backgroundType="action" /> <include latin:keyboardLayout="@xml/key_styles_enter" /> + <!-- TODO: Currently there is no way to specify icon alignment per theme. --> <key-style latin:styleName="spaceKeyStyle" - latin:code="!code/key_space" + latin:keySpec="!icon/space_key|!code/key_space" latin:keyActionFlags="noKeyPreview|enableLongPress" /> <!-- U+200C: ZERO WIDTH NON-JOINER U+200D: ZERO WIDTH JOINER --> <key-style latin:styleName="zwnjKeyStyle" - latin:code="0x200C" - latin:keyIcon="!icon/zwnj_key" + latin:keySpec="!icon/zwnj_key|‌" latin:moreKeys="!icon/zwj_key|‍" latin:keyLabelFlags="hasPopupHint" latin:keyActionFlags="noKeyPreview" /> <key-style latin:styleName="shortcutKeyStyle" - latin:code="!code/key_shortcut" - latin:keyIcon="!icon/shortcut_key" + latin:keySpec="!icon/shortcut_key|!code/key_shortcut" latin:keyIconDisabled="!icon/shortcut_key_disabled" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping" latin:altCode="!code/key_space" - latin:parentStyle="f1MoreKeysStyle" /> + latin:parentStyle="settingsMoreKeysStyle" /> <key-style latin:styleName="settingsKeyStyle" - latin:code="!code/key_settings" - latin:keyIcon="!icon/settings_key" + latin:keySpec="!icon/settings_key|!code/key_settings" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping" latin:altCode="!code/key_space" latin:backgroundType="functional" /> <key-style latin:styleName="languageSwitchKeyStyle" - latin:code="!code/key_language_switch" - latin:keyIcon="!icon/language_switch_key" + latin:keySpec="!icon/language_switch_key|!code/key_language_switch" latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress" latin:altCode="!code/key_space" /> <key-style - latin:styleName="emojiKeyStyle" - latin:code="!code/key_emoji" - latin:keyIcon="!icon/emoji_key" - latin:keyActionFlags="noKeyPreview" - latin:backgroundType="functional" /> - <!-- Overriding EnterKeyStyle here --> - <switch> - <!-- Shift + Enter in textMultiLine field. --> - <case - latin:isMultiLine="true" - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" - > - <key-style - latin:styleName="enterKeyStyle" - latin:parentStyle="shiftEnterKeyStyle" /> - </case> - <!-- Smiley in textShortMessage field. - Overrides common enter key style. --> - <case - latin:mode="im" - > - <key-style - latin:styleName="enterKeyStyle" - latin:parentStyle="emojiKeyStyle" /> - </case> - </switch> - <key-style latin:styleName="tabKeyStyle" - latin:code="!code/key_tab" - latin:keyIcon="!icon/tab_key" + latin:keySpec="!icon/tab_key|!code/key_tab" latin:keyIconPreview="!icon/tab_key_preview" latin:backgroundType="functional" /> <!-- 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="!code/key_tab" - latin:keyIcon="!icon/tab_key" + latin:keySpec="!icon/tab_key|!code/key_tab" latin:keyIconPreview="!icon/tab_key_preview" /> <key-style latin:styleName="baseForLayoutSwitchKeyStyle" - latin:keyLabelFlags="preserveCase" + latin:keyLabelFlags="preserveCase|followFunctionalTextColor" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" /> - <switch> - <!-- When this qwerty keyboard has no shortcut keys but shortcut key is enabled, then symbol - keyboard will have a shortcut key. That means we should use label_to_symbol_key label - and shortcut_for_label icon. --> - <case - latin:shortcutKeyOnSymbols="true" - > - <key-style - latin:styleName="baseForToSymbolKeyStyle" - latin:keyIcon="!icon/shortcut_for_label" - latin:keyLabel="!text/label_to_symbol_with_microphone_key" - latin:keyLabelFlags="withIconRight|preserveCase" - latin:parentStyle="baseForLayoutSwitchKeyStyle" /> - </case> - <default> - <key-style - latin:styleName="baseForToSymbolKeyStyle" - latin:keyLabel="!text/label_to_symbol_key" - latin:parentStyle="baseForLayoutSwitchKeyStyle" /> - </default> - </switch> <key-style latin:styleName="toSymbolKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:parentStyle="baseForToSymbolKeyStyle" /> + latin:keySpec="!text/keylabel_to_symbol|!code/key_switch_alpha_symbol" + latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="toAlphaKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:keyLabel="!text/label_to_alpha_key" + latin:keySpec="!text/keylabel_to_alpha|!code/key_switch_alpha_symbol" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="toMoreSymbolKeyStyle" - latin:code="!code/key_shift" - latin:keyLabel="!text/label_to_more_symbol_key" + latin:keySpec="!text/keylabel_to_more_symbol|!code/key_shift" latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="backFromMoreSymbolKeyStyle" - latin:code="!code/key_shift" - latin:parentStyle="baseForToSymbolKeyStyle" /> - <key-style - latin:styleName="punctuationKeyStyle" - latin:keyLabel="." - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_punctuation" - latin:backgroundType="functional" /> + latin:keySpec="!text/keylabel_to_symbol|!code/key_shift" + latin:parentStyle="baseForLayoutSwitchKeyStyle" /> <key-style latin:styleName="comKeyStyle" - latin:keyLabel="!text/keylabel_for_popular_domain" + latin:keySpec="!text/keyspec_popular_domain" latin:keyLabelFlags="autoXScale|fontNormal|hasPopupHint|preserveCase" - latin:keyOutputText="!text/keylabel_for_popular_domain" - latin:moreKeys="!text/more_keys_for_popular_domain" + latin:moreKeys="!text/morekeys_popular_domain" latin:backgroundType="functional" /> </merge> diff --git a/java/res/xml/key_styles_currency.xml b/java/res/xml/key_styles_currency.xml index 84c2abc08..f576d0465 100644 --- a/java/res/xml/key_styles_currency.xml +++ b/java/res/xml/key_styles_currency.xml @@ -50,7 +50,7 @@ 19. San Marino (it_SM) 20. Slovakia (sk_SK) 21. Slovenia (sl_SI) - 22. Spain (es_ES, ca_ES) + 22. Spain (es_ES, ca_ES, eu_ES, gl_ES) 23. Vatican City (it_VA) --> <case latin:countryCode="AD|AT|BE|CY|EE|FI|FR|DE|GR|IE|IT|XK|LU|MT|MO|ME|NL|PT|SM|SK|SI|ES|VA" @@ -92,7 +92,34 @@ <include latin:keyboardLayout="@xml/key_styles_currency_euro" /> </case> - <!-- fa: Persian (Rial and Afgahni) + <!-- IN: India (Rupee) --> + <case + latin:countryCode="IN" + > + <!-- U+20B9: "₹" INDIAN RUPEE SIGN + U+00A3: "£" POUND SIGN + U+20AC: "€" EURO SIGN + U+00A2: "¢" CENT SIGN --> + <key-style + latin:styleName="currencyKeyStyle" + latin:keySpec="₹" + latin:moreKeys="!text/morekeys_currency" /> + <key-style + latin:styleName="moreCurrency1KeyStyle" + latin:keySpec="£" /> + <key-style + latin:styleName="moreCurrency2KeyStyle" + latin:keySpec="€" /> + <key-style + latin:styleName="moreCurrency3KeyStyle" + latin:keySpec="$" + latin:moreKeys="¢" /> + <key-style + latin:styleName="moreCurrency4KeyStyle" + latin:keySpec="¢" /> + </case> + <!-- bn: Bengali (Bangladesh Taka) + fa: Persian (Rial and Afgahni) hi: Hindi (Indian Rupee) iw: Hebrew (New Sheqel) lo: Lao (Kip) @@ -106,28 +133,28 @@ <!-- TODO: The currency sign of Armenian Dram was created in 2012 and assigned U+058F for its unicode, although there is no font glyph for it as of September 2013. --> <case - latin:languageCode="fa|hi|iw|lo|mn|ne|th|uk|vi" + latin:languageCode="bn|fa|hi|iw|lo|mn|ne|th|uk|vi" > <!-- U+00A3: "£" POUND SIGN U+20AC: "€" EURO SIGN U+00A2: "¢" CENT SIGN --> <key-style latin:styleName="currencyKeyStyle" - latin:keyLabel="!text/keylabel_for_currency" - latin:moreKeys="!text/more_keys_for_currency" /> + latin:keySpec="!text/keyspec_currency" + latin:moreKeys="!text/morekeys_currency" /> <key-style latin:styleName="moreCurrency1KeyStyle" - latin:keyLabel="£" /> + latin:keySpec="£" /> <key-style latin:styleName="moreCurrency2KeyStyle" - latin:keyLabel="€" /> + latin:keySpec="€" /> <key-style latin:styleName="moreCurrency3KeyStyle" - latin:keyLabel="$" + latin:keySpec="$" latin:moreKeys="¢" /> <key-style latin:styleName="moreCurrency4KeyStyle" - latin:keyLabel="¢" /> + latin:keySpec="¢" /> </case> <!-- GB: United Kingdom (Pound) --> <case @@ -140,21 +167,21 @@ U+20B1: "₱" PESO SIGN --> <key-style latin:styleName="currencyKeyStyle" - latin:keyLabel="£" + latin:keySpec="£" latin:moreKeys="¢,$,€,¥,₱" /> <key-style latin:styleName="moreCurrency1KeyStyle" - latin:keyLabel="€" /> + latin:keySpec="€" /> <key-style latin:styleName="moreCurrency2KeyStyle" - latin:keyLabel="¥" /> + latin:keySpec="¥" /> <key-style latin:styleName="moreCurrency3KeyStyle" - latin:keyLabel="$" + latin:keySpec="$" latin:moreKeys="¢" /> <key-style latin:styleName="moreCurrency4KeyStyle" - latin:keyLabel="¢" /> + latin:keySpec="¢" /> </case> <!-- ar: Arabic (Dollar and Rial) --> <default> diff --git a/java/res/xml/key_styles_currency_dollar.xml b/java/res/xml/key_styles_currency_dollar.xml index 674a3966d..d3211bd69 100644 --- a/java/res/xml/key_styles_currency_dollar.xml +++ b/java/res/xml/key_styles_currency_dollar.xml @@ -25,18 +25,18 @@ U+00A5: "¥" YEN SIGN --> <key-style latin:styleName="currencyKeyStyle" - latin:keyLabel="$" - latin:moreKeys="!text/more_keys_for_currency_dollar" /> + latin:keySpec="$" + latin:moreKeys="!text/morekeys_currency_dollar" /> <key-style latin:styleName="moreCurrency1KeyStyle" - latin:keyLabel="£" /> + latin:keySpec="£" /> <key-style latin:styleName="moreCurrency2KeyStyle" - latin:keyLabel="¢" /> + latin:keySpec="¢" /> <key-style latin:styleName="moreCurrency3KeyStyle" - latin:keyLabel="€" /> + latin:keySpec="€" /> <key-style latin:styleName="moreCurrency4KeyStyle" - latin:keyLabel="¥" /> + latin:keySpec="¥" /> </merge> diff --git a/java/res/xml/key_styles_currency_euro.xml b/java/res/xml/key_styles_currency_euro.xml index c1b5e0384..c2ae87bea 100644 --- a/java/res/xml/key_styles_currency_euro.xml +++ b/java/res/xml/key_styles_currency_euro.xml @@ -26,19 +26,19 @@ U+20B1: "₱" PESO SIGN --> <key-style latin:styleName="currencyKeyStyle" - latin:keyLabel="€" + latin:keySpec="€" latin:moreKeys="¢,£,$,¥,₱" /> <key-style latin:styleName="moreCurrency1KeyStyle" - latin:keyLabel="£" /> + latin:keySpec="£" /> <key-style latin:styleName="moreCurrency2KeyStyle" - latin:keyLabel="¥" /> + latin:keySpec="¥" /> <key-style latin:styleName="moreCurrency3KeyStyle" - latin:keyLabel="$" + latin:keySpec="$" latin:moreKeys="¢" /> <key-style latin:styleName="moreCurrency4KeyStyle" - latin:keyLabel="¢" /> + latin:keySpec="¢" /> </merge> diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml index 083e6a67d..50530e1bf 100644 --- a/java/res/xml/key_styles_enter.xml +++ b/java/res/xml/key_styles_enter.xml @@ -21,7 +21,7 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <!-- TODO: Stop using many conditional cases for emoji_key_as_more_key. There are way too many to maintain. --> + <!-- TODO: Stop using many conditional cases for keyspec_emoji_key. There are way too many to maintain. --> <!-- Navigate more keys style --> <switch> <!-- latin:passwordInput="true" --> @@ -33,7 +33,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:imeAction="actionNext" @@ -51,7 +51,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:imeAction="actionPrevious" @@ -69,7 +69,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/action_previous_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_action_previous,!text/keyspec_action_next" /> </case> <case latin:navigateNext="true" @@ -79,7 +79,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:navigateNext="false" @@ -89,7 +89,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:navigateNext="false" @@ -108,7 +108,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:imeAction="actionNext" @@ -126,7 +126,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:imeAction="actionPrevious" @@ -144,7 +144,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/action_previous_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_action_previous,!text/keyspec_action_next" /> </case> <case latin:navigateNext="true" @@ -154,7 +154,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_next_as_more_key" /> + latin:moreKeys="!text/keyspec_action_next" /> </case> <case latin:navigateNext="false" @@ -164,7 +164,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/action_previous_as_more_key" /> + latin:moreKeys="!text/keyspec_action_previous" /> </case> <case latin:navigateNext="false" @@ -182,7 +182,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/emoji_key_as_more_key,!text/action_previous_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_emoji_key,!text/keyspec_action_previous" /> </case> <case latin:imeAction="actionNext" @@ -191,7 +191,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/emoji_key_as_more_key" /> + latin:moreKeys="!text/keyspec_emoji_key" /> </case> <case latin:imeAction="actionPrevious" @@ -200,7 +200,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/emoji_key_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_emoji_key,!text/keyspec_action_next" /> </case> <case latin:imeAction="actionPrevious" @@ -209,7 +209,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/emoji_key_as_more_key" /> + latin:moreKeys="!text/keyspec_emoji_key" /> </case> <case latin:navigateNext="true" @@ -218,7 +218,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!3,!needsDividers!,!text/emoji_key_as_more_key,!text/action_previous_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!3,!needsDividers!,!text/keyspec_emoji_key,!text/keyspec_action_previous,!text/keyspec_action_next" /> </case> <case latin:navigateNext="true" @@ -227,7 +227,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/emoji_key_as_more_key,!text/action_next_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_emoji_key,!text/keyspec_action_next" /> </case> <case latin:navigateNext="false" @@ -236,7 +236,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/emoji_key_as_more_key,!text/action_previous_as_more_key" /> + latin:moreKeys="!fixedColumnOrder!2,!needsDividers!,!text/keyspec_emoji_key,!text/keyspec_action_previous" /> </case> <case latin:navigateNext="false" @@ -245,7 +245,7 @@ <key-style latin:styleName="navigateMoreKeysStyle" latin:keyLabelFlags="hasPopupHint|preserveCase" - latin:moreKeys="!text/emoji_key_as_more_key" /> + latin:moreKeys="!text/keyspec_emoji_key" /> </case> <default> <key-style @@ -255,21 +255,13 @@ <!-- Enter key style --> <key-style latin:styleName="defaultEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/enter_key" - latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio" + latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio|followFunctionalTextColor" latin:keyActionFlags="noKeyPreview" - latin:backgroundType="functional" + latin:backgroundType="action" latin:parentStyle="navigateMoreKeysStyle" /> <key-style latin:styleName="shiftEnterKeyStyle" - latin:code="!code/key_shift_enter" - latin:parentStyle="defaultEnterKeyStyle" /> - <key-style - latin:styleName="defaultActionEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/undefined" - latin:backgroundType="action" + latin:keySpec="!icon/enter_key|!code/key_shift_enter" latin:parentStyle="defaultEnterKeyStyle" /> <switch> <!-- Shift + Enter in textMultiLine field. --> @@ -281,66 +273,137 @@ latin:styleName="enterKeyStyle" latin:parentStyle="shiftEnterKeyStyle" /> </case> + <!-- Smiley in textShortMessage field. + This <case> should be after Shift + Enter <case> and before any of action <case>. --> + <case + latin:mode="im" + > + <key-style + latin:styleName="enterKeyStyle" + latin:parentStyle="emojiKeyStyle" /> + </case> <case latin:imeAction="actionGo" + latin:isIconDefined="go_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_go_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/go_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionGo" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_go_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionNext" + latin:isIconDefined="next_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/next_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionNext" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_next_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_next_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionPrevious" + latin:isIconDefined="previous_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/previous_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionPrevious" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_previous_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_previous_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionDone" + latin:isIconDefined="done_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_done_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/done_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionDone" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_done_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSend" + latin:isIconDefined="send_key" > <key-style latin:styleName="enterKeyStyle" - latin:keyLabel="!text/label_send_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!icon/send_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionSend" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!text/label_send_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> + </case> + <case + latin:imeAction="actionSearch" + latin:isIconDefined="search_key" + > + <key-style + latin:styleName="enterKeyStyle" + latin:keySpec="!icon/search_key|!code/key_enter" + latin:backgroundType="action" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSearch" > <key-style latin:styleName="enterKeyStyle" - latin:keyIcon="!icon/search_key" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:keySpec="!text/label_search_key|!code/key_enter" + latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionCustomLabel" > <key-style latin:styleName="enterKeyStyle" + latin:keySpec="dummy_label|!code/key_enter" latin:keyLabelFlags="fromCustomActionLabel" - latin:parentStyle="defaultActionEnterKeyStyle" /> + latin:parentStyle="defaultEnterKeyStyle" /> </case> <!-- imeAction is either actionNone or actionUnspecified. --> <default> <key-style latin:styleName="enterKeyStyle" + latin:keySpec="!icon/enter_key|!code/key_enter" latin:parentStyle="defaultEnterKeyStyle" /> </default> </switch> diff --git a/java/res/xml/keys_less_greater.xml b/java/res/xml/key_styles_less_greater.xml index 56d0727dd..db4c7984b 100644 --- a/java/res/xml/keys_less_greater.xml +++ b/java/res/xml/key_styles_less_greater.xml @@ -21,34 +21,34 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > + <!-- The less and greater keys' style which may have different label depending on locale. --> + <!-- Kept as a separate file for cleaner overriding by an overlay. --> <switch> <case latin:languageCode="fa" > - <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> - <Key - latin:keyLabel="«" - latin:code="0x00BB" + <key-style + latin:styleName="lessKeyStyle" + latin:keySpec="!text/keyspec_left_double_angle_quote" latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_less_than" /> - <Key - latin:keyLabel="»" - latin:code="0x00AB" + latin:moreKeys="!text/morekeys_less_than" /> + <key-style + latin:styleName="greaterKeyStyle" + latin:keySpec="!text/keyspec_right_double_angle_quote" latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_greater_than" /> + latin:moreKeys="!text/morekeys_greater_than" /> </case> <default> - <Key - latin:keyLabel="<" - latin:code="!code/key_less_than" + <key-style + latin:styleName="lessKeyStyle" + latin:keySpec="!text/keyspec_less_than" latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_less_than" /> - <Key - latin:keyLabel=">" - latin:code="!code/key_greater_than" + latin:moreKeys="!text/morekeys_less_than" /> + <key-style + latin:styleName="greaterKeyStyle" + latin:keySpec="!text/keyspec_greater_than" latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_greater_than" /> + latin:moreKeys="!text/morekeys_greater_than" /> </default> </switch> </merge> diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml index 2e5a601b0..8a76fe397 100644 --- a/java/res/xml/key_styles_number.xml +++ b/java/res/xml/key_styles_number.xml @@ -30,7 +30,7 @@ latin:parentStyle="numKeyBaseStyle" /> <key-style latin:styleName="numModeKeyStyle" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" + latin:keyLabelFlags="fontNormal|followKeyLetterRatio|followFunctionalTextColor" latin:parentStyle="numKeyBaseStyle" /> <key-style latin:styleName="numFunctionalKeyStyle" @@ -43,82 +43,74 @@ latin:parentStyle="numKeyStyle" /> <key-style latin:styleName="num0KeyStyle" - latin:keyLabel="0" + latin:keySpec="0" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num1KeyStyle" - latin:keyLabel="1" + latin:keySpec="1" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num2KeyStyle" - latin:keyLabel="2" + latin:keySpec="2" latin:keyHintLabel="ABC" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num3KeyStyle" - latin:keyLabel="3" + latin:keySpec="3" latin:keyHintLabel="DEF" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num4KeyStyle" - latin:keyLabel="4" + latin:keySpec="4" latin:keyHintLabel="GHI" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num5KeyStyle" - latin:keyLabel="5" + latin:keySpec="5" latin:keyHintLabel="JKL" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num6KeyStyle" - latin:keyLabel="6" + latin:keySpec="6" latin:keyHintLabel="MNO" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num7KeyStyle" - latin:keyLabel="7" + latin:keySpec="7" latin:keyHintLabel="PQRS" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num8KeyStyle" - latin:keyLabel="8" + latin:keySpec="8" latin:keyHintLabel="TUV" latin:parentStyle="numberKeyStyle" /> <key-style latin:styleName="num9KeyStyle" - latin:keyLabel="9" + latin:keySpec="9" latin:keyHintLabel="WXYZ" latin:parentStyle="numberKeyStyle" /> - <!-- U+002A: "*" ASTERISK - U+FF0A: "*" FULLWIDTH ASTERISK --> + <!-- U+FF0A: "*" FULLWIDTH ASTERISK --> <key-style latin:styleName="numStarKeyStyle" - latin:code="0x002A" - latin:keyLabel="*" + latin:keySpec="*|*" latin:parentStyle="numKeyStyle" /> <!-- Only for non-tablet device --> <key-style latin:styleName="numPhoneToSymbolKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:keyLabel="!text/label_to_phone_symbols_key" + latin:keySpec="!text/keylabel_to_phone_symbols|!code/key_switch_alpha_symbol" latin:parentStyle="numModeKeyStyle" /> <key-style latin:styleName="numPhoneToNumericKeyStyle" - latin:code="!code/key_switch_alpha_symbol" - latin:keyLabel="!text/label_to_phone_numeric_key" + latin:keySpec="!text/keylabel_to_phone_numeric|!code/key_switch_alpha_symbol" latin:parentStyle="numModeKeyStyle" /> - <!-- U+002C: "," COMMA --> <key-style latin:styleName="numPauseKeyStyle" - latin:code="0x002C" - latin:keyLabel="!text/label_pause_key" + latin:keySpec="!text/label_pause_key|," latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale" latin:parentStyle="numKeyBaseStyle" /> - <!-- U+003B: ";" SEMICOLON --> <key-style latin:styleName="numWaitKeyStyle" - latin:code="0x003B" - latin:keyLabel="!text/label_wait_key" + latin:keySpec="!text/label_wait_key|;" latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale" latin:parentStyle="numKeyBaseStyle" /> <key-style @@ -127,15 +119,14 @@ latin:parentStyle="tabKeyStyle" /> <key-style latin:styleName="numSpaceKeyStyle" - latin:code="!code/key_space" - latin:keyIcon="!icon/space_key_for_number_layout" + latin:keySpec="!icon/space_key_for_number_layout|!code/key_space" + latin:keyLabelFlags="alignButtom" latin:keyActionFlags="enableLongPress" latin:parentStyle="numKeyBaseStyle" /> <!-- Override defaultEnterKeyStyle in key_styles_enter.xml --> <key-style latin:styleName="defaultEnterKeyStyle" - latin:code="!code/key_enter" - latin:keyIcon="!icon/enter_key" + latin:keySpec="!icon/enter_key|!code/key_enter" latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio" latin:keyActionFlags="noKeyPreview" latin:backgroundType="functional" diff --git a/java/res/xml/key_styles_f1.xml b/java/res/xml/key_styles_settings.xml index 8dfc3cb84..956b40235 100644 --- a/java/res/xml/key_styles_f1.xml +++ b/java/res/xml/key_styles_settings.xml @@ -21,22 +21,22 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <!-- Base key style for the key which may have settings or tab key as popup key. --> + <!-- Base key style for the key which may have settings key as more keys. --> <!-- Kept as a separate file for cleaner overriding by an overlay. --> <switch> <case latin:clobberSettingsKey="true" > <key-style - latin:styleName="f1MoreKeysStyle" + latin:styleName="settingsMoreKeysStyle" latin:backgroundType="functional" /> </case> <!-- clobberSettingsKey="false" --> <default> <key-style - latin:styleName="f1MoreKeysStyle" + latin:styleName="settingsMoreKeysStyle" latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/settings_as_more_key" + latin:moreKeys="!text/keyspec_settings" latin:backgroundType="functional" /> </default> </switch> diff --git a/java/res/xml/key_symbols_period.xml b/java/res/xml/key_symbols_period.xml deleted file mode 100644 index 6efc9dee3..000000000 --- a/java/res/xml/key_symbols_period.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2013, 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" -> - <!-- U+2105: "℅" CARE OF - U+2122: "™" TRADE MARK SIGN - U+00AE: "®" REGISTERED SIGN - U+00A9: "©" COPYRIGHT SIGN - U+00A7: "§" SECTION SIGN - U+00B6: "¶" PILCROW SIGN - U+002C: "," COMMA - U+2022: "•" BULLET --> - <!-- U+00B0: "°" DEGREE SIGN - U+2032: "′" PRIME - U+2033: "″" DOUBLE PRIME - U+2191: "↑" UPWARDS ARROW - U+2193: "↓" DOWNWARDS ARROW - U+2190: "←" LEFTWARDS ARROW - U+2192: "→" RIGHTWARDS ARROW - U+2026: "…" HORIZONTAL ELLIPSIS --> - <!-- U+0394: "Δ" GREEK CAPITAL LETTER DELTA - U+03A0: "Π" GREEK CAPITAL LETTER PI - U+03C0: "π" GREEK SMALL LETTER PI --> - <Key - latin:keyLabel="." - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!fixedColumnOrder!8,℅,™,®,©,§,¶,\\,,•,°,′,″,↑,↓,←,→,…,!text/more_keys_for_bullet,Δ,Π,π" /> -</merge> diff --git a/java/res/xml/key_thai_kho_khuat.xml b/java/res/xml/key_thai_kho_khuat.xml index 0ffd0f924..a43a87ccd 100644 --- a/java/res/xml/key_thai_kho_khuat.xml +++ b/java/res/xml/key_thai_kho_khuat.xml @@ -27,14 +27,12 @@ > <!-- U+0E05: "ฅ" THAI CHARACTER KHO KHON --> <Key - latin:keyLabel="ฅ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ฅ" /> </case> <default> <!-- U+0E03: "ฃ" THAI CHARACTER KHO KHUAT --> <Key - latin:keyLabel="ฃ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ฃ" /> </default> </switch> </merge> diff --git a/java/res/xml/keyboard_layout_set_arabic.xml b/java/res/xml/keyboard_layout_set_arabic.xml index 10e95bd30..1bf8c6295 100644 --- a/java/res/xml/keyboard_layout_set_arabic.xml +++ b/java/res/xml/keyboard_layout_set_arabic.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="arabic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_arabic" diff --git a/java/res/xml/keyboard_layout_set_armenian_phonetic.xml b/java/res/xml/keyboard_layout_set_armenian_phonetic.xml index 35bd43fb9..c3a11898d 100644 --- a/java/res/xml/keyboard_layout_set_armenian_phonetic.xml +++ b/java/res/xml/keyboard_layout_set_armenian_phonetic.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="armenian" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_armenian_phonetic" diff --git a/java/res/xml/keyboard_layout_set_bengali.xml b/java/res/xml/keyboard_layout_set_bengali.xml new file mode 100644 index 000000000..6e40e6de4 --- /dev/null +++ b/java/res/xml/keyboard_layout_set_bengali.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_bengali" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keyboard_layout_set_bulgarian.xml b/java/res/xml/keyboard_layout_set_bulgarian.xml index c6fdff9a2..3f53865d4 100644 --- a/java/res/xml/keyboard_layout_set_bulgarian.xml +++ b/java/res/xml/keyboard_layout_set_bulgarian.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="cyrillic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_bulgarian" diff --git a/java/res/xml/keyboard_layout_set_bulgarian_bds.xml b/java/res/xml/keyboard_layout_set_bulgarian_bds.xml index a36b3bd52..8e92f7054 100644 --- a/java/res/xml/keyboard_layout_set_bulgarian_bds.xml +++ b/java/res/xml/keyboard_layout_set_bulgarian_bds.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="cyrillic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_bulgarian_bds" diff --git a/java/res/xml/keyboard_layout_set_east_slavic.xml b/java/res/xml/keyboard_layout_set_east_slavic.xml index 8d66faf8f..ef080643b 100644 --- a/java/res/xml/keyboard_layout_set_east_slavic.xml +++ b/java/res/xml/keyboard_layout_set_east_slavic.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="cyrillic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_east_slavic" diff --git a/java/res/xml/keyboard_layout_set_farsi.xml b/java/res/xml/keyboard_layout_set_farsi.xml index b9a91e3a8..9b44b7b8b 100644 --- a/java/res/xml/keyboard_layout_set_farsi.xml +++ b/java/res/xml/keyboard_layout_set_farsi.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="arabic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_farsi" diff --git a/java/res/xml/keyboard_layout_set_georgian.xml b/java/res/xml/keyboard_layout_set_georgian.xml index 36d091653..a0a060832 100644 --- a/java/res/xml/keyboard_layout_set_georgian.xml +++ b/java/res/xml/keyboard_layout_set_georgian.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="georgian" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_georgian" diff --git a/java/res/xml/keyboard_layout_set_greek.xml b/java/res/xml/keyboard_layout_set_greek.xml index b376e4fe3..a1e738f3a 100644 --- a/java/res/xml/keyboard_layout_set_greek.xml +++ b/java/res/xml/keyboard_layout_set_greek.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="greek" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_greek" diff --git a/java/res/xml/keyboard_layout_set_hebrew.xml b/java/res/xml/keyboard_layout_set_hebrew.xml index d5b25b36c..d3d4b7633 100644 --- a/java/res/xml/keyboard_layout_set_hebrew.xml +++ b/java/res/xml/keyboard_layout_set_hebrew.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="hebrew" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_hebrew" diff --git a/java/res/xml/keyboard_layout_set_hindi_compact.xml b/java/res/xml/keyboard_layout_set_hindi_compact.xml new file mode 100644 index 000000000..77d02fbbc --- /dev/null +++ b/java/res/xml/keyboard_layout_set_hindi_compact.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_hindi_compact" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keyboard_layout_set_marathi.xml b/java/res/xml/keyboard_layout_set_marathi.xml new file mode 100644 index 000000000..e5c68e7ce --- /dev/null +++ b/java/res/xml/keyboard_layout_set_marathi.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_marathi" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keyboard_layout_set_mongolian.xml b/java/res/xml/keyboard_layout_set_mongolian.xml index 2d364f682..977fc687b 100644 --- a/java/res/xml/keyboard_layout_set_mongolian.xml +++ b/java/res/xml/keyboard_layout_set_mongolian.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="cyrillic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_mongolian" diff --git a/java/res/xml/keyboard_layout_set_myanmar.xml b/java/res/xml/keyboard_layout_set_myanmar.xml new file mode 100644 index 000000000..5c823b263 --- /dev/null +++ b/java/res/xml/keyboard_layout_set_myanmar.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_myanmar" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="alphabetAutomaticShifted" + latin:elementKeyboard="@xml/kbd_myanmar" + latin:enableProximityCharsCorrection="true" /> + <!-- On these shifted alphabet layouts the proximity characters correction should be disabled + because the letters on these layouts aren't the ones in different case of the above + unshifted layouts. --> + <Element + latin:elementName="alphabetManualShifted" + latin:elementKeyboard="@xml/kbd_myanmar" /> + <Element + latin:elementName="alphabetShiftLocked" + latin:elementKeyboard="@xml/kbd_myanmar" /> + <Element + latin:elementName="alphabetShiftLockShifted" + latin:elementKeyboard="@xml/kbd_myanmar" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keyboard_layout_set_sinhala.xml b/java/res/xml/keyboard_layout_set_sinhala.xml new file mode 100644 index 000000000..8e6e619d2 --- /dev/null +++ b/java/res/xml/keyboard_layout_set_sinhala.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_sinhala" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="alphabetAutomaticShifted" + latin:elementKeyboard="@xml/kbd_sinhala" + latin:enableProximityCharsCorrection="true" /> + <!-- On these shifted alphabet layouts the proximity characters correction should be disabled + because the letters on these layouts aren't the ones in different case of the above + unshifted layouts. --> + <Element + latin:elementName="alphabetManualShifted" + latin:elementKeyboard="@xml/kbd_sinhala" /> + <Element + latin:elementName="alphabetShiftLocked" + latin:elementKeyboard="@xml/kbd_sinhala" /> + <Element + latin:elementName="alphabetShiftLockShifted" + latin:elementKeyboard="@xml/kbd_sinhala" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keyboard_layout_set_south_slavic.xml b/java/res/xml/keyboard_layout_set_south_slavic.xml index 36666b91b..b851a999e 100644 --- a/java/res/xml/keyboard_layout_set_south_slavic.xml +++ b/java/res/xml/keyboard_layout_set_south_slavic.xml @@ -20,6 +20,8 @@ <KeyboardLayoutSet xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Feature + latin:supportedScript="cyrillic" /> <Element latin:elementName="alphabet" latin:elementKeyboard="@xml/kbd_south_slavic" diff --git a/java/res/xml/keyboard_layout_set_swiss.xml b/java/res/xml/keyboard_layout_set_swiss.xml new file mode 100644 index 000000000..e17a5ab8b --- /dev/null +++ b/java/res/xml/keyboard_layout_set_swiss.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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. +*/ +--> + +<KeyboardLayoutSet + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <Element + latin:elementName="alphabet" + latin:elementKeyboard="@xml/kbd_swiss" + latin:enableProximityCharsCorrection="true" /> + <Element + latin:elementName="symbols" + latin:elementKeyboard="@xml/kbd_symbols" /> + <Element + latin:elementName="symbolsShifted" + latin:elementKeyboard="@xml/kbd_symbols_shift" /> + <Element + latin:elementName="phone" + latin:elementKeyboard="@xml/kbd_phone" /> + <Element + latin:elementName="phoneSymbols" + latin:elementKeyboard="@xml/kbd_phone_symbols" /> + <Element + latin:elementName="number" + latin:elementKeyboard="@xml/kbd_number" /> +</KeyboardLayoutSet> diff --git a/java/res/xml/keys_arabic3_left.xml b/java/res/xml/keys_arabic3_left.xml index 157af4a52..05ba6d8f3 100644 --- a/java/res/xml/keys_arabic3_left.xml +++ b/java/res/xml/keys_arabic3_left.xml @@ -23,6 +23,5 @@ > <!-- U+0630: "ذ" ARABIC LETTER THAL --> <Key - latin:keyLabel="ذ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ذ" /> </merge> diff --git a/java/res/xml/keys_comma_period.xml b/java/res/xml/keys_comma_period.xml deleted file mode 100644 index 1b51e45ed..000000000 --- a/java/res/xml/keys_comma_period.xml +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <switch> - <case - latin:languageCode="ar" - > - <Key - latin:keyLabel="!text/keylabel_for_apostrophe" - latin:keyHintLabel="!text/keyhintlabel_for_apostrophe" - latin:moreKeys="!text/more_keys_for_apostrophe" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_arabic_diacritics" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_arabic_diacritics" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - </case> - <case - latin:languageCode="fa" - > - <Key - latin:keyLabel="!text/keylabel_for_apostrophe" - latin:keyHintLabel="!text/keyhintlabel_for_apostrophe" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_apostrophe" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_arabic_diacritics" - latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_arabic_diacritics" - latin:backgroundType="functional" - latin:keyStyle="hasShiftedLetterHintStyle" /> - </case> - <case - latin:languageCode="hy" - > - <!-- U+055D: "՝" ARMENIAN COMMA --> - <Key - latin:keyLabel="՝" - latin:backgroundType="functional" /> - <!-- U+0589: "։" ARMENIAN FULL STOP --> - <Key - latin:keyLabel="։" - latin:keyLabelFlags="hasPopupHint" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_punctuation" /> - </case> - <default> - <Key - latin:keyLabel="!text/keylabel_for_tablet_comma" - latin:keyHintLabel="!text/keyhintlabel_for_tablet_comma" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_tablet_comma" /> - <Key - latin:keyLabel="." - latin:keyHintLabel="!text/keyhintlabel_for_period" - latin:backgroundType="functional" - latin:moreKeys="!text/more_keys_for_period" /> - </default> - </switch> -</merge> diff --git a/java/res/xml/keys_curly_brackets.xml b/java/res/xml/keys_curly_brackets.xml index 6a4b1a945..596516af3 100644 --- a/java/res/xml/keys_curly_brackets.xml +++ b/java/res/xml/keys_curly_brackets.xml @@ -22,9 +22,7 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="{" - latin:code="!code/key_left_curly_bracket" /> + latin:keySpec="!text/keyspec_left_curly_bracket" /> <Key - latin:keyLabel="}" - latin:code="!code/key_right_curly_bracket" /> + latin:keySpec="!text/keyspec_right_curly_bracket" /> </merge> diff --git a/java/res/xml/keys_dvorak_123.xml b/java/res/xml/keys_dvorak_123.xml index fa94f1f28..6efc7f2c5 100644 --- a/java/res/xml/keys_dvorak_123.xml +++ b/java/res/xml/keys_dvorak_123.xml @@ -26,7 +26,7 @@ latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" > <Key - latin:keyLabel=""" + latin:keySpec=""" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> </case> @@ -34,7 +34,7 @@ latin:mode="url" > <Key - latin:keyLabel="/" + latin:keySpec="/" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> </case> @@ -42,13 +42,13 @@ latin:mode="email" > <Key - latin:keyLabel="\@" + latin:keySpec="\@" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> </case> <default> <Key - latin:keyLabel="\'" + latin:keySpec="\'" latin:keyHintLabel="1" latin:additionalMoreKeys="1" latin:moreKeys="!,"" /> @@ -59,22 +59,22 @@ latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" > <Key - latin:keyLabel="<" + latin:keySpec="<" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <Key - latin:keyLabel=">" + latin:keySpec=">" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> </case> <default> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyHintLabel="2" latin:additionalMoreKeys="2" latin:moreKeys="\?,<" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyHintLabel="3" latin:additionalMoreKeys="3" latin:moreKeys=">" /> diff --git a/java/res/xml/keys_farsi3_right.xml b/java/res/xml/keys_farsi3_right.xml index 77efb0a21..867c02143 100644 --- a/java/res/xml/keys_farsi3_right.xml +++ b/java/res/xml/keys_farsi3_right.xml @@ -23,6 +23,5 @@ > <!-- U+0686: "چ" ARABIC LETTER TCHEH --> <Key - latin:keyLabel="چ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="چ" /> </merge> diff --git a/java/res/xml/keys_parentheses.xml b/java/res/xml/keys_parentheses.xml index 25e89c930..320b109a8 100644 --- a/java/res/xml/keys_parentheses.xml +++ b/java/res/xml/keys_parentheses.xml @@ -22,11 +22,9 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="(" - latin:code="!code/key_left_parenthesis" - latin:moreKeys="!text/more_keys_for_left_parenthesis" /> + latin:keySpec="!text/keyspec_left_parenthesis" + latin:moreKeys="!text/morekeys_left_parenthesis" /> <Key - latin:keyLabel=")" - latin:code="!code/key_right_parenthesis" - latin:moreKeys="!text/more_keys_for_right_parenthesis" /> + latin:keySpec="!text/keyspec_right_parenthesis" + latin:moreKeys="!text/morekeys_right_parenthesis" /> </merge> diff --git a/java/res/xml/keys_pcqwerty2_right3.xml b/java/res/xml/keys_pcqwerty2_right3.xml index 6f86477da..b188cffab 100644 --- a/java/res/xml/keys_pcqwerty2_right3.xml +++ b/java/res/xml/keys_pcqwerty2_right3.xml @@ -23,26 +23,26 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel="[" + latin:keySpec="[" latin:additionalMoreKeys="{" /> <Key - latin:keyLabel="]" + latin:keySpec="]" latin:additionalMoreKeys="}" /> <Key - latin:keyLabel="\\" + latin:keySpec="\\" latin:additionalMoreKeys="\\|" /> </case> <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> <Key - latin:keyLabel="{" /> + latin:keySpec="{" /> <Key - latin:keyLabel="}" /> + latin:keySpec="}" /> <Key - latin:keyLabel="|" /> + latin:keySpec="|" /> </default> </switch> </merge> diff --git a/java/res/xml/keys_pcqwerty3_right2.xml b/java/res/xml/keys_pcqwerty3_right2.xml index 8da145b20..8a1f60fae 100644 --- a/java/res/xml/keys_pcqwerty3_right2.xml +++ b/java/res/xml/keys_pcqwerty3_right2.xml @@ -23,22 +23,22 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel=";" + latin:keySpec=";" latin:additionalMoreKeys=":" /> <Key - latin:keyLabel="\'" + latin:keySpec="\'" latin:additionalMoreKeys=""" latin:moreKeys="!fixedColumnOrder!4,!text/double_quotes,%,!text/single_quotes" /> </case> <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> <Key - latin:keyLabel=":" /> + latin:keySpec=":" /> <Key - latin:keyLabel=""" + latin:keySpec=""" latin:moreKeys="!fixedColumnOrder!3,!text/double_quotes,!text/single_quotes" /> </default> </switch> diff --git a/java/res/xml/keys_pcqwerty4_right3.xml b/java/res/xml/keys_pcqwerty4_right3.xml index e6084cb45..a87f550f7 100644 --- a/java/res/xml/keys_pcqwerty4_right3.xml +++ b/java/res/xml/keys_pcqwerty4_right3.xml @@ -23,18 +23,18 @@ > <switch> <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" > <Key - latin:keyLabel="," + latin:keySpec="," latin:additionalMoreKeys="<" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:additionalMoreKeys=">" /> <Key - latin:keyLabel="/" + latin:keySpec="/" latin:additionalMoreKeys="\?" - latin:moreKeys="!text/more_keys_for_symbols_question" /> + latin:moreKeys="!text/morekeys_question" /> </case> <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> <default> @@ -45,14 +45,14 @@ U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> <Key - latin:keyLabel="<" + latin:keySpec="<" latin:moreKeys="!fixedColumnOrder!3,‹,≤,«" /> <Key - latin:keyLabel=">" + latin:keySpec=">" latin:moreKeys="!fixedColumnOrder!3,›,≥,»" /> <Key - latin:keyLabel="\?" - latin:moreKeys="!text/more_keys_for_symbols_question" /> + latin:keySpec="\?" + latin:moreKeys="!text/morekeys_question" /> </default> </switch> </merge> diff --git a/java/res/xml/keys_square_brackets.xml b/java/res/xml/keys_square_brackets.xml index 5c128fd0c..076b2c2d9 100644 --- a/java/res/xml/keys_square_brackets.xml +++ b/java/res/xml/keys_square_brackets.xml @@ -22,9 +22,7 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="[" - latin:code="!code/key_left_square_bracket" /> + latin:keySpec="!text/keyspec_left_square_bracket" /> <Key - latin:keyLabel="]" - latin:code="!code/key_right_square_bracket" /> + latin:keySpec="!text/keyspec_right_square_bracket" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_sign_anusvara.xml b/java/res/xml/keystyle_devanagari_sign_anusvara.xml new file mode 100644 index 000000000..2517ac562 --- /dev/null +++ b/java/res/xml/keystyle_devanagari_sign_anusvara.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0903: "ः" DEVANAGARI SIGN VISARGA + U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU + U+093C: "़" DEVANAGARI SIGN NUKTA --> + <key-style + latin:styleName="moreKeysDevanagariSignAnusvara" + latin:moreKeys="◌ः|ः,◌ँ|ँ,◌़|़" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0903: "ः" DEVANAGARI SIGN VISARGA + U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU --> + <key-style + latin:styleName="moreKeysDevanagariSignAnusvara" + latin:moreKeys="◌ः|ः,◌ँ|ँ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariSignAnusvara" /> + </default> + </switch> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0902: "ं" DEVANAGARI SIGN ANUSVARA --> + <key-style + latin:styleName="baseKeyDevanagariSignAnusvara" + latin:parentStyle="moreKeysDevanagariSignAnusvara" + latin:keySpec="◌ं|ं" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/key_devanagari_sign_candrabindu.xml b/java/res/xml/keystyle_devanagari_sign_candrabindu.xml index df0c4e054..3eb6ca0c0 100644 --- a/java/res/xml/key_devanagari_sign_candrabindu.xml +++ b/java/res/xml/keystyle_devanagari_sign_candrabindu.xml @@ -22,13 +22,9 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> <key-style @@ -36,15 +32,14 @@ latin:moreKeys="◌ॅ|ॅ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariSignCandrabindu" /> + <key-style latin:styleName="moreKeysDevanagariSignCandrabindu" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU --> - <Key - latin:keyStyle="moreKeysDevanagariSignCandrabindu" - latin:keyLabel="◌ँ" - latin:code="0x0901" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + <key-style + latin:styleName="baseKeyDevanagariSignCandrabindu" + latin:parentStyle="moreKeysDevanagariSignCandrabindu" + latin:keySpec="◌ँ|ँ" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/key_devanagari_sign_nukta.xml b/java/res/xml/keystyle_devanagari_sign_nukta.xml index f7a03ee90..e12848c6c 100644 --- a/java/res/xml/key_devanagari_sign_nukta.xml +++ b/java/res/xml/keystyle_devanagari_sign_nukta.xml @@ -22,31 +22,33 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+097D: "ॽ" DEVANAGARI LETTER GLOTTAL STOP U+0970: "॰" DEVANAGARI ABBREVIATION SIGN U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> - <key-style + <key-style latin:styleName="moreKeysDevanagariSignNukta" latin:moreKeys="◌ॽ|ॽ,◌॰|॰,◌ऽ|ऽ" /> </case> + <case latin:keyboardLayoutSet="nepali_romanized"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+093C: "़" DEVANAGARI SIGN NUKTA --> + <key-style + latin:styleName="moreKeysDevanagariSignNukta" + latin:moreKeys="◌़|़" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariSignNukta" /> + <key-style latin:styleName="moreKeysDevanagariSignNukta" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE U+093C: "़" DEVANAGARI SIGN NUKTA --> - <Key - latin:keyStyle="moreKeysDevanagariSignNukta" - latin:keyLabel="◌़" - latin:code="0x093C" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + <key-style + latin:styleName="baseKeyDevanagariSignNukta" + latin:parentStyle="moreKeysDevanagariSignNukta" + latin:keySpec="◌़|़" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_sign_virama.xml b/java/res/xml/keystyle_devanagari_sign_virama.xml index b22fbe842..a7c5998ef 100644 --- a/java/res/xml/keystyle_devanagari_sign_virama.xml +++ b/java/res/xml/keystyle_devanagari_sign_virama.xml @@ -22,14 +22,30 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+094D: "्" DEVANAGARI SIGN VIRAMA --> + <key-style + latin:styleName="moreKeysDevanagariSignVirama" + latin:moreKeys="◌्|्" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0905: "अ" DEVANAGARI LETTER A --> + <key-style + latin:styleName="moreKeysDevanagariSignVirama" + latin:moreKeys="अ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariSignVirama" /> + </default> + </switch> <!-- U+25CC: "◌" DOTTED CIRCLE U+094D: "्" DEVANAGARI SIGN VIRAMA --> <key-style latin:styleName="baseKeyDevanagariSignVirama" - latin:keyLabel="◌्" - latin:code="0x094D" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> - </merge> + latin:parentStyle="moreKeysDevanagariSignVirama" + latin:keySpec="◌्|्" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/keystyle_devanagari_sign_visarga.xml b/java/res/xml/keystyle_devanagari_sign_visarga.xml index cb294951f..d66e8e244 100644 --- a/java/res/xml/keystyle_devanagari_sign_visarga.xml +++ b/java/res/xml/keystyle_devanagari_sign_visarga.xml @@ -22,14 +22,11 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0903: "ः" DEVANAGARI SIGN VISARGA --> <key-style latin:styleName="baseKeyDevanagariSignVisarga" - latin:keyLabel="◌ः" - latin:code="0x0903" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ः|ः" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml index 2e78c53ec..6a62a1f1c 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml @@ -22,13 +22,9 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+093E/U+0902: "ां" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN ANUSVARA U+093E/U+0901: "ाँ" DEVANAGARI VOWEL SIGN AA/DEVANAGARI SIGN CANDRABINDU --> @@ -36,9 +32,21 @@ latin:styleName="moreKeysDevanagariVowelSignAa" latin:moreKeys="◌ां|ां,◌ाँ|ाँ,%" /> </case> - <default> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+093E: "ा" DEVANAGARI VOWEL SIGN AA --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAa" + latin:moreKeys="◌ा|ा,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0906: "आ" DEVANAGARI LETTER AA --> <key-style - latin:styleName="moreKeysDevanagariVowelSignAa" /> + latin:styleName="moreKeysDevanagariVowelSignAa" + latin:moreKeys="आ,%" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignAa" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -46,7 +54,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignAa" latin:parentStyle="moreKeysDevanagariVowelSignAa" - latin:keyLabel="◌ा" - latin:code="0x093E" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ा|ा" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml index 0554c0e15..53f831725 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml @@ -22,30 +22,36 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0948/U+0902: "ैं" DEVANAGARI VOWEL SIGN AI/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAi" latin:moreKeys="◌ैं|ैं,%" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0948: "ै" DEVANAGARI VOWEL SIGN AI --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAi" + latin:moreKeys="◌ै|ै,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0910: "ऐ" DEVANAGARI LETTER AI --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAi" + latin:moreKeys="ऐ,%" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAi" latin:moreKeys="श्र" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignAi" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignAi" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -53,7 +59,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignAi" latin:parentStyle="moreKeysDevanagariVowelSignAi" - latin:keyLabel="◌ै" - latin:code="0x0948" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ै|ै" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml index 29a11a82e..04f84562d 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml @@ -22,29 +22,36 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE - U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA --> + U+094C/U+0902: "ौं" DEVANAGARI VOWEL SIGN AU/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignAu" latin:moreKeys="◌ौं|ौं,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+094C: "ौ" DEVANAGARI VOWEL SIGN AU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAu" + latin:moreKeys="◌ौ|ौ,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0914: "औ" DEVANAGARI LETTER AU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignAu" + latin:moreKeys="औ,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignAu" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignAu" /> </default> </switch> <!-- U+094C: "ौ" DEVANAGARI VOWEL SIGN AU --> <key-style latin:styleName="baseKeyDevanagariVowelSignAu" latin:parentStyle="moreKeysDevanagariVowelSignAu" - latin:keyLabel="◌ौ" - latin:code="0x094C" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ौ|ौ" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_candra_e.xml b/java/res/xml/keystyle_devanagari_vowel_sign_candra_e.xml new file mode 100644 index 000000000..2f2998fb8 --- /dev/null +++ b/java/res/xml/keystyle_devanagari_vowel_sign_candra_e.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraE" + latin:moreKeys="◌ॅ|ॅ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090D: "ऍ" DEVANAGARI LETTER CANDRA E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraE" + latin:moreKeys="ऍ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignCandraE" /> + </default> + </switch> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0945: "ॅ" DEVANAGARI VOWEL SIGN CANDRA E --> + <key-style + latin:styleName="baseKeyDevanagariVowelSignCandraE" + latin:parentStyle="moreKeysDevanagariVowelSignCandraE" + latin:keySpec="◌ॅ|ॅ" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_candra_o.xml b/java/res/xml/keystyle_devanagari_vowel_sign_candra_o.xml new file mode 100644 index 000000000..c36e3fbac --- /dev/null +++ b/java/res/xml/keystyle_devanagari_vowel_sign_candra_o.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- The code point U+25CC for key label is needed because the font rendering system prior to + API version 16 can't automatically render dotted circle for incomplete combining letter + of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the + counterpart files named res/xml-v16/key_*.xml don't have this hack. --> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <switch> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraO" + latin:moreKeys="◌ॉ|ॉ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0911: "ऑ" DEVANAGARI LETTER CANDRA O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignCandraO" + latin:moreKeys="ऑ" /> + </case> + <default> + <key-style latin:styleName="moreKeysDevanagariVowelSignCandraO" /> + </default> + </switch> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O --> + <key-style + latin:styleName="baseKeyDevanagariVowelSignCandraO" + latin:parentStyle="moreKeysDevanagariVowelSignCandraO" + latin:keySpec="◌ॉ|ॉ" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml index edd29c791..481e53eb4 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml @@ -22,22 +22,29 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0947/U+0902: "ें" DEVANAGARI VOWEL SIGN E/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignE" latin:moreKeys="◌ें|ें" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0947: "े" DEVANAGARI VOWEL SIGN E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignE" + latin:moreKeys="◌े|े" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090F: "ए" DEVANAGARI LETTER SHORT E --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignE" + latin:moreKeys="ए" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0903: "ः" DEVANAGARI SIGN VISARGA U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> @@ -46,14 +53,14 @@ latin:moreKeys="◌ः|ः,ऽ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignE" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignE" /> </default> </switch> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0947: "े" DEVANAGARI VOWEL SIGN E --> <key-style latin:styleName="baseKeyDevanagariVowelSignE" latin:parentStyle="moreKeysDevanagariVowelSignE" - latin:keyLabel="◌े" - latin:code="0x0947" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌े|े" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml index 200fed29f..4b3a240b9 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml @@ -22,22 +22,30 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+093F/U+0902: "िं" DEVANAGARI VOWEL SIGN I/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignI" latin:moreKeys="ि◌ं|िं" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+093F: "ि" DEVANAGARI VOWEL SIGN I --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignI" + latin:moreKeys="◌ि|ि" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0907: "इ" DEVANAGARI LETTER I --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignI" + latin:moreKeys="इ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignI" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignI" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -45,7 +53,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignI" latin:parentStyle="moreKeysDevanagariVowelSignI" - latin:keyLabel="◌ि" - latin:code="0x093F" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ि|ि" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml index 6dc9951df..8ade6efc8 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml @@ -22,22 +22,30 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > - <!-- U+0940: "ी" DEVANAGARI VOWEL SIGN II + <case latin:keyboardLayoutSet="hindi"> + <!-- U+25CC: "◌" DOTTED CIRCLE U+0940/U+0902: "ीं" DEVANAGARI VOWEL SIGN II/DEVANAGARI SIGN ANUSVARA --> <key-style latin:styleName="moreKeysDevanagariVowelSignIi" latin:moreKeys="◌ीं|ीं,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0940: "ी" DEVANAGARI VOWEL SIGN II --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignIi" + latin:moreKeys="◌ी|ी,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0908: "ई" DEVANAGARI LETTER II --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignIi" + latin:moreKeys="ई,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignIi" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignIi" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -45,7 +53,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignIi" latin:parentStyle="moreKeysDevanagariVowelSignIi" - latin:keyLabel="◌ी" - latin:code="0x0940" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ी|ी" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml index 233ac8609..3afded426 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml @@ -22,24 +22,32 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE - U+094B/U+0902: "қं" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA + U+094B/U+0902: "ों" DEVANAGARI VOWEL SIGN O/DEVANAGARI SIGN ANUSVARA U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O U+094A: "ॊ" DEVANAGARI VOWEL SIGN SHORT O --> <key-style latin:styleName="moreKeysDevanagariVowelSignO" latin:moreKeys="◌ों|ों,◌ॉ|ॉ,◌ॊ|ॊ" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+094B: "ो" DEVANAGARI VOWEL SIGN O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignO" + latin:moreKeys="◌ो|ो" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0913: "ओ" DEVANAGARI LETTER O --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignO" + latin:moreKeys="ओ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignO" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignO" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -47,7 +55,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignO" latin:parentStyle="moreKeysDevanagariVowelSignO" - latin:keyLabel="◌ो" - latin:code="0x094B" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ो|ो" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml index 7291b7099..1eb19b573 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml @@ -22,13 +22,9 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0941/U+0902: "ुं" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN ANUSVARA U+0941/U+0901: "ुँ" DEVANAGARI VOWEL SIGN U/DEVANAGARI SIGN CANDRABINDU --> @@ -36,9 +32,21 @@ latin:styleName="moreKeysDevanagariVowelSignU" latin:moreKeys="◌ुं|ुं,◌ुँ|ुँ" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0941: "ु" DEVANAGARI VOWEL SIGN U --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignU" + latin:moreKeys="◌ु|ु" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0909: "उ" DEVANAGARI LETTER U --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignU" + latin:moreKeys="उ" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignU" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignU" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -46,7 +54,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignU" latin:parentStyle="moreKeysDevanagariVowelSignU" - latin:keyLabel="◌ु" - latin:code="0x0941" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ु|ु" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml index a95ab822d..0bb3426e4 100644 --- a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml @@ -22,13 +22,9 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0942/U+0902: "ूं" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN ANUSVARA U+0942/U+0901: "ूँ" DEVANAGARI VOWEL SIGN UU/DEVANAGARI SIGN CANDRABINDU --> @@ -36,9 +32,21 @@ latin:styleName="moreKeysDevanagariVowelSignUu" latin:moreKeys="◌ूं|ूं,◌ूँ|ूँ,%" /> </case> + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+25CC: "◌" DOTTED CIRCLE + U+0942: "ू" DEVANAGARI VOWEL SIGN UU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignUu" + latin:moreKeys="◌ू|ू,%" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+090A: "ऊ" DEVANAGARI LETTER UU --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignUu" + latin:moreKeys="ऊ,%" /> + </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignUu" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignUu" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE @@ -46,7 +54,6 @@ <key-style latin:styleName="baseKeyDevanagariVowelSignUu" latin:parentStyle="moreKeysDevanagariVowelSignUu" - latin:keyLabel="◌ू" - latin:code="0x0942" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="◌ू|ू" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml b/java/res/xml/keystyle_devanagari_vowel_sign_vocalic_r.xml index f150d7ed9..688826a43 100644 --- a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml +++ b/java/res/xml/keystyle_devanagari_vowel_sign_vocalic_r.xml @@ -22,37 +22,47 @@ API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts. The files named res/xml/key_*.xml have this U+25CC hack, although the counterpart files named res/xml-v16/key_*.xml don't have this hack. --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSet="hindi" - > + <case latin:keyboardLayoutSet="hindi"> <!-- U+25CC: "◌" DOTTED CIRCLE U+0944: "ॄ" DEVANAGARI VOWEL SIGN VOCALIC RR --> <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" latin:moreKeys="◌ॄ|ॄ" /> </case> - <case - latin:keyboardLayoutSet="nepali_traditional" - > + <case latin:keyboardLayoutSet="hindi_compact"> + <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R + U+25CC: "◌" DOTTED CIRCLE + U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignVocalicR" + latin:moreKeys="ऋ,◌ृ|ृ" /> + </case> + <case latin:keyboardLayoutSet="marathi"> + <!-- U+0931: "ऱ" DEVANAGARI LETTER RRA + U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R + U+25CC: "◌" DOTTED CIRCLE + U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> + <key-style + latin:styleName="moreKeysDevanagariVowelSignVocalicR" + latin:moreKeys="ऱ,ऋ,◌ृ|ृ" /> + </case> + <case latin:keyboardLayoutSet="nepali_traditional"> <!-- U+0913: "ओ" DEVANAGARI LETTER O --> <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" latin:moreKeys="ओ" /> </case> <default> - <key-style - latin:styleName="moreKeysDevanagariVowelSignVocalicR" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignVocalicR" /> </default> </switch> <!-- U+25CC: "◌" DOTTED CIRCLE U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R --> - <Key - latin:keyStyle="moreKeysDevanagariVowelSignVocalicR" - latin:keyLabel="◌ृ" - latin:code="0x0943" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + <key-style + latin:styleName="baseKeyDevanagariVowelSignVocalicR" + latin:parentStyle="moreKeysDevanagariVowelSignVocalicR" + latin:keySpec="◌ृ|ृ" + latin:keyLabelFlags="followKeyLetterRatio" /> </merge> diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml index 0a27da93f..67be24256 100644 --- a/java/res/xml/method.xml +++ b/java/res/xml/method.xml @@ -24,54 +24,65 @@ keyboard_locale: script_name/keyboard_layout_set af: Afrikaans/qwerty ar: Arabic/arabic - (az: Azerbaijani/qwerty) # disabled temporarily. waiting for string resources. - be: Belarusian/east_slavic + az_AZ: Azerbaijani (Azerbaijan)/qwerty + be_BY: Belarusian (Belarus)/east_slavic bg: Bulgarian/bulgarian bg: Bulgarian/bulgarian_bds + (bn_IN: Bengali (India)/bengali) # This is a preliminary keyboard layout. ca: Catalan/spanish cs: Czech/qwertz da: Danish/nordic de: German/qwertz + de_CH: German (Switzerland)/swiss el: Greek/greek - en_US: English United States/qwerty - en_GB: English Great Britain/qwerty + en_IN: English (India)/qwerty + en_US: English (United States)/qwerty + en_GB: English (Great Britain)/qwerty eo: Esperanto/spanish es: Spanish/spanish - es_US: Spanish United States/spanish - (es_419: Spanish Latin America/qwerty) - et_EE: Estonian/nordic - fa: Persian/arabic + es_US: Spanish (United States)/spanish + es_419: Spanish (Latin America)/spanish + et_EE: Estonian (Estonia)/nordic + eu_ES: Basque (Spain)/spanish + fa: Persian/farsi fi: Finnish/nordic fr: French/azerty - fr_CA: French Canada/qwerty + fr_CA: French (Canada)/qwerty + fr_CH: French (Switzerland)/swiss + gl_ES: Galician (Spain)/spanish hi: Hindi/hindi + (hi: Hindi/hindi_compact) # This is a preliminary keyboard layout. hr: Croatian/qwertz hu: Hungarian/qwertz - hy_AM: Armenian Phonetic/armenian_phonetic - in: Indonesian/qwerty # "id" is official language code of Indonesian. + hy_AM: Armenian (Armenia) Phonetic/armenian_phonetic + in: Indonesian/qwerty # "id" is the official language code of Indonesian. is: Icelandic/qwerty it: Italian/qwerty - iw: Hebrew/hebrew # "he" is official language code of Hebrew. - ka_GE: Georgian/georgian - (kk: Kazakh/east_slavic) # disabled temporarily. waiting for string resources. - km_KH: Khmer/khmer + it_CH: Italian (Switzerland)/swiss + iw: Hebrew/hebrew # "he" is the official language code of Hebrew. + ka_GE: Georgian (Georgia)/georgian + kk: Kazakh/east_slavic + km_KH: Khmer (Cambodia)/khmer ky: Kyrgyz/east_slavic - lo_LA: Lao/lao + lo_LA: Lao (Laos)/lao lt: Lithuanian/qwerty lv: Latvian/qwerty mk: Macedonian/south_slavic - mn_MN: Mongolian/mongolian - ms_MY: Malay/qwerty + mn_MN: Mongolian (Mongolia)/mongolian + (mr_IN: Marathi (India)/marathi) # This is a preliminary keyboard layout. + ms_MY: Malay (Malaysia)/qwerty + (my_MM: Myanmar (Myanmar)/myanmar) # This is a preliminary keyboard layout. nb: Norwegian Bokmål/nordic - (ne: Nepali Romanized/nepali_romanized) # disabled temporarily - (ne: Nepali Traditional/nepali_traditional) # disabled temporarily + ne_NP: Nepali (Nepal) Romanized/nepali_romanized + ne_NP: Nepali (Nepal) Traditional/nepali_traditional nl: Dutch/qwerty - nl_BE: Dutch Belgium/azerty + nl_BE: Dutch (Belgium)/azerty pl: Polish/qwerty - pt_BR: Portuguese Brazil/qwerty - pt_PT: Portuguese Portugal/qwerty + pt_BR: Portuguese (Brazil)/qwerty + pt_PT: Portuguese (Portugal)/qwerty ro: Romanian/qwerty ru: Russian/east_slavic + (si_LK: Sinhala (Sri Lanka)/sinhala) # This is a preliminary keyboard layout. sk: Slovak/qwerty sl: Slovenian/qwerty sr: Serbian/south_slavic @@ -88,19 +99,22 @@ (zz: Emoji/emoji) --> <!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. --> +<!-- TODO: Remove "AsciiCapable" from the extra values when we can stop supporting JB-MR1 --> <!-- Note: SupportTouchPositionCorrection extra value is obsolete and maintained for backward compatibility. --> <!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default subtype.--> <input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.android.inputmethod.latin.settings.SettingsActivity" - android:isDefault="@bool/im_is_default"> + android:isDefault="@bool/im_is_default" + android:supportsSwitchingToNextInputMethod="true"> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_en_US" android:subtypeId="0xc9194f98" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_en_GB" @@ -108,6 +122,7 @@ android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="TrySuppressingImeSwitcher,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -115,6 +130,7 @@ android:imeSubtypeLocale="af" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -122,22 +138,23 @@ android:imeSubtypeLocale="ar" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="false" /> - <!-- <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0x70b0f974" - android:imeSubtypeLocale="az" + android:imeSubtypeLocale="az_AZ" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> - --> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0x1dc3a859" - android:imeSubtypeLocale="be" + android:imeSubtypeLocale="be_BY" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -145,6 +162,7 @@ android:imeSubtypeLocale="bg" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_bulgarian_bds" @@ -152,6 +170,17 @@ android:imeSubtypeLocale="bg" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian_bds,EmojiCapable" + android:isAsciiCapable="false" + /> + <!-- TODO: This bengali keyboard is a preliminary layout. + This isn't based on the final specification. --> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0xbff5986c" + android:imeSubtypeLocale="bn_IN" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -159,6 +188,7 @@ android:imeSubtypeLocale="ca" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -166,6 +196,7 @@ android:imeSubtypeLocale="cs" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -173,6 +204,7 @@ android:imeSubtypeLocale="da" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -180,6 +212,15 @@ android:imeSubtypeLocale="de" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0x7acfd0aa" + android:imeSubtypeLocale="de_CH" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -187,6 +228,15 @@ android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=greek,EmojiCapable" + android:isAsciiCapable="false" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0x8d58fc2d" + android:imeSubtypeLocale="en_IN" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -194,6 +244,7 @@ android:imeSubtypeLocale="eo" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -201,6 +252,7 @@ android:imeSubtypeLocale="es" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_es_US" @@ -208,22 +260,31 @@ android:imeSubtypeLocale="es_US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> - <!-- <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" - android:subtypeId="0x623f9286" + android:subtypeId="0xa23e5d19" android:imeSubtypeLocale="es_419" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> - --> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0xec2d3955" android:imeSubtypeLocale="et_EE" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=nordic,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0x070e5c07" + android:imeSubtypeLocale="eu_ES" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -231,6 +292,7 @@ android:imeSubtypeLocale="fa" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=farsi,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -238,6 +300,7 @@ android:imeSubtypeLocale="fi" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -245,6 +308,7 @@ android:imeSubtypeLocale="fr" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -252,6 +316,23 @@ android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0xeadc55f5" + android:imeSubtypeLocale="fr_CH" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0xb939573c" + android:imeSubtypeLocale="gl_ES" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -259,6 +340,17 @@ android:imeSubtypeLocale="hi" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi,EmojiCapable" + android:isAsciiCapable="false" + /> + <!-- TODO: This hindi_compact keyboard is a preliminary layout. + This isn't based on the final specification. --> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic_compact" + android:subtypeId="0xe49c89a1" + android:imeSubtypeLocale="hi" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi_compact,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -266,6 +358,7 @@ android:imeSubtypeLocale="hr" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -273,6 +366,7 @@ android:imeSubtypeLocale="hu" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -280,6 +374,7 @@ android:imeSubtypeLocale="hy_AM" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=armenian_phonetic,EmojiCapable" + android:isAsciiCapable="false" /> <!-- Java uses the deprecated "in" code instead of the standard "id" code for Indonesian. --> <subtype android:icon="@drawable/ic_ime_switcher_dark" @@ -288,6 +383,7 @@ android:imeSubtypeLocale="in" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -295,6 +391,7 @@ android:imeSubtypeLocale="is" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -302,6 +399,15 @@ android:imeSubtypeLocale="it" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" + /> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0xd914fe1a" + android:imeSubtypeLocale="it_CH" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=swiss,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <!-- Java uses the deprecated "iw" code instead of the standard "he" code for Hebrew. --> <subtype android:icon="@drawable/ic_ime_switcher_dark" @@ -310,6 +416,7 @@ android:imeSubtypeLocale="iw" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -317,22 +424,23 @@ android:imeSubtypeLocale="ka_GE" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=georgian,EmojiCapable" + android:isAsciiCapable="false" /> - <!-- <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0x2d73d2f6" android:imeSubtypeLocale="kk" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable" + android:isAsciiCapable="false" /> - --> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0x1365683a" android:imeSubtypeLocale="km_KH" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=khmer,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -340,6 +448,7 @@ android:imeSubtypeLocale="ky" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -347,6 +456,7 @@ android:imeSubtypeLocale="lo_LA" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=lao,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -354,6 +464,7 @@ android:imeSubtypeLocale="lt" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -361,6 +472,7 @@ android:imeSubtypeLocale="lv" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -368,6 +480,7 @@ android:imeSubtypeLocale="mk" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=south_slavic,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -375,6 +488,17 @@ android:imeSubtypeLocale="mn_MN" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=mongolian,EmojiCapable" + android:isAsciiCapable="false" + /> + <!-- TODO: This marathi keyboard is a preliminary layout. + This isn't based on the final specification. --> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0x747b9f03" + android:imeSubtypeLocale="mr_IN" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=marathi,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -382,6 +506,17 @@ android:imeSubtypeLocale="ms_MY" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" + /> + <!-- TODO: This Myanmar keyboard is a preliminary layout. + This isn't based on the final specification. --> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0xea266ea4" + android:imeSubtypeLocale="my_MM" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=myanmar,EmojiCapable,CombiningRules=MyanmarReordering" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -389,29 +524,31 @@ android:imeSubtypeLocale="nb" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> - <!-- <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0xd80a4cee" - android:imeSubtypeLocale="ne" + android:imeSubtypeLocale="ne_NP" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=nepali_romanized,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" - android:label="@string/subtype_nepali_traditional" + android:label="@string/subtype_generic_traditional" android:subtypeId="0x5fafea88" - android:imeSubtypeLocale="ne" + android:imeSubtypeLocale="ne_NP" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=nepali_traditional,EmojiCapable" + android:isAsciiCapable="false" /> - --> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" android:subtypeId="0x3f9fd91e" android:imeSubtypeLocale="nl" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -419,6 +556,7 @@ android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=azerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -426,6 +564,7 @@ android:imeSubtypeLocale="pl" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -433,6 +572,7 @@ android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -440,6 +580,7 @@ android:imeSubtypeLocale="pt_PT" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -447,6 +588,7 @@ android:imeSubtypeLocale="ro" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -454,6 +596,17 @@ android:imeSubtypeLocale="ru" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="false" + /> + <!-- TODO: This sinhala keyboard is a preliminary layout. + This isn't based on the final specification. --> + <subtype android:icon="@drawable/ic_ime_switcher_dark" + android:label="@string/subtype_generic" + android:subtypeId="0x5c6b3bde" + android:imeSubtypeLocale="si_LK" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=sinhala,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -461,6 +614,7 @@ android:imeSubtypeLocale="sk" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -468,6 +622,7 @@ android:imeSubtypeLocale="sl" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -475,6 +630,7 @@ android:imeSubtypeLocale="sr" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="false" /> <!-- TODO: Uncomment once we can handle IETF language tag with script name specified. <subtype android:icon="@drawable/ic_ime_switcher_dark" @@ -483,6 +639,7 @@ android:imeSubtypeLocale="sr" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_serbian_latin" @@ -490,6 +647,7 @@ android:imeSubtypeLocale="sr-Latn" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> --> <subtype android:icon="@drawable/ic_ime_switcher_dark" @@ -498,6 +656,7 @@ android:imeSubtypeLocale="sv" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -505,6 +664,7 @@ android:imeSubtypeLocale="sw" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -512,6 +672,7 @@ android:imeSubtypeLocale="th" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=thai,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -519,6 +680,7 @@ android:imeSubtypeLocale="tl" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=spanish,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -526,6 +688,7 @@ android:imeSubtypeLocale="tr" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -533,6 +696,7 @@ android:imeSubtypeLocale="uk" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic,EmojiCapable" + android:isAsciiCapable="false" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -540,6 +704,7 @@ android:imeSubtypeLocale="vi" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_generic" @@ -547,6 +712,7 @@ android:imeSubtypeLocale="zu" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <subtype android:icon="@drawable/ic_ime_switcher_dark" android:label="@string/subtype_no_language_qwerty" @@ -554,6 +720,7 @@ android:imeSubtypeLocale="zz" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EnabledWhenDefaultIsNotAsciiCapable,EmojiCapable" + android:isAsciiCapable="true" /> <!-- Emoji subtype has to be an addtional subtype added at boot time because ICS doesn't support Emoji. --> @@ -564,6 +731,7 @@ android:imeSubtypeLocale="zz" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=emoji,EmojiCapable" + android:isAsciiCapable="false" /> --> </input-method> diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index bf3b62353..e71d9517c 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -18,15 +18,21 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" android:key="english_ime_settings"> - <PreferenceCategory - android:title="@string/general_category" - android:key="general_settings"> + <PreferenceScreen + android:title="@string/settings_screen_input" + android:key="screen_input"> <CheckBoxPreference android:key="auto_cap" android:title="@string/auto_cap" android:summary="@string/auto_cap_summary" - android:persistent="true" - android:defaultValue="true" /> + android:defaultValue="true" + android:persistent="true" /> + <CheckBoxPreference + android:key="pref_key_use_double_space_period" + android:title="@string/use_double_space_period" + android:summary="@string/use_double_space_period_summary" + android:defaultValue="true" + android:persistent="true" /> <CheckBoxPreference android:key="vibrate_on" android:title="@string/vibrate_on_keypress" @@ -40,17 +46,67 @@ <CheckBoxPreference android:key="popup_on" android:title="@string/popup_on_keypress" - android:persistent="true" - android:defaultValue="@bool/config_default_key_preview_popup" /> + android:defaultValue="@bool/config_default_key_preview_popup" + android:persistent="true" /> <CheckBoxPreference android:key="pref_voice_input_key" android:title="@string/voice_input" - android:persistent="true" - android:defaultValue="true" /> - </PreferenceCategory> - <PreferenceCategory - android:title="@string/correction_category" - android:key="correction_settings"> + android:defaultValue="true" + android:persistent="true" /> + </PreferenceScreen> + <ListPreference + android:key="pref_keyboard_theme" + android:title="@string/keyboard_theme" + android:entryValues="@array/keyboard_theme_ids" + android:entries="@array/keyboard_theme_names" + android:persistent="true" /> + <PreferenceScreen + android:title="@string/settings_screen_multi_lingual" + android:key="screen_multi_lingual"> + <CheckBoxPreference + android:key="pref_show_language_switch_key" + android:title="@string/show_language_switch_key" + android:summary="@string/show_language_switch_key_summary" + android:defaultValue="true" + android:persistent="true" /> + <CheckBoxPreference + android:key="pref_include_other_imes_in_language_switch_list" + android:dependency="pref_show_language_switch_key" + android:title="@string/include_other_imes_in_language_switch_list" + android:summary="@string/include_other_imes_in_language_switch_list_summary" + android:defaultValue="false" + android:persistent="true" /> + <PreferenceScreen + android:fragment="com.android.inputmethod.latin.settings.AdditionalSubtypeSettings" + android:key="custom_input_styles" + android:title="@string/custom_input_styles_title" /> + </PreferenceScreen> + <PreferenceScreen + android:title="@string/settings_screen_gesture" + android:key="screen_gesture"> + <CheckBoxPreference + android:key="gesture_input" + android:title="@string/gesture_input" + android:summary="@string/gesture_input_summary" + android:defaultValue="true" + android:persistent="true" /> + <CheckBoxPreference + android:key="pref_gesture_floating_preview_text" + android:dependency="gesture_input" + android:title="@string/gesture_floating_preview_text" + android:summary="@string/gesture_floating_preview_text_summary" + android:defaultValue="true" + android:persistent="true" /> + <CheckBoxPreference + android:key="pref_gesture_preview_trail" + android:dependency="gesture_input" + android:title="@string/gesture_preview_trail" + android:defaultValue="true" + android:persistent="true" /> + </PreferenceScreen> + <PreferenceScreen + android:title="@string/settings_screen_correction" + android:key="screen_correction"> <PreferenceScreen android:key="edit_personal_dictionary" android:title="@string/edit_personal_dictionary"> @@ -71,137 +127,74 @@ android:key="pref_key_block_potentially_offensive" android:title="@string/prefs_block_potentially_offensive_title" android:summary="@string/prefs_block_potentially_offensive_summary" - android:persistent="true" - android:defaultValue="@bool/config_block_potentially_offensive" /> + android:defaultValue="@bool/config_block_potentially_offensive" + android:persistent="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" /> + android:defaultValue="@string/auto_correction_threshold_mode_index_modest" + android:persistent="true" /> <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" /> - </PreferenceCategory> - <PreferenceCategory - android:title="@string/gesture_typing_category" - android:key="gesture_typing_settings"> - <CheckBoxPreference - android:key="gesture_input" - android:title="@string/gesture_input" - android:summary="@string/gesture_input_summary" - android:persistent="true" - android:defaultValue="true" /> - <!-- TODO: Move these two options to the advanced settings. --> + android:defaultValue="@string/prefs_suggestion_visibility_default_value" + android:persistent="true" /> <CheckBoxPreference - android:key="pref_gesture_floating_preview_text" - android:dependency="gesture_input" - android:title="@string/gesture_floating_preview_text" - android:summary="@string/gesture_floating_preview_text_summary" - android:persistent="true" - android:defaultValue="true" /> + android:key="pref_key_use_personalized_dicts" + android:title="@string/use_personalized_dicts" + android:summary="@string/use_personalized_dicts_summary" + android:defaultValue="true" + android:persistent="true" /> <CheckBoxPreference - android:key="pref_gesture_preview_trail" - android:dependency="gesture_input" - android:title="@string/gesture_preview_trail" - android:persistent="true" - android:defaultValue="true" /> - </PreferenceCategory> - <PreferenceCategory - android:title="@string/misc_category" - android:key="misc_settings"> + android:key="pref_key_use_contacts_dict" + android:title="@string/use_contacts_dict" + android:summary="@string/use_contacts_dict_summary" + android:defaultValue="true" + android:persistent="true" /> <CheckBoxPreference android:key="next_word_prediction" android:title="@string/bigram_prediction" android:summary="@string/bigram_prediction_summary" - android:persistent="true" - android:defaultValue="true" /> - <PreferenceScreen - android:key="pref_advanced_settings" - android:title="@string/advanced_settings" - android:summary="@string/advanced_settings_summary"> - <CheckBoxPreference - android:key="pref_key_use_contacts_dict" - android:title="@string/use_contacts_dict" - android:summary="@string/use_contacts_dict_summary" - android:persistent="true" - android:defaultValue="true" /> - <CheckBoxPreference - android:key="pref_key_use_double_space_period" - android:title="@string/use_double_space_period" - android:summary="@string/use_double_space_period_summary" - android:persistent="true" - android:defaultValue="true" /> - <CheckBoxPreference - android:key="pref_show_language_switch_key" - android:title="@string/show_language_switch_key" - android:summary="@string/show_language_switch_key_summary" - android:persistent="true" - android:defaultValue="true" /> - <CheckBoxPreference - android:key="pref_include_other_imes_in_language_switch_list" - android:title="@string/include_other_imes_in_language_switch_list" - android:summary="@string/include_other_imes_in_language_switch_list_summary" - android:persistent="true" - android:defaultValue="false" /> - <!-- Values for popup dismiss delay are added programmatically --> - <CheckBoxPreference - android:key="pref_sliding_key_input_preview" - android:title="@string/sliding_key_input_preview" - android:summary="@string/sliding_key_input_preview_summary" - android:persistent="true" - android:defaultValue="true" /> - <ListPreference - android:key="pref_keyboard_layout_20110916" - android:title="@string/keyboard_color_scheme" - android:persistent="true" - android:entryValues="@array/keyboard_color_schemes_values" - android:entries="@array/keyboard_color_schemes" - android:defaultValue="@string/config_default_keyboard_theme_index" /> - <PreferenceScreen - android:fragment="com.android.inputmethod.latin.settings.AdditionalSubtypeSettings" - android:key="custom_input_styles" - android:title="@string/custom_input_styles_title" /> - <ListPreference - android:key="pref_key_preview_popup_dismiss_delay" - android:title="@string/key_preview_popup_dismiss_delay" /> - <com.android.inputmethod.latin.settings.SeekBarDialogPreference - android:key="pref_key_longpress_timeout" - android:title="@string/prefs_key_longpress_timeout_settings" - latin:minValue="@integer/config_min_longpress_timeout" - latin:maxValue="@integer/config_max_longpress_timeout" - latin:stepValue="@integer/config_longpress_timeout_step" /> - <com.android.inputmethod.latin.settings.SeekBarDialogPreference - android:key="pref_vibration_duration_settings" - android:title="@string/prefs_keypress_vibration_duration_settings" - latin:maxValue="@integer/config_max_vibration_duration" /> - <com.android.inputmethod.latin.settings.SeekBarDialogPreference - android:key="pref_keypress_sound_volume" - android:title="@string/prefs_keypress_sound_volume_settings" - latin:maxValue="100" /> <!-- percent --> - <!-- The settigs for showing setup wizard application icon shouldn't be persistent and - the default value is added programmatically. --> - <CheckBoxPreference - android:key="pref_show_setup_wizard_icon" - android:title="@string/show_setup_wizard_icon" - android:summary="@string/show_setup_wizard_icon_summary" /> + android:defaultValue="true" + android:persistent="true" /> </PreferenceScreen> + <PreferenceScreen + android:title="@string/settings_screen_advanced" + android:key="screen_advanced"> + <!-- TODO: consolidate key preview dismiss delay with the key preview animation parameters. --> + <ListPreference + android:key="pref_key_preview_popup_dismiss_delay" + android:title="@string/key_preview_popup_dismiss_delay" /> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_vibration_duration_settings" + android:title="@string/prefs_keypress_vibration_duration_settings" + latin:maxValue="@integer/config_max_vibration_duration" /> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_keypress_sound_volume" + android:title="@string/prefs_keypress_sound_volume_settings" + latin:maxValue="100" /> <!-- percent --> + <!-- The settigs for showing setup wizard application icon shouldn't be persistent and + the default value is added programmatically. --> + <CheckBoxPreference + android:key="pref_show_setup_wizard_icon" + android:title="@string/show_setup_wizard_icon" + android:summary="@string/show_setup_wizard_icon_summary" /> + <!-- title will be set programmatically to embed application name --> + <CheckBoxPreference + android:key="pref_enable_metrics_logging" + android:summary="@string/enable_metrics_logging_summary" + android:defaultValue="true" + android:persistent="true" /> <PreferenceScreen - android:key="send_feedback" - android:title="@string/send_feedback" /> - <PreferenceScreen - android:key="about_keyboard" /> - <PreferenceScreen - android:key="debug_settings" + android:key="screen_debug" android:title="Debug settings" - android:persistent="true" - android:defaultValue="false" /> - </PreferenceCategory> + android:defaultValue="false" + android:persistent="true" /> + </PreferenceScreen> </PreferenceScreen> diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml index 8d9508e38..ae29a8a82 100644 --- a/java/res/xml/prefs_for_debug.xml +++ b/java/res/xml/prefs_for_debug.xml @@ -14,51 +14,55 @@ limitations under the License. --> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - android:title="@string/prefs_debug_mode" - android:key="english_ime_debug_settings"> - - <CheckBoxPreference - android:key="enable_logging" - android:title="@string/prefs_enable_log" - android:summary="@string/prefs_description_log" - android:persistent="true" - android:defaultValue="false" /> - - <ListPreference - android:key="pref_keyboard_layout_20110916" - android:title="@string/keyboard_layout" - android:summary="%s" - android:persistent="true" - android:entryValues="@array/keyboard_layout_modes_values" - android:entries="@array/keyboard_layout_modes" - android:defaultValue="@string/config_default_keyboard_theme_index" /> - - <CheckBoxPreference - android:key="debug_mode" - android:title="@string/prefs_debug_mode" - android:persistent="true" - android:defaultValue="false" /> - +<PreferenceScreen + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" + android:title="@string/prefs_debug_mode" + android:key="english_ime_debug_settings" +> <CheckBoxPreference - android:key="force_non_distinct_multitouch" - android:title="@string/prefs_force_non_distinct_multitouch" - android:persistent="true" - android:defaultValue="false" /> - - <CheckBoxPreference - android:key="usability_study_mode" - android:title="@string/prefs_usability_study_mode" - android:persistent="true" - android:defaultValue="false" /> - + android:key="debug_mode" + android:title="@string/prefs_debug_mode" + android:defaultValue="false" + android:persistent="true" /> <CheckBoxPreference + android:key="force_non_distinct_multitouch" + android:title="@string/prefs_force_non_distinct_multitouch" android:defaultValue="false" - android:key="use_only_personalization_dictionary_for_debug" - android:persistent="true" - android:title="@string/prefs_use_only_personalization_dictionary" /> - + android:persistent="true" /> + <CheckBoxPreference + android:key="pref_sliding_key_input_preview" + android:title="@string/sliding_key_input_preview" + android:summary="@string/sliding_key_input_preview_summary" + android:defaultValue="true" + android:persistent="true" /> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_key_longpress_timeout" + android:title="@string/prefs_key_longpress_timeout_settings" + latin:minValue="@integer/config_min_longpress_timeout" + latin:maxValue="@integer/config_max_longpress_timeout" + latin:stepValue="@integer/config_longpress_timeout_step" /> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_key_preview_show_up_start_scale" + android:title="@string/prefs_key_popup_show_up_start_scale_settings" + latin:maxValue="100" /> <!-- percent --> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_key_preview_dismiss_end_scale" + android:title="@string/prefs_key_popup_dismiss_end_scale_settings" + latin:maxValue="100" /> <!-- percent --> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_key_preview_show_up_duration" + android:title="@string/prefs_key_popup_show_up_duration_settings" + latin:maxValue="100" /> <!-- milliseconds --> + <com.android.inputmethod.latin.settings.SeekBarDialogPreference + android:key="pref_key_preview_dismiss_duration" + android:title="@string/prefs_key_popup_dismiss_duration_settings" + latin:maxValue="100" /> <!-- milliseconds --> <PreferenceScreen android:key="read_external_dictionary" android:title="@string/prefs_read_external_dictionary" /> + <PreferenceCategory + android:key="pref_key_dump_dictionaries" + android:title="@string/prefs_dump_dynamic_dicts"> + </PreferenceCategory> </PreferenceScreen> diff --git a/java/res/xml/row_dvorak4.xml b/java/res/xml/row_dvorak4.xml index b78872fe4..e7a3ee736 100644 --- a/java/res/xml/row_dvorak4.xml +++ b/java/res/xml/row_dvorak4.xml @@ -28,17 +28,16 @@ latin:keyStyle="toSymbolKeyStyle" latin:keyWidth="15%p" /> <Key - latin:keyLabel="q" + latin:keySpec="q" latin:backgroundType="normal" - latin:additionalMoreKeys="!text/shortcut_as_more_key" - latin:keyStyle="f1MoreKeysStyle" /> + latin:keyStyle="settingsMoreKeysStyle" /> <include latin:keyXPos="25%p" latin:keyboardLayout="@xml/key_space_5kw" /> <Key - latin:keyLabel="z" + latin:keySpec="z" latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_punctuation,!text/more_keys_for_z" /> + latin:moreKeys="!text/morekeys_punctuation,!text/morekeys_z" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> diff --git a/java/res/xml/row_pcqwerty5.xml b/java/res/xml/row_pcqwerty5.xml index 4ec908ba1..32c5389cc 100644 --- a/java/res/xml/row_pcqwerty5.xml +++ b/java/res/xml/row_pcqwerty5.xml @@ -24,23 +24,14 @@ <Row latin:keyWidth="7.692%p" > - <Spacer - latin:keyWidth="11.538%p" /> <switch> <case - latin:shortcutKeyEnabled="true" - > - <Key - latin:keyStyle="shortcutKeyStyle" - latin:keyWidth="11.538%p" /> - </case> - <case latin:clobberSettingsKey="false" > <Key latin:keyStyle="settingsKeyStyle" latin:keyWidth="11.538%p" /> - </case> + </case> </switch> <switch> <case @@ -48,33 +39,23 @@ > <Key latin:keyStyle="languageSwitchKeyStyle" + latin:keyXPos="19.231%p" latin:keyWidth="11.538%p" /> <Key latin:keyStyle="spaceKeyStyle" - latin:keyWidth="38.464%p" /> - </case> + latin:keyWidth="42.308%p" /> + </case> <!-- languageSwitchKeyEnabled="false" --> <default> <Key latin:keyStyle="spaceKeyStyle" - latin:keyWidth="50.002%p" /> + latin:keyXPos="26.923%p" + latin:keyWidth="46.154%p" /> </default> </switch> <Key - latin:keyStyle="defaultEnterKeyStyle" - latin:keyWidth="15.384%p" /> - <switch> - <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" - > - <Spacer /> - </case> - <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> - <default> - <Key - latin:keyStyle="emojiKeyStyle" - latin:keyWidth="fillRight" /> - </default> - </switch> + latin:keyStyle="enterKeyStyle" + latin:keyXPos="-19.231%p" + latin:keyWidth="fillRight" /> </Row> </merge> diff --git a/java/res/xml/row_qwerty4.xml b/java/res/xml/row_qwerty4.xml index 578bc1234..509092d96 100644 --- a/java/res/xml/row_qwerty4.xml +++ b/java/res/xml/row_qwerty4.xml @@ -32,36 +32,8 @@ <include latin:keyXPos="25%p" latin:keyboardLayout="@xml/key_space_5kw" /> - <switch> - <case - latin:languageCode="ar|fa" - > - <Key - latin:keyHintLabel="!text/keyhintlabel_for_arabic_diacritics" - latin:keyLabelFlags="hasPopupHint|hasShiftedLetterHint" - latin:moreKeys="!text/more_keys_for_arabic_diacritics" - latin:keyStyle="punctuationKeyStyle" /> - </case> - <case - latin:languageCode="ne" - latin:keyboardLayoutSet="nepali_traditional" - > - <include - latin:keyboardLayout="@xml/key_nepali_traditional_period" /> - </case> - <case - latin:languageCode="hy" - > - <!-- U+0589: "։" ARMENIAN FULL STOP --> - <Key - latin:keyLabel="։" - latin:keyStyle="punctuationKeyStyle" /> - </case> - <default> - <Key - latin:keyStyle="punctuationKeyStyle" /> - </default> - </switch> + <include + latin:keyboardLayout="@xml/key_period" /> <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> diff --git a/java/res/xml/row_symbols4.xml b/java/res/xml/row_symbols4.xml index fbfdc5f72..2be03bd6d 100644 --- a/java/res/xml/row_symbols4.xml +++ b/java/res/xml/row_symbols4.xml @@ -19,24 +19,16 @@ --> <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:backgroundType="functional" - latin:keyLabel="_" /> + latin:keySpec="!text/keyspec_comma" /> <Key - latin:backgroundType="functional" - latin:keyLabel="/" /> - - <switch> - <case latin:hasShortcutKey="true" > - <Key latin:keyStyle="shortcutKeyStyle" /> - </case> - <!-- latin:hasShortcutKey="false" --> - <default> - </default> - </switch> - - <include latin:keyboardLayout="@xml/key_space_symbols" /> - <include latin:keyboardLayout="@xml/keys_comma_period" /> - + latin:keySpec="_" /> + <include + latin:keyboardLayout="@xml/key_space_symbols" /> + <Key + latin:keySpec="/" /> + <!-- U+2026: "…" HORIZONTAL ELLIPSIS --> + <Key + latin:keySpec="." + latin:moreKeys="…" /> </merge> diff --git a/java/res/xml/row_symbols_shift4.xml b/java/res/xml/row_symbols_shift4.xml index 0909374f4..4fc63c2c5 100644 --- a/java/res/xml/row_symbols_shift4.xml +++ b/java/res/xml/row_symbols_shift4.xml @@ -18,9 +18,18 @@ */ --> <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - - <include latin:keyboardLayout="@xml/keys_less_greater" /> + <include + latin:keyboardLayout="@xml/key_styles_less_greater" /> + <Key + latin:keySpec="!text/keyspec_comma" /> + <Key + latin:keyStyle="lessKeyStyle" /> <include latin:keyboardLayout="@xml/key_space_symbols" /> - <include latin:keyboardLayout="@xml/keys_comma_period" /> + <Key + latin:keyStyle="greaterKeyStyle" /> + <!-- U+2026: "…" HORIZONTAL ELLIPSIS --> + <Key + latin:keySpec="." + latin:moreKeys="…" /> </merge> diff --git a/java/res/xml/rowkeys_arabic1.xml b/java/res/xml/rowkeys_arabic1.xml index 3c0acf112..9f83fef50 100644 --- a/java/res/xml/rowkeys_arabic1.xml +++ b/java/res/xml/rowkeys_arabic1.xml @@ -18,95 +18,82 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0636: "ض" ARABIC LETTER DAD U+0661: "١" ARABIC-INDIC DIGIT ONE --> <Key - latin:keyLabel="ض" + latin:keySpec="ض" latin:keyHintLabel="1" - latin:additionalMoreKeys="1,١" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="1,١" /> <!-- U+0635: "ص" ARABIC LETTER SAD U+0662: "٢" ARABIC-INDIC DIGIT TWO --> <Key - latin:keyLabel="ص" + latin:keySpec="ص" latin:keyHintLabel="2" - latin:additionalMoreKeys="2,٢" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="2,٢" /> <!-- U+062B: "ث" ARABIC LETTER THEH U+0663: "٣" ARABIC-INDIC DIGIT THREE --> <Key - latin:keyLabel="ث" + latin:keySpec="ث" latin:keyHintLabel="3" - latin:additionalMoreKeys="3,٣" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="3,٣" /> <!-- U+0642: "ق" ARABIC LETTER QAF - U+06A8: "ڨ" ARABIC LETTER QAF WITH THREE DOTS ABOVE - U+0664: "٤" ARABIC-INDIC DIGIT FOUR --> + U+0664: "٤" ARABIC-INDIC DIGIT FOUR + U+06A8: "ڨ" ARABIC LETTER QAF WITH THREE DOTS ABOVE --> <!-- TODO: DroidSansArabic lacks the glyph of U+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE --> <Key - latin:keyLabel="ق" + latin:keySpec="ق" latin:keyHintLabel="4" latin:additionalMoreKeys="4,٤" - latin:moreKeys="ڨ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ڨ" /> <!-- U+0641: "ف" ARABIC LETTER FEH + U+0665: "٥" ARABIC-INDIC DIGIT FIVE U+06A4: "ڤ" ARABIC LETTER VEH U+06A2: "ڢ" ARABIC LETTER FEH WITH DOT MOVED BELOW - U+06A5: "ڥ" ARABIC LETTER FEH WITH THREE DOTS BELOW - U+0665: "٥" ARABIC-INDIC DIGIT FIVE --> + U+06A5: "ڥ" ARABIC LETTER FEH WITH THREE DOTS BELOW --> <!-- TODO: DroidSansArabic lacks the glyph of U+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW --> <!-- TODO: DroidSansArabic lacks the glyph of U+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW --> <Key - latin:keyLabel="ف" + latin:keySpec="ف" latin:keyHintLabel="5" latin:additionalMoreKeys="5,٥" - latin:moreKeys="ڤ,ڢ,ڥ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ڤ,ڢ,ڥ" /> <!-- U+063A: "غ" ARABIC LETTER GHAIN U+0666: "٦" ARABIC-INDIC DIGIT SIX --> <Key - latin:keyLabel="غ" + latin:keySpec="غ" latin:keyHintLabel="6" - latin:additionalMoreKeys="6,٦" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="6,٦" /> <!-- U+0639: "ع" ARABIC LETTER AIN U+0667: "٧" ARABIC-INDIC DIGIT SEVEN --> <Key - latin:keyLabel="ع" + latin:keySpec="ع" latin:keyHintLabel="7" - latin:additionalMoreKeys="7,٧" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="7,٧" /> <!-- U+0647: "ه" ARABIC LETTER HEH + U+0668: "٨" ARABIC-INDIC DIGIT EIGHT U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM - U+0647 U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER - U+0668: "٨" ARABIC-INDIC DIGIT EIGHT --> + U+0647 U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER --> <Key - latin:keyLabel="ه" + latin:keySpec="ه" latin:keyHintLabel="8" latin:additionalMoreKeys="8,٨" - latin:moreKeys="ﻫ|ه‍" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ﻫ|ه‍" /> <!-- U+062E: "خ" ARABIC LETTER KHAH U+0669: "٩" ARABIC-INDIC DIGIT NINE --> <Key - latin:keyLabel="خ" + latin:keySpec="خ" latin:keyHintLabel="9" - latin:additionalMoreKeys="9,٩" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="9,٩" /> <!-- U+062D: "ح" ARABIC LETTER HAH U+0660: "٠" ARABIC-INDIC DIGIT ZERO --> <Key - latin:keyLabel="ح" + latin:keySpec="ح" latin:keyHintLabel="0" - latin:additionalMoreKeys="0,٠" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="0,٠" /> <!-- U+062C: "ج" ARABIC LETTER JEEM U+0686: "چ" ARABIC LETTER TCHEH --> <Key - latin:keyLabel="ج" - latin:moreKeys="چ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ج" + latin:moreKeys="چ" /> </merge> diff --git a/java/res/xml/rowkeys_arabic2.xml b/java/res/xml/rowkeys_arabic2.xml index 4f8090d01..4f401e8bc 100644 --- a/java/res/xml/rowkeys_arabic2.xml +++ b/java/res/xml/rowkeys_arabic2.xml @@ -18,33 +18,26 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0634: "ش" ARABIC LETTER SHEEN U+069C: "ڜ" ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE --> <!-- TODO: DroidSansArabic lacks the glyph of U+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE --> <Key - latin:keyLabel="ش" - latin:moreKeys="ڜ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ش" + latin:moreKeys="ڜ" /> <!-- U+0633: "س" ARABIC LETTER SEEN --> - <Key - latin:keyLabel="س" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="س" /> <!-- U+064A: "ي" ARABIC LETTER YEH U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE U+0649: "ى" ARABIC LETTER ALEF MAKSURA --> <Key - latin:keyLabel="ي" - latin:moreKeys="ئ,ى" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ي" + latin:moreKeys="ئ,ى" /> <!-- U+0628: "ب" ARABIC LETTER BEH U+067E: "پ" ARABIC LETTER PEH --> <Key - latin:keyLabel="ب" - latin:moreKeys="پ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ب" + latin:moreKeys="پ" /> <!-- U+0644: "ل" ARABIC LETTER LAM U+FEFB: "ﻻ" ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM U+0627: "ا" ARABIC LETTER ALEF @@ -55,9 +48,8 @@ U+FEF5: "ﻵ" ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE --> <Key - latin:keyLabel="ل" - latin:moreKeys="ﻻ|لا,ﻷ|لأ,ﻹ|لإ,ﻵ|لآ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ل" + latin:moreKeys="ﻻ|لا,ﻷ|لأ,ﻹ|لإ,ﻵ|لآ" /> <!-- U+0627: "ا" ARABIC LETTER ALEF U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE U+0621: "ء" ARABIC LETTER HAMZA @@ -65,30 +57,20 @@ U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW U+0671: "ٱ" ARABIC LETTER ALEF WASLA --> <Key - latin:keyLabel="ا" - latin:moreKeys="!fixedColumnOrder!5,آ,ء,أ,إ,ٱ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ا" + latin:moreKeys="!fixedColumnOrder!5,آ,ء,أ,إ,ٱ" /> <!-- U+062A: "ت" ARABIC LETTER TEH --> - <Key - latin:keyLabel="ت" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ت" /> <!-- U+0646: "ن" ARABIC LETTER NOON --> - <Key - latin:keyLabel="ن" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ن" /> <!-- U+0645: "م" ARABIC LETTER MEEM --> - <Key - latin:keyLabel="م" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="م" /> <!-- U+0643: "ك" ARABIC LETTER KAF U+06AF: "گ" ARABIC LETTER GAF U+06A9: "ک" ARABIC LETTER KEHEH --> <Key - latin:keyLabel="ك" - latin:moreKeys="گ,ک" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ك" + latin:moreKeys="گ,ک" /> <!-- U+0637: "ط" ARABIC LETTER TAH --> - <Key - latin:keyLabel="ط" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ط" /> </merge> diff --git a/java/res/xml/rowkeys_arabic3.xml b/java/res/xml/rowkeys_arabic3.xml index 8a17b4b98..8b178013e 100644 --- a/java/res/xml/rowkeys_arabic3.xml +++ b/java/res/xml/rowkeys_arabic3.xml @@ -18,49 +18,30 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/keys_arabic3_left" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/keys_arabic3_left" /> <!-- U+0621: "ء" ARABIC LETTER HAMZA --> - <Key - latin:keyLabel="ء" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ء" /> <!-- U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE --> - <Key - latin:keyLabel="ؤ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ؤ" /> <!-- U+0631: "ر" ARABIC LETTER REH --> - <Key - latin:keyLabel="ر" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ر" /> <!-- U+0649: "ى" ARABIC LETTER ALEF MAKSURA U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE --> <Key - latin:keyLabel="ى" - latin:moreKeys="ئ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ى" + latin:moreKeys="ئ" /> <!-- U+0629: "ة" ARABIC LETTER TEH MARBUTA --> - <Key - latin:keyLabel="ة" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ة" /> <!-- U+0648: "و" ARABIC LETTER WAW --> - <Key - latin:keyLabel="و" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="و" /> <!-- U+0632: "ز" ARABIC LETTER ZAIN U+0698: "ژ" ARABIC LETTER JEH --> <Key - latin:keyLabel="ز" - latin:moreKeys="ژ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ز" + latin:moreKeys="ژ" /> <!-- U+0638: "ظ" ARABIC LETTER ZAH --> - <Key - latin:keyLabel="ظ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ظ" /> <!-- U+062F: "د" ARABIC LETTER DAL --> - <Key - latin:keyLabel="د" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="د" /> </merge> diff --git a/java/res/xml/rowkeys_armenian_phonetic1.xml b/java/res/xml/rowkeys_armenian_phonetic1.xml index 1984fae8a..8d54b179c 100644 --- a/java/res/xml/rowkeys_armenian_phonetic1.xml +++ b/java/res/xml/rowkeys_armenian_phonetic1.xml @@ -18,67 +18,55 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0567: "է" ARMENIAN SMALL LETTER EH --> <Key - latin:keyLabel="է" + latin:keySpec="է" latin:keyHintLabel="1" - latin:additionalMoreKeys="1" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="1" /> <!-- U+0569: "թ" ARMENIAN SMALL LETTER TO --> <Key - latin:keyLabel="թ" + latin:keySpec="թ" latin:keyHintLabel="2" - latin:additionalMoreKeys="2" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="2" /> <!-- U+0583: "փ" ARMENIAN SMALL LETTER PIWR --> <Key - latin:keyLabel="փ" + latin:keySpec="փ" latin:keyHintLabel="3" - latin:additionalMoreKeys="3" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="3" /> <!-- U+0571: "ձ" ARMENIAN SMALL LETTER JA --> <Key - latin:keyLabel="ձ" + latin:keySpec="ձ" latin:keyHintLabel="4" - latin:additionalMoreKeys="4" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="4" /> <!-- U+057B: "ջ" ARMENIAN SMALL LETTER JHEH --> <Key - latin:keyLabel="ջ" + latin:keySpec="ջ" latin:keyHintLabel="5" - latin:additionalMoreKeys="5" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="5" /> <!-- U+0580: "ր" ARMENIAN SMALL LETTER REH --> <Key - latin:keyLabel="ր" + latin:keySpec="ր" latin:keyHintLabel="6" - latin:additionalMoreKeys="6" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="6" /> <!-- U+0579: "չ" ARMENIAN SMALL LETTER CHA --> <Key - latin:keyLabel="չ" + latin:keySpec="չ" latin:keyHintLabel="7" - latin:additionalMoreKeys="7" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="7" /> <!-- U+0573: "ճ" ARMENIAN SMALL LETTER CHEH --> <Key - latin:keyLabel="ճ" + latin:keySpec="ճ" latin:keyHintLabel="8" - latin:additionalMoreKeys="8" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="8" /> <!-- U+056A: "ժ" ARMENIAN SMALL LETTER ZHE --> <Key - latin:keyLabel="ժ" + latin:keySpec="ժ" latin:keyHintLabel="9" - latin:additionalMoreKeys="9" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="9" /> <!-- U+056E: "ծ" ARMENIAN SMALL LETTER CA --> <Key - latin:keyLabel="ծ" + latin:keySpec="ծ" latin:keyHintLabel="0" - latin:additionalMoreKeys="0" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_armenian_phonetic2.xml b/java/res/xml/rowkeys_armenian_phonetic2.xml index 5dcabc301..cb1b932b9 100644 --- a/java/res/xml/rowkeys_armenian_phonetic2.xml +++ b/java/res/xml/rowkeys_armenian_phonetic2.xml @@ -18,49 +18,29 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0584: "ք" ARMENIAN SMALL LETTER KEH --> - <Key - latin:keyLabel="ք" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ք" /> <!-- U+0578: "ո" ARMENIAN SMALL LETTER VO --> - <Key - latin:keyLabel="ո" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ո" /> <!-- U+0565: "ե" ARMENIAN SMALL LETTER ECH U+0587: "և" ARMENIAN SMALL LIGATURE ECH YIWN --> <Key - latin:keyLabel="ե" + latin:keySpec="ե" latin:moreKeys="և" - latin:keyLabelFlags="fontNormal" /> + latin:keyHintLabel="և" /> <!-- U+057C: "ռ" ARMENIAN SMALL LETTER RA --> - <Key - latin:keyLabel="ռ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ռ" /> <!-- U+057F: "տ" ARMENIAN SMALL LETTER TIWN --> - <Key - latin:keyLabel="տ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="տ" /> <!-- U+0568: "ը" ARMENIAN SMALL LETTER ET --> - <Key - latin:keyLabel="ը" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ը" /> <!-- U+0582: "ւ" ARMENIAN SMALL LETTER YIWN --> - <Key - latin:keyLabel="ւ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ւ" /> <!-- U+056B: "ի" ARMENIAN SMALL LETTER INI --> - <Key - latin:keyLabel="ի" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ի" /> <!-- U+0585: "օ" ARMENIAN SMALL LETTER OH --> - <Key - latin:keyLabel="օ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="օ" /> <!-- U+057A: "պ" ARMENIAN SMALL LETTER PEH --> - <Key - latin:keyLabel="պ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="պ" /> </merge> diff --git a/java/res/xml/rowkeys_armenian_phonetic3.xml b/java/res/xml/rowkeys_armenian_phonetic3.xml index 3116811b3..33db4529f 100644 --- a/java/res/xml/rowkeys_armenian_phonetic3.xml +++ b/java/res/xml/rowkeys_armenian_phonetic3.xml @@ -18,43 +18,23 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0561: "ա" ARMENIAN SMALL LETTER AYB --> - <Key - latin:keyLabel="ա" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ա" /> <!-- U+057D: "ս" ARMENIAN SMALL LETTER SEH --> - <Key - latin:keyLabel="ս" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ս" /> <!-- U+0564: "դ" ARMENIAN SMALL LETTER DA --> - <Key - latin:keyLabel="դ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="դ" /> <!-- U+0586: "ֆ" ARMENIAN SMALL LETTER FEH --> - <Key - latin:keyLabel="ֆ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ֆ" /> <!-- U+0563: "գ" ARMENIAN SMALL LETTER GIM --> - <Key - latin:keyLabel="գ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="գ" /> <!-- U+0570: "հ" ARMENIAN SMALL LETTER HO --> - <Key - latin:keyLabel="հ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="հ" /> <!-- U+0575: "յ" ARMENIAN SMALL LETTER YI --> - <Key - latin:keyLabel="յ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="յ" /> <!-- U+056F: "կ" ARMENIAN SMALL LETTER KEN --> - <Key - latin:keyLabel="կ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="կ" /> <!-- U+056C: "լ" ARMENIAN SMALL LETTER LIWN --> - <Key - latin:keyLabel="լ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="լ" /> </merge> diff --git a/java/res/xml/rowkeys_armenian_phonetic4.xml b/java/res/xml/rowkeys_armenian_phonetic4.xml index 922481add..c7db25b73 100644 --- a/java/res/xml/rowkeys_armenian_phonetic4.xml +++ b/java/res/xml/rowkeys_armenian_phonetic4.xml @@ -18,35 +18,19 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0566: "զ" ARMENIAN SMALL LETTER ZA --> - <Key - latin:keyLabel="զ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="զ" /> <!-- U+0572: "ղ" ARMENIAN SMALL LETTER GHAD --> - <Key - latin:keyLabel="ղ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ղ" /> <!-- U+0581: "ց" ARMENIAN SMALL LETTER CO --> - <Key - latin:keyLabel="ց" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ց" /> <!-- U+057E: "վ" ARMENIAN SMALL LETTER VEW --> - <Key - latin:keyLabel="վ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="վ" /> <!-- U+0562: "բ" ARMENIAN SMALL LETTER BEN --> - <Key - latin:keyLabel="բ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="բ" /> <!-- U+0576: "ն" ARMENIAN SMALL LETTER NOW --> - <Key - latin:keyLabel="ն" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ն" /> <!-- U+0574: "մ" ARMENIAN SMALL LETTER MEN --> - <Key - latin:keyLabel="մ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="մ" /> </merge> diff --git a/java/res/xml/rowkeys_azerty1.xml b/java/res/xml/rowkeys_azerty1.xml index 42b27463f..67be342c0 100644 --- a/java/res/xml/rowkeys_azerty1.xml +++ b/java/res/xml/rowkeys_azerty1.xml @@ -22,52 +22,52 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="a" + latin:keySpec="a" latin:keyHintLabel="1" latin:additionalMoreKeys="1" - latin:moreKeys="!text/more_keys_for_a" /> + latin:moreKeys="!text/morekeys_a" /> <Key - latin:keyLabel="z" + latin:keySpec="z" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="!text/more_keys_for_z" /> + latin:moreKeys="!text/morekeys_z" /> <Key - latin:keyLabel="e" + latin:keySpec="e" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_e" /> + latin:moreKeys="!text/morekeys_e" /> <Key - latin:keyLabel="r" + latin:keySpec="r" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="!text/more_keys_for_r" /> + latin:moreKeys="!text/morekeys_r" /> <Key - latin:keyLabel="t" + latin:keySpec="t" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_t" /> + latin:moreKeys="!text/morekeys_t" /> <Key - latin:keyLabel="y" + latin:keySpec="y" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_y" /> + latin:moreKeys="!text/morekeys_y" /> <Key - latin:keyLabel="u" + latin:keySpec="u" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_u" /> + latin:moreKeys="!text/morekeys_u" /> <Key - latin:keyLabel="i" + latin:keySpec="i" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_i" /> + latin:moreKeys="!text/morekeys_i" /> <Key - latin:keyLabel="o" + latin:keySpec="o" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="!text/more_keys_for_o" /> + latin:moreKeys="!text/morekeys_o" /> <Key - latin:keyLabel="p" + latin:keySpec="p" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_azerty2.xml b/java/res/xml/rowkeys_azerty2.xml index 2eee214e5..116417f08 100644 --- a/java/res/xml/rowkeys_azerty2.xml +++ b/java/res/xml/rowkeys_azerty2.xml @@ -22,30 +22,30 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="q" /> + latin:keySpec="q" /> <Key - latin:keyLabel="s" - latin:moreKeys="!text/more_keys_for_s" /> + latin:keySpec="s" + latin:moreKeys="!text/morekeys_s" /> <Key - latin:keyLabel="d" - latin:moreKeys="!text/more_keys_for_d" /> + latin:keySpec="d" + latin:moreKeys="!text/morekeys_d" /> <Key - latin:keyLabel="f" /> + latin:keySpec="f" /> <Key - latin:keyLabel="g" - latin:moreKeys="!text/more_keys_for_g" /> + latin:keySpec="g" + latin:moreKeys="!text/morekeys_g" /> <Key - latin:keyLabel="h" - latin:moreKeys="!text/more_keys_for_h" /> + latin:keySpec="h" + latin:moreKeys="!text/morekeys_h" /> <Key - latin:keyLabel="j" - latin:moreKeys="!text/more_keys_for_j" /> + latin:keySpec="j" + latin:moreKeys="!text/morekeys_j" /> <Key - latin:keyLabel="k" - latin:moreKeys="!text/more_keys_for_k" /> + latin:keySpec="k" + latin:moreKeys="!text/morekeys_k" /> <Key - latin:keyLabel="l" - latin:moreKeys="!text/more_keys_for_l" /> + latin:keySpec="l" + latin:moreKeys="!text/morekeys_l" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> </merge> diff --git a/java/res/xml/rowkeys_azerty3.xml b/java/res/xml/rowkeys_azerty3.xml index 2643f3283..48d3a5280 100644 --- a/java/res/xml/rowkeys_azerty3.xml +++ b/java/res/xml/rowkeys_azerty3.xml @@ -22,21 +22,32 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="w" - latin:moreKeys="!text/more_keys_for_w" /> + latin:keySpec="w" + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="x" /> + latin:keySpec="x" /> <Key - latin:keyLabel="c" - latin:moreKeys="!text/more_keys_for_c" /> + latin:keySpec="c" + latin:moreKeys="!text/morekeys_c" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="n" - latin:moreKeys="!text/more_keys_for_n" /> - <include - latin:keyboardLayout="@xml/key_azerty3_right" /> + latin:keySpec="n" + latin:moreKeys="!text/morekeys_n" /> + <switch> + <case + latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" + > + <Key + latin:keySpec="\?" /> + </case> + <default> + <Key + latin:keySpec="\'" + latin:moreKeys="!text/morekeys_single_quote" /> + </default> + </switch> </merge> diff --git a/java/res/xml/rowkeys_bengali1.xml b/java/res/xml/rowkeys_bengali1.xml new file mode 100644 index 000000000..c1fd8b434 --- /dev/null +++ b/java/res/xml/rowkeys_bengali1.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- U+0994: "ঔ" BENGALI LETTER AU + U+09E7: "১" BENGALI DIGIT ONE --> + <Key + latin:keySpec="ঔ" + latin:keyHintLabel="১" + latin:additionalMoreKeys="১,1" /> + <!-- U+0990: "ঐ" BENGALI LETTER AI + U+09E8: "২" BENGALI DIGIT TWO --> + <Key + latin:keySpec="ঐ" + latin:keyHintLabel="২" + latin:additionalMoreKeys="২,2" /> + <!-- U+0986: "আ" BENGALI LETTER AA + U+09E9: "৩" BENGALI DIGIT THREE --> + <Key + latin:keySpec="আ" + latin:keyHintLabel="৩" + latin:additionalMoreKeys="৩,3" /> + <!-- U+0988: "ঈ" BENGALI LETTER II + U+09EA: "৪" BENGALI DIGIT FOUR --> + <Key + latin:keySpec="ঈ" + latin:keyHintLabel="৪" + latin:additionalMoreKeys="৪,4" /> + <!-- U+098A: "ঊ" BENGALI LETTER UU + U+09EB: "৫" BENGALI DIGIT FIVE --> + <Key + latin:keySpec="ঊ" + latin:keyHintLabel="৫" + latin:additionalMoreKeys="৫,5" /> + <!-- U+09AC: "ব" BENGALI LETTER BA + U+09AD: "ভ" BENGALI LETTER BHA + U+09EC: "৬" BENGALI DIGIT SIX --> + <Key + latin:keySpec="ব" + latin:moreKeys="ভ,%" + latin:keyHintLabel="৬" + latin:additionalMoreKeys="৬,6" /> + <!-- U+09B9: "হ" BENGALI LETTER HA + U+09ED: "৭" BENGALI DIGIT SEVEN --> + <Key + latin:keySpec="হ" + latin:keyHintLabel="৭" + latin:additionalMoreKeys="৭,7" /> + <!-- U+0997: "গ" BENGALI LETTER GA + U+0998: "ঘ" BENGALI LETTER GHA + U+09EE: "৮" BENGALI DIGIT EIGHT --> + <Key + latin:keySpec="গ" + latin:moreKeys="ঘ,%" + latin:keyHintLabel="৮" + latin:additionalMoreKeys="৮,8" /> + <!-- U+09A6: "দ" BENGALI LETTER DA + U+09A7: "ধ" BENGALI LETTER DHA + U+09EF: "৯" BENGALI DIGIT NINE --> + <Key + latin:keySpec="দ" + latin:moreKeys="ধ,%" + latin:keyHintLabel="৯" + latin:additionalMoreKeys="৯,9" /> + <!-- U+099C: "জ" BENGALI LETTER JA + U+099D: "ঝ" BENGALI LETTER JHA + U+099C/U+09CD/U+099E: "জ্ঞ" BENGALI LETTER JA/BENGALI SIGN VIRAMA/BENGALI LETTER NYA + U+09E6: "০" BENGALI DIGIT ZERO --> + <Key + latin:keySpec="জ" + latin:moreKeys="ঝ,জ্ঞ,%" + latin:keyHintLabel="০" + latin:additionalMoreKeys="০,0" /> + <!-- U+09A1: "ড" BENGALI LETTER DDA + U+09A1/U+09BC: "ড়" BENGALI LETTER DDA/BENGALI SIGN NUKTA --> + <Key + latin:keySpec="ড" + latin:moreKeys="ড়" /> +</merge> diff --git a/java/res/xml/rowkeys_bengali2.xml b/java/res/xml/rowkeys_bengali2.xml new file mode 100644 index 000000000..44b361797 --- /dev/null +++ b/java/res/xml/rowkeys_bengali2.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- U+0993: "ও" BENGALI LETTER O + U+09CB: "ো" BENGALI VOWEL SIGN O --> + <Key + latin:keySpec="ও" + latin:moreKeys="ো" /> + <!-- U+098F: "এ" BENGALI LETTER E + U+09C7: "ে" BENGALI VOWEL SIGN E --> + <Key + latin:keySpec="এ" + latin:moreKeys="ে" /> + <!-- U+0985: "অ" BENGALI LETTER A + U+09CD: "্" BENGALI SIGN VIRAMA --> + <Key + latin:keySpec="অ" + latin:moreKeys="্" /> + <!-- U+0987: "ই" BENGALI LETTER I + U+09BF: "ি" BENGALI VOWEL SIGN I --> + <Key + latin:keySpec="ই" + latin:moreKeys="ি" /> + <!-- U+0989: "উ" BENGALI LETTER U + U+09C1: "ু" BENGALI VOWEL SIGN U --> + <Key + latin:keySpec="উ" + latin:moreKeys="ু" /> + <!-- U+09AA: "প" BENGALI LETTER PA + U+09AB: "ফ" BENGALI LETTER PHA --> + <Key + latin:keySpec="প" + latin:moreKeys="ফ" /> + <!-- U+09B0: "র" BENGALI LETTER RA + U+09C3: "ৃ" BENGALI VOWEL SIGN VOCALIC R + U+098B: "ঋ" BENGALI LETTER VOCALIC R + U+09A4/U+09CD/U+09B0: "ত্র" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER RA --> + <Key + latin:keySpec="র" + latin:moreKeys="ৃ,ঋ,ত্র" /> + <!-- U+0995: "ক" BENGALI LETTER KA + U+0996: "খ" BENGALI LETTER KHA --> + <Key + latin:keySpec="ক" + latin:moreKeys="খ" /> + <!-- U+09A4: "ত" BENGALI LETTER TA + U+09CE: "ৎ" BENGALI LETTER KHANDA TA + U+09A5: "থ" BENGALI LETTER THA + U+09A4/U+09CD/U+09A4: "ত্ত" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER TA --> + <Key + latin:keySpec="ত" + latin:moreKeys="ৎ,থ,ত্ত" /> + <!-- U+099A: "চ" BENGALI LETTER CA + U+099B: "ছ" BENGALI LETTER CHA --> + <Key + latin:keySpec="চ" + latin:moreKeys="ছ" /> + <!-- U+099F: "ট" BENGALI LETTER TTA + U+09A0: "ঠ" BENGALI LETTER TTHA --> + <Key + latin:keySpec="ট" + latin:moreKeys="ঠ" /> +</merge> diff --git a/java/res/xml/rowkeys_bengali3.xml b/java/res/xml/rowkeys_bengali3.xml new file mode 100644 index 000000000..5222b096b --- /dev/null +++ b/java/res/xml/rowkeys_bengali3.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- U+0981: "ঁ" BENGALI SIGN CANDRABINDU + U+0983: "ঃ" BENGALI SIGN VISARGA + U+0982: "ং" BENGALI SIGN ANUSVARA --> + <Key + latin:keySpec="ঁ" + latin:moreKeys="ঃ,ং" /> + <!-- U+09A2: "ঢ" BENGALI LETTER DDHA + U+09A2/U+09BC: "ঢ়" BENGALI LETTER DDHA/BENGALI SIGN NUKTA --> + <Key + latin:keySpec="ঢ" + latin:moreKeys="ঢ়" /> + <!-- U+09AE: "ম" BENGALI LETTER MA --> + <Key latin:keySpec="ম" /> + <!-- U+09A8: "ন" BENGALI LETTER NA + U+09A3: "ণ" BENGALI LETTER NNA --> + <Key + latin:keySpec="ন" + latin:moreKeys="ণ" /> + <!-- U+099E: "ঞ" BENGALI LETTER NYA + U+0999: "ঙ" BENGALI LETTER NGA + U+099E/U+09CD/U+099C: "ঞ্জ" BENGALI LETTER NYA/BENGALI SIGN VIRAMA/BENGALI LETTER JA --> + <Key + latin:keySpec="ঞ" + latin:moreKeys="ঙ,ঞ্জ" /> + <!-- U+09B2: "ল" BENGALI LETTER LA --> + <Key latin:keySpec="ল" /> + <!-- U+09B7: "ষ" BENGALI LETTER SSA + U+0995/U+09CD/U+09B7: "ক্ষ" BENGALI LETTER KA/BENGALI SIGN VIRAMA/BENGALI LETTER SSA --> + <Key + latin:keySpec="ষ" + latin:moreKeys="ক্ষ" /> + <!-- U+09B8: "স" BENGALI LETTER SA + U+09B6: "শ" BENGALI LETTER SHA --> + <Key + latin:keySpec="স" + latin:moreKeys="শ" /> + <!-- U+09DF: "য়" BENGALI LETTER YYA + U+09AF: "য" BENGALI LETTER YA --> + <Key + latin:keySpec="য়" + latin:moreKeys="য" /> + <!-- U+0964: "।" DEVANAGARI DANDA + U+0965: "॥" DEVANAGARI DOUBLE DANDA --> + <Key + latin:keySpec="।" + latin:moreKeys="॥" /> +</merge> diff --git a/java/res/xml/rowkeys_bulgarian1.xml b/java/res/xml/rowkeys_bulgarian1.xml index 441b079f1..e84719302 100644 --- a/java/res/xml/rowkeys_bulgarian1.xml +++ b/java/res/xml/rowkeys_bulgarian1.xml @@ -23,57 +23,57 @@ > <!-- U+044F: "я" CYRILLIC SMALL LETTER YA --> <Key - latin:keyLabel="я" + latin:keySpec="я" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+0432: "в" CYRILLIC SMALL LETTER VE --> <Key - latin:keyLabel="в" + latin:keySpec="в" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+0435: "е" CYRILLIC SMALL LETTER IE --> <Key - latin:keyLabel="е" + latin:keySpec="е" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> <!-- U+0440: "р" CYRILLIC SMALL LETTER ER --> <Key - latin:keyLabel="р" + latin:keySpec="р" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+0442: "т" CYRILLIC SMALL LETTER TE --> <Key - latin:keyLabel="т" + latin:keySpec="т" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN --> <Key - latin:keyLabel="ъ" + latin:keySpec="ъ" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <!-- U+0443: "у" CYRILLIC SMALL LETTER U --> <Key - latin:keyLabel="у" + latin:keySpec="у" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+0438: "и" CYRILLIC SMALL LETTER I U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE --> <Key - latin:keyLabel="и" + latin:keySpec="и" latin:keyHintLabel="8" latin:additionalMoreKeys="8" latin:moreKeys="ѝ" /> <!-- U+043E: "о" CYRILLIC SMALL LETTER O --> <Key - latin:keyLabel="о" + latin:keySpec="о" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+043F: "п" CYRILLIC SMALL LETTER PE --> <Key - latin:keyLabel="п" + latin:keySpec="п" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE --> <Key - latin:keyLabel="ч" /> + latin:keySpec="ч" /> </merge> diff --git a/java/res/xml/rowkeys_bulgarian2.xml b/java/res/xml/rowkeys_bulgarian2.xml index a4e93d862..e572a221d 100644 --- a/java/res/xml/rowkeys_bulgarian2.xml +++ b/java/res/xml/rowkeys_bulgarian2.xml @@ -23,35 +23,35 @@ > <!-- U+0430: "а" CYRILLIC SMALL LETTER A --> <Key - latin:keyLabel="а" /> + latin:keySpec="а" /> <!-- U+0441: "с" CYRILLIC SMALL LETTER ES --> <Key - latin:keyLabel="с" /> + latin:keySpec="с" /> <!-- U+0434: "д" CYRILLIC SMALL LETTER DE --> <Key - latin:keyLabel="д" /> + latin:keySpec="д" /> <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF --> <Key - latin:keyLabel="ф" /> + latin:keySpec="ф" /> <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE --> <Key - latin:keyLabel="г" /> + latin:keySpec="г" /> <!-- U+0445: "х" CYRILLIC SMALL LETTER HA --> <Key - latin:keyLabel="х" /> + latin:keySpec="х" /> <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I --> <Key - latin:keyLabel="й" /> + latin:keySpec="й" /> <!-- U+043A: "к" CYRILLIC SMALL LETTER KA --> <Key - latin:keyLabel="к" /> + latin:keySpec="к" /> <!-- U+043B: "л" CYRILLIC SMALL LETTER EL --> <Key - latin:keyLabel="л" /> + latin:keySpec="л" /> <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA --> <Key - latin:keyLabel="ш" /> + latin:keySpec="ш" /> <!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA --> <Key - latin:keyLabel="щ" /> + latin:keySpec="щ" /> </merge> diff --git a/java/res/xml/rowkeys_bulgarian3.xml b/java/res/xml/rowkeys_bulgarian3.xml index 258219c27..2509793b2 100644 --- a/java/res/xml/rowkeys_bulgarian3.xml +++ b/java/res/xml/rowkeys_bulgarian3.xml @@ -23,26 +23,26 @@ > <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE --> <Key - latin:keyLabel="з" /> + latin:keySpec="з" /> <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN --> <Key - latin:keyLabel="ь" /> + latin:keySpec="ь" /> <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE --> <Key - latin:keyLabel="ц" /> + latin:keySpec="ц" /> <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE --> <Key - latin:keyLabel="ж" /> + latin:keySpec="ж" /> <!-- U+0431: "б" CYRILLIC SMALL LETTER BE --> <Key - latin:keyLabel="б" /> + latin:keySpec="б" /> <!-- U+043D: "н" CYRILLIC SMALL LETTER EN --> <Key - latin:keyLabel="н" /> + latin:keySpec="н" /> <!-- U+043C: "м" CYRILLIC SMALL LETTER EM --> <Key - latin:keyLabel="м" /> + latin:keySpec="м" /> <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU --> <Key - latin:keyLabel="ю" /> + latin:keySpec="ю" /> </merge> diff --git a/java/res/xml/rowkeys_bulgarian_bds1.xml b/java/res/xml/rowkeys_bulgarian_bds1.xml index eed1fcb8f..9d6428268 100644 --- a/java/res/xml/rowkeys_bulgarian_bds1.xml +++ b/java/res/xml/rowkeys_bulgarian_bds1.xml @@ -23,57 +23,57 @@ > <!-- U+0443: "у" CYRILLIC SMALL LETTER U --> <Key - latin:keyLabel="у" + latin:keySpec="у" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+0435: "е" CYRILLIC SMALL LETTER IE --> <Key - latin:keyLabel="е" + latin:keySpec="е" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+0438: "и" CYRILLIC SMALL LETTER I U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE --> <Key - latin:keyLabel="и" + latin:keySpec="и" latin:keyHintLabel="3" latin:additionalMoreKeys="3" latin:moreKeys="ѝ" /> <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA --> <Key - latin:keyLabel="ш" + latin:keySpec="ш" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA --> <Key - latin:keyLabel="щ" + latin:keySpec="щ" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <!-- U+043A: "к" CYRILLIC SMALL LETTER KA --> <Key - latin:keyLabel="к" + latin:keySpec="к" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <!-- U+0441: "с" CYRILLIC SMALL LETTER ES --> <Key - latin:keyLabel="с" + latin:keySpec="с" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+0434: "д" CYRILLIC SMALL LETTER DE --> <Key - latin:keyLabel="д" + latin:keySpec="д" latin:keyHintLabel="8" latin:additionalMoreKeys="8" /> <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE --> <Key - latin:keyLabel="з" + latin:keySpec="з" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE --> <Key - latin:keyLabel="ц" + latin:keySpec="ц" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> <!-- U+0431: "б" CYRILLIC SMALL LETTER BE --> <Key - latin:keyLabel="б" /> + latin:keySpec="б" /> </merge> diff --git a/java/res/xml/rowkeys_bulgarian_bds2.xml b/java/res/xml/rowkeys_bulgarian_bds2.xml index ff1bff895..e078ae7d3 100644 --- a/java/res/xml/rowkeys_bulgarian_bds2.xml +++ b/java/res/xml/rowkeys_bulgarian_bds2.xml @@ -23,35 +23,35 @@ > <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN --> <Key - latin:keyLabel="ь" /> + latin:keySpec="ь" /> <!-- U+044F: "я" CYRILLIC SMALL LETTER YA --> <Key - latin:keyLabel="я" /> + latin:keySpec="я" /> <!-- U+0430: "а" CYRILLIC SMALL LETTER A --> <Key - latin:keyLabel="а" /> + latin:keySpec="а" /> <!-- U+043E: "о" CYRILLIC SMALL LETTER O --> <Key - latin:keyLabel="о" /> + latin:keySpec="о" /> <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE --> <Key - latin:keyLabel="ж" /> + latin:keySpec="ж" /> <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE --> <Key - latin:keyLabel="г" /> + latin:keySpec="г" /> <!-- U+0442: "т" CYRILLIC SMALL LETTER TE --> <Key - latin:keyLabel="т" /> + latin:keySpec="т" /> <!-- U+043D: "н" CYRILLIC SMALL LETTER EN --> <Key - latin:keyLabel="н" /> + latin:keySpec="н" /> <!-- U+0432: "в" CYRILLIC SMALL LETTER VE --> <Key - latin:keyLabel="в" /> + latin:keySpec="в" /> <!-- U+043C: "м" CYRILLIC SMALL LETTER EM --> <Key - latin:keyLabel="м" /> + latin:keySpec="м" /> <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE --> <Key - latin:keyLabel="ч" /> + latin:keySpec="ч" /> </merge> diff --git a/java/res/xml/rowkeys_bulgarian_bds3.xml b/java/res/xml/rowkeys_bulgarian_bds3.xml index 7bb780ac7..8302d6922 100644 --- a/java/res/xml/rowkeys_bulgarian_bds3.xml +++ b/java/res/xml/rowkeys_bulgarian_bds3.xml @@ -23,29 +23,29 @@ > <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU --> <Key - latin:keyLabel="ю" /> + latin:keySpec="ю" /> <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I --> <Key - latin:keyLabel="й" /> + latin:keySpec="й" /> <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN --> <Key - latin:keyLabel="ъ" /> + latin:keySpec="ъ" /> <!-- U+044D: "э" CYRILLIC SMALL LETTER E --> <Key - latin:keyLabel="э" /> + latin:keySpec="э" /> <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF --> <Key - latin:keyLabel="ф" /> + latin:keySpec="ф" /> <!-- U+0445: "х" CYRILLIC SMALL LETTER HA --> <Key - latin:keyLabel="х" /> + latin:keySpec="х" /> <!-- U+043F: "п" CYRILLIC SMALL LETTER PE --> <Key - latin:keyLabel="п" /> + latin:keySpec="п" /> <!-- U+0440: "р" CYRILLIC SMALL LETTER ER --> <Key - latin:keyLabel="р" /> + latin:keySpec="р" /> <!-- U+043B: "л" CYRILLIC SMALL LETTER EL --> <Key - latin:keyLabel="л" /> + latin:keySpec="л" /> </merge> diff --git a/java/res/xml/rowkeys_colemak1.xml b/java/res/xml/rowkeys_colemak1.xml index f1c30756b..199d285f9 100644 --- a/java/res/xml/rowkeys_colemak1.xml +++ b/java/res/xml/rowkeys_colemak1.xml @@ -22,45 +22,62 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="q" + latin:keySpec="q" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <Key - latin:keyLabel="w" + latin:keySpec="w" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="!text/more_keys_for_w" /> + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="f" + latin:keySpec="f" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> <Key - latin:keyLabel="p" + latin:keySpec="p" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <Key - latin:keyLabel="g" + latin:keySpec="g" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_g" /> + latin:moreKeys="!text/morekeys_g" /> <Key - latin:keyLabel="j" + latin:keySpec="j" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_j" /> + latin:moreKeys="!text/morekeys_j" /> <Key - latin:keyLabel="l" + latin:keySpec="l" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_l" /> + latin:moreKeys="!text/morekeys_l" /> <Key - latin:keyLabel="u" + latin:keySpec="u" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_u" /> + latin:moreKeys="!text/morekeys_u" /> <Key - latin:keyLabel="y" + latin:keySpec="y" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="!text/more_keys_for_y" /> + latin:moreKeys="!text/morekeys_y" /> + <switch> + <case + latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" + > + <Key + latin:keySpec=":" + latin:keyHintLabel="0" + latin:additionalMoreKeys="0" /> + </case> + <default> + <Key + latin:keySpec=";" + latin:keyHintLabel="0" + latin:additionalMoreKeys="0" + latin:moreKeys=":" /> + </default> + </switch> </merge> diff --git a/java/res/xml/rowkeys_colemak2.xml b/java/res/xml/rowkeys_colemak2.xml index f73d7e95f..a8e93bf0e 100644 --- a/java/res/xml/rowkeys_colemak2.xml +++ b/java/res/xml/rowkeys_colemak2.xml @@ -22,33 +22,33 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="a" - latin:moreKeys="!text/more_keys_for_a" /> + latin:keySpec="a" + latin:moreKeys="!text/morekeys_a" /> <Key - latin:keyLabel="r" - latin:moreKeys="!text/more_keys_for_r" /> + latin:keySpec="r" + latin:moreKeys="!text/morekeys_r" /> <Key - latin:keyLabel="s" - latin:moreKeys="!text/more_keys_for_s" /> + latin:keySpec="s" + latin:moreKeys="!text/morekeys_s" /> <Key - latin:keyLabel="t" - latin:moreKeys="!text/more_keys_for_t" /> + latin:keySpec="t" + latin:moreKeys="!text/morekeys_t" /> <Key - latin:keyLabel="d" - latin:moreKeys="!text/more_keys_for_d" /> + latin:keySpec="d" + latin:moreKeys="!text/morekeys_d" /> <Key - latin:keyLabel="h" - latin:moreKeys="!text/more_keys_for_h" /> + latin:keySpec="h" + latin:moreKeys="!text/morekeys_h" /> <Key - latin:keyLabel="n" - latin:moreKeys="!text/more_keys_for_n" /> + latin:keySpec="n" + latin:moreKeys="!text/morekeys_n" /> <Key - latin:keyLabel="e" - latin:moreKeys="!text/more_keys_for_e" /> + latin:keySpec="e" + latin:moreKeys="!text/morekeys_e" /> <Key - latin:keyLabel="i" - latin:moreKeys="!text/more_keys_for_i" /> + latin:keySpec="i" + latin:moreKeys="!text/morekeys_i" /> <Key - latin:keyLabel="o" - latin:moreKeys="!text/more_keys_for_o" /> + latin:keySpec="o" + latin:moreKeys="!text/morekeys_o" /> </merge> diff --git a/java/res/xml/rowkeys_colemak3.xml b/java/res/xml/rowkeys_colemak3.xml index f0f915142..df4d9936e 100644 --- a/java/res/xml/rowkeys_colemak3.xml +++ b/java/res/xml/rowkeys_colemak3.xml @@ -22,21 +22,21 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="z" - latin:moreKeys="!text/more_keys_for_z" /> + latin:keySpec="z" + latin:moreKeys="!text/morekeys_z" /> <Key - latin:keyLabel="x" /> + latin:keySpec="x" /> <Key - latin:keyLabel="c" - latin:moreKeys="!text/more_keys_for_c" /> + latin:keySpec="c" + latin:moreKeys="!text/morekeys_c" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="k" - latin:moreKeys="!text/more_keys_for_k" /> + latin:keySpec="k" + latin:moreKeys="!text/morekeys_k" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> </merge> diff --git a/java/res/xml/rowkeys_dvorak1.xml b/java/res/xml/rowkeys_dvorak1.xml index 033308acb..170e31664 100644 --- a/java/res/xml/rowkeys_dvorak1.xml +++ b/java/res/xml/rowkeys_dvorak1.xml @@ -24,36 +24,36 @@ <include latin:keyboardLayout="@xml/keys_dvorak_123" /> <Key - latin:keyLabel="p" + latin:keySpec="p" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <Key - latin:keyLabel="y" + latin:keySpec="y" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_y" /> + latin:moreKeys="!text/morekeys_y" /> <Key - latin:keyLabel="f" + latin:keySpec="f" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <Key - latin:keyLabel="g" + latin:keySpec="g" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_g" /> + latin:moreKeys="!text/morekeys_g" /> <Key - latin:keyLabel="c" + latin:keySpec="c" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_c" /> + latin:moreKeys="!text/morekeys_c" /> <Key - latin:keyLabel="r" + latin:keySpec="r" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="!text/more_keys_for_r" /> + latin:moreKeys="!text/morekeys_r" /> <Key - latin:keyLabel="l" + latin:keySpec="l" latin:keyHintLabel="0" latin:additionalMoreKeys="0" - latin:moreKeys="!text/more_keys_for_l" /> + latin:moreKeys="!text/morekeys_l" /> </merge> diff --git a/java/res/xml/rowkeys_dvorak2.xml b/java/res/xml/rowkeys_dvorak2.xml index 943e3f549..0840a6cfc 100644 --- a/java/res/xml/rowkeys_dvorak2.xml +++ b/java/res/xml/rowkeys_dvorak2.xml @@ -22,33 +22,33 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="a" - latin:moreKeys="!text/more_keys_for_a" /> + latin:keySpec="a" + latin:moreKeys="!text/morekeys_a" /> <Key - latin:keyLabel="o" - latin:moreKeys="!text/more_keys_for_o" /> + latin:keySpec="o" + latin:moreKeys="!text/morekeys_o" /> <Key - latin:keyLabel="e" - latin:moreKeys="!text/more_keys_for_e" /> + latin:keySpec="e" + latin:moreKeys="!text/morekeys_e" /> <Key - latin:keyLabel="u" - latin:moreKeys="!text/more_keys_for_u" /> + latin:keySpec="u" + latin:moreKeys="!text/morekeys_u" /> <Key - latin:keyLabel="i" - latin:moreKeys="!text/more_keys_for_i" /> + latin:keySpec="i" + latin:moreKeys="!text/morekeys_i" /> <Key - latin:keyLabel="d" - latin:moreKeys="!text/more_keys_for_d" /> + latin:keySpec="d" + latin:moreKeys="!text/morekeys_d" /> <Key - latin:keyLabel="h" - latin:moreKeys="!text/more_keys_for_h" /> + latin:keySpec="h" + latin:moreKeys="!text/morekeys_h" /> <Key - latin:keyLabel="t" - latin:moreKeys="!text/more_keys_for_t" /> + latin:keySpec="t" + latin:moreKeys="!text/morekeys_t" /> <Key - latin:keyLabel="n" - latin:moreKeys="!text/more_keys_for_n" /> + latin:keySpec="n" + latin:moreKeys="!text/morekeys_n" /> <Key - latin:keyLabel="s" - latin:moreKeys="!text/more_keys_for_s" /> + latin:keySpec="s" + latin:moreKeys="!text/morekeys_s" /> </merge> diff --git a/java/res/xml/rowkeys_dvorak3.xml b/java/res/xml/rowkeys_dvorak3.xml index b035f41cd..e53908c91 100644 --- a/java/res/xml/rowkeys_dvorak3.xml +++ b/java/res/xml/rowkeys_dvorak3.xml @@ -22,21 +22,21 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="j" - latin:moreKeys="!text/more_keys_for_j" /> + latin:keySpec="j" + latin:moreKeys="!text/morekeys_j" /> <Key - latin:keyLabel="k" - latin:moreKeys="!text/more_keys_for_k" /> + latin:keySpec="k" + latin:moreKeys="!text/morekeys_k" /> <Key - latin:keyLabel="x" /> + latin:keySpec="x" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> <Key - latin:keyLabel="w" - latin:moreKeys="!text/more_keys_for_w" /> + latin:keySpec="w" + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> </merge> diff --git a/java/res/xml/rowkeys_east_slavic1.xml b/java/res/xml/rowkeys_east_slavic1.xml index 5b3b4b48d..88d95fffb 100644 --- a/java/res/xml/rowkeys_east_slavic1.xml +++ b/java/res/xml/rowkeys_east_slavic1.xml @@ -23,59 +23,59 @@ > <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I --> <Key - latin:keyLabel="й" + latin:keySpec="й" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE --> <Key - latin:keyLabel="ц" + latin:keySpec="ц" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+0443: "у" CYRILLIC SMALL LETTER U --> <Key - latin:keyLabel="у" + latin:keySpec="у" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_cyrillic_u" /> + latin:moreKeys="!text/morekeys_cyrillic_u" /> <!-- U+043A: "к" CYRILLIC SMALL LETTER KA --> <Key - latin:keyLabel="к" + latin:keySpec="к" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="!text/more_keys_for_cyrillic_ka" /> + latin:moreKeys="!text/morekeys_cyrillic_ka" /> <!-- U+0435: "е" CYRILLIC SMALL LETTER IE --> <Key - latin:keyLabel="е" + latin:keySpec="е" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_cyrillic_ie" /> + latin:moreKeys="!text/morekeys_cyrillic_ie" /> <!-- U+043D: "н" CYRILLIC SMALL LETTER EN --> <Key - latin:keyLabel="н" + latin:keySpec="н" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_cyrillic_en" /> + latin:moreKeys="!text/morekeys_cyrillic_en" /> <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE --> <Key - latin:keyLabel="г" + latin:keySpec="г" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_cyrillic_ghe" /> + latin:moreKeys="!text/morekeys_cyrillic_ghe" /> <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA --> <Key - latin:keyLabel="ш" + latin:keySpec="ш" latin:keyHintLabel="8" latin:additionalMoreKeys="8" /> <Key - latin:keyLabel="!text/keylabel_for_east_slavic_row1_9" + latin:keySpec="!text/keyspec_east_slavic_row1_9" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE --> <Key - latin:keyLabel="з" + latin:keySpec="з" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> <!-- U+0445: "х" CYRILLIC SMALL LETTER HA --> <Key - latin:keyLabel="х" /> + latin:keySpec="х" /> </merge> diff --git a/java/res/xml/rowkeys_east_slavic2.xml b/java/res/xml/rowkeys_east_slavic2.xml index 2e412f08c..21463fb7d 100644 --- a/java/res/xml/rowkeys_east_slavic2.xml +++ b/java/res/xml/rowkeys_east_slavic2.xml @@ -23,37 +23,37 @@ > <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF --> <Key - latin:keyLabel="ф" /> + latin:keySpec="ф" /> <Key - latin:keyLabel="!text/keylabel_for_east_slavic_row2_1" - latin:moreKeys="!text/more_keys_for_east_slavic_row2_1" /> + latin:keySpec="!text/keyspec_east_slavic_row2_2" + latin:moreKeys="!text/morekeys_east_slavic_row2_2" /> <!-- U+0432: "в" CYRILLIC SMALL LETTER VE --> <Key - latin:keyLabel="в" /> + latin:keySpec="в" /> <!-- U+0430: "а" CYRILLIC SMALL LETTER A --> <Key - latin:keyLabel="а" - latin:moreKeys="!text/more_keys_for_cyrillic_a" /> + latin:keySpec="а" + latin:moreKeys="!text/morekeys_cyrillic_a" /> <!-- U+043F: "п" CYRILLIC SMALL LETTER PE --> <Key - latin:keyLabel="п" /> + latin:keySpec="п" /> <!-- U+0440: "р" CYRILLIC SMALL LETTER ER --> <Key - latin:keyLabel="р" /> + latin:keySpec="р" /> <!-- U+043E: "о" CYRILLIC SMALL LETTER O --> <Key - latin:keyLabel="о" - latin:moreKeys="!text/more_keys_for_cyrillic_o" /> + latin:keySpec="о" + latin:moreKeys="!text/morekeys_cyrillic_o" /> <!-- U+043B: "л" CYRILLIC SMALL LETTER EL --> <Key - latin:keyLabel="л" /> + latin:keySpec="л" /> <!-- U+0434: "д" CYRILLIC SMALL LETTER DE --> <Key - latin:keyLabel="д" /> + latin:keySpec="д" /> <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE --> <Key - latin:keyLabel="ж" /> + latin:keySpec="ж" /> <Key - latin:keyLabel="!text/keylabel_for_east_slavic_row2_11" - latin:moreKeys="!text/more_keys_for_east_slavic_row2_11" /> + latin:keySpec="!text/keyspec_east_slavic_row2_11" + latin:moreKeys="!text/morekeys_east_slavic_row2_11" /> </merge> diff --git a/java/res/xml/rowkeys_east_slavic3.xml b/java/res/xml/rowkeys_east_slavic3.xml index c3a171b49..54802e878 100644 --- a/java/res/xml/rowkeys_east_slavic3.xml +++ b/java/res/xml/rowkeys_east_slavic3.xml @@ -23,29 +23,29 @@ > <!-- U+044F: "я" CYRILLIC SMALL LETTER YA --> <Key - latin:keyLabel="я" /> + latin:keySpec="я" /> <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE --> <Key - latin:keyLabel="ч" /> + latin:keySpec="ч" /> <!-- U+0441: "с" CYRILLIC SMALL LETTER ES --> <Key - latin:keyLabel="с" /> + latin:keySpec="с" /> <!-- U+043C: "м" CYRILLIC SMALL LETTER EM --> <Key - latin:keyLabel="м" /> + latin:keySpec="м" /> <Key - latin:keyLabel="!text/keylabel_for_east_slavic_row3_5" /> + latin:keySpec="!text/keyspec_east_slavic_row3_5" /> <!-- U+0442: "т" CYRILLIC SMALL LETTER TE --> <Key - latin:keyLabel="т" /> + latin:keySpec="т" /> <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN --> <Key - latin:keyLabel="ь" - latin:moreKeys="!text/more_keys_for_cyrillic_soft_sign" /> + latin:keySpec="ь" + latin:moreKeys="!text/morekeys_cyrillic_soft_sign" /> <!-- U+0431: "б" CYRILLIC SMALL LETTER BE --> <Key - latin:keyLabel="б" /> + latin:keySpec="б" /> <!-- U+044E: "ю" CYRILLIC SMALL LETTER YU --> <Key - latin:keyLabel="ю" /> + latin:keySpec="ю" /> </merge> diff --git a/java/res/xml/rowkeys_farsi1.xml b/java/res/xml/rowkeys_farsi1.xml index 5a22a2462..abc2c9614 100644 --- a/java/res/xml/rowkeys_farsi1.xml +++ b/java/res/xml/rowkeys_farsi1.xml @@ -18,58 +18,49 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0636: "ض" ARABIC LETTER DAD U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE --> <Key - latin:keyLabel="ض" + latin:keySpec="ض" latin:keyHintLabel="۱" - latin:additionalMoreKeys="۱,1" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۱,1" /> <!-- U+0635: "ص" ARABIC LETTER SAD U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO --> <Key - latin:keyLabel="ص" + latin:keySpec="ص" latin:keyHintLabel="۲" - latin:additionalMoreKeys="۲,2" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۲,2" /> <!-- U+062B: "ث" ARABIC LETTER THEH U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE --> <Key - latin:keyLabel="ث" + latin:keySpec="ث" latin:keyHintLabel="۳" - latin:additionalMoreKeys="۳,3" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۳,3" /> <!-- U+0642: "ق" ARABIC LETTER QAF U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR --> <Key - latin:keyLabel="ق" + latin:keySpec="ق" latin:keyHintLabel="۴" - latin:additionalMoreKeys="۴,4" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۴,4" /> <!-- U+0641: "ف" ARABIC LETTER FEH U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE --> <Key - latin:keyLabel="ف" + latin:keySpec="ف" latin:keyHintLabel="۵" - latin:additionalMoreKeys="۵,5" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۵,5" /> <!-- U+063A: "غ" ARABIC LETTER GHAIN U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX --> <Key - latin:keyLabel="غ" + latin:keySpec="غ" latin:keyHintLabel="۶" - latin:additionalMoreKeys="۶,6" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۶,6" /> <!-- U+0639: "ع" ARABIC LETTER AIN U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN --> <Key - latin:keyLabel="ع" + latin:keySpec="ع" latin:keyHintLabel="۷" - latin:additionalMoreKeys="۷,7" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۷,7" /> <!-- U+0647: "ه" ARABIC LETTER HEH U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM U+0647/U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER @@ -77,27 +68,22 @@ U+0629: "ة" ARABIC LETTER TEH MARBUTA U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT --> <Key - latin:keyLabel="ه" + latin:keySpec="ه" latin:moreKeys="ﻫ|ه‍,هٔ,ة,%" latin:keyHintLabel="۸" - latin:additionalMoreKeys="۸,8" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۸,8" /> <!-- U+062E: "خ" ARABIC LETTER KHAH U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE --> <Key - latin:keyLabel="خ" + latin:keySpec="خ" latin:keyHintLabel="۹" - latin:additionalMoreKeys="۹,9" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۹,9" /> <!-- U+062D: "ح" ARABIC LETTER HAH U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO --> <Key - latin:keyLabel="ح" + latin:keySpec="ح" latin:keyHintLabel="۰" - latin:additionalMoreKeys="۰,0" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="۰,0" /> <!-- U+062C: "ج" ARABIC LETTER JEEM --> - <Key - latin:keyLabel="ج" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ج" /> </merge> diff --git a/java/res/xml/rowkeys_farsi2.xml b/java/res/xml/rowkeys_farsi2.xml index 590161f62..82f1903c7 100644 --- a/java/res/xml/rowkeys_farsi2.xml +++ b/java/res/xml/rowkeys_farsi2.xml @@ -18,34 +18,23 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0634: "ش" ARABIC LETTER SHEEN --> - <Key - latin:keyLabel="ش" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ش" /> <!-- U+0633: "س" ARABIC LETTER SEEN --> - <Key - latin:keyLabel="س" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="س" /> <!-- U+06CC: "ی" ARABIC LETTER FARSI YEH U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE U+064A: "ي" ARABIC LETTER YEH U+FBE8: "ﯨ" ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM U+0649: "ى" ARABIC LETTER ALEF MAKSURA --> <Key - latin:keyLabel="ی" - latin:moreKeys="ئ,ي,ﯨ|ى" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ی" + latin:moreKeys="ئ,ي,ﯨ|ى" /> <!-- U+0628: "ب" ARABIC LETTER BEH --> - <Key - latin:keyLabel="ب" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ب" /> <!-- U+0644: "ل" ARABIC LETTER LAM --> - <Key - latin:keyLabel="ل" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ل" /> <!-- U+0627: "ا" ARABIC LETTER ALEF U+0671: "ٱ" ARABIC LETTER ALEF WASLA U+0621: "ء" ARABIC LETTER HAMZA @@ -53,31 +42,22 @@ U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW --> <Key - latin:keyLabel="ا" - latin:moreKeys="!fixedColumnOrder!5,ٱ,ء,آ,أ,إ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ا" + latin:moreKeys="!fixedColumnOrder!5,ٱ,ء,آ,أ,إ" /> <!-- U+062A: "ت" ARABIC LETTER TEH U+0629: "ة": ARABIC LETTER TEH MARBUTA --> <Key - latin:keyLabel="ت" - latin:moreKeys="ة" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ت" + latin:moreKeys="ة" /> <!-- U+0646: "ن" ARABIC LETTER NOON --> - <Key - latin:keyLabel="ن" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ن" /> <!-- U+0645: "م" ARABIC LETTER MEEM --> - <Key - latin:keyLabel="م" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="م" /> <!-- U+06A9: "ک" ARABIC LETTER KEHEH U+0643: "ك" ARABIC LETTER KAF --> <Key - latin:keyLabel="ک" - latin:moreKeys="ك" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ک" + latin:moreKeys="ك" /> <!-- U+06AF: "گ" ARABIC LETTER GAF --> - <Key - latin:keyLabel="گ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="گ" /> </merge> diff --git a/java/res/xml/rowkeys_farsi3.xml b/java/res/xml/rowkeys_farsi3.xml index 98949f4c0..b825a36d5 100644 --- a/java/res/xml/rowkeys_farsi3.xml +++ b/java/res/xml/rowkeys_farsi3.xml @@ -18,47 +18,27 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <!-- U+0638: "ظ" ARABIC LETTER ZAH --> - <Key - latin:keyLabel="ظ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ظ" /> <!-- U+0637: "ط" ARABIC LETTER TAH --> - <Key - latin:keyLabel="ط" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ط" /> <!-- U+0698: "ژ" ARABIC LETTER JEH --> - <Key - latin:keyLabel="ژ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ژ" /> <!-- U+0632: "ز" ARABIC LETTER ZAIN --> - <Key - latin:keyLabel="ز" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ز" /> <!-- U+0631: "ر" ARABIC LETTER REH --> - <Key - latin:keyLabel="ر" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ر" /> <!-- U+0630: "ذ" ARABIC LETTER THAL --> - <Key - latin:keyLabel="ذ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ذ" /> <!-- U+062F: "د" ARABIC LETTER DAL --> - <Key - latin:keyLabel="د" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="د" /> <!-- U+067E: "پ" ARABIC LETTER PEH --> - <Key - latin:keyLabel="پ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="پ" /> <!-- U+0648: "و" ARABIC LETTER WAW U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE --> <Key - latin:keyLabel="و" - latin:moreKeys="ؤ" - latin:keyLabelFlags="fontNormal" /> - <include - latin:keyboardLayout="@xml/keys_farsi3_right" /> + latin:keySpec="و" + latin:moreKeys="ؤ" /> + <include latin:keyboardLayout="@xml/keys_farsi3_right" /> </merge> diff --git a/java/res/xml/rowkeys_georgian1.xml b/java/res/xml/rowkeys_georgian1.xml index d31a4c79c..c412aa3fa 100644 --- a/java/res/xml/rowkeys_georgian1.xml +++ b/java/res/xml/rowkeys_georgian1.xml @@ -26,104 +26,104 @@ latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" > <Key - latin:keyLabel="Q" + latin:keySpec="Q" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+10ED: "ჭ" GEORGIAN LETTER CHAR --> <Key - latin:keyLabel="ჭ" + latin:keySpec="ჭ" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <Key - latin:keyLabel="E" + latin:keySpec="E" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> <!-- U+10E6: "ღ" GEORGIAN LETTER GHAN --> <Key - latin:keyLabel="ღ" + latin:keySpec="ღ" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+10D7: "თ" GEORGIAN LETTER TAN --> <Key - latin:keyLabel="თ" + latin:keySpec="თ" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <Key - latin:keyLabel="Y" + latin:keySpec="Y" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <Key - latin:keyLabel="U" + latin:keySpec="U" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <Key - latin:keyLabel="I" + latin:keySpec="I" latin:keyHintLabel="8" latin:additionalMoreKeys="8" /> <Key - latin:keyLabel="O" + latin:keySpec="O" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <Key - latin:keyLabel="P" + latin:keySpec="P" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </case> <default> <!-- U+10E5: "ქ" GEORGIAN LETTER GHAN --> <Key - latin:keyLabel="ქ" + latin:keySpec="ქ" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+10EC: "წ" GEORGIAN LETTER CIL --> <Key - latin:keyLabel="წ" + latin:keySpec="წ" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+10D4: "ე" GEORGIAN LETTER EN U+10F1: "ჱ" GEORGIAN LETTER HE --> <Key - latin:keyLabel="ე" + latin:keySpec="ე" latin:moreKeys="ჱ" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> <!-- U+10E0: "რ" GEORGIAN LETTER RAE --> <Key - latin:keyLabel="რ" + latin:keySpec="რ" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+10E2: "ტ" GEORGIAN LETTER TAR --> <Key - latin:keyLabel="ტ" + latin:keySpec="ტ" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <!-- U+10E7: "ყ" GEORGIAN LETTER QAR U+10F8: "ჸ" GEORGIAN LETTER ELIFI --> <Key - latin:keyLabel="ყ" + latin:keySpec="ყ" latin:moreKeys="ჸ" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <!-- U+10E3: "უ" GEORGIAN LETTER UN --> <Key - latin:keyLabel="უ" + latin:keySpec="უ" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+10D8: "ი" GEORGIAN LETTER IN U+10F2: "ჲ" GEORGIAN LETTER HIE --> <Key - latin:keyLabel="ი" + latin:keySpec="ი" latin:moreKeys="ჲ" latin:keyHintLabel="8" latin:additionalMoreKeys="8" /> <!-- U+10DD: "ო" GEORGIAN LETTER ON --> <Key - latin:keyLabel="ო" + latin:keySpec="ო" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+10DE: "პ" GEORGIAN LETTER PAR --> <Key - latin:keyLabel="პ" + latin:keySpec="პ" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </default> diff --git a/java/res/xml/rowkeys_georgian2.xml b/java/res/xml/rowkeys_georgian2.xml index cdccda31f..162960d75 100644 --- a/java/res/xml/rowkeys_georgian2.xml +++ b/java/res/xml/rowkeys_georgian2.xml @@ -26,64 +26,64 @@ latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" > <Key - latin:keyLabel="A" /> + latin:keySpec="A" /> <!-- U+10E8: "შ" GEORGIAN LETTER SHIN --> <Key - latin:keyLabel="შ" /> + latin:keySpec="შ" /> <Key - latin:keyLabel="D" /> + latin:keySpec="D" /> <Key - latin:keyLabel="F" /> + latin:keySpec="F" /> <Key - latin:keyLabel="G" /> + latin:keySpec="G" /> <Key - latin:keyLabel="H" /> + latin:keySpec="H" /> <!-- U+10DF: "ჟ" GEORGIAN LETTER ZHAR --> <Key - latin:keyLabel="ჟ" /> + latin:keySpec="ჟ" /> <Key - latin:keyLabel="K" /> + latin:keySpec="K" /> <Key - latin:keyLabel="L" /> + latin:keySpec="L" /> </case> <default> <!-- U+10D0: "ა" GEORGIAN LETTER AN U+10FA: "ჺ" GEORGIAN LETTER AIN --> <Key - latin:keyLabel="ა" + latin:keySpec="ა" latin:moreKeys="ჺ" /> <!-- U+10E1: "ს" GEORGIAN LETTER SAN --> <Key - latin:keyLabel="ს" /> + latin:keySpec="ს" /> <!-- U+10D3: "დ" GEORGIAN LETTER DON --> <Key - latin:keyLabel="დ" /> + latin:keySpec="დ" /> <!-- U+10E4: "ფ" GEORGIAN LETTER PHAR U+10F6: "ჶ" GEORGIAN LETTER FI --> <Key - latin:keyLabel="ფ" + latin:keySpec="ფ" latin:moreKeys="ჶ" /> <!-- U+10D2: "გ" GEORGIAN LETTER GAN U+10F9: "ჹ" GEORGIAN LETTER TURNED GAN --> <Key - latin:keyLabel="გ" + latin:keySpec="გ" latin:moreKeys="ჹ" /> <!-- U+10F0: "ჰ" GEORGIAN LETTER HAE U+10F5: "ჵ" GEORGIAN LETTER HOE --> <Key - latin:keyLabel="ჰ" + latin:keySpec="ჰ" latin:moreKeys="ჵ" /> <!-- U+10EF: "ჯ" GEORGIAN LETTER JHAN U+10F7: "ჷ" GEORGIAN LETTER YN --> <Key - latin:keyLabel="ჯ" + latin:keySpec="ჯ" latin:moreKeys="ჷ" /> <!-- U+10D9: "კ" GEORGIAN LETTER KAN --> <Key - latin:keyLabel="კ" /> + latin:keySpec="კ" /> <!-- U+10DA: "ლ" GEORGIAN LETTER LAS --> <Key - latin:keyLabel="ლ" /> + latin:keySpec="ლ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_georgian3.xml b/java/res/xml/rowkeys_georgian3.xml index a3714586f..a16acf8d3 100644 --- a/java/res/xml/rowkeys_georgian3.xml +++ b/java/res/xml/rowkeys_georgian3.xml @@ -27,49 +27,49 @@ > <!-- U+10EB: "ძ" GEORGIAN LETTER JIL --> <Key - latin:keyLabel="ძ" /> + latin:keySpec="ძ" /> <Key - latin:keyLabel="X" /> + latin:keySpec="X" /> <!-- U+10E9: "ჩ" GEORGIAN LETTER CHIN --> <Key - latin:keyLabel="ჩ" /> + latin:keySpec="ჩ" /> <Key - latin:keyLabel="V" /> + latin:keySpec="V" /> <Key - latin:keyLabel="B" /> + latin:keySpec="B" /> <Key - latin:keyLabel="N" /> + latin:keySpec="N" /> <Key - latin:keyLabel="M" /> + latin:keySpec="M" /> </case> <default> <!-- U+10D6: "ზ" GEORGIAN LETTER ZEN --> <Key - latin:keyLabel="ზ" /> + latin:keySpec="ზ" /> <!-- U+10EE: "ხ" GEORGIAN LETTER XAN U+10F4: "ჴ" GEORGIAN LETTER HAR --> <Key - latin:keyLabel="ხ" + latin:keySpec="ხ" latin:moreKeys="ჴ" /> <!-- U+10EA: "ც" GEORGIAN LETTER CAN --> <Key - latin:keyLabel="ც" /> + latin:keySpec="ც" /> <!-- U+10D5: "ვ" GEORGIAN LETTER VIN U+10F3: "ჳ" GEORGIAN LETTER WE --> <Key - latin:keyLabel="ვ" + latin:keySpec="ვ" latin:moreKeys="ჳ" /> <!-- U+10D1: "ბ" GEORGIAN LETTER BAN --> <Key - latin:keyLabel="ბ" /> + latin:keySpec="ბ" /> <!-- U+10DC: "ნ" GEORGIAN LETTER NAR U+10FC: "ჼ" MODIFIER LETTER GEORGIAN NAR --> <Key - latin:keyLabel="ნ" + latin:keySpec="ნ" latin:moreKeys="ჼ" /> <!-- U+10DB: "მ" GEORGIAN LETTER MAN --> <Key - latin:keyLabel="მ" /> + latin:keySpec="მ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_greek1.xml b/java/res/xml/rowkeys_greek1.xml index 5777d3b85..6d767794c 100644 --- a/java/res/xml/rowkeys_greek1.xml +++ b/java/res/xml/rowkeys_greek1.xml @@ -21,6 +21,24 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > + <switch> + <case + latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" + > + <Key + latin:keySpec=":" + latin:keyHintLabel="1" + latin:moreKeys=";" + latin:additionalMoreKeys="1" /> + </case> + <default> + <Key + latin:keySpec=";" + latin:keyHintLabel="1" + latin:moreKeys=":" + latin:additionalMoreKeys="1" /> + </default> + </switch> <!-- TODO: Should find a way to compound Greek dialytika tonos and other Greek letters. --> <!-- <switch> @@ -29,7 +47,7 @@ > U+0385: "΅" GREEK DIALYTIKA TONOS <Key - latin:keyLabel="΅" + latin:keySpec="΅" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> </case> @@ -37,7 +55,7 @@ --> <!-- U+03C2: "ς" GREEK SMALL LETTER FINAL SIGMA --> <Key - latin:keyLabel="ς" + latin:keySpec="ς" latin:keyLabelFlags="preserveCase" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> @@ -48,18 +66,18 @@ <!-- U+03B5: "ε" GREEK SMALL LETTER EPSILON U+03AD: "έ" GREEK SMALL LETTER EPSILON WITH TONOS --> <Key - latin:keyLabel="ε" + latin:keySpec="ε" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="έ" /> + latin:moreKeys="έ,%" /> <!-- U+03C1: "ρ" GREEK SMALL LETTER RHO --> <Key - latin:keyLabel="ρ" + latin:keySpec="ρ" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+03C4: "τ" GREEK SMALL LETTER TAU --> <Key - latin:keyLabel="τ" + latin:keySpec="τ" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <!-- U+03C5: "υ" GREEK SMALL LETTER UPSILON @@ -67,13 +85,13 @@ U+03CB: "ϋ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA U+03B0: "ΰ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS --> <Key - latin:keyLabel="υ" + latin:keySpec="υ" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="ύ,ϋ,ΰ" /> + latin:moreKeys="ύ,%,ϋ,ΰ" /> <!-- U+03B8: "θ" GREEK SMALL LETTER THETA --> <Key - latin:keyLabel="θ" + latin:keySpec="θ" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+03B9: "ι" GREEK SMALL LETTER IOTA @@ -81,20 +99,20 @@ U+03CA: "ϊ" GREEK SMALL LETTER IOTA WITH DIALYTIKA U+0390: "ΐ" GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS --> <Key - latin:keyLabel="ι" + latin:keySpec="ι" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="ί,ϊ,ΐ" /> + latin:moreKeys="ί,%,ϊ,ΐ" /> <!-- U+03BF: "ο" GREEK SMALL LETTER OMICRON U+03CC: "ό" GREEK SMALL LETTER OMICRON WITH TONOS --> <Key - latin:keyLabel="ο" + latin:keySpec="ο" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="ό" /> + latin:moreKeys="ό,%" /> <!-- U+03C0: "π" GREEK SMALL LETTER PI --> <Key - latin:keyLabel="π" + latin:keySpec="π" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_greek2.xml b/java/res/xml/rowkeys_greek2.xml index 91bdc1165..d8769caa9 100644 --- a/java/res/xml/rowkeys_greek2.xml +++ b/java/res/xml/rowkeys_greek2.xml @@ -24,32 +24,32 @@ <!-- U+03B1: "α" GREEK SMALL LETTER ALPHA U+03AC: "ά" GREEK SMALL LETTER ALPHA WITH TONOS --> <Key - latin:keyLabel="α" + latin:keySpec="α" latin:moreKeys="ά" /> <!-- U+03C3: "σ" GREEK SMALL LETTER SIGMA --> <Key - latin:keyLabel="σ" /> + latin:keySpec="σ" /> <!-- U+03B4: "δ" GREEK SMALL LETTER DELTA --> <Key - latin:keyLabel="δ" /> + latin:keySpec="δ" /> <!-- U+03C6: "φ" GREEK SMALL LETTER PHI --> <Key - latin:keyLabel="φ" /> + latin:keySpec="φ" /> <!-- U+03B3: "γ" GREEK SMALL LETTER GAMMA --> <Key - latin:keyLabel="γ" /> + latin:keySpec="γ" /> <!-- U+03B7: "η" GREEK SMALL LETTER ETA U+03AE: "ή" GREEK SMALL LETTER ETA WITH TONOS --> <Key - latin:keyLabel="η" + latin:keySpec="η" latin:moreKeys="ή" /> <!-- U+03BE: "ξ" GREEK SMALL LETTER XI --> <Key - latin:keyLabel="ξ" /> + latin:keySpec="ξ" /> <!-- U+03BA: "κ" GREEK SMALL LETTER KAPPA --> <Key - latin:keyLabel="κ" /> + latin:keySpec="κ" /> <!-- U+03BB: "λ" GREEK SMALL LETTER LAMDA --> <Key - latin:keyLabel="λ" /> + latin:keySpec="λ" /> </merge> diff --git a/java/res/xml/rowkeys_greek3.xml b/java/res/xml/rowkeys_greek3.xml index 8a99db925..3f989bc9c 100644 --- a/java/res/xml/rowkeys_greek3.xml +++ b/java/res/xml/rowkeys_greek3.xml @@ -23,25 +23,25 @@ > <!-- U+03B6: "ζ" GREEK SMALL LETTER ZETA --> <Key - latin:keyLabel="ζ" /> + latin:keySpec="ζ" /> <!-- U+03C7: "χ" GREEK SMALL LETTER CHI --> <Key - latin:keyLabel="χ" /> + latin:keySpec="χ" /> <!-- U+03C8: "ψ" GREEK SMALL LETTER PSI --> <Key - latin:keyLabel="ψ" /> + latin:keySpec="ψ" /> <!-- U+03C9: "ω" GREEK SMALL LETTER OMEGA U+03CE: "ώ" GREEK SMALL LETTER OMEGA WITH TONOS --> <Key - latin:keyLabel="ω" + latin:keySpec="ω" latin:moreKeys="ώ" /> <!-- U+03B2: "β" GREEK SMALL LETTER BETA --> <Key - latin:keyLabel="β" /> + latin:keySpec="β" /> <!-- U+03BD: "ν" GREEK SMALL LETTER NU --> <Key - latin:keyLabel="ν" /> + latin:keySpec="ν" /> <!-- U+03BC: "μ" GREEK SMALL LETTER MU --> <Key - latin:keyLabel="μ" /> + latin:keySpec="μ" /> </merge> diff --git a/java/res/xml/rowkeys_hebrew1.xml b/java/res/xml/rowkeys_hebrew1.xml index 81a00e367..e888977ae 100644 --- a/java/res/xml/rowkeys_hebrew1.xml +++ b/java/res/xml/rowkeys_hebrew1.xml @@ -26,22 +26,22 @@ latin:mode="email|url" > <Key - latin:keyLabel="-" + latin:keySpec="-" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <Key - latin:keyLabel="_" + latin:keySpec="_" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> </case> <default> <Key - latin:keyLabel="\'" + latin:keySpec="\'" latin:keyHintLabel="1" latin:additionalMoreKeys="1" latin:moreKeys=""" /> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:keyHintLabel="2" latin:additionalMoreKeys="2" latin:moreKeys="_" /> @@ -49,42 +49,42 @@ </switch> <!-- U+05E7: "ק" HEBREW LETTER QOF --> <Key - latin:keyLabel="ק" + latin:keySpec="ק" latin:keyHintLabel="3" latin:additionalMoreKeys="3" /> <!-- U+05E8: "ר" HEBREW LETTER RESH --> <Key - latin:keyLabel="ר" + latin:keySpec="ר" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+05D0: "א" HEBREW LETTER ALEF --> <Key - latin:keyLabel="א" + latin:keySpec="א" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <!-- U+05D8: "ט" HEBREW LETTER TET --> <Key - latin:keyLabel="ט" + latin:keySpec="ט" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <!-- U+05D5: "ו" HEBREW LETTER VAV --> <Key - latin:keyLabel="ו" + latin:keySpec="ו" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+05DF: "ן" HEBREW LETTER FINAL NUN --> <Key - latin:keyLabel="ן" + latin:keySpec="ן" latin:keyHintLabel="8" latin:additionalMoreKeys="8" /> <!-- U+05DD: "ם" HEBREW LETTER FINAL MEM --> <Key - latin:keyLabel="ם" + latin:keySpec="ם" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+05E4: "פ" HEBREW LETTER PE --> <Key - latin:keyLabel="פ" + latin:keySpec="פ" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_hebrew2.xml b/java/res/xml/rowkeys_hebrew2.xml index e4ecac335..d43f5a8f2 100644 --- a/java/res/xml/rowkeys_hebrew2.xml +++ b/java/res/xml/rowkeys_hebrew2.xml @@ -23,38 +23,38 @@ > <!-- U+05E9: "ש" HEBREW LETTER SHIN --> <Key - latin:keyLabel="ש" /> + latin:keySpec="ש" /> <!-- U+05D3: "ד" HEBREW LETTER DALET --> <Key - latin:keyLabel="ד" /> + latin:keySpec="ד" /> <!-- U+05D2: "ג" HEBREW LETTER GIMEL U+05D2 U+05F3: "ג׳" HEBREW LETTER GIMEL + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="ג" + latin:keySpec="ג" latin:moreKeys="ג׳" /> <!-- U+05DB: "כ" HEBREW LETTER KAF --> <Key - latin:keyLabel="כ" /> + latin:keySpec="כ" /> <!-- U+05E2: "ע" HEBREW LETTER AYIN --> <Key - latin:keyLabel="ע" /> + latin:keySpec="ע" /> <!-- U+05D9: "י" HEBREW LETTER YOD U+05F2 U+05B7: "ײַ" HEBREW LIGATURE YIDDISH DOUBLE YOD + HEBREW POINT PATAH --> <Key - latin:keyLabel="י" + latin:keySpec="י" latin:moreKeys="ײַ" /> <!-- U+05D7: "ח" HEBREW LETTER HET U+05D7 U+05F3: "ח׳" HEBREW LETTER HET + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="ח" + latin:keySpec="ח" latin:moreKeys="ח׳" /> <!-- U+05DC: "ל" HEBREW LETTER LAMED --> <Key - latin:keyLabel="ל" /> + latin:keySpec="ל" /> <!-- U+05DA: "ך" HEBREW LETTER FINAL KAF --> <Key - latin:keyLabel="ך" /> + latin:keySpec="ך" /> <!-- U+05E3: "ף" HEBREW LETTER FINAL PE --> <Key - latin:keyLabel="ף" /> + latin:keySpec="ף" /> </merge> diff --git a/java/res/xml/rowkeys_hebrew3.xml b/java/res/xml/rowkeys_hebrew3.xml index 805a7a596..928e6b255 100644 --- a/java/res/xml/rowkeys_hebrew3.xml +++ b/java/res/xml/rowkeys_hebrew3.xml @@ -24,36 +24,36 @@ <!-- U+05D6: "ז" HEBREW LETTER ZAYIN U+05D6 U+05F3: "ז׳" HEBREW LETTER ZAYIN + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="ז" + latin:keySpec="ז" latin:moreKeys="ז׳" /> <!-- U+05E1: "ס" HEBREW LETTER SAMEKH --> <Key - latin:keyLabel="ס" /> + latin:keySpec="ס" /> <!-- U+05D1: "ב" HEBREW LETTER BET --> <Key - latin:keyLabel="ב" /> + latin:keySpec="ב" /> <!-- U+05D4: "ה" HEBREW LETTER HE --> <Key - latin:keyLabel="ה" /> + latin:keySpec="ה" /> <!-- U+05E0: "נ" HEBREW LETTER NUN --> <Key - latin:keyLabel="נ" /> + latin:keySpec="נ" /> <!-- U+05DE: "מ" HEBREW LETTER MEM --> <Key - latin:keyLabel="מ" /> + latin:keySpec="מ" /> <!-- U+05E6: "צ" HEBREW LETTER TSADI U+05E6 U+05F3: "צ׳" HEBREW LETTER TSADI + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="צ" + latin:keySpec="צ" latin:moreKeys="צ׳" /> <!-- U+05EA: "ת" HEBREW LETTER TAV U+05EA U+05F3: "ת׳" HEBREW LETTER TAV + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="ת" + latin:keySpec="ת" latin:moreKeys="ת׳" /> <!-- U+05E5: "ץ" HEBREW LETTER FINAL TSADI U+05E5 U+05F3: "ץ׳" HEBREW LETTER FINAL TSADI + HEBREW PUNCTUATION GERESH --> <Key - latin:keyLabel="ץ" + latin:keySpec="ץ" latin:moreKeys="ץ׳" /> </merge> diff --git a/java/res/xml/rowkeys_hindi1.xml b/java/res/xml/rowkeys_hindi1.xml index c0b3cb913..cd08e1600 100644 --- a/java/res/xml/rowkeys_hindi1.xml +++ b/java/res/xml/rowkeys_hindi1.xml @@ -18,83 +18,62 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0914: "औ" DEVANAGARI LETTER AU U+0912/U+0902: "ऒं" DEVANAGARI LETTER SHORT O//DEVANAGARI SIGN ANUSVARA --> <Key - latin:keyLabel="औ" - latin:moreKeys="ऒं" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="औ" + latin:moreKeys="ऒं" /> <!-- U+0910: "ऐ" DEVANAGARI LETTER AI U+0910/U+0902: "ऐं" DEVANAGARI LETTER AI/DEVANAGARI SIGN ANUSVARA --> <Key - latin:keyLabel="ऐ" - latin:moreKeys="ऐं" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ऐ" + latin:moreKeys="ऐं" /> <!-- U+0906: "आ" DEVANAGARI LETTER AA U+0906/U+0902: "आं" DEVANAGARI LETTER AA/DEVANAGARI SIGN ANUSVARA U+0906/U+0901: "आँ" DEVANAGARI LETTER AA/DEVANAGARI SIGN CANDRABINDU --> <Key - latin:keyLabel="आ" - latin:moreKeys="आं,आँ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="आ" + latin:moreKeys="आं,आँ" /> <!-- U+0908: "ई" DEVANAGARI LETTER II U+0908/U+0902: "ईं" DEVANAGARI LETTER II/DEVANAGARI SIGN ANUSVARA --> <Key - latin:keyLabel="ई" - latin:moreKeys="ईं" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ई" + latin:moreKeys="ईं" /> <!-- U+090A: "ऊ" DEVANAGARI LETTER UU U+090A/U+0902: "ऊं" DEVANAGARI LETTER UU/DEVANAGARI SIGN ANUSVARA U+090A/U+0901: "ऊँ" DEVANAGARI LETTER UU/DEVANAGARI SIGN CANDRABINDU --> <Key - latin:keyLabel="ऊ" - latin:moreKeys="ऊं,ऊँ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ऊ" + latin:moreKeys="ऊं,ऊँ" /> <!-- U+092D: "भ" DEVANAGARI LETTER BHA --> - <Key - latin:keyLabel="भ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="भ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> - <Key - latin:keyStyle="baseKeyDevanagariSignVisarga" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> + <Key latin:keyStyle="baseKeyDevanagariSignVisarga" /> <!-- U+0918: "घ" DEVANAGARI LETTER GHA --> - <Key - latin:keyLabel="घ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="घ" /> <!-- U+0927: "ध" DEVANAGARI LETTER DHA U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> <Key - latin:keyLabel="ध" - latin:moreKeys="क्ष,श्र" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ध" + latin:moreKeys="क्ष,श्र" /> <!-- U+091D: "झ" DEVANAGARI LETTER JHA --> - <Key - latin:keyLabel="झ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="झ" /> <!-- U+0922: "ढ" DEVANAGARI LETTER DDHA --> - <Key - latin:keyLabel="ढ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ढ" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> <!-- U+0967: "१" DEVANAGARI DIGIT ONE --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignAu" latin:keyHintLabel="1" @@ -102,9 +81,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> <!-- U+0968: "२" DEVANAGARI DIGIT TWO --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignAi" latin:keyHintLabel="2" @@ -112,9 +90,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> <!-- U+0969: "३" DEVANAGARI DIGIT THREE --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignAa" latin:keyHintLabel="3" @@ -122,9 +99,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> <!-- U+096A: "४" DEVANAGARI DIGIT FOUR --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignIi" latin:keyHintLabel="4" @@ -132,65 +108,58 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> <!-- U+096B: "५" DEVANAGARI DIGIT FIVE --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignUu" latin:keyHintLabel="5" latin:additionalMoreKeys="५,5" /> <!-- U+092C: "ब" DEVANAGARI LETTER BA - U+096C: "६" DEVANAGARI DIGIT SIX - U+092C/U+0952: "ब॒" DEVANAGARI LETTER BA/DEVANAGARI STRESS SIGN ANUDATTA --> + U+092C/U+0952: "ब॒" DEVANAGARI LETTER BA/DEVANAGARI STRESS SIGN ANUDATTA + U+096C: "६" DEVANAGARI DIGIT SIX --> <Key - latin:keyLabel="ब" + latin:keySpec="ब" latin:moreKeys="ब॒,%" latin:keyHintLabel="6" - latin:additionalMoreKeys="६,6" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="६,6" /> <!-- U+0939: "ह" DEVANAGARI LETTER HA U+096D: "७" DEVANAGARI DIGIT SEVEN --> <Key - latin:keyLabel="ह" + latin:keySpec="ह" latin:keyHintLabel="7" - latin:additionalMoreKeys="७,7" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="७,7" /> <!-- U+0917: "ग" DEVANAGARI LETTER GA U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA U+0917/U+093C: "ग़" DEVANAGARI LETTER GA/DEVANAGARI SIGN NUKTA U+0917/U+0952: "ग॒" DEVANAGARI LETTER GA/DEVANAGARI STRESS SIGN ANUDATTA U+096E: "८" DEVANAGARI DIGIT EIGHT --> <Key - latin:keyLabel="ग" + latin:keySpec="ग" latin:moreKeys="ज्ञ,ग़,ग॒,%" latin:keyHintLabel="8" - latin:additionalMoreKeys="८,8" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="८,8" /> <!-- U+0926: "द" DEVANAGARI LETTER DA U+096F: "९" DEVANAGARI DIGIT NINE --> <Key - latin:keyLabel="द" + latin:keySpec="द" latin:keyHintLabel="9" - latin:additionalMoreKeys="९,9" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="९,9" /> <!-- U+091C: "ज" DEVANAGARI LETTER JA U+091C/U+0952: "ज॒" DEVANAGARI LETTER JA/DEVANAGARI STRESS SIGN ANUDATTA U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA U+091C/U+093C: "ज़" DEVANAGARI LETTER JA/DEVANAGARI SIGN NUKTA U+0966: "०" DEVANAGARI DIGIT ZERO --> <Key - latin:keyLabel="ज" + latin:keySpec="ज" latin:moreKeys="ज॒,ज्ञ,ज़,%" latin:keyHintLabel="0" - latin:additionalMoreKeys="०,0" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="०,0" /> <!-- U+0921: "ड" DEVANAGARI LETTER DDA U+0921/U+0952: "ड॒" DEVANAGARI LETTER DDA/DEVANAGARI STRESS SIGN ANUDATTA U+0921/U+093C: "ड़" DEVANAGARI LETTER DDA/DEVANAGARI SIGN NUKTA --> <Key - latin:keyLabel="ड" - latin:moreKeys="ड॒,ड़" - latin:keyLabelFlags="fontNormal" /> - </default> + latin:keySpec="ड" + latin:moreKeys="ड॒,ड़" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_hindi2.xml b/java/res/xml/rowkeys_hindi2.xml index 70ac66ee4..fec93f3c6 100644 --- a/java/res/xml/rowkeys_hindi2.xml +++ b/java/res/xml/rowkeys_hindi2.xml @@ -18,151 +18,114 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0913: "ओ" DEVANAGARI LETTER O U+0913/U+0902: "ओं" DEVANAGARI LETTER O/DEVANAGARI SIGN ANUSVARA U+0911: "ऑ" DEVANAGARI LETTER CANDRA O U+0912: "ऒ" DEVANAGARI LETTER SHORT O --> <Key - latin:keyLabel="ओ" - latin:moreKeys="ओं,ऑ,ऒ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ओ" + latin:moreKeys="ओं,ऑ,ऒ" /> <!-- U+090F: "ए" DEVANAGARI LETTER E U+090F/U+0902: "एं" DEVANAGARI LETTER E/DEVANAGARI SIGN ANUSVARA U+090F/U+0901: "एँ" DEVANAGARI LETTER E/DEVANAGARI SIGN CANDRABINDU U+090D: "ऍ" DEVANAGARI LETTER CANDRA E U+090E: "ऎ" DEVANAGARI LETTER SHORT E --> <Key - latin:keyLabel="ए" - latin:moreKeys="एं,एँ,ऍ,ऎ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ए" + latin:moreKeys="एं,एँ,ऍ,ऎ" /> <!-- U+0905: "अ" DEVANAGARI LETTER A U+0905/U+0902: "अं" DEVANAGARI LETTER A/DEVANAGARI SIGN ANUSVARA U+0905/U+0901: "अँ" DEVANAGARI LETTER A/DEVANAGARI SIGN CANDRABINDU --> <Key - latin:keyLabel="अ" - latin:moreKeys="अं,अँ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="अ" + latin:moreKeys="अं,अँ" /> <!-- U+0907: "इ" DEVANAGARI LETTER I U+0907/U+0902: "इं" DEVANAGARI LETTER I/DEVANAGARI SIGN ANUSVARA U+0907/U+0901: "इं" DEVANAGARI LETTER I/DEVANAGARI SIGN CANDRABINDU --> <Key - latin:keyLabel="इ" - latin:moreKeys="इं,इँ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="इ" + latin:moreKeys="इं,इँ" /> <!-- U+0909: "उ" DEVANAGARI LETTER U U+0909/U+0902: "उं" DEVANAGARI LETTER U/DEVANAGARI SIGN ANUSVARA U+0909/U+0901: "उँ" DEVANAGARI LETTER U/DEVANAGARI SIGN CANDRABINDU --> <Key - latin:keyLabel="उ" - latin:moreKeys="उं,उँ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="उ" + latin:moreKeys="उं,उँ" /> <!-- U+092B: "फ" DEVANAGARI LETTER PHA U+092B/U+093C: "फ़" DEVANAGARI LETTER PHA/DEVANAGARI SIGN NUKTA --> <Key - latin:keyLabel="फ" - latin:moreKeys="फ़" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="फ" + latin:moreKeys="फ़" /> <!-- U+0931: "ऱ" DEVANAGARI LETTER RRA U+094D/U+0930: "्र" DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA U+0930/U+094D: "र्" DEVANAGARI LETTER RA/DEVANAGARI SIGN VIRAMA --> <Key - latin:keyLabel="ऱ" - latin:moreKeys="्र,र्" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ऱ" + latin:moreKeys="्र,र्" /> <!-- U+0916: "ख" DEVANAGARI LETTER KHA U+0916/U+093C: "ख़" DEVANAGARI LETTER KHA/DEVANAGARI SIGN NUKTA --> <Key - latin:keyLabel="ख" - latin:moreKeys="ख़" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ख" + latin:moreKeys="ख़" /> <!-- U+0925: "थ" DEVANAGARI LETTER THA --> - <Key - latin:keyLabel="थ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="थ" /> <!-- U+091B: "छ" DEVANAGARI LETTER CHA --> - <Key - latin:keyLabel="छ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="छ" /> <!-- U+0920: "ठ" DEVANAGARI LETTER TTHA --> - <Key - latin:keyLabel="ठ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ठ" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignO" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignO" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignE" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignE" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> - <Key - latin:keyStyle="baseKeyDevanagariSignVirama" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <Key latin:keyStyle="baseKeyDevanagariSignVirama" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignI" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignI" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignU" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignU" /> <!-- U+092A: "प" DEVANAGARI LETTER PA --> - <Key - latin:keyLabel="प" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="प" /> <!-- U+0930: "र" DEVANAGARI LETTER RA U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R U+0930/U+093C: "ऱ" DEVANAGARI LETTER RA/DEVANAGARI SIGN NUKTA U+0960: "ॠ" DEVANAGARI LETTER VOCALIC RR --> <Key - latin:keyLabel="र" - latin:moreKeys="ऋ,ऱ,ॠ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="र" + latin:moreKeys="ऋ,ऱ,ॠ" /> <!-- U+0915: "क" DEVANAGARI LETTER KA U+0915/U+093C: "क़" DEVANAGARI LETTER KA/DEVANAGARI SIGN NUKTA --> <Key - latin:keyLabel="क" - latin:moreKeys="क़" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="क" + latin:moreKeys="क़" /> <!-- U+0924: "त" DEVANAGARI LETTER TA U+0924/U+094D/U+0930: "त्र" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> <Key - latin:keyLabel="त" - latin:moreKeys="त्र" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="त" + latin:moreKeys="त्र" /> <!-- U+091A: "च" DEVANAGARI LETTER CA --> - <Key - latin:keyLabel="च" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="च" /> <!-- U+091F: "ट" DEVANAGARI LETTER TTA --> - <Key - latin:keyLabel="ट" - latin:keyLabelFlags="fontNormal" /> - </default> + <Key latin:keySpec="ट" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_hindi3.xml b/java/res/xml/rowkeys_hindi3.xml index 136bc5f22..2e6d6864e 100644 --- a/java/res/xml/rowkeys_hindi3.xml +++ b/java/res/xml/rowkeys_hindi3.xml @@ -18,101 +18,80 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0911: "ऑ" DEVANAGARI LETTER CANDRA O --> - <Key - latin:keyLabel="ऑ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ऑ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_candrabindu" /> + <Key latin:keyStyle="baseKeyDevanagariSignCandrabindu" /> <!-- U+0923: "ण" DEVANAGARI LETTER NNA --> - <Key - latin:keyLabel="ण" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ण" /> <!-- U+0929: "ऩ" DEVANAGARI LETTER NNNA --> - <Key - latin:keyLabel="ऩ" /> + <Key latin:keySpec="ऩ" /> <!-- U+0933: "ळ" DEVANAGARI LETTER LLA U+0934: "ऴ" DEVANAGARI LETTER LLLA --> <Key - latin:keyLabel="ळ" - latin:moreKeys="ऴ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ळ" + latin:moreKeys="ऴ" /> <!-- U+0936: "श" DEVANAGARI LETTER SHA --> - <Key - latin:keyLabel="श" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="श" /> <!-- U+0937: "ष" DEVANAGARI LETTER SSA --> - <Key - latin:keyLabel="ष" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ष" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_vowel_sign_vocalic_r" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_vocalic_r" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignVocalicR" /> <!-- U+091E: "ञ" DEVANAGARI LETTER NYA --> - <Key - latin:keyLabel="ञ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ञ" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_vowel_sign_candra_o" /> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_candra_o" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignCandraO" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> <!-- U+092E: "म" DEVANAGARI LETTER MA U+0950: "ॐ" DEVANAGARI OM --> <Key - latin:keyLabel="म" - latin:moreKeys="ॐ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="म" + latin:moreKeys="ॐ" /> <!-- U+0928: "न" DEVANAGARI LETTER NA U+091E: "ञ" DEVANAGARI LETTER NYA U+0919: "ङ" DEVANAGARI LETTER NGA U+0928/U+093C: "ऩ" DEVANAGARI LETTER NA/DEVANAGARI SIGN NUKTA --> <Key - latin:keyLabel="न" - latin:moreKeys="ञ,ङ,ऩ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="न" + latin:moreKeys="ञ,ङ,ऩ" /> <!-- U+0935: "व" DEVANAGARI LETTER VA --> - <Key - latin:keyLabel="व" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="व" /> <!-- U+0932: "ल" DEVANAGARI LETTER LA U+090C: "ऌ" DEVANAGARI LETTER VOCALIC L U+0961: "ॡ" DEVANAGARI LETTER VOCALIC LL --> <Key - latin:keyLabel="ल" - latin:moreKeys="ऌ,ॡ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ल" + latin:moreKeys="ऌ,ॡ" /> <!-- U+0938: "स" DEVANAGARI LETTER SA --> - <Key - latin:keyLabel="स" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="स" /> <!-- U+092F: "य" DEVANAGARI LETTER YA U+095F: "य़" DEVANAGARI LETTER YYA --> <Key - latin:keyLabel="य" - latin:moreKeys="य़" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="य" + latin:moreKeys="य़" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_nukta" /> - </default> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_nukta" /> + <Key latin:keyStyle="baseKeyDevanagariSignNukta" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_hindi_compact1.xml b/java/res/xml/rowkeys_hindi_compact1.xml new file mode 100644 index 000000000..06a014162 --- /dev/null +++ b/java/res/xml/rowkeys_hindi_compact1.xml @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> + <!-- U+0914: "औ" DEVANAGARI LETTER AU + U+0967: "१" DEVANAGARI DIGIT ONE --> + <Key + latin:keySpec="औ" + latin:keyStyle="moreKeysDevanagariVowelSignAu" + latin:keyHintLabel="1" + latin:additionalMoreKeys="१,1" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> + <!-- U+0910: "ऐ" DEVANAGARI LETTER AI + U+0968: "२" DEVANAGARI DIGIT TWO --> + <Key + latin:keySpec="ऐ" + latin:keyStyle="moreKeysDevanagariVowelSignAi" + latin:keyHintLabel="2" + latin:additionalMoreKeys="२,2" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> + <!-- U+0906: "आ" DEVANAGARI LETTER AA + U+0969: "३" DEVANAGARI DIGIT THREE --> + <Key + latin:keySpec="आ" + latin:keyStyle="moreKeysDevanagariVowelSignAa" + latin:keyHintLabel="3" + latin:additionalMoreKeys="३,3" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> + <!-- U+0908: "ई" DEVANAGARI LETTER II + U+096A: "४" DEVANAGARI DIGIT FOUR --> + <Key + latin:keySpec="ई" + latin:keyStyle="moreKeysDevanagariVowelSignIi" + latin:keyHintLabel="4" + latin:additionalMoreKeys="४,4" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> + <!-- U+090A: "ऊ" DEVANAGARI LETTER UU + U+096B: "५" DEVANAGARI DIGIT FIVE --> + <Key + latin:keySpec="ऊ" + latin:keyStyle="moreKeysDevanagariVowelSignUu" + latin:keyHintLabel="5" + latin:additionalMoreKeys="५,5" /> + <!-- U+092C: "ब" DEVANAGARI LETTER BA + U+092D: "भ" DEVANAGARI LETTER BHA + U+096C: "६" DEVANAGARI DIGIT SIX --> + <Key + latin:keySpec="ब" + latin:moreKeys="भ,%" + latin:keyHintLabel="6" + latin:additionalMoreKeys="६,6" /> + <!-- U+0939: "ह" DEVANAGARI LETTER HA + U+096D: "७" DEVANAGARI DIGIT SEVEN --> + <Key + latin:keySpec="ह" + latin:keyHintLabel="7" + latin:additionalMoreKeys="७,7" /> + <!-- U+0917: "ग" DEVANAGARI LETTER GA + U+0918: "घ" DEVANAGARI LETTER GHA + U+096E: "८" DEVANAGARI DIGIT EIGHT --> + <Key + latin:keySpec="ग" + latin:moreKeys="घ,%" + latin:keyHintLabel="8" + latin:additionalMoreKeys="८,8" /> + <!-- U+0926: "द" DEVANAGARI LETTER DA + U+0927: "ध" DEVANAGARI LETTER DHA + U+096F: "९" DEVANAGARI DIGIT NINE --> + <Key + latin:keySpec="द" + latin:moreKeys="ध,%" + latin:keyHintLabel="9" + latin:additionalMoreKeys="९,9" /> + <!-- U+091C: "ज" DEVANAGARI LETTER JA + U+091D: "झ" DEVANAGARI LETTER JHA + U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA + U+0966: "०" DEVANAGARI DIGIT ZERO --> + <Key + latin:keySpec="ज" + latin:moreKeys="झ,ज्ञ,%" + latin:keyHintLabel="0" + latin:additionalMoreKeys="०,0" /> + <!-- U+0921: "ड" DEVANAGARI LETTER DDA + U+0922: "ढ" DEVANAGARI LETTER DDHA --> + <Key + latin:keySpec="ड" + latin:moreKeys="ढ" /> +</merge> diff --git a/java/res/xml/rowkeys_hindi_compact2.xml b/java/res/xml/rowkeys_hindi_compact2.xml new file mode 100644 index 000000000..7cbe5efbb --- /dev/null +++ b/java/res/xml/rowkeys_hindi_compact2.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> + <!-- U+0913: "ओ" DEVANAGARI LETTER O --> + <Key + latin:keySpec="ओ" + latin:keyStyle="moreKeysDevanagariVowelSignO" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> + <!-- U+090F: "ए" DEVANAGARI LETTER E --> + <Key + latin:keySpec="ए" + latin:keyStyle="moreKeysDevanagariVowelSignE" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <!-- U+0905: "अ" DEVANAGARI LETTER A --> + <Key + latin:keySpec="अ" + latin:keyStyle="moreKeysDevanagariSignVirama" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> + <!-- U+0907: "इ" DEVANAGARI LETTER I --> + <Key + latin:keySpec="इ" + latin:keyStyle="moreKeysDevanagariVowelSignI" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> + <!-- U+0909: "उ" DEVANAGARI LETTER U --> + <Key + latin:keySpec="उ" + latin:keyStyle="moreKeysDevanagariVowelSignU" /> + <!-- U+092A: "प" DEVANAGARI LETTER PA + U+092B: "फ" DEVANAGARI LETTER PHA --> + <Key + latin:keySpec="प" + latin:moreKeys="फ" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_vocalic_r" /> + <!-- U+0930: "र" DEVANAGARI LETTER RA --> + <Key + latin:keySpec="र" + latin:keyStyle="moreKeysDevanagariVowelSignVocalicR" /> + <!-- U+0915: "क" DEVANAGARI LETTER KA + U+0916: "ख" DEVANAGARI LETTER KHA --> + <Key + latin:keySpec="क" + latin:moreKeys="ख" /> + <!-- U+0924: "त" DEVANAGARI LETTER TA + U+0925: "थ" DEVANAGARI LETTER THA + U+0924/U+094D/U+0930: "त्र" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> + <Key + latin:keySpec="त" + latin:moreKeys="थ,त्र" /> + <!-- U+091A: "च" DEVANAGARI LETTER CA + U+091B: "छ" DEVANAGARI LETTER CHA --> + <Key + latin:keySpec="च" + latin:moreKeys="छ" /> + <!-- U+091F: "ट" DEVANAGARI LETTER TTA + U+0920: "ठ" DEVANAGARI LETTER TTHA --> + <Key + latin:keySpec="ट" + latin:moreKeys="ठ" /> +</merge> diff --git a/java/res/xml/rowkeys_hindi_compact3.xml b/java/res/xml/rowkeys_hindi_compact3.xml new file mode 100644 index 000000000..89a9f9d60 --- /dev/null +++ b/java/res/xml/rowkeys_hindi_compact3.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_candra_o" /> + <!-- U+0911: "ऑ" DEVANAGARI LETTER CANDRA O --> + <Key + latin:keySpec="ऑ" + latin:keyStyle="moreKeysDevanagariVowelSignCandraO" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_candra_e" /> + <!-- U+090D: "ऍ" DEVANAGARI LETTER CANDRA E --> + <Key + latin:keySpec="ऍ" + latin:keyStyle="moreKeysDevanagariVowelSignCandraE" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> + <!-- U+092E: "म" DEVANAGARI LETTER MA + U+0950: "ॐ" DEVANAGARI OM --> + <Key + latin:keySpec="म" + latin:moreKeys="ॐ" /> + <!-- U+0928: "न" DEVANAGARI LETTER NA + U+0923: "ण" DEVANAGARI LETTER NNA + U+091E: "ञ" DEVANAGARI LETTER NYA + U+0919: "ङ" DEVANAGARI LETTER NGA --> + <Key + latin:keySpec="न" + latin:moreKeys="ण,ञ,ङ" /> + <!-- U+0935: "व" DEVANAGARI LETTER VA --> + <Key latin:keySpec="व" /> + <!-- U+0932: "ल" DEVANAGARI LETTER LA --> + <Key latin:keySpec="ल" /> + <!-- U+0938: "स" DEVANAGARI LETTER SA + U+0936: "श" DEVANAGARI LETTER SHA + U+0937: "ष" DEVANAGARI LETTER SSA + U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> + <Key + latin:keySpec="स" + latin:moreKeys="श,ष,श्र" /> + <!-- U+092F: "य" DEVANAGARI LETTER YA --> + <Key latin:keySpec="य" /> + <!-- U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA --> + <Key + latin:keySpec="क्ष" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/rowkeys_khmer1.xml b/java/res/xml/rowkeys_khmer1.xml index 25da66400..79fd231a0 100644 --- a/java/res/xml/rowkeys_khmer1.xml +++ b/java/res/xml/rowkeys_khmer1.xml @@ -18,177 +18,159 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+200D: ZERO WIDTH JOINER --> <Key - latin:keyLabel="!" - latin:moreKeys="!icon/zwj_key|‍" /> + latin:keySpec="!" + latin:moreKeys="!icon/zwj_key|‍" + latin:keyLabelFlags="fontDefault" /> <!-- U+17D7: "ៗ" KHMER SIGN LEK TOO U+200C: ZERO WIDTH NON-JOINER --> <Key - latin:keyLabel="ៗ" - latin:moreKeys="!icon/zwnj_key|‌" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ៗ" + latin:moreKeys="!icon/zwnj_key|‌" /> <!-- U+17D1: "៑" KHMER SIGN VIRIAM --> <Key - latin:keyLabel=""" + latin:keySpec=""" latin:keyHintLabel="៑" - latin:moreKeys="៑" /> + latin:moreKeys="៑" + latin:keyLabelFlags="fontDefault" /> <!-- U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL U+20AC: "€" EURO SIGN --> <Key - latin:keyLabel="៛" + latin:keySpec="៛" latin:keyHintLabel="$" - latin:moreKeys="$,€" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="$,€" /> <!-- U+17D6: "៖" KHMER SIGN CAMNUC PII KUUH --> <Key - latin:keyLabel="%" + latin:keySpec="%" latin:keyHintLabel="៖" - latin:moreKeys="៖" /> + latin:moreKeys="៖" + latin:keyLabelFlags="fontDefault" /> <!-- U+17CD: "៍" KHMER SIGN TOANDAKHIAT U+17D9: "៙" KHMER SIGN PHNAEK MUAN --> <Key - latin:keyLabel="៍" + latin:keySpec="៍" latin:keyHintLabel="៙" - latin:moreKeys="៙" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៙" /> <!-- U+17D0: "័" KHMER SIGN SAMYOK SANNYA U+17DA: "៚" KHMER SIGN KOOMUUT --> <Key - latin:keyLabel="័" + latin:keySpec="័" latin:keyHintLabel="៚" - latin:moreKeys="៚" - latin:keyLabelFlags="fontNormal" /> + latin:keyHintLabelVerticalAdjustment="-30%" + latin:moreKeys="៚" /> <!-- U+17CF: "៏" KHMER SIGN AHSDA --> <Key - latin:keyLabel="៏" + latin:keySpec="៏" latin:keyHintLabel="*" - latin:moreKeys="*" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="*" /> <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK --> <Key - latin:keyLabel="(" + latin:keySpec="(" latin:keyHintLabel="{" - latin:moreKeys="{,«" /> + latin:moreKeys="{,«" + latin:keyLabelFlags="fontDefault" /> <!-- U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> <Key - latin:keyLabel=")" + latin:keySpec=")" latin:keyHintLabel="}" - latin:moreKeys="},»" /> + latin:moreKeys="},»" + latin:keyLabelFlags="fontDefault" /> <!-- U+17CC: "៌" KHMER SIGN ROBAT U+00D7: "×" MULTIPLICATION SIGN --> <Key - latin:keyLabel="៌" + latin:keySpec="៌" latin:keyHintLabel="×" - latin:moreKeys="×" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="×" /> <!-- U+17CE: "៎" KHMER SIGN KAKABAT --> - <Key - latin:keyLabel="៎" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="៎" /> </case> <default> <!-- U+17E1: "១" KHMER DIGIT ONE U+17F1: "៱" KHMER SYMBOL LEK ATTAK MUOY --> <Key - latin:keyLabel="១" + latin:keySpec="១" latin:keyHintLabel="1" latin:additionalMoreKeys="1" - latin:moreKeys="៱" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៱" /> <!-- U+17E2: "២" KHMER DIGIT TWO U+17F2: "៲" KHMER SYMBOL LEK ATTAK PII --> <Key - latin:keyLabel="២" + latin:keySpec="២" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="៲" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៲" /> <!-- U+17E3: "៣" KHMER DIGIT THREE U+17F3: "៳" KHMER SYMBOL LEK ATTAK BEI --> <Key - latin:keyLabel="៣" + latin:keySpec="៣" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="៳" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៳" /> <!-- U+17E4: "៤" KHMER DIGIT FOUR U+17F4: "៴" KHMER SYMBOL LEK ATTAK BUON --> <Key - latin:keyLabel="៤" + latin:keySpec="៤" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="៴" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៴" /> <!-- U+17E5: "៥" KHMER DIGIT FIVE U+17F5: "៵" KHMER SYMBOL LEK ATTAK PRAM --> <Key - latin:keyLabel="៥" + latin:keySpec="៥" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="៵" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៵" /> <!-- U+17E6: "៦" KHMER DIGIT SIX U+17F6: "៶" KHMER SYMBOL LEK ATTAK PRAM-MUOY --> <Key - latin:keyLabel="៦" + latin:keySpec="៦" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="៶" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៶" /> <!-- U+17E7: "៧" KHMER DIGIT SEVEN U+17F7: "៷" KHMER SYMBOL LEK ATTAK PRAM-PII --> <Key - latin:keyLabel="៧" + latin:keySpec="៧" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="៷" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៷" /> <!-- U+17E8: "៨" KHMER DIGIT EIGHT U+17F8: "៸" KHMER SYMBOL LEK ATTAK PRAM-BEI --> <Key - latin:keyLabel="៨" + latin:keySpec="៨" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="៸" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៸" /> <!-- U+17E9: "៩" KHMER DIGIT NINE U+17F9: "៹" KHMER SYMBOL LEK ATTAK PRAM-BUON --> <Key - latin:keyLabel="៩" + latin:keySpec="៩" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="៹" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៹" /> <!-- U+17E0: "០" KHMER DIGIT ZERO U+17F0: "៰" KHMER SYMBOL LEK ATTAK SON --> <Key - latin:keyLabel="០" + latin:keySpec="០" latin:keyHintLabel="0" latin:additionalMoreKeys="0" - latin:moreKeys="៰" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="៰" /> <!-- U+17A5: "ឥ" KHMER INDEPENDENT VOWEL QI U+17A6: "ឦ" KHMER INDEPENDENT VOWEL QII --> <Key - latin:keyLabel="ឥ" + latin:keySpec="ឥ" latin:keyHintLabel="ឦ" - latin:moreKeys=",ឦ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys=",ឦ" /> <!-- U+17B2: "ឲ" KHMER INDEPENDENT VOWEL QOO TYPE TWO U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE --> <Key - latin:keyLabel="ឲ" + latin:keySpec="ឲ" latin:keyHintLabel="ឱ" - latin:moreKeys="ឱ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឱ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_khmer2.xml b/java/res/xml/rowkeys_khmer2.xml index cba2d3b90..04ca1e0df 100644 --- a/java/res/xml/rowkeys_khmer2.xml +++ b/java/res/xml/rowkeys_khmer2.xml @@ -18,116 +18,70 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+1788: "ឈ" KHMER LETTER CHO U+17DC: "ៜ" KHMER SIGN AVAKRAHASANYA --> <Key - latin:keyLabel="ឈ" + latin:keySpec="ឈ" latin:keyHintLabel="ៜ" - latin:moreKeys="ៜ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ៜ" /> <!-- U+17BA: "ឺ" KHMER VOWEL SIGN YY U+17DD: "៝" KHMER SIGN ATTHACAN --> <Key - latin:keyLabel="ឺ" + latin:keySpec="ឺ" latin:keyHintLabel="៝" - latin:moreKeys="៝" - latin:keyLabelFlags="fontNormal" /> + latin:keyHintLabelVerticalAdjustment="40%" + latin:moreKeys="៝" /> <!-- U+17C2: "ែ" KHMER VOWEL SIGN AE --> - <Key - latin:keyLabel="ែ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ែ" /> <!-- U+17AC: "ឬ" KHMER INDEPENDENT VOWEL RYY U+17AB: "ឫ" KHMER INDEPENDENT VOWEL RY --> <Key - latin:keyLabel="ឬ" + latin:keySpec="ឬ" latin:keyHintLabel="ឫ" - latin:moreKeys="ឫ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឫ" /> <!-- U+1791: "ទ" KHMER LETTER TO --> - <Key - latin:keyLabel="ទ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ទ" /> <!-- U+17BD: "ួ" KHMER VOWEL SIGN UA --> - <Key - latin:keyLabel="ួ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ួ" /> <!-- U+17BC: "ូ" KHMER VOWEL SIGN UU --> - <Key - latin:keyLabel="ូ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ូ" /> <!-- U+17B8: "ី" KHMER VOWEL SIGN II --> - <Key - latin:keyLabel="ី" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ី" /> <!-- U+17C5: "ៅ" KHMER VOWEL SIGN AU --> - <Key - latin:keyLabel="ៅ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ៅ" /> <!-- U+1797: "ភ" KHMER LETTER PHO --> - <Key - latin:keyLabel="ភ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ភ" /> <!-- U+17BF: "ឿ" KHMER VOWEL SIGN YA --> - <Key - latin:keyLabel="ឿ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឿ" /> <!-- U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI --> - <Key - latin:keyLabel="ឰ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឰ" /> </case> <default> <!-- U+1786: "ឆ" KHMER LETTER CHA --> - <Key - latin:keyLabel="ឆ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឆ" /> <!-- U+17B9: "ឹ" KHMER VOWEL SIGN Y --> - <Key - latin:keyLabel="ឹ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឹ" /> <!-- U+17C1: "េ" KHMER VOWEL SIGN E --> - <Key - latin:keyLabel="េ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="េ" /> <!-- U+179A: "រ" KHMER LETTER RO --> - <Key - latin:keyLabel="រ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="រ" /> <!-- U+178F: "ត" KHMER LETTER TA --> - <Key - latin:keyLabel="ត" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ត" /> <!-- U+1799: "យ" KHMER LETTER YO --> - <Key - latin:keyLabel="យ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="យ" /> <!-- U+17BB: "ុ" KHMER VOWEL SIGN U --> - <Key - latin:keyLabel="ុ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ុ" /> <!-- U+17B7: "ិ" KHMER VOWEL SIGN I --> - <Key - latin:keyLabel="ិ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ិ" /> <!-- U+17C4: "ោ" KHMER VOWEL SIGN OO --> - <Key - latin:keyLabel="ោ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ោ" /> <!-- U+1795: "ផ" KHMER LETTER PHA --> - <Key - latin:keyLabel="ផ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ផ" /> <!-- U+17C0: "ៀ" KHMER VOWEL SIGN IE --> - <Key - latin:keyLabel="ៀ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ៀ" /> <!-- U+17AA: "ឪ" KHMER INDEPENDENT VOWEL QUUV U+17A7: "ឧ" KHMER INDEPENDENT VOWEL QU U+17B1: "ឱ" KHMER INDEPENDENT VOWEL QOO TYPE ONE @@ -135,10 +89,9 @@ U+17A9: "ឩ" KHMER INDEPENDENT VOWEL QUU U+17A8: "ឨ" KHMER INDEPENDENT VOWEL QUK --> <Key - latin:keyLabel="ឪ" + latin:keySpec="ឪ" latin:keyHintLabel="ឧ" - latin:moreKeys="ឧ,ឱ,ឳ,ឩ,ឨ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឧ,ឱ,ឳ,ឩ,ឨ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_khmer3.xml b/java/res/xml/rowkeys_khmer3.xml index ff6c9ca51..c2db36449 100644 --- a/java/res/xml/rowkeys_khmer3.xml +++ b/java/res/xml/rowkeys_khmer3.xml @@ -18,121 +18,76 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+17B6/U+17C6: "ាំ" KHMER VOWEL SIGN AA/KHMER SIGN NIKAHIT --> <Key - latin:keyLabel="ាំ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ាំ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+17C3: "ៃ" KHMER VOWEL SIGN AI --> - <Key - latin:keyLabel="ៃ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ៃ" /> <!-- U+178C: "ឌ" KHMER LETTER DO --> - <Key - latin:keyLabel="ឌ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឌ" /> <!-- U+1792: "ធ" KHMER LETTER THO --> - <Key - latin:keyLabel="ធ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ធ" /> <!-- U+17A2: "អ" KHMER LETTER QA --> - <Key - latin:keyLabel="អ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="អ" /> <!-- U+17C7: "ះ" KHMER SIGN REAHMUK - U+17C8: "ៈ" KHMER SIGN YUUKALEAPINTU;--> + U+17C8: "ៈ" KHMER SIGN YUUKALEAPINTU --> <Key - latin:keyLabel="ះ" + latin:keySpec="ះ" latin:keyHintLabel="ៈ" - latin:moreKeys="ៈ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ៈ" /> <!-- U+1789: "ញ" KHMER LETTER NYO --> - <Key - latin:keyLabel="ញ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ញ" /> <!-- U+1782: "គ" KHMER LETTER KO U+179D: "ឝ" KHMER LETTER SHA --> <Key - latin:keyLabel="គ" + latin:keySpec="គ" latin:keyHintLabel="ឝ" - latin:moreKeys="ឝ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឝ" /> <!-- U+17A1: "ឡ" KHMER LETTER LA --> - <Key - latin:keyLabel="ឡ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឡ" /> <!-- U+17C4/U+17C7: "ោះ" KHMER VOWEL SIGN OO/KHMER SIGN REAHMUK --> <Key - latin:keyLabel="ោះ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ោះ" + latin:keyLabelFlags="followKeyLetterRatio|autoScale" /> <!-- U+17C9: "៉" KHMER SIGN MUUSIKATOAN --> - <Key - latin:keyLabel="៉" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="៉" /> <!-- U+17AF: "ឯ" KHMER INDEPENDENT VOWEL QE --> - <Key - latin:keyLabel="ឯ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឯ" /> </case> <default> <!-- U+17B6: "ា" KHMER VOWEL SIGN AA --> - <Key - latin:keyLabel="ា" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ា" /> <!-- U+179F: "ស" KHMER LETTER SA --> - <Key - latin:keyLabel="ស" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ស" /> <!-- U+178A: "ដ" KHMER LETTER DA --> - <Key - latin:keyLabel="ដ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ដ" /> <!-- U+1790: "ថ" KHMER LETTER THA --> - <Key - latin:keyLabel="ថ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ថ" /> <!-- U+1784: "ង" KHMER LETTER NGO --> - <Key - latin:keyLabel="ង" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ង" /> <!-- U+17A0: "ហ" KHMER LETTER HA --> - <Key - latin:keyLabel="ហ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ហ" /> <!-- U+17D2: "្" KHMER SIGN COENG --> - <Key - latin:keyLabel="្" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="្" /> <!-- U+1780: "ក" KHMER LETTER KA --> - <Key - latin:keyLabel="ក" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ក" /> <!-- U+179B: "ល" KHMER LETTER LO --> - <Key - latin:keyLabel="ល" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ល" /> <!-- U+17BE: "ើ" KHMER VOWEL SIGN OE --> - <Key - latin:keyLabel="ើ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ើ" /> <!-- U+17CB: "់" KHMER SIGN BANTOC --> - <Key - latin:keyLabel="់" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="់" /> <!-- U+17AE: "ឮ" KHMER INDEPENDENT VOWEL LYY U+17AD: "ឭ" KHMER INDEPENDENT VOWEL LY U+17B0: "ឰ" KHMER INDEPENDENT VOWEL QAI --> <Key - latin:keyLabel="ឮ" + latin:keySpec="ឮ" latin:keyHintLabel="ឭ" - latin:moreKeys="ឭ,ឰ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឭ,ឰ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_khmer4.xml b/java/res/xml/rowkeys_khmer4.xml index fe6c59125..70bdcf1bb 100644 --- a/java/res/xml/rowkeys_khmer4.xml +++ b/java/res/xml/rowkeys_khmer4.xml @@ -18,96 +18,62 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+178D: "ឍ" KHMER LETTER TTHO --> - <Key - latin:keyLabel="ឍ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឍ" /> <!-- U+1783: "ឃ" KHMER LETTER KHO --> - <Key - latin:keyLabel="ឃ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឃ" /> <!-- U+1787: "ជ" KHMER LETTER CO --> - <Key - latin:keyLabel="ជ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ជ" /> <!-- U+17C1/U+17C7: "េះ" KHMER VOWEL SIGN E/KHMER SIGN REAHMUK --> <Key - latin:keyLabel="េះ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="េះ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+1796: "ព" KHMER LETTER PO U+179E: "ឞ" KHMER LETTER SSO --> <Key - latin:keyLabel="ព" + latin:keySpec="ព" latin:keyHintLabel="ឞ" - latin:moreKeys="ឞ" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="ឞ" /> <!-- U+178E: "ណ" KHMER LETTER NNO --> - <Key - latin:keyLabel="ណ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ណ" /> <!-- U+17C6: "ំ" KHMER SIGN NIKAHIT --> - <Key - latin:keyLabel="ំ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ំ" /> <!-- U+17BB/U+17C7: "ុះ" KHMER VOWEL SIGN U/KHMER SIGN REAHMUK --> <Key - latin:keyLabel="ុះ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ុះ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+17D5: "៕" KHMER SIGN BARIYOOSAN --> + <Key latin:keySpec="៕" /> <Key - latin:keyLabel="៕" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel="\?" /> + latin:keySpec="\?" + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+178B: "ឋ" KHMER LETTER TTHA --> - <Key - latin:keyLabel="ឋ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ឋ" /> <!-- U+1781: "ខ" KHMER LETTER KHA --> - <Key - latin:keyLabel="ខ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ខ" /> <!-- U+1785: "ច" KHMER LETTER CA --> - <Key - latin:keyLabel="ច" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ច" /> <!-- U+179C: "វ" KHMER LETTER VO --> - <Key - latin:keyLabel="វ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="វ" /> <!-- U+1794: "ប" KHMER LETTER BA --> - <Key - latin:keyLabel="ប" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ប" /> <!-- U+1793: "ន" KHMER LETTER NO --> - <Key - latin:keyLabel="ន" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ន" /> <!-- U+1798: "ម" KHMER LETTER MO --> - <Key - latin:keyLabel="ម" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ម" /> <!-- U+17BB/U+17C6: "ុំ" KHMER VOWEL SIGN U/KHMER SIGN NIKAHIT --> <Key - latin:keyLabel="ុំ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ុំ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+17D4: "។" KHMER SIGN KHAN --> - <Key - latin:keyLabel="។" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="។" /> <!-- U+17CA: "៊" KHMER SIGN TRIISAP --> - <Key - latin:keyLabel="៊" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="៊" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_lao1.xml b/java/res/xml/rowkeys_lao1.xml index fa1ad97d8..f88d5fd66 100644 --- a/java/res/xml/rowkeys_lao1.xml +++ b/java/res/xml/rowkeys_lao1.xml @@ -18,147 +18,106 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0ED1: "໑" LAO DIGIT ONE --> - <Key - latin:keyLabel="໑" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໑" /> <!-- U+0ED2: "໒" LAO DIGIT TWO --> - <Key - latin:keyLabel="໒" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໒" /> <!-- U+0ED3: "໓" LAO DIGIT THREE --> - <Key - latin:keyLabel="໓" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໓" /> <!-- U+0ED4: "໔" LAO DIGIT FOUR --> - <Key - latin:keyLabel="໔" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໔" /> <!-- U+0ECC: "໌" LAO CANCELLATION MARK --> - <Key - latin:keyLabel="໌" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໌" /> <!-- U+0EBC: "ຼ" LAO SEMIVOWEL SIGN LO --> - <Key - latin:keyLabel="ຼ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຼ" /> <!-- U+0ED5: "໕" LAO DIGIT FIVE --> - <Key - latin:keyLabel="໕" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໕" /> <!-- U+0ED6: "໖" LAO DIGIT SIX --> - <Key - latin:keyLabel="໖" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໖" /> <!-- U+0ED7: "໗" LAO DIGIT SEVEN --> - <Key - latin:keyLabel="໗" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໗" /> <!-- U+0ED8: "໘" LAO DIGIT EIGHT --> - <Key - latin:keyLabel="໘" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໘" /> <!-- U+0ED9: "໙" LAO DIGIT NINE --> - <Key - latin:keyLabel="໙" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໙" /> <!-- U+0ECD/U+0EC8: "ໍ່" LAO NIGGAHITA/LAO TONE MAI EK --> <Key - latin:keyLabel="ໍ່" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ໍ່" + latin:keyLabelFlags="followKeyLetterRatio" /> </case> <default> <!-- U+0EA2: "ຢ" LAO LETTER YO U+0ED1: "໑" LAO DIGIT ONE --> <Key - latin:keyLabel="ຢ" + latin:keySpec="ຢ" latin:keyHintLabel="1" latin:additionalMoreKeys="1" - latin:moreKeys="໑" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໑" /> <!-- U+0E9F: "ຟ" LAO LETTER FO SUNG U+0ED2: "໒" LAO DIGIT TWO --> <Key - latin:keyLabel="ຟ" + latin:keySpec="ຟ" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="໒" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໒" /> <!-- U+0EC2: "ໂ" LAO VOWEL SIGN O U+0ED3: "໓" LAO DIGIT THREE --> <Key - latin:keyLabel="ໂ" + latin:keySpec="ໂ" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="໓" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໓" /> <!-- U+0E96: "ຖ" LAO LETTER THO SUNG U+0ED4: "໔" LAO DIGIT FOUR --> <Key - latin:keyLabel="ຖ" + latin:keySpec="ຖ" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="໔" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໔" /> <!-- U+0EB8: "ຸ" LAO VOWEL SIGN U --> - <Key - latin:keyLabel="ຸ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຸ" /> <!-- U+0EB9: "ູ" LAO VOWEL SIGN UU --> - <Key - latin:keyLabel="ູ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ູ" /> <!-- U+0E84: "ຄ" LAO LETTER KHO TAM U+0ED5: "໕" LAO DIGIT FIVE --> <Key - latin:keyLabel="ຄ" + latin:keySpec="ຄ" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="໕" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໕" /> <!-- U+0E95: "ຕ" LAO LETTER TO U+0ED6: "໖" LAO DIGIT SIX --> <Key - latin:keyLabel="ຕ" + latin:keySpec="ຕ" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="໖" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໖" /> <!-- U+0E88: "ຈ" LAO LETTER CO U+0ED7: "໗" LAO DIGIT SEVEN --> <Key - latin:keyLabel="ຈ" + latin:keySpec="ຈ" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="໗" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໗" /> <!-- U+0E82: "ຂ" LAO LETTER KHO SUNG U+0ED8: "໘" LAO DIGIT EIGHT --> <Key - latin:keyLabel="ຂ" + latin:keySpec="ຂ" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="໘" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໘" /> <!-- U+0E8A: "ຊ" LAO LETTER SO TAM U+0ED9: "໙" LAO DIGIT NINE --> <Key - latin:keyLabel="ຊ" + latin:keySpec="ຊ" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="໙" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໙" /> <!-- U+0ECD: "ໍ" LAO NIGGAHITA --> - <Key - latin:keyLabel="ໍ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ໍ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_lao2.xml b/java/res/xml/rowkeys_lao2.xml index fca58ac0e..46b6395d7 100644 --- a/java/res/xml/rowkeys_lao2.xml +++ b/java/res/xml/rowkeys_lao2.xml @@ -18,110 +18,78 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0EBB/U+0EC9: "" LAO VOWEL SIGN MAI KON/LAO TONE MAI THO --> <Key - latin:keyLabel="ົ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ົ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0ED0: "໐" LAO DIGIT ZERO --> - <Key - latin:keyLabel="໐" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໐" /> <!-- U+0EB3/U+0EC9: "ຳ້" LAO VOWEL SIGN AM/LAO TONE MAI THO --> <Key - latin:keyLabel="ຳ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ຳ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <Key - latin:keyLabel="_" /> + latin:keySpec="_" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="+" /> + latin:keySpec="+" + latin:keyLabelFlags="fontDefault" /> <!-- U+0EB4/U+0EC9: "ິ້" LAO VOWEL SIGN I/LAO TONE MAI THO --> <Key - latin:keyLabel="ິ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ິ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0EB5/U+0EC9: "ີ້" LAO VOWEL SIGN II/LAO TONE MAI THO --> <Key - latin:keyLabel="ີ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ີ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0EA3: "ຣ" LAO LETTER LO LING --> - <Key - latin:keyLabel="ຣ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຣ" /> <!-- U+0EDC: "ໜ" LAO HO NO --> - <Key - latin:keyLabel="ໜ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ໜ" /> <!-- U+0EBD: "ຽ" LAO SEMIVOWEL SIGN NYO --> - <Key - latin:keyLabel="ຽ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຽ" /> <!-- U+0EAB/U+0EBC: "" LAO LETTER HO SUNG/LAO SEMIVOWEL SIGN LO --> <Key - latin:keyLabel="ຫຼ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ຫຼ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+201D: "”" RIGHT DOUBLE QUOTATION MARK --> <Key - latin:keyLabel="”" /> + latin:keySpec="”" + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+0EBB: "ົ" LAO VOWEL SIGN MAI KON --> - <Key - latin:keyLabel="ົ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ົ" /> <!-- U+0EC4: "ໄ" LAO VOWEL SIGN AI U+0ED0: "໐" LAO DIGIT ZERO --> <Key - latin:keyLabel="ໄ" + latin:keySpec="ໄ" latin:keyHintLabel="0" latin:additionalMoreKeys="0" - latin:moreKeys="໐" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="໐" /> <!-- U+0EB3: "ຳ" LAO VOWEL SIGN AM --> - <Key - latin:keyLabel="ຳ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຳ" /> <!-- U+0E9E: "ພ" LAO LETTER PHO TAM --> - <Key - latin:keyLabel="ພ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ພ" /> <!-- U+0EB0: "ະ" LAO VOWEL SIGN A --> - <Key - latin:keyLabel="ະ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ະ" /> <!-- U+0EB4: "ິ" LAO VOWEL SIGN I --> - <Key - latin:keyLabel="ິ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ິ" /> <!-- U+0EB5: "ີ" LAO VOWEL SIGN II --> - <Key - latin:keyLabel="ີ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ີ" /> <!-- U+0EAE: "ຮ" LAO LETTER HO TAM --> - <Key - latin:keyLabel="ຮ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຮ" /> <!-- U+0E99: "ນ" LAO LETTER NO --> - <Key - latin:keyLabel="ນ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ນ" /> <!-- U+0E8D: "ຍ" LAO LETTER NYO --> - <Key - latin:keyLabel="ຍ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຍ" /> <!-- U+0E9A: "ບ" LAO LETTER BO --> - <Key - latin:keyLabel="ບ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ບ" /> <!-- U+0EA5: "ລ" LAO LETTER LO LOOT --> - <Key - latin:keyLabel="ລ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ລ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_lao3.xml b/java/res/xml/rowkeys_lao3.xml index 2a6c2d1dd..ab3e25131 100644 --- a/java/res/xml/rowkeys_lao3.xml +++ b/java/res/xml/rowkeys_lao3.xml @@ -18,93 +18,73 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0EB1/U+0EC9: "ັ້" LAO VOWEL SIGN MAI KAN/LAO TONE MAI THO --> <Key - latin:keyLabel="ັ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ັ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <Key - latin:keyLabel=";" /> + latin:keySpec=";" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="." /> + latin:keySpec="." + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="," /> + latin:keySpec="," + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel=":" /> + latin:keySpec=":" + latin:keyLabelFlags="fontDefault" /> <!-- U+0ECA: "໊" LAO TONE MAI TI --> - <Key - latin:keyLabel="໊" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="໊" /> <!-- U+0ECB: "໋" LAO TONE MAI CATAWA --> + <Key latin:keySpec="໋" /> <Key - latin:keyLabel="໋" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel="!" /> + latin:keySpec="!" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="\?" /> + latin:keySpec="\?" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="%" /> + latin:keySpec="%" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="=" /> + latin:keySpec="=" + latin:keyLabelFlags="fontDefault" /> <!-- U+201C: "“" LEFT DOUBLE QUOTATION MARK --> <Key - latin:keyLabel="“" /> + latin:keySpec="“" + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+0EB1: "ັ" LAO VOWEL SIGN MAI KAN --> - <Key - latin:keyLabel="ັ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ັ" /> <!-- U+0EAB: "ຫ" LAO LETTER HO SUNG --> - <Key - latin:keyLabel="ຫ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຫ" /> <!-- U+0E81: "ກ" LAO LETTER KO --> - <Key - latin:keyLabel="ກ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ກ" /> <!-- U+0E94: "ດ" LAO LETTER DO --> - <Key - latin:keyLabel="ດ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ດ" /> <!-- U+0EC0: "ເ" LAO VOWEL SIGN E --> - <Key - latin:keyLabel="ເ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ເ" /> <!-- U+0EC9: "້" LAO TONE MAI THO --> - <Key - latin:keyLabel="້" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="້" /> <!-- U+0EC8: "່" LAO TONE MAI EK --> - <Key - latin:keyLabel="່" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="່" /> <!-- U+0EB2: "າ" LAO VOWEL SIGN AA --> - <Key - latin:keyLabel="າ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="າ" /> <!-- U+0EAA: "ສ" LAO LETTER SO SUNG --> - <Key - latin:keyLabel="ສ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ສ" /> <!-- U+0EA7: "ວ" LAO LETTER WO --> - <Key - latin:keyLabel="ວ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ວ" /> <!-- U+0E87: "ງ" LAO LETTER NGO --> - <Key - latin:keyLabel="ງ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ງ" /> <!-- U+201C: "“" LEFT DOUBLE QUOTATION MARK --> <Key - latin:keyLabel="“" /> + latin:keySpec="“" + latin:keyLabelFlags="fontDefault" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_lao4.xml b/java/res/xml/rowkeys_lao4.xml index fae9cc923..5beb1cbcb 100644 --- a/java/res/xml/rowkeys_lao4.xml +++ b/java/res/xml/rowkeys_lao4.xml @@ -18,86 +18,60 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+20AD: "₭" KIP SIGN --> <Key - latin:keyLabel="₭" /> + latin:keySpec="₭" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="(" /> - <!-- U+0EAF: "ຯ" LAO ELLIPSIS --> + latin:keySpec="(" + latin:keyLabelFlags="fontDefault" /> + <Key latin:keySpec="ຯ" /> <Key - latin:keyLabel="ຯ" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel="\@" /> + latin:keySpec="\@" + latin:keyLabelFlags="fontDefault" /> <!-- U+0EB6/U+0EC9: "ຶ້" LAO VOWEL SIGN Y/LAO TONE MAI THO --> <Key - latin:keyLabel="ຶ້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ຶ້" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0EB7/U+0EC9: "ື້" LAO VOWEL SIGN YY/LAO TONE MAI THO --> <Key - latin:keyLabel="ື້" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ື້" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0EC6: "ໆ" LAO KO LA --> - <Key - latin:keyLabel="ໆ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ໆ" /> <!-- U+0EDD: "ໝ" LAO HO MO --> + <Key latin:keySpec="ໝ" /> <Key - latin:keyLabel="ໝ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="$" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel="$" /> - <Key - latin:keyLabel=")" /> + latin:keySpec=")" + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+0E9C: "ຜ" LAO LETTER PHO SUNG --> - <Key - latin:keyLabel="ຜ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຜ" /> <!-- U+0E9B: "ປ" LAO LETTER PO --> - <Key - latin:keyLabel="ປ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ປ" /> <!-- U+0EC1: "ແ" LAO VOWEL SIGN EI --> - <Key - latin:keyLabel="ແ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ແ" /> <!-- U+0EAD: "ອ" LAO LETTER O --> - <Key - latin:keyLabel="ອ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ອ" /> <!-- U+0EB6: "ຶ" LAO VOWEL SIGN Y --> - <Key - latin:keyLabel="ຶ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຶ" /> <!-- U+0EB7: "ື" LAO VOWEL SIGN YY --> - <Key - latin:keyLabel="ື" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ື" /> <!-- U+0E97: "ທ" LAO LETTER THO TAM --> - <Key - latin:keyLabel="ທ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ທ" /> <!-- U+0EA1: "ມ" LAO LETTER MO --> - <Key - latin:keyLabel="ມ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ມ" /> <!-- U+0EC3: "ໃ" LAO VOWEL SIGN AY --> - <Key - latin:keyLabel="ໃ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ໃ" /> <!-- U+0E9D: "ຝ" LAO LETTER FO TAM --> - <Key - latin:keyLabel="ຝ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ຝ" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_marathi1.xml b/java/res/xml/rowkeys_marathi1.xml new file mode 100644 index 000000000..596664bc6 --- /dev/null +++ b/java/res/xml/rowkeys_marathi1.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> + <!-- U+0967: "१" DEVANAGARI DIGIT ONE --> + <Key + latin:keyStyle="baseKeyDevanagariVowelSignAu" + latin:keyHintLabel="1" + latin:additionalMoreKeys="१,1" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> + <!-- U+0968: "२" DEVANAGARI DIGIT TWO --> + <Key + latin:keyStyle="baseKeyDevanagariVowelSignAi" + latin:keyHintLabel="2" + latin:additionalMoreKeys="२,2" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> + <!-- U+0969: "३" DEVANAGARI DIGIT THREE --> + <Key + latin:keyStyle="baseKeyDevanagariVowelSignAa" + latin:keyHintLabel="3" + latin:additionalMoreKeys="३,3" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> + <!-- U+096A: "४" DEVANAGARI DIGIT FOUR --> + <Key + latin:keyStyle="baseKeyDevanagariVowelSignIi" + latin:keyHintLabel="4" + latin:additionalMoreKeys="४,4" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> + <!-- U+096B: "५" DEVANAGARI DIGIT FIVE --> + <Key + latin:keyStyle="baseKeyDevanagariVowelSignUu" + latin:keyHintLabel="5" + latin:additionalMoreKeys="५,5" /> + <!-- U+092C: "ब" DEVANAGARI LETTER BA + U+092D: "भ" DEVANAGARI LETTER BHA + U+096C: "६" DEVANAGARI DIGIT SIX --> + <Key + latin:keySpec="ब" + latin:moreKeys="भ,%" + latin:keyHintLabel="6" + latin:additionalMoreKeys="६,6" /> + <!-- U+0939: "ह" DEVANAGARI LETTER HA + U+096D: "७" DEVANAGARI DIGIT SEVEN --> + <Key + latin:keySpec="ह" + latin:keyHintLabel="7" + latin:additionalMoreKeys="७,7" /> + <!-- U+0917: "ग" DEVANAGARI LETTER GA + U+0918: "घ" DEVANAGARI LETTER GHA + U+096E: "८" DEVANAGARI DIGIT EIGHT --> + <Key + latin:keySpec="ग" + latin:moreKeys="घ,%" + latin:keyHintLabel="8" + latin:additionalMoreKeys="८,8" /> + <!-- U+0926: "द" DEVANAGARI LETTER DA + U+0927: "ध" DEVANAGARI LETTER DHA + U+096F: "९" DEVANAGARI DIGIT NINE --> + <Key + latin:keySpec="द" + latin:moreKeys="ध,%" + latin:keyHintLabel="9" + latin:additionalMoreKeys="९,9" /> + <!-- U+091C: "ज" DEVANAGARI LETTER JA + U+091D: "झ" DEVANAGARI LETTER JHA + U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER JHA --> + <Key + latin:keySpec="ज" + latin:moreKeys="झ,ज्ञ,%" + latin:keyHintLabel="0" + latin:additionalMoreKeys="०,0" /> + <!-- U+0921: "ड" DEVANAGARI LETTER DDA + U+0922: "ढ" DEVANAGARI LETTER DDHA --> + <Key + latin:keySpec="ड" + latin:moreKeys="ढ" /> +</merge> diff --git a/java/res/xml/rowkeys_marathi2.xml b/java/res/xml/rowkeys_marathi2.xml new file mode 100644 index 000000000..060822ee5 --- /dev/null +++ b/java/res/xml/rowkeys_marathi2.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignO" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignE" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <Key latin:keyStyle="baseKeyDevanagariSignVirama" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignI" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignU" /> + <!-- U+092A: "प" DEVANAGARI LETTER PA + U+092B: "फ" DEVANAGARI LETTER PHA --> + <Key + latin:keySpec="प" + latin:moreKeys="फ" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_vocalic_r" /> + <!-- U+0930: "र" DEVANAGARI LETTER RA --> + <Key + latin:keySpec="र" + latin:keyStyle="moreKeysDevanagariVowelSignVocalicR" /> + <!-- U+0915: "क" DEVANAGARI LETTER KA + U+0916: "ख" DEVANAGARI LETTER KHA --> + <Key + latin:keySpec="क" + latin:moreKeys="ख" /> + <!-- U+0924: "त" DEVANAGARI LETTER TA + U+0925: "थ" DEVANAGARI LETTER THA + U+0924/U+094D/U+0930: "त्र" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> + <Key + latin:keySpec="त" + latin:moreKeys="थ,त्र" /> + <!-- U+091A: "च" DEVANAGARI LETTER CA + U+091B: "छ" DEVANAGARI LETTER CHA --> + <Key + latin:keySpec="च" + latin:moreKeys="छ" /> + <!-- U+091F: "ट" DEVANAGARI LETTER TTA + U+0920: "ठ" DEVANAGARI LETTER TTHA --> + <Key + latin:keySpec="ट" + latin:moreKeys="ठ" /> +</merge> diff --git a/java/res/xml/rowkeys_marathi3.xml b/java/res/xml/rowkeys_marathi3.xml new file mode 100644 index 000000000..661e79672 --- /dev/null +++ b/java/res/xml/rowkeys_marathi3.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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"> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_candra_o" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignCandraO" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_candra_e" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignCandraE" /> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> + <!-- U+092E: "म" DEVANAGARI LETTER MA --> + <Key latin:keySpec="म" /> + <!-- U+0928: "न" DEVANAGARI LETTER NA + U+0923: "ण" DEVANAGARI LETTER NNA + U+091E: "ञ" DEVANAGARI LETTER NYA + U+0919: "ङ" DEVANAGARI LETTER NGA --> + <Key + latin:keySpec="न" + latin:moreKeys="ण,ञ,ङ" /> + <!-- U+0935: "व" DEVANAGARI LETTER VA --> + <Key latin:keySpec="व" /> + <!-- U+0932: "ल" DEVANAGARI LETTER LA + U+0933: "ळ" DEVANAGARI LETTER LLA --> + <Key + latin:keySpec="ल" + latin:moreKeys="ळ" /> + <!-- U+0938: "स" DEVANAGARI LETTER SA + U+0936: "श" DEVANAGARI LETTER SHA + U+0937: "ष" DEVANAGARI LETTER SSA + U+0936/U+094D/U+0930: "श्र" DEVANAGARI LETTER SHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER RA --> + <Key + latin:keySpec="स" + latin:moreKeys="श,ष,श्र" /> + <!-- U+092F: "य" DEVANAGARI LETTER YA --> + <Key latin:keySpec="य" /> + <!-- U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA --> + <Key + latin:keySpec="क्ष" + latin:keyLabelFlags="followKeyLetterRatio" /> +</merge> diff --git a/java/res/xml/rowkeys_mongolian1.xml b/java/res/xml/rowkeys_mongolian1.xml index 6c8c8e2fd..2bd8097e2 100644 --- a/java/res/xml/rowkeys_mongolian1.xml +++ b/java/res/xml/rowkeys_mongolian1.xml @@ -23,61 +23,61 @@ > <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF --> <Key - latin:keyLabel="ф" + latin:keySpec="ф" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE --> <Key - latin:keyLabel="ц" + latin:keySpec="ц" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+0443: "у" CYRILLIC SMALL LETTER U --> <Key - latin:keyLabel="у" + latin:keySpec="у" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_cyrillic_u" /> + latin:moreKeys="!text/morekeys_cyrillic_u" /> <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE --> <Key - latin:keyLabel="ж" + latin:keySpec="ж" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+044D: "э" CYRILLIC SMALL LETTER E --> <Key - latin:keyLabel="э" + latin:keySpec="э" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_cyrillic_ie" /> + latin:moreKeys="!text/morekeys_cyrillic_ie" /> <!-- U+043D: "н" CYRILLIC SMALL LETTER EN --> <Key - latin:keyLabel="н" + latin:keySpec="н" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_cyrillic_en" /> + latin:moreKeys="!text/morekeys_cyrillic_en" /> <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE --> <Key - latin:keyLabel="г" + latin:keySpec="г" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_cyrillic_ghe" /> + latin:moreKeys="!text/morekeys_cyrillic_ghe" /> <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA U+0449: "щ" CYRILLIC SMALL LETTER SHCHA --> <Key - latin:keyLabel="ш" + latin:keySpec="ш" latin:keyHintLabel="8" latin:additionalMoreKeys="8" latin:moreKeys="щ" /> <!-- U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U --> <Key - latin:keyLabel="ү" + latin:keySpec="ү" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+0437: "з" CYRILLIC SMALL LETTER ZE --> <Key - latin:keyLabel="з" + latin:keySpec="з" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> <!-- U+043A: "к" CYRILLIC SMALL LETTER KA --> <Key - latin:keyLabel="к" /> + latin:keySpec="к" /> </merge> diff --git a/java/res/xml/rowkeys_mongolian2.xml b/java/res/xml/rowkeys_mongolian2.xml index a8aa00620..f11f4f230 100644 --- a/java/res/xml/rowkeys_mongolian2.xml +++ b/java/res/xml/rowkeys_mongolian2.xml @@ -23,35 +23,35 @@ > <!-- U+0439: "й" CYRILLIC SMALL LETTER SHORT I --> <Key - latin:keyLabel="й" /> + latin:keySpec="й" /> <!-- U+044B: "ы" CYRILLIC SMALL LETTER YERU --> <Key - latin:keyLabel="ы" /> + latin:keySpec="ы" /> <!-- U+0431: "б" CYRILLIC SMALL LETTER BE --> <Key - latin:keyLabel="б" /> + latin:keySpec="б" /> <!-- U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O --> <Key - latin:keyLabel="ө" /> + latin:keySpec="ө" /> <!-- U+0430: "а" CYRILLIC SMALL LETTER A --> <Key - latin:keyLabel="а" /> + latin:keySpec="а" /> <!-- U+0445: "х" CYRILLIC SMALL LETTER HA --> <Key - latin:keyLabel="х" /> + latin:keySpec="х" /> <!-- U+0440: "р" CYRILLIC SMALL LETTER ER --> <Key - latin:keyLabel="р" /> + latin:keySpec="р" /> <!-- U+043E: "о" CYRILLIC SMALL LETTER O --> <Key - latin:keyLabel="о" /> + latin:keySpec="о" /> <!-- U+043B: "л" CYRILLIC SMALL LETTER EL --> <Key - latin:keyLabel="л" /> + latin:keySpec="л" /> <!-- U+0434: "д" CYRILLIC SMALL LETTER DE --> <Key - latin:keyLabel="д" /> + latin:keySpec="д" /> <!-- U+043F: "п" CYRILLIC SMALL LETTER PE --> <Key - latin:keyLabel="п" /> + latin:keySpec="п" /> </merge> diff --git a/java/res/xml/rowkeys_mongolian3.xml b/java/res/xml/rowkeys_mongolian3.xml index dc80c37ab..cf57d1c2a 100644 --- a/java/res/xml/rowkeys_mongolian3.xml +++ b/java/res/xml/rowkeys_mongolian3.xml @@ -23,35 +23,35 @@ > <!-- U+044F: "я" CYRILLIC SMALL LETTER YA --> <Key - latin:keyLabel="я" /> + latin:keySpec="я" /> <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE --> <Key - latin:keyLabel="ч" /> + latin:keySpec="ч" /> <!-- U+0451: "ё" CYRILLIC SMALL LETTER IO U+0435: "е" CYRILLIC SMALL LETTER IE --> <Key - latin:keyLabel="ё" + latin:keySpec="ё" latin:moreKeys="е" /> <!-- U+0441: "с" CYRILLIC SMALL LETTER ES --> <Key - latin:keyLabel="с" /> + latin:keySpec="с" /> <!-- U+043C: "м" CYRILLIC SMALL LETTER EM --> <Key - latin:keyLabel="м" /> + latin:keySpec="м" /> <!-- U+0438: "и" CYRILLIC SMALL LETTER I --> <Key - latin:keyLabel="и" /> + latin:keySpec="и" /> <!-- U+0442: "т" CYRILLIC SMALL LETTER TE --> <Key - latin:keyLabel="т" /> + latin:keySpec="т" /> <!-- U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN --> <Key - latin:keyLabel="ь" + latin:keySpec="ь" latin:moreKeys="ъ" /> <!-- U+0432: "в" CYRILLIC SMALL LETTER VE U+044E: "ю" CYRILLIC SMALL LETTER YU --> <Key - latin:keyLabel="в" + latin:keySpec="в" latin:moreKeys="ю" /> </merge> diff --git a/java/res/xml/rowkeys_myanmar1.xml b/java/res/xml/rowkeys_myanmar1.xml new file mode 100644 index 000000000..117007431 --- /dev/null +++ b/java/res/xml/rowkeys_myanmar1.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+1027: "ဧ" MYANMAR LETTER E --> + <Key latin:keySpec="ဧ" /> + <!-- U+104F: "၏" MYANMAR SYMBOL GENITIVE --> + <Key latin:keySpec="၏" /> + <!-- U+1024: "ဤ" MYANMAR LETTER II --> + <Key latin:keySpec="ဤ" /> + <!-- U+1023: "ဣ" MYANMAR LETTER I --> + <Key latin:keySpec="ဣ" /> + <!-- U+104E: "၎" MYANMAR SYMBOL AFOREMENTIONED --> + <Key latin:keySpec="၎" /> + <!-- U+1000/U+103B/U+1015/U+103A: "ကျပ်" + MYANMAR LETTER KA/MYANMAR CONSONANT SIGN MEDIAL YA/MYANMAR LETTER PA/MYANMAR SIGN ASAT --> + <Key + latin:keySpec="ကျပ်" + latin:keyLabelFlags="followKeyLetterRatio|autoScale" /> + <!-- U+1029: "ဩ" MYANMAR LETTER O --> + <Key + latin:keySpec="ဩ" + latin:keyLabelFlags="autoScale" /> + <!-- U+102A: "ဪ" MYANMAR LETTER AU --> + <Key + latin:keySpec="ဪ" + latin:keyLabelFlags="autoScale" /> + <!-- U+104D: "၍" MYANMAR SYMBOL COMPLETED --> + <Key latin:keySpec="၍" /> + <!-- U+104C: "၌" MYANMAR SYMBOL LOCATIVE --> + <Key latin:keySpec="၌" /> + </case> + <default> + <!-- U+1041: "၁" MYANMAR DIGIT ONE --> + <Key + latin:keySpec="၁" + latin:keyHintLabel="1" + latin:additionalMoreKeys="1" /> + <!-- U+1042: "၂" MYANMAR DIGIT TWO --> + <Key + latin:keySpec="၂" + latin:keyHintLabel="2" + latin:additionalMoreKeys="2" /> + <!-- U+1043: "၃" MYANMAR DIGIT THREE --> + <Key + latin:keySpec="၃" + latin:keyHintLabel="3" + latin:additionalMoreKeys="3" /> + <!-- U+1044: "၄" MYANMAR DIGIT FOUR --> + <Key + latin:keySpec="၄" + latin:keyHintLabel="4" + latin:additionalMoreKeys="4" /> + <!-- U+1045: "၅" MYANMAR DIGIT FIVE --> + <Key + latin:keySpec="၅" + latin:keyHintLabel="5" + latin:additionalMoreKeys="5" /> + <!-- U+1046: "၆" MYANMAR DIGIT SIX --> + <Key + latin:keySpec="၆" + latin:keyHintLabel="6" + latin:additionalMoreKeys="6" /> + <!-- U+1047: "၇" MYANMAR DIGIT SEVEN --> + <Key + latin:keySpec="၇" + latin:keyHintLabel="7" + latin:additionalMoreKeys="7" /> + <!-- U+1048: "၈" MYANMAR DIGIT EIGHT --> + <Key + latin:keySpec="၈" + latin:keyHintLabel="8" + latin:additionalMoreKeys="8" /> + <!-- U+1049: "၉" MYANMAR DIGIT NINE --> + <Key + latin:keySpec="၉" + latin:keyHintLabel="9" + latin:additionalMoreKeys="9" /> + <!-- U+1040: "၀" MYANMAR DIGIT ZERO --> + <Key + latin:keySpec="၀" + latin:keyHintLabel="0" + latin:additionalMoreKeys="0" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_myanmar2.xml b/java/res/xml/rowkeys_myanmar2.xml new file mode 100644 index 000000000..d7aca0063 --- /dev/null +++ b/java/res/xml/rowkeys_myanmar2.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+1017: "ဗ" MYANMAR LETTER BA --> + <Key latin:keySpec="ဗ" /> + <!-- U+1012: "ဒ" MYANMAR LETTER DA --> + <Key latin:keySpec="ဒ" /> + <!-- U+1013: "ဓ" MYANMAR LETTER DHA --> + <Key latin:keySpec="ဓ" /> + <!-- U+1003: "ဃ" MYANMAR LETTER GHA --> + <Key latin:keySpec="ဃ" /> + <!-- U+100E: "ဎ" MYANMAR LETTER DDHA --> + <Key latin:keySpec="ဎ" /> + <!-- U+103F: "ဿ" MYANMAR LETTER GREAT SA --> + <Key latin:keySpec="ဿ" /> + <!-- U+100F: "ဏ" MYANMAR LETTER NNA --> + <Key latin:keySpec="ဏ" /> + <!-- U+1008: "ဈ" MYANMAR LETTER JHA --> + <Key latin:keySpec="ဈ" /> + <!-- U+1007: "ဇ" MYANMAR LETTER JA --> + <Key latin:keySpec="ဇ" /> + <!-- U+1002: "ဂ" MYANMAR LETTER GA --> + <Key latin:keySpec="ဂ" /> + </case> + <default> + <!-- U+1006: "ဆ" MYANMAR LETTER CHA --> + <Key latin:keySpec="ဆ" /> + <!-- U+1010: "တ" MYANMAR LETTER TA --> + <Key latin:keySpec="တ" /> + <!-- U+1014: "န" MYANMAR LETTER NA --> + <Key latin:keySpec="န" /> + <!-- U+1019: "မ" MYANMAR LETTER MA --> + <Key latin:keySpec="မ" /> + <!-- U+1021: "အ" MYANMAR LETTER A --> + <Key latin:keySpec="အ" /> + <!-- U+1015: "ပ" MYANMAR LETTER PA --> + <Key latin:keySpec="ပ" /> + <!-- U+1000: "က" MYANMAR LETTER KA --> + <Key latin:keySpec="က" /> + <!-- U+1004: "င" MYANMAR LETTER NGA --> + <Key latin:keySpec="င" /> + <!-- U+101E: "သ" MYANMAR LETTER SA --> + <Key latin:keySpec="သ" /> + <!-- U+1005: "စ" MYANMAR LETTER CA --> + <Key latin:keySpec="စ" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_myanmar3.xml b/java/res/xml/rowkeys_myanmar3.xml new file mode 100644 index 000000000..c5850689b --- /dev/null +++ b/java/res/xml/rowkeys_myanmar3.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+101A: "ယ" MYANMAR LETTER YA --> + <Key latin:keySpec="ယ" /> + <!-- U+1039: "္" MYANMAR SIGN VIRAMA --> + <Key latin:keySpec="္" /> + <!-- U+1004/U+103A/U+1039: "င်္င" MYANMAR LETTER NGA/MYANMAR SIGN ASAT/MYANMAR SIGN VIRAMA --> + <Key + latin:keySpec="င်္" + latin:keyLabelFlags="followKeyLetterRatio" /> + <!-- U+103E: "ှ" MYANMAR CONSONANT SIGN MEDIAL HA --> + <Key latin:keySpec="ှ" /> + <!-- U+102E: "ီ" MYANMAR VOWEL SIGN II --> + <Key latin:keySpec="ီ" /> + <!-- U+1030: "ူ" MYANMAR VOWEL SIGN UU --> + <Key latin:keySpec="ူ" /> + <!-- U+102B: "ါ" MYANMAR VOWEL SIGN TALL AA --> + <Key latin:keySpec="ါ" /> + <!-- U+1032: "ဲ" MYANMAR VOWEL SIGN AI --> + <Key latin:keySpec="ဲ" /> + <!-- U+1036: "ံ" MYANMAR SIGN ANUSVARA --> + <Key latin:keySpec="ံ" /> + <!-- U+101F: "ဟ" MYANMAR LETTER HA --> + <Key latin:keySpec="ဟ" /> + </case> + <default> + <!-- U+1031: "ေ" MYANMAR VOWEL SIGN E --> + <Key latin:keySpec="ေ" /> + <!-- U+103B: "ျ" MYANMAR CONSONANT SIGN MEDIAL YA --> + <Key latin:keySpec="ျ" /> + <!-- U+103C: "ြ" MYANMAR CONSONANT SIGN MEDIAL RA --> + <Key latin:keySpec="ြ" /> + <!-- U+103D: "ွ" MYANMAR CONSONANT SIGN MEDIAL WA + U+103E: "ှ" MYANMAR CONSONANT SIGN MEDIAL HA + U+103D/U+103E: "ွှ" MYANMAR CONSONANT SIGN MEDIAL WA/MYANMAR CONSONANT SIGN MEDIAL HA --> + <Key + latin:keySpec="ွ" + latin:moreKeys="ှ,ွှ" /> + <!-- U+102D: "ိ" MYANMAR VOWEL SIGN I + U+102E: "ီ" MYANMAR VOWEL SIGN II --> + <Key + latin:keySpec="ိ" + latin:moreKeys="ီ" /> + <!-- U+102F: "ု" MYANMAR VOWEL SIGN U + U+1030: "ူ" MYANMAR VOWEL SIGN UU --> + <Key + latin:keySpec="ု" + latin:moreKeys="ူ" /> + <!-- U+102C: "ာ" MYANMAR VOWEL SIGN AA --> + <Key latin:keySpec="ာ" /> + <!-- U+103A: "်" MYANMAR SIGN ASAT + U+1032: "ဲ" MYANMAR VOWEL SIGN AI --> + <Key + latin:keySpec="်" + latin:moreKeys="ဲ" /> + <!-- U+1037: "့" MYANMAR SIGN DOT BELOW + U+1036: "ံ" MYANMAR SIGN ANUSVARA --> + <Key + latin:keySpec="့" + latin:moreKeys="ံ" /> + <!-- U+1038: "း" MYANMAR SIGN VISARGA --> + <Key latin:keySpec="း" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_myanmar4.xml b/java/res/xml/rowkeys_myanmar4.xml new file mode 100644 index 000000000..210ebaa8f --- /dev/null +++ b/java/res/xml/rowkeys_myanmar4.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+1025: "ဥ" MYANMAR LETTER U --> + <Key latin:keySpec="ဥ" /> + <!-- U+1026: "ဦ" MYANMAR LETTER UU --> + <Key latin:keySpec="ဦ" /> + <!-- U+100C: "ဌ" MYANMAR LETTER TTHA --> + <Key latin:keySpec="ဌ" /> + <!-- U+100B: "ဋ" MYANMAR LETTER TTA --> + <Key latin:keySpec="ဋ" /> + <!-- U+100D: "ဍ" MYANMAR LETTER DDA --> + <Key latin:keySpec="ဍ" /> + <!-- U+1020: "ဠ" MYANMAR LETTER LLA --> + <Key latin:keySpec="ဠ" /> + <!-- U+100B/U+1039/U+100C: "ဋ္ဌ" MYANMAR LETTER TTA/MYANMAR SIGN VIRAMA/MYANMAR LETTER TTHA --> + <Key + latin:keySpec="ဋ္ဌ" + latin:keyLabelFlags="followKeyLetterRatio" /> + <!-- U+100F/U+1039/U+100D: "ဏ္ဍ" MYANMAR LETTER NNA/MYANMAR SIGN VIRAMA/MYANMAR LETTER DDA + U+100F/U+1039/U+100C: "ဏ္ဌ" MYANMAR LETTER NNA/MYANMAR SIGN VIRAMA/MYANMAR LETTER TTHA --> + <Key + latin:keySpec="ဏ္ဍ" + latin:moreKeys="ဏ္ဌ" + latin:keyLabelFlags="followKeyLetterRatio" /> + </case> + <default> + <!-- U+1016: "ဖ" MYANMAR LETTER PHA --> + <Key latin:keySpec="ဖ" /> + <!-- U+1011: "ထ" MYANMAR LETTER THA --> + <Key latin:keySpec="ထ" /> + <!-- U+1001: "ခ" MYANMAR LETTER KHA --> + <Key latin:keySpec="ခ" /> + <!-- U+101C: "လ" MYANMAR LETTER LA --> + <Key latin:keySpec="လ" /> + <!-- U+1018: "ဘ" MYANMAR LETTER BHA --> + <Key latin:keySpec="ဘ" /> + <!-- U+100A: "ည" MYANMAR LETTER NNYA + U+1009: "ဉ" MYANMAR LETTER NYA --> + <Key + latin:keySpec="ည" + latin:moreKeys="ဉ" /> + <!-- U+101B: "ရ" MYANMAR LETTER RA --> + <Key latin:keySpec="ရ" /> + <!-- U+101D: "ဝ" MYANMAR LETTER WA --> + <Key latin:keySpec="ဝ" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_nepali_romanized1.xml b/java/res/xml/rowkeys_nepali_romanized1.xml index 408a96648..67be51bb0 100644 --- a/java/res/xml/rowkeys_nepali_romanized1.xml +++ b/java/res/xml/rowkeys_nepali_romanized1.xml @@ -18,84 +18,61 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0920: "ठ" DEVANAGARI LETTER TTHA --> - <Key - latin:keyLabel="ठ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ठ" /> <!-- U+0914: "औ" DEVANAGARI LETTER AU --> - <Key - latin:keyLabel="औ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="औ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAi" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAi" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_vowel_sign_vocalic_r" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_vocalic_r" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignVocalicR" /> <!-- U+0925: "थ" DEVANAGARI LETTER THA --> - <Key - latin:keyLabel="थ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="थ" /> <!-- U+091E: "ञ" DEVANAGARI LETTER NYA --> - <Key - latin:keyLabel="ञ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ञ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignUu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignUu" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignIi" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignIi" /> <!-- U+0913: "ओ" DEVANAGARI LETTER O --> - <Key - latin:keyLabel="ओ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ओ" /> <!-- U+092B: "फ" DEVANAGARI LETTER PHA --> - <Key - latin:keyLabel="फ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="फ" /> <!-- U+0908: "ई" DEVANAGARI LETTER II --> - <Key - latin:keyLabel="ई" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ई" /> </case> <default> + <!-- Because the font rendering system prior to API version 16 can't automatically + render dotted circle for incomplete combining letter of some scripts, different + set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_nukta" /> <!-- U+091F: "ट" DEVANAGARI LETTER TTA - U+0967: "१" DEVANAGARI DIGIT ONE - U+093C: "़" DEVANAGARI SIGN NUKTA --> + U+0967: "१" DEVANAGARI DIGIT ONE --> <Key - latin:keyLabel="ट" + latin:keySpec="ट" latin:keyHintLabel="1" latin:additionalMoreKeys="१,1" - latin:moreKeys="़" - latin:keyLabelFlags="fontNormal" /> + latin:keyStyle="moreKeysDevanagariSignNukta" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> <!-- U+0968: "२" DEVANAGARI DIGIT TWO --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignAu" latin:keyHintLabel="2" @@ -103,9 +80,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> <!-- U+0969: "३" DEVANAGARI DIGIT THREE --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignE" latin:keyHintLabel="3" @@ -113,30 +89,26 @@ <!-- U+0930: "र" DEVANAGARI LETTER RA U+096A: "४" DEVANAGARI DIGIT FOUR --> <Key - latin:keyLabel="र" + latin:keySpec="र" latin:keyHintLabel="4" - latin:additionalMoreKeys="४,4" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="४,4" /> <!-- U+0924: "त" DEVANAGARI LETTER TA U+096B: "५" DEVANAGARI DIGIT FIVE --> <Key - latin:keyLabel="त" + latin:keySpec="त" latin:keyHintLabel="5" - latin:additionalMoreKeys="५,5" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="५,5" /> <!-- U+092F: "य" DEVANAGARI LETTER YA U+096C: "६" DEVANAGARI DIGIT SIX --> <Key - latin:keyLabel="य" + latin:keySpec="य" latin:keyHintLabel="6" - latin:additionalMoreKeys="६,6" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="६,6" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> <!-- U+096D: "७" DEVANAGARI DIGIT SEVEN --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignU" latin:keyHintLabel="7" @@ -144,9 +116,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> <!-- U+096E: "८" DEVANAGARI DIGIT EIGHT --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignI" latin:keyHintLabel="8" @@ -154,9 +125,8 @@ <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> <!-- U+096F: "९" DEVANAGARI DIGIT NINE --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> <Key latin:keyStyle="baseKeyDevanagariVowelSignO" latin:keyHintLabel="9" @@ -164,14 +134,11 @@ <!-- U+092A: "प" DEVANAGARI LETTER PA U+0966: "०" DEVANAGARI DIGIT ZERO --> <Key - latin:keyLabel="प" + latin:keySpec="प" latin:keyHintLabel="0" - latin:additionalMoreKeys="०,0" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="०,0" /> <!-- U+0907: "इ" DEVANAGARI LETTER I --> - <Key - latin:keyLabel="इ" - latin:keyLabelFlags="fontNormal" /> - </default> + <Key latin:keySpec="इ" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_romanized2.xml b/java/res/xml/rowkeys_nepali_romanized2.xml index 66359ffb5..2e2583cca 100644 --- a/java/res/xml/rowkeys_nepali_romanized2.xml +++ b/java/res/xml/rowkeys_nepali_romanized2.xml @@ -18,109 +18,61 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0906: "आ" DEVANAGARI LETTER AA --> - <Key - latin:keyLabel="आ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="आ" /> <!-- U+0936: "श" DEVANAGARI LETTER SHA --> - <Key - latin:keyLabel="श" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="श" /> <!-- U+0927: "ध" DEVANAGARI LETTER DHA --> - <Key - latin:keyLabel="ध" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ध" /> <!-- U+090A: "ऊ" DEVANAGARI LETTER UU --> - <Key - latin:keyLabel="ऊ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ऊ" /> <!-- U+0918: "घ" DEVANAGARI LETTER GHA --> - <Key - latin:keyLabel="घ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="घ" /> <!-- U+0905: "अ" DEVANAGARI LETTER A --> - <Key - latin:keyLabel="अ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="अ" /> <!-- U+091D: "झ" DEVANAGARI LETTER JHA --> - <Key - latin:keyLabel="झ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="झ" /> <!-- U+0916: "ख" DEVANAGARI LETTER KHA --> - <Key - latin:keyLabel="ख" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ख" /> <!-- U+0965: "॥" DEVANAGARI DOUBLE DANDA --> - <Key - latin:keyLabel="॥" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="॥" /> <!-- U+0910: "ऐ" DEVANAGARI LETTER AI --> - <Key - latin:keyLabel="ऐ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ऐ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> - <Key - latin:keyStyle="baseKeyDevanagariSignVisarga" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> + <Key latin:keyStyle="baseKeyDevanagariSignVisarga" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAa" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAa" /> <!-- U+0938: "स" DEVANAGARI LETTER SA --> - <Key - latin:keyLabel="स" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="स" /> <!-- U+0926: "द" DEVANAGARI LETTER DA --> - <Key - latin:keyLabel="द" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="द" /> <!-- U+0909: "उ" DEVANAGARI LETTER U --> - <Key - latin:keyLabel="उ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="उ" /> <!-- U+0917: "ग" DEVANAGARI LETTER GA --> - <Key - latin:keyLabel="ग" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ग" /> <!-- U+0939: "ह" DEVANAGARI LETTER HA --> - <Key - latin:keyLabel="ह" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ह" /> <!-- U+091C: "ज" DEVANAGARI LETTER JA --> - <Key - latin:keyLabel="ज" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ज" /> <!-- U+0915: "क" DEVANAGARI LETTER KA --> - <Key - latin:keyLabel="क" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="क" /> <!-- U+0932: "ल" DEVANAGARI LETTER LA --> - <Key - latin:keyLabel="ल" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ल" /> <!-- U+090F: "ए" DEVANAGARI LETTER E --> - <Key - latin:keyLabel="ए" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ए" /> <!-- U+0950: "ॐ" DEVANAGARI OM --> - <Key - latin:keyLabel="ॐ" - latin:keyLabelFlags="fontNormal" /> - </default> + <Key latin:keySpec="ॐ" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_romanized3.xml b/java/res/xml/rowkeys_nepali_romanized3.xml index 166d028a3..24f590832 100644 --- a/java/res/xml/rowkeys_nepali_romanized3.xml +++ b/java/res/xml/rowkeys_nepali_romanized3.xml @@ -18,97 +18,62 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R --> - <Key - latin:keyLabel="ऋ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ऋ" /> <!-- U+0922: "ढ" DEVANAGARI LETTER DDHA --> - <Key - latin:keyLabel="ढ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ढ" /> <!-- U+091B: "छ" DEVANAGARI LETTER CHA --> - <Key - latin:keyLabel="छ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="छ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_candrabindu" /> + <Key latin:keyStyle="baseKeyDevanagariSignCandrabindu" /> <!-- U+092D: "भ" DEVANAGARI LETTER BHA --> - <Key - latin:keyLabel="भ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="भ" /> <!-- U+0923: "ण" DEVANAGARI LETTER NNA --> - <Key - latin:keyLabel="ण" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ण" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> <!-- U+0919: "ङ" DEVANAGARI LETTER NGA --> - <Key - latin:keyLabel="ङ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ङ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> - <Key - latin:keyStyle="baseKeyDevanagariSignVirama" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <Key latin:keyStyle="baseKeyDevanagariSignVirama" /> </case> <default> <!-- U+0937: "ष" DEVANAGARI LETTER SSA --> - <Key - latin:keyLabel="ष" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ष" /> <!-- U+0921: "ड" DEVANAGARI LETTER DDA --> - <Key - latin:keyLabel="ड" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ड" /> <!-- U+091A: "च" DEVANAGARI LETTER CA --> - <Key - latin:keyLabel="च" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="च" /> <!-- U+0935: "व" DEVANAGARI LETTER VA --> - <Key - latin:keyLabel="व" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="व" /> <!-- U+092C: "ब" DEVANAGARI LETTER BHA --> - <Key - latin:keyLabel="ब" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ब" /> <!-- U+0928: "न" DEVANAGARI LETTER NA --> - <Key - latin:keyLabel="न" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="न" /> <!-- U+092E: "म" DEVANAGARI LETTER MA --> - <Key - latin:keyLabel="म" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="म" /> <!-- U+0964: "।" DEVANAGARI DANDA U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> <Key - latin:keyLabel="।" - latin:moreKeys="ऽ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="।" + latin:moreKeys="ऽ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> - <Key - latin:keyStyle="baseKeyDevanagariSignVirama" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <Key latin:keyStyle="baseKeyDevanagariSignVirama" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_traditional1.xml b/java/res/xml/rowkeys_nepali_traditional1.xml index c7883c733..73b2275ef 100644 --- a/java/res/xml/rowkeys_nepali_traditional1.xml +++ b/java/res/xml/rowkeys_nepali_traditional1.xml @@ -18,158 +18,139 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0924/U+094D/U+0924: "त्त" DEVANAGARI LETTER TA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TA U+091E: "ञ" DEVANAGARI LETTER NYA U+091C/U+094D/U+091E: "ज्ञ" DEVANAGARI LETTER JA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER NYA U+0965: "॥" DEVANAGARI DOUBLE DANDA --> <Key - latin:keyLabel="त्त" + latin:keySpec="त्त" latin:moreKeys="ञ,ज्ञ,॥" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0921/U+094D/U+0922: "ड्ढ" DEVANAGARI LETTER DDA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DDHA U+0908: "ई" DEVANAGARI LETTER II --> <Key - latin:keyLabel="ड्ढ" + latin:keySpec="ड्ढ" latin:moreKeys="ई" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0910: "ऐ" DEVANAGARI LETTER AI U+0918: "घ" DEVANAGARI LETTER GHA --> <Key - latin:keyLabel="ऐ" - latin:moreKeys="घ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ऐ" + latin:moreKeys="घ" /> <!-- U+0926/U+094D/U+0935: "द्व" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER VA U+0926/U+094D/U+0927: "द्ध" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DHA --> <Key - latin:keyLabel="द्व" + latin:keySpec="द्व" latin:moreKeys="द्ध" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+091F/U+094D/U+091F: "ट्ट" DEVANAGARI LETTER TTA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTA U+091B: "छ" DEVANAGARI LETTER CHA --> <Key - latin:keyLabel="ट्ट" + latin:keySpec="ट्ट" latin:moreKeys="छ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0920/U+094D/U+0920: "ठ्ठ" DEVANAGARI LETTER TTHA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTHA U+091F: "ट" DEVANAGARI LETTER TTA --> <Key - latin:keyLabel="ठ्ठ" + latin:keySpec="ठ्ठ" latin:moreKeys="ट" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+090A: "ऊ" DEVANAGARI LETTER UU U+0920: "ठ" DEVANAGARI LETTER TTHA --> <Key - latin:keyLabel="ऊ" - latin:moreKeys="ठ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ऊ" + latin:moreKeys="ठ" /> <!-- U+0915/U+094D/U+0937: "क्ष" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER SSA U+0921: "ड" DEVANAGARI LETTER DDA --> <Key - latin:keyLabel="क्ष" + latin:keySpec="क्ष" latin:moreKeys="ड" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0907: "इ" DEVANAGARI LETTER I U+0922: "ढ" DEVANAGARI LETTER DDHA --> <Key - latin:keyLabel="इ" - latin:moreKeys="ढ" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="इ" + latin:moreKeys="ढ" /> <!-- U+090F: "ए" DEVANAGARI LETTER E U+0923: "ण" DEVANAGARI LETTER NNA --> <Key - latin:keyLabel="ए" - latin:moreKeys="ण" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="ए" + latin:moreKeys="ण" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_vowel_sign_vocalic_r" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_vocalic_r" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignVocalicR" /> </case> <default> <!-- U+091F: "ट" DEVANAGARI LETTER TTA U+0967: "१" DEVANAGARI DIGIT ONE --> <Key - latin:keyLabel="ट" + latin:keySpec="ट" latin:keyHintLabel="1" - latin:additionalMoreKeys="१,1" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="१,1" /> <!-- U+0927: "ध" DEVANAGARI LETTER DHA U+0968: "२" DEVANAGARI DIGIT TWO --> <Key - latin:keyLabel="ध" + latin:keySpec="ध" latin:keyHintLabel="2" - latin:additionalMoreKeys="२,2" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="२,2" /> <!-- U+092D: "भ" DEVANAGARI LETTER BHA U+0969: "३" DEVANAGARI DIGIT THREE --> <Key - latin:keyLabel="भ" + latin:keySpec="भ" latin:keyHintLabel="3" - latin:additionalMoreKeys="३,3" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="३,3" /> <!-- U+091A: "च" DEVANAGARI LETTER CA U+096A: "४" DEVANAGARI DIGIT FOUR --> <Key - latin:keyLabel="च" + latin:keySpec="च" latin:keyHintLabel="4" - latin:additionalMoreKeys="४,4" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="४,4" /> <!-- U+0924: "त" DEVANAGARI LETTER TA U+096B: "५" DEVANAGARI DIGIT FIVE --> <Key - latin:keyLabel="त" + latin:keySpec="त" latin:keyHintLabel="5" - latin:additionalMoreKeys="५,5" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="५,5" /> <!-- U+0925: "थ" DEVANAGARI LETTER THA U+096C: "६" DEVANAGARI DIGIT SIX --> <Key - latin:keyLabel="थ" + latin:keySpec="थ" latin:keyHintLabel="6" - latin:additionalMoreKeys="६,6" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="६,6" /> <!-- U+0917: "ग" DEVANAGARI LETTER G U+096D: "७" DEVANAGARI DIGIT SEVEN --> <Key - latin:keyLabel="ग" + latin:keySpec="ग" latin:keyHintLabel="7" - latin:additionalMoreKeys="७,7" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="७,7" /> <!-- U+0937: "ष" DEVANAGARI LETTER SSA U+096E: "८" DEVANAGARI DIGIT EIGHT --> <Key - latin:keyLabel="ष" + latin:keySpec="ष" latin:keyHintLabel="8" - latin:additionalMoreKeys="८,8" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="८,8" /> <!-- U+092F: "य" DEVANAGARI LETTER YA U+096F: "९" DEVANAGARI DIGIT NINE --> <Key - latin:keyLabel="य" + latin:keySpec="य" latin:keyHintLabel="9" - latin:additionalMoreKeys="९,9" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="९,9" /> <!-- U+0909: "उ" DEVANAGARI LETTER U U+0966: "०" DEVANAGARI DIGIT ZERO --> <Key - latin:keyLabel="उ" + latin:keySpec="उ" latin:keyHintLabel="0" - latin:additionalMoreKeys="०,0" - latin:keyLabelFlags="fontNormal" /> + latin:additionalMoreKeys="०,0" /> <!-- U+0907: "इ" DEVANAGARI LETTER I U+0914: "औ" DEVANAGARI LETTER AU --> <Key - latin:keyLabel="इ" - latin:moreKeys="औ" - latin:keyLabelFlags="fontNormal" /> - </default> + latin:keySpec="इ" + latin:moreKeys="औ" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_traditional2.xml b/java/res/xml/rowkeys_nepali_traditional2.xml index 45620a9d7..c443daf5d 100644 --- a/java/res/xml/rowkeys_nepali_traditional2.xml +++ b/java/res/xml/rowkeys_nepali_traditional2.xml @@ -18,122 +18,84 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0906: "आ" DEVANAGARI LETTER AA --> - <Key - latin:keyLabel="आ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="आ" /> <!-- U+0919/U+094D: "ङ्" DEVANAGARI LETTER NGA/DEVANAGARI SIGN VIRAMA --> <Key - latin:keyLabel="ङ्" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ङ्" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0921/U+094D/U+0921: "ड्ड" DEVANAGARI LETTER DDA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DDA --> <Key - latin:keyLabel="ड्ड" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ड्ड" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_candrabindu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_candrabindu" /> + <Key latin:keyStyle="baseKeyDevanagariSignCandrabindu" /> <!-- U+0926/U+094D/U+0926: "द्द" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER DA --> <Key - latin:keyLabel="द्द" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="द्द" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+091D: "झ" DEVANAGARI LETTER JHA --> - <Key - latin:keyLabel="झ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="झ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignO" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_o" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignO" /> <!-- U+092B: "फ" DEVANAGARI LETTER PHA --> - <Key - latin:keyLabel="फ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="फ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignIi" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ii" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignIi" /> <!-- U+091F/U+094D/U+0920: "ट्ठ" DEVANAGARI LETTER TTA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER TTHA --> <Key - latin:keyLabel="ट्ठ" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ट्ठ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignUu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_uu" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignUu" /> </case> <default> <!-- U+092C: "ब" DEVANAGARI LETTER BA --> - <Key - latin:keyLabel="ब" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ब" /> <!-- U+0915: "क" DEVANAGARI LETTER KA --> - <Key - latin:keyLabel="क" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="क" /> <!-- U+092E: "म" DEVANAGARI LETTER MA --> - <Key - latin:keyLabel="म" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="म" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAa" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_aa" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAa" /> <!-- U+0928: "न" DEVANAGARI LETTER NA --> - <Key - latin:keyLabel="न" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="न" /> <!-- U+091C: "ज" DEVANAGARI LETTER JA --> - <Key - latin:keyLabel="ज" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ज" /> <!-- U+0935: "व" DEVANAGARI LETTER VA --> - <Key - latin:keyLabel="व" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="व" /> <!-- U+092A: "प" DEVANAGARI LETTER PA --> - <Key - latin:keyLabel="प" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="प" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignI" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_i" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignI" /> <!-- U+0938: "स" DEVANAGARI LETTER SA --> - <Key - latin:keyLabel="स" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="स" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignU" /> - </default> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_u" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignU" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_traditional3_left6.xml b/java/res/xml/rowkeys_nepali_traditional3_left6.xml index 1cacced83..ade278710 100644 --- a/java/res/xml/rowkeys_nepali_traditional3_left6.xml +++ b/java/res/xml/rowkeys_nepali_traditional3_left6.xml @@ -18,66 +18,44 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0915/U+094D: "क्" DEVANAGARI LETTER KA/DEVANAGARI SIGN VIRAMA --> <Key - latin:keyLabel="क्" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="क्" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0939/U+094D/U+092E: "ह्म" DEVANAGARI LETTER HA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER MA --> <Key - latin:keyLabel="ह्म" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="ह्म" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+090B: "ऋ" DEVANAGARI LETTER VOCALIC R --> - <Key - latin:keyLabel="ऋ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ऋ" /> <!-- U+0950: "ॐ" DEVANAGARI OM --> - <Key - latin:keyLabel="ॐ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ॐ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAu" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_au" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAu" /> <!-- U+0926/U+094D/U+092F: "द्य" DEVANAGARI LETTER DA/DEVANAGARI SIGN VIRAMA/DEVANAGARI LETTER YA --> <Key - latin:keyLabel="द्य" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec="द्य" + latin:keyLabelFlags="followKeyLetterRatio" /> </case> <default> <!-- U+0936: "श" DEVANAGARI LETTER SHA --> - <Key - latin:keyLabel="श" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="श" /> <!-- U+0939: "ह" DEVANAGARI LETTER HA --> - <Key - latin:keyLabel="ह" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ह" /> <!-- U+0905: "अ" DEVANAGARI LETTER A --> - <Key - latin:keyLabel="अ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="अ" /> <!-- U+0916: "ख" DEVANAGARI LETTER KHA --> - <Key - latin:keyLabel="ख" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ख" /> <!-- U+0926: "द" DEVANAGARI LETTER DA --> - <Key - latin:keyLabel="द" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="द" /> <!-- U+0932: "ल" DEVANAGARI LETTER LA --> - <Key - latin:keyLabel="ल" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ल" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_traditional3_right3.xml b/java/res/xml/rowkeys_nepali_traditional3_right3.xml index b2e01e481..4db438d81 100644 --- a/java/res/xml/rowkeys_nepali_traditional3_right3.xml +++ b/java/res/xml/rowkeys_nepali_traditional3_right3.xml @@ -18,48 +18,35 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> <!-- U+0919: "ङ" DEVANAGARI LETTER NGA --> - <Key - latin:keyLabel="ङ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ङ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAi" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAi" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignE" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignE" /> <!-- U+0964: "।" DEVANAGARI DANDA --> + <Key latin:keySpec="।" /> + <!-- U+0930: "र" DEVANAGARI LETTER RA + U+0930/U+0941: "रु" DEVANAGARI LETTER RA/DEVANAGARI VOWEL SIGN U --> <Key - latin:keyLabel="।" - latin:keyLabelFlags="fontNormal" /> - <!-- U+0930: "र" DEVANAGARI LETTER RA - U+0930/U+0941: "रु" DEVANAGARI LETTER RA/DEVANAGARI VOWEL SIGN U --> - <Key - latin:keyLabel="र" - latin:moreKeys="रु" - latin:keyLabelFlags="fontNormal" /> - </default> + latin:keySpec="र" + latin:moreKeys="रु" /> + </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_nepali_traditional3_right5.xml b/java/res/xml/rowkeys_nepali_traditional3_right5.xml index 87f061610..c7c73a446 100644 --- a/java/res/xml/rowkeys_nepali_traditional3_right5.xml +++ b/java/res/xml/rowkeys_nepali_traditional3_right5.xml @@ -18,71 +18,56 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/key_devanagari_sign_anusvara" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_anusvara" /> + <Key latin:keyStyle="baseKeyDevanagariSignAnusvara" /> <!-- U+0919: "ङ" DEVANAGARI LETTER NGA --> - <Key - latin:keyLabel="ङ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ङ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignAi" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_ai" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignAi" /> <!-- U+0930/U+0941: "रु" DEVANAGARI LETTER RA/DEVANAGARI VOWEL SIGN U --> <Key - latin:keyLabel="रु" + latin:keySpec="रु" latin:moreKeys="!" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keyLabelFlags="followKeyLetterRatio" /> <Key - latin:keyLabel="\?" /> + latin:keySpec="\?" + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> <!-- U+093D: "ऽ" DEVANAGARI SIGN AVAGRAHA --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_visarga" /> <Key latin:keyStyle="baseKeyDevanagariSignVisarga" latin:moreKeys="ऽ" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_vowel_sign_e" /> <!-- Override more keys with empty definition --> - <key-style - latin:styleName="moreKeysDevanagariVowelSignE" /> - <Key - latin:keyStyle="baseKeyDevanagariVowelSignE" /> + <key-style latin:styleName="moreKeysDevanagariVowelSignE" /> + <Key latin:keyStyle="baseKeyDevanagariVowelSignE" /> <!-- U+0964: "।" DEVANAGARI DANDA --> - <Key - latin:keyLabel="।" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="।" /> <!-- U+0930: "र" DEVANAGARI LETTER RA --> <Key - latin:keyLabel="र" - latin:moreKeys="!" - latin:keyLabelFlags="fontNormal" /> + latin:keySpec="र" + latin:moreKeys="!" /> <!-- Because the font rendering system prior to API version 16 can't automatically render dotted circle for incomplete combining letter of some scripts, different set of Key definitions are needed based on the API version. --> - <include - latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> + <include latin:keyboardLayout="@xml/keystyle_devanagari_sign_virama" /> <Key latin:keyStyle="baseKeyDevanagariSignVirama" latin:moreKeys="\?" /> diff --git a/java/res/xml/rowkeys_nordic1.xml b/java/res/xml/rowkeys_nordic1.xml index 72ac86b2e..ff589cc4a 100644 --- a/java/res/xml/rowkeys_nordic1.xml +++ b/java/res/xml/rowkeys_nordic1.xml @@ -24,5 +24,5 @@ <include latin:keyboardLayout="@xml/rowkeys_qwerty1" /> <Key - latin:keyLabel="!text/keylabel_for_nordic_row1_11" /> + latin:keySpec="!text/keyspec_nordic_row1_11" /> </merge> diff --git a/java/res/xml/rowkeys_nordic2.xml b/java/res/xml/rowkeys_nordic2.xml index 836214abf..0330c0f67 100644 --- a/java/res/xml/rowkeys_nordic2.xml +++ b/java/res/xml/rowkeys_nordic2.xml @@ -24,9 +24,9 @@ <include latin:keyboardLayout="@xml/rowkeys_qwerty2" /> <Key - latin:keyLabel="!text/keylabel_for_nordic_row2_10" - latin:moreKeys="!text/more_keys_for_nordic_row2_10" /> + latin:keySpec="!text/keyspec_nordic_row2_10" + latin:moreKeys="!text/morekeys_nordic_row2_10" /> <Key - latin:keyLabel="!text/keylabel_for_nordic_row2_11" - latin:moreKeys="!text/more_keys_for_nordic_row2_11" /> + latin:keySpec="!text/keyspec_nordic_row2_11" + latin:moreKeys="!text/morekeys_nordic_row2_11" /> </merge> diff --git a/java/res/xml/rowkeys_pcqwerty1.xml b/java/res/xml/rowkeys_pcqwerty1.xml index de548d0ba..564468a9a 100644 --- a/java/res/xml/rowkeys_pcqwerty1.xml +++ b/java/res/xml/rowkeys_pcqwerty1.xml @@ -21,61 +21,72 @@ <merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > - <Key - latin:keyLabel="`" - latin:additionalMoreKeys="~" /> - <Key - latin:keyLabel="1" - latin:additionalMoreKeys="!,!text/more_keys_for_symbols_exclamation" - latin:moreKeys="!text/more_keys_for_symbols_1" /> - <Key - latin:keyLabel="2" - latin:additionalMoreKeys="\@" - latin:moreKeys="!text/more_keys_for_symbols_2" /> - <Key - latin:keyLabel="3" - latin:additionalMoreKeys="\#" - latin:moreKeys="!text/more_keys_for_symbols_3" /> - <Key - latin:keyLabel="4" - latin:additionalMoreKeys="$" - latin:moreKeys="!text/more_keys_for_symbols_4" /> - <Key - latin:keyLabel="5" - latin:additionalMoreKeys="\\%" - latin:moreKeys="!text/more_keys_for_symbols_5" /> - <Key - latin:keyLabel="6" - latin:additionalMoreKeys="^" - latin:moreKeys="!text/more_keys_for_symbols_6" /> - <Key - latin:keyLabel="7" - latin:additionalMoreKeys="&" - latin:moreKeys="!text/more_keys_for_symbols_7" /> - <Key - latin:keyLabel="8" - latin:additionalMoreKeys="*" - latin:moreKeys="!text/more_keys_for_symbols_8" /> - <Key - latin:keyLabel="9" - latin:additionalMoreKeys="(" - latin:moreKeys="!text/more_keys_for_symbols_9" /> - <Key - latin:keyLabel="0" - latin:additionalMoreKeys=")" - latin:moreKeys="!text/more_keys_for_symbols_0" /> - <!-- U+2013: "–" EN DASH - U+2014: "—" EM DASH - U+00B7: "·" MIDDLE DOT --> - <Key - latin:keyLabel="-" - latin:additionalMoreKeys="_" - latin:moreKeys="–,—,·" /> - <!-- U+221E: "∞" INFINITY - U+2260: "≠" NOT EQUAL TO - U+2248: "≈" ALMOST EQUAL TO --> - <Key - latin:keyLabel="=" - latin:additionalMoreKeys="+" - latin:moreKeys="!fixedColumnOrder!4,∞,≠,≈,%" /> + <switch> + <case + latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted|alphabetShiftLocked" + > + <Key + latin:keySpec="`" + latin:additionalMoreKeys="~" /> + <Key + latin:keySpec="1" + latin:additionalMoreKeys="!,!text/morekeys_exclamation" + latin:moreKeys="!text/morekeys_symbols_1" /> + <Key + latin:keySpec="2" + latin:additionalMoreKeys="\@" + latin:moreKeys="!text/morekeys_symbols_2" /> + <Key + latin:keySpec="3" + latin:additionalMoreKeys="\#" + latin:moreKeys="!text/morekeys_symbols_3" /> + <Key + latin:keySpec="4" + latin:additionalMoreKeys="$" + latin:moreKeys="!text/morekeys_symbols_4" /> + <Key + latin:keySpec="5" + latin:additionalMoreKeys="\\%" + latin:moreKeys="!text/morekeys_symbols_5" /> + <Key + latin:keySpec="6" + latin:additionalMoreKeys="^" + latin:moreKeys="!text/morekeys_symbols_6" /> + <Key + latin:keySpec="7" + latin:additionalMoreKeys="&" + latin:moreKeys="!text/morekeys_symbols_7" /> + <Key + latin:keySpec="8" + latin:additionalMoreKeys="*" + latin:moreKeys="!text/morekeys_symbols_8" /> + <Key + latin:keySpec="9" + latin:additionalMoreKeys="(" + latin:moreKeys="!text/morekeys_symbols_9" /> + <Key + latin:keySpec="0" + latin:additionalMoreKeys=")" + latin:moreKeys="!text/morekeys_symbols_0" /> + <!-- U+2013: "–" EN DASH + U+2014: "—" EM DASH + U+00B7: "·" MIDDLE DOT --> + <Key + latin:keySpec="-" + latin:additionalMoreKeys="_" + latin:moreKeys="–,—,·" /> + <!-- U+221E: "∞" INFINITY + U+2260: "≠" NOT EQUAL TO + U+2248: "≈" ALMOST EQUAL TO --> + <Key + latin:keySpec="=" + latin:additionalMoreKeys="+" + latin:moreKeys="!fixedColumnOrder!4,∞,≠,≈,%" /> + </case> + <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted" --> + <default> + <include + latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" /> + </default> + </switch> </merge> diff --git a/java/res/xml/rowkeys_pcqwerty1_shift.xml b/java/res/xml/rowkeys_pcqwerty1_shift.xml index bc39f944e..c72040f8a 100644 --- a/java/res/xml/rowkeys_pcqwerty1_shift.xml +++ b/java/res/xml/rowkeys_pcqwerty1_shift.xml @@ -22,39 +22,38 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="~" /> + latin:keySpec="~" /> <Key - latin:keyLabel="!" - latin:additionalMoreKeys="!text/more_keys_for_symbols_exclamation" /> + latin:keySpec="!" + latin:additionalMoreKeys="!text/morekeys_exclamation" /> <Key - latin:keyLabel="\@" /> + latin:keySpec="\@" /> <Key - latin:keyLabel="\#" /> + latin:keySpec="\#" /> <Key - latin:keyLabel="$" - latin:additionalMoreKeys="!text/more_keys_for_currency_dollar" /> + latin:keySpec="$" + latin:additionalMoreKeys="!text/morekeys_currency_dollar" /> <Key - latin:keyLabel="%" - latin:additionalMoreKeys="!text/more_keys_for_symbols_percent" /> + latin:keySpec="%" + latin:additionalMoreKeys="!text/morekeys_symbols_percent" /> <Key - latin:keyLabel="^" /> + latin:keySpec="^" /> <Key - latin:keyLabel="&" /> + latin:keySpec="&" /> <Key - latin:keyLabel="*" - latin:additionalMoreKeys="!text/more_keys_for_star" /> + latin:keySpec="*" + latin:additionalMoreKeys="!text/morekeys_star" /> <Key - latin:keyLabel="(" /> + latin:keySpec="(" /> <Key - latin:keyLabel=")" /> + latin:keySpec=")" /> <Key - latin:keyLabel="_" /> - <!-- U+00B1: "±" PLUS-MINUS SIGN - U+00D7: "×" MULTIPLICATION SIGN + latin:keySpec="_" /> + <!-- U+00D7: "×" MULTIPLICATION SIGN U+00F7: "÷" DIVISION SIGN U+221A: "√" SQUARE ROOT --> <Key - latin:keyLabel="+" - latin:additionalMoreKeys="!text/more_keys_for_plus" - latin:moreKeys="±,×,÷,√" /> + latin:keySpec="+" + latin:additionalMoreKeys="!text/morekeys_plus" + latin:moreKeys="×,÷,√" /> </merge> diff --git a/java/res/xml/rowkeys_qwerty1.xml b/java/res/xml/rowkeys_qwerty1.xml index e7c9b590b..8f3b160fe 100644 --- a/java/res/xml/rowkeys_qwerty1.xml +++ b/java/res/xml/rowkeys_qwerty1.xml @@ -22,52 +22,52 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="!text/keylabel_for_q" + latin:keySpec="!text/keyspec_q" latin:keyHintLabel="1" latin:additionalMoreKeys="1" - latin:moreKeys="!text/more_keys_for_q" /> + latin:moreKeys="!text/morekeys_q" /> <Key - latin:keyLabel="!text/keylabel_for_w" + latin:keySpec="!text/keyspec_w" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="!text/more_keys_for_w" /> + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="e" + latin:keySpec="e" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_e" /> + latin:moreKeys="!text/morekeys_e" /> <Key - latin:keyLabel="r" + latin:keySpec="r" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="!text/more_keys_for_r" /> + latin:moreKeys="!text/morekeys_r" /> <Key - latin:keyLabel="t" + latin:keySpec="t" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_t" /> + latin:moreKeys="!text/morekeys_t" /> <Key - latin:keyLabel="!text/keylabel_for_y" + latin:keySpec="!text/keyspec_y" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_y" /> + latin:moreKeys="!text/morekeys_y" /> <Key - latin:keyLabel="u" + latin:keySpec="u" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_u" /> + latin:moreKeys="!text/morekeys_u" /> <Key - latin:keyLabel="i" + latin:keySpec="i" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_i" /> + latin:moreKeys="!text/morekeys_i" /> <Key - latin:keyLabel="o" + latin:keySpec="o" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="!text/more_keys_for_o" /> + latin:moreKeys="!text/morekeys_o" /> <Key - latin:keyLabel="p" + latin:keySpec="p" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_qwerty2.xml b/java/res/xml/rowkeys_qwerty2.xml index d9777d920..4077beaf6 100644 --- a/java/res/xml/rowkeys_qwerty2.xml +++ b/java/res/xml/rowkeys_qwerty2.xml @@ -22,29 +22,29 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="a" - latin:moreKeys="!text/more_keys_for_a" /> + latin:keySpec="a" + latin:moreKeys="!text/morekeys_a" /> <Key - latin:keyLabel="s" - latin:moreKeys="!text/more_keys_for_s" /> + latin:keySpec="s" + latin:moreKeys="!text/morekeys_s" /> <Key - latin:keyLabel="d" - latin:moreKeys="!text/more_keys_for_d" /> + latin:keySpec="d" + latin:moreKeys="!text/morekeys_d" /> <Key - latin:keyLabel="f" /> + latin:keySpec="f" /> <Key - latin:keyLabel="g" - latin:moreKeys="!text/more_keys_for_g" /> + latin:keySpec="g" + latin:moreKeys="!text/morekeys_g" /> <Key - latin:keyLabel="h" - latin:moreKeys="!text/more_keys_for_h" /> + latin:keySpec="h" + latin:moreKeys="!text/morekeys_h" /> <Key - latin:keyLabel="j" - latin:moreKeys="!text/more_keys_for_j" /> + latin:keySpec="j" + latin:moreKeys="!text/morekeys_j" /> <Key - latin:keyLabel="k" - latin:moreKeys="!text/more_keys_for_k" /> + latin:keySpec="k" + latin:moreKeys="!text/morekeys_k" /> <Key - latin:keyLabel="l" - latin:moreKeys="!text/more_keys_for_l" /> + latin:keySpec="l" + latin:moreKeys="!text/morekeys_l" /> </merge> diff --git a/java/res/xml/rowkeys_qwerty3.xml b/java/res/xml/rowkeys_qwerty3.xml index b70fd729f..8562003d2 100644 --- a/java/res/xml/rowkeys_qwerty3.xml +++ b/java/res/xml/rowkeys_qwerty3.xml @@ -22,22 +22,22 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="z" - latin:moreKeys="!text/more_keys_for_z" /> + latin:keySpec="z" + latin:moreKeys="!text/morekeys_z" /> <Key - latin:keyLabel="!text/keylabel_for_x" - latin:moreKeys="!text/more_keys_for_x" /> + latin:keySpec="!text/keyspec_x" + latin:moreKeys="!text/morekeys_x" /> <Key - latin:keyLabel="c" - latin:moreKeys="!text/more_keys_for_c" /> + latin:keySpec="c" + latin:moreKeys="!text/morekeys_c" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="n" - latin:moreKeys="!text/more_keys_for_n" /> + latin:keySpec="n" + latin:moreKeys="!text/morekeys_n" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> </merge> diff --git a/java/res/xml/rowkeys_qwertz1.xml b/java/res/xml/rowkeys_qwertz1.xml index d87f03ddc..c4edae339 100644 --- a/java/res/xml/rowkeys_qwertz1.xml +++ b/java/res/xml/rowkeys_qwertz1.xml @@ -22,51 +22,51 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="q" + latin:keySpec="q" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <Key - latin:keyLabel="w" + latin:keySpec="w" latin:keyHintLabel="2" latin:additionalMoreKeys="2" - latin:moreKeys="!text/more_keys_for_w" /> + latin:moreKeys="!text/morekeys_w" /> <Key - latin:keyLabel="e" + latin:keySpec="e" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_e" /> + latin:moreKeys="!text/morekeys_e" /> <Key - latin:keyLabel="r" + latin:keySpec="r" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="!text/more_keys_for_r" /> + latin:moreKeys="!text/morekeys_r" /> <Key - latin:keyLabel="t" + latin:keySpec="t" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="!text/more_keys_for_t" /> + latin:moreKeys="!text/morekeys_t" /> <Key - latin:keyLabel="z" + latin:keySpec="z" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="!text/more_keys_for_z" /> + latin:moreKeys="!text/morekeys_z" /> <Key - latin:keyLabel="u" + latin:keySpec="u" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="!text/more_keys_for_u" /> + latin:moreKeys="!text/morekeys_u" /> <Key - latin:keyLabel="i" + latin:keySpec="i" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_i" /> + latin:moreKeys="!text/morekeys_i" /> <Key - latin:keyLabel="o" + latin:keySpec="o" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="!text/more_keys_for_o" /> + latin:moreKeys="!text/morekeys_o" /> <Key - latin:keyLabel="p" + latin:keySpec="p" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> </merge> diff --git a/java/res/xml/rowkeys_qwertz3.xml b/java/res/xml/rowkeys_qwertz3.xml index 9e39fe08e..a66c34868 100644 --- a/java/res/xml/rowkeys_qwertz3.xml +++ b/java/res/xml/rowkeys_qwertz3.xml @@ -22,21 +22,21 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="y" - latin:moreKeys="!text/more_keys_for_y" /> + latin:keySpec="y" + latin:moreKeys="!text/morekeys_y" /> <Key - latin:keyLabel="x" /> + latin:keySpec="x" /> <Key - latin:keyLabel="c" - latin:moreKeys="!text/more_keys_for_c" /> + latin:keySpec="c" + latin:moreKeys="!text/morekeys_c" /> <Key - latin:keyLabel="v" - latin:moreKeys="!text/more_keys_for_v" /> + latin:keySpec="v" + latin:moreKeys="!text/morekeys_v" /> <Key - latin:keyLabel="b" /> + latin:keySpec="b" /> <Key - latin:keyLabel="n" - latin:moreKeys="!text/more_keys_for_n" /> + latin:keySpec="n" + latin:moreKeys="!text/morekeys_n" /> <Key - latin:keyLabel="m" /> + latin:keySpec="m" /> </merge> diff --git a/java/res/xml/rowkeys_sinhala1.xml b/java/res/xml/rowkeys_sinhala1.xml new file mode 100644 index 000000000..fcad5eaa3 --- /dev/null +++ b/java/res/xml/rowkeys_sinhala1.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+0DD6: "ූ" SINHALA VOWEL SIGN DIGA PAA-PILLA --> + <Key latin:keySpec="ූ" /> + <!-- U+0D8B: "උ" SINHALA LETTER UYANNA --> + <Key latin:keySpec="උ" /> + <!-- U+0DD1: "ෑ" SINHALA VOWEL SIGN DIGA AEDA-PILLA --> + <Key latin:keySpec="ෑ" /> + <!-- U+0D8D: "ඍ" SINHALA LETTER IRUYANNA --> + <Key latin:keySpec="ඍ" /> + <!-- U+0D94: "ඔ" SINHALA LETTER OYANNA --> + <Key latin:keySpec="ඔ" /> + <!-- U+0DC1: "ශ" SINHALA LETTER TAALUJA SAYANNA --> + <Key latin:keySpec="ශ" /> + <!-- U+0DB9: "ඹ" SINHALA LETTER AMBA BAYANNA --> + <Key latin:keySpec="ඹ" /> + <!-- U+0DC2: "ෂ" SINHALA LETTER MUURDHAJA SAYANNA --> + <Key latin:keySpec="ෂ" /> + <!-- U+0DB0: "ධ" SINHALA LETTER MAHAAPRAANA DAYANNA --> + <Key latin:keySpec="ධ" /> + <!-- U+0DA1: "ඡ" SINHALA LETTER MAHAAPRAANA CAYANNA --> + <Key latin:keySpec="ඡ" /> + <!-- U+0DA5: "ඥ" SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA + U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA --> + <Key + latin:keySpec="ඥ" + latin:moreKeys="෴" + latin:keyLabelFlags="autoXScale" /> + </case> + <default> + <!-- U+0DD4: "ු" SINHALA VOWEL SIGN KETTI PAA-PILLA --> + <Key + latin:keySpec="ු" + latin:keyHintLabel="1" + latin:additionalMoreKeys="1" /> + <!-- U+0D85: "අ" SINHALA LETTER AYANNA --> + <Key + latin:keySpec="අ" + latin:keyHintLabel="2" + latin:additionalMoreKeys="2" /> + <!-- U+0DD0: "ැ" SINHALA VOWEL SIGN KETTI AEDA-PILLA --> + <Key + latin:keySpec="ැ" + latin:keyHintLabel="3" + latin:additionalMoreKeys="3" /> + <!-- U+0DBB: "ර" SINHALA LETTER RAYANNA --> + <Key + latin:keySpec="ර" + latin:keyHintLabel="4" + latin:additionalMoreKeys="4" /> + <!-- U+0D91: "එ" SINHALA LETTER EYANNA --> + <Key + latin:keySpec="එ" + latin:keyHintLabel="5" + latin:additionalMoreKeys="5" /> + <!-- U+0DC4: "හ" SINHALA LETTER HAYANNA --> + <Key + latin:keySpec="හ" + latin:keyHintLabel="6" + latin:additionalMoreKeys="6" /> + <!-- U+0DB8: "ම" SINHALA LETTER MAYANNA --> + <Key + latin:keySpec="ම" + latin:keyHintLabel="7" + latin:additionalMoreKeys="7" /> + <!-- U+0DC3: "ස" SINHALA LETTER DANTAJA SAYANNA --> + <Key + latin:keySpec="ස" + latin:keyHintLabel="8" + latin:additionalMoreKeys="8" /> + <!-- U+0DAF: "ද" SINHALA LETTER ALPAPRAANA DAYANNA + U+0DB3: "ඳ" SINHALA LETTER SANYAKA DAYANNA --> + <Key + latin:keySpec="ද" + latin:moreKeys="ඳ" + latin:keyHintLabel="9" + latin:additionalMoreKeys="9" /> + <!-- U+0DA0: "ච" SINHALA LETTER ALPAPRAANA CAYANNA --> + <Key + latin:keySpec="ච" + latin:keyHintLabel="0" + latin:additionalMoreKeys="0" /> + <!-- U+0DA4: "ඤ" SINHALA LETTER TAALUJA NAASIKYAYA + U+0DF4: "෴" SINHALA PUNCTUATION KUNDDALIYA --> + <Key + latin:keySpec="ඤ" + latin:moreKeys="෴" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_sinhala2.xml b/java/res/xml/rowkeys_sinhala2.xml new file mode 100644 index 000000000..92c1e0892 --- /dev/null +++ b/java/res/xml/rowkeys_sinhala2.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+0DDF: "ෟ" SINHALA VOWEL SIGN GAYANUKITTA --> + <Key latin:keySpec="ෟ" /> + <!-- U+0DD3: "ී" SINHALA VOWEL SIGN DIGA IS-PILLA --> + <Key latin:keySpec="ී" /> + <!-- U+0DD8: "ෘ" SINHALA VOWEL SIGN GAETTA-PILLA --> + <Key latin:keySpec="ෘ" /> + <!-- U+0DC6: "ෆ" SINHALA LETTER FAYANNA --> + <Key latin:keySpec="ෆ" /> + <!-- U+0DA8: "ඨ" SINHALA LETTER MAHAAPRAANA TTAYANNA --> + <Key latin:keySpec="ඨ" /> + <!-- U+0DCA/U+200D/U+0DBA: "්ය" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER YAYANNA --> + <Key latin:keySpec="්‍ය" /> + <!-- U+0DC5/U+0DD4: "ළු" SINHALA LETTER MUURDHAJA LAYANNA/SINHALA VOWEL SIGN KETTI PAA-PILLA --> + <Key latin:keySpec="ළු" /> + <!-- U+0DAB: "ණ" SINHALA LETTER MUURDHAJA NAYANNA --> + <Key latin:keySpec="ණ" /> + <!-- U+0D9B: "ඛ" SINHALA LETTER MAHAAPRAANA KAYANNA --> + <Key latin:keySpec="ඛ" /> + <!-- U+0DAE: "ථ" SINHALA LETTER MAHAAPRAANA TAYANNA --> + <Key latin:keySpec="ථ" /> + <!-- U+0DCA/U+200D/U+0DBB: "්ර" SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER/SINHALA LETTER RAYANNA --> + <Key latin:keySpec="්‍ර" /> + </case> + <default> + <!-- U+0DCA: "්" SINHALA SIGN AL-LAKUNA --> + <Key latin:keySpec="්" /> + <!-- U+0DD2: "ි" SINHALA VOWEL SIGN KETTI IS-PILLA --> + <Key latin:keySpec="ි" /> + <!-- U+0DCF: "ා" SINHALA VOWEL SIGN AELA-PILLA --> + <Key latin:keySpec="ා" /> + <!-- U+0DD9: "ෙ" SINHALA VOWEL SIGN KOMBUVA --> + <Key latin:keySpec="ෙ" /> + <!-- U+0DA7: "ට" SINHALA LETTER ALPAPRAANA TTAYANNA --> + <Key latin:keySpec="ට" /> + <!-- U+0DBA: "ය" SINHALA LETTER YAYANNA --> + <Key latin:keySpec="ය" /> + <!-- U+0DC0: "ව" SINHALA LETTER VAYANNA --> + <Key latin:keySpec="ව" /> + <!-- U+0DB1: "න" SINHALA LETTER DANTAJA NAYANNA --> + <Key latin:keySpec="න" /> + <!-- U+0D9A: "ක" SINHALA LETTER ALPAPRAANA KAYANNA --> + <Key latin:keySpec="ක" /> + <!-- U+0DAD: "ත" SINHALA LETTER ALPAPRAANA TAYANNA --> + <Key latin:keySpec="ත" /> + <!-- U+0D8F: "ඏ" SINHALA LETTER ILUYANNA --> + <Key latin:keySpec="ඏ" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_sinhala3.xml b/java/res/xml/rowkeys_sinhala3.xml new file mode 100644 index 000000000..872787517 --- /dev/null +++ b/java/res/xml/rowkeys_sinhala3.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> + <!-- U+0D9E: "ඞ" SINHALA LETTER KANTAJA NAASIKYAYA --> + <Key latin:keySpec="ඞ" /> + <!-- U+0DA3: "ඣ" SINHALA LETTER MAHAAPRAANA JAYANNA --> + <Key latin:keySpec="ඣ" /> + <!-- U+0DAA: "ඪ" SINHALA LETTER MAHAAPRAANA DDAYANNA --> + <Key latin:keySpec="ඪ" /> + <!-- U+0D8A: "ඊ" SINHALA LETTER IIYANNA --> + <Key latin:keySpec="ඊ" /> + <!-- U+0DB7: "භ" SINHALA LETTER MAHAAPRAANA BAYANNA --> + <Key latin:keySpec="භ" /> + <!-- U+0DB5: "ඵ" SINHALA LETTER MAHAAPRAANA PAYANNA --> + <Key latin:keySpec="ඵ" /> + <!-- U+0DC5: "ළ" SINHALA LETTER MUURDHAJA LAYANNA --> + <Key latin:keySpec="ළ" /> + <!-- U+0D9D: "ඝ" SINHALA LETTER MAHAAPRAANA GAYANNA --> + <Key latin:keySpec="ඝ" /> + <!-- U+0DBB/U+0DCA/U+200D: "ර්" SINHALA LETTER RAYANNA/SINHALA SIGN AL-LAKUNA/ZERO WIDTH JOINER --> + <Key latin:keySpec="ර්‍" /> + </case> + <default> + <!-- U+0D82: "ං" SINHALA SIGN ANUSVARAYA + U+0D83: "ඃ" SINHALA SIGN VISARGAYA --> + <Key + latin:keySpec="ං" + latin:moreKeys="ඃ" /> + <!-- U+0DA2: "ජ" SINHALA LETTER ALPAPRAANA JAYANNA + U+0DA6: "ඦ" SINHALA LETTER SANYAKA JAYANNA --> + <Key + latin:keySpec="ජ" + latin:moreKeys="ඦ" /> + <!-- U+0DA9: "ඩ" SINHALA LETTER ALPAPRAANA DDAYANNA + U+0DAC: "ඬ" SINHALA LETTER SANYAKA DDAYANNA --> + <Key + latin:keySpec="ඩ" + latin:moreKeys="ඬ" /> + <!-- U+0D89: "ඉ" SINHALA LETTER IYANNA --> + <Key latin:keySpec="ඉ" /> + <!-- U+0DB6: "බ" SINHALA LETTER ALPAPRAANA BAYANNA --> + <Key latin:keySpec="බ" /> + <!-- U+0DB4: "ප" SINHALA LETTER ALPAPRAANA PAYANNA --> + <Key latin:keySpec="ප" /> + <!-- U+0DBD: "ල" SINHALA LETTER DANTAJA LAYANNA --> + <Key latin:keySpec="ල" /> + <!-- U+0D9C: "ග" SINHALA LETTER ALPAPRAANA GAYANNA + U+0D9F: "ඟ" SINHALA LETTER SANYAKA GAYANNA --> + <Key + latin:keySpec="ග" + latin:moreKeys="ඟ" /> + <!-- U+0DF3: "ෳ" SINHALA VOWEL SIGN DIGA GAYANUKITTA --> + <Key latin:keySpec="ෳ" /> + </default> + </switch> +</merge> diff --git a/java/res/xml/rowkeys_south_slavic1.xml b/java/res/xml/rowkeys_south_slavic1.xml index 6117d46f1..064f164e8 100644 --- a/java/res/xml/rowkeys_south_slavic1.xml +++ b/java/res/xml/rowkeys_south_slavic1.xml @@ -23,56 +23,56 @@ > <!-- U+0459: "љ" CYRILLIC SMALL LETTER LJE --> <Key - latin:keyLabel="љ" + latin:keySpec="љ" latin:keyHintLabel="1" latin:additionalMoreKeys="1" /> <!-- U+045A: "њ" CYRILLIC SMALL LETTER NJE --> <Key - latin:keyLabel="њ" + latin:keySpec="њ" latin:keyHintLabel="2" latin:additionalMoreKeys="2" /> <!-- U+0435: "е" CYRILLIC SMALL LETTER IE --> <Key - latin:keyLabel="е" + latin:keySpec="е" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="!text/more_keys_for_cyrillic_ie" /> + latin:moreKeys="!text/morekeys_cyrillic_ie" /> <!-- U+0440: "р" CYRILLIC SMALL LETTER ER --> <Key - latin:keyLabel="р" + latin:keySpec="р" latin:keyHintLabel="4" latin:additionalMoreKeys="4" /> <!-- U+0442: "т" CYRILLIC SMALL LETTER TE --> <Key - latin:keyLabel="т" + latin:keySpec="т" latin:keyHintLabel="5" latin:additionalMoreKeys="5" /> <Key - latin:keyLabel="!text/keylabel_for_south_slavic_row1_6" + latin:keySpec="!text/keyspec_south_slavic_row1_6" latin:keyHintLabel="6" latin:additionalMoreKeys="6" /> <!-- U+0443: "у" CYRILLIC SMALL LETTER U --> <Key - latin:keyLabel="у" + latin:keySpec="у" latin:keyHintLabel="7" latin:additionalMoreKeys="7" /> <!-- U+0438: "и" CYRILLIC SMALL LETTER I --> <Key - latin:keyLabel="и" + latin:keySpec="и" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="!text/more_keys_for_cyrillic_i" /> + latin:moreKeys="!text/morekeys_cyrillic_i" /> <!-- U+043E: "о" CYRILLIC SMALL LETTER O --> <Key - latin:keyLabel="о" + latin:keySpec="о" latin:keyHintLabel="9" latin:additionalMoreKeys="9" /> <!-- U+043F: "п" CYRILLIC SMALL LETTER PE --> <Key - latin:keyLabel="п" + latin:keySpec="п" latin:keyHintLabel="0" latin:additionalMoreKeys="0" /> <!-- U+0448: "ш" CYRILLIC SMALL LETTER SHA --> <Key - latin:keyLabel="ш" /> + latin:keySpec="ш" /> </merge> diff --git a/java/res/xml/rowkeys_south_slavic2.xml b/java/res/xml/rowkeys_south_slavic2.xml index 88e894053..3b98001b2 100644 --- a/java/res/xml/rowkeys_south_slavic2.xml +++ b/java/res/xml/rowkeys_south_slavic2.xml @@ -23,34 +23,34 @@ > <!-- U+0430: "а" CYRILLIC SMALL LETTER A --> <Key - latin:keyLabel="а" /> + latin:keySpec="а" /> <!-- U+0441: "с" CYRILLIC SMALL LETTER ES --> <Key - latin:keyLabel="с" /> + latin:keySpec="с" /> <!-- U+0434: "д" CYRILLIC SMALL LETTER DE --> <Key - latin:keyLabel="д" /> + latin:keySpec="д" /> <!-- U+0444: "ф" CYRILLIC SMALL LETTER EF --> <Key - latin:keyLabel="ф" /> + latin:keySpec="ф" /> <!-- U+0433: "г" CYRILLIC SMALL LETTER GHE --> <Key - latin:keyLabel="г" /> + latin:keySpec="г" /> <!-- U+0445: "х" CYRILLIC SMALL LETTER HA --> <Key - latin:keyLabel="х" /> + latin:keySpec="х" /> <!-- U+0458: "ј" CYRILLIC SMALL LETTER JE --> <Key - latin:keyLabel="ј" /> + latin:keySpec="ј" /> <!-- U+043A: "к" CYRILLIC SMALL LETTER KA --> <Key - latin:keyLabel="к" /> + latin:keySpec="к" /> <!-- U+043B: "л" CYRILLIC SMALL LETTER EL --> <Key - latin:keyLabel="л" /> + latin:keySpec="л" /> <!-- U+0447: "ч" CYRILLIC SMALL LETTER CHE --> <Key - latin:keyLabel="ч" /> + latin:keySpec="ч" /> <Key - latin:keyLabel="!text/keylabel_for_south_slavic_row2_11" /> + latin:keySpec="!text/keyspec_south_slavic_row2_11" /> </merge> diff --git a/java/res/xml/rowkeys_south_slavic3.xml b/java/res/xml/rowkeys_south_slavic3.xml index b01550911..31df9b96e 100644 --- a/java/res/xml/rowkeys_south_slavic3.xml +++ b/java/res/xml/rowkeys_south_slavic3.xml @@ -22,28 +22,28 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="!text/keylabel_for_south_slavic_row3_1" /> + latin:keySpec="!text/keyspec_south_slavic_row3_1" /> <!-- U+045F: "џ" CYRILLIC SMALL LETTER DZHE --> <Key - latin:keyLabel="џ" /> + latin:keySpec="џ" /> <!-- U+0446: "ц" CYRILLIC SMALL LETTER TSE --> <Key - latin:keyLabel="ц" /> + latin:keySpec="ц" /> <!-- U+0432: "в" CYRILLIC SMALL LETTER VE --> <Key - latin:keyLabel="в" /> + latin:keySpec="в" /> <!-- U+0431: "б" CYRILLIC SMALL LETTER BE --> <Key - latin:keyLabel="б" /> + latin:keySpec="б" /> <!-- U+043D: "н" CYRILLIC SMALL LETTER EN --> <Key - latin:keyLabel="н" /> + latin:keySpec="н" /> <!-- U+043C: "м" CYRILLIC SMALL LETTER EM --> <Key - latin:keyLabel="м" /> + latin:keySpec="м" /> <Key - latin:keyLabel="!text/keylabel_for_south_slavic_row3_8" /> + latin:keySpec="!text/keyspec_south_slavic_row3_8" /> <!-- U+0436: "ж" CYRILLIC SMALL LETTER ZHE --> <Key - latin:keyLabel="ж" /> + latin:keySpec="ж" /> </merge> diff --git a/java/res/xml/rowkeys_spanish2.xml b/java/res/xml/rowkeys_spanish2.xml index 335dff33c..5c7f67cdd 100644 --- a/java/res/xml/rowkeys_spanish2.xml +++ b/java/res/xml/rowkeys_spanish2.xml @@ -25,5 +25,5 @@ latin:keyboardLayout="@xml/rowkeys_qwerty2" /> <!-- U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE --> <Key - latin:keyLabel="!text/keylabel_for_spanish_row2_10" /> + latin:keySpec="!text/keyspec_spanish_row2_10" /> </merge> diff --git a/java/res/layout/key_preview_klp.xml b/java/res/xml/rowkeys_swiss1.xml index 160aeb9a9..2b82c81bd 100644 --- a/java/res/layout/key_preview_klp.xml +++ b/java/res/xml/rowkeys_swiss1.xml @@ -18,10 +18,12 @@ */ --> -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/keyboard_key_feedback_klp" - android:minWidth="32dp" - android:gravity="center" -/> +<merge + xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" +> + <include + latin:keyboardLayout="@xml/rowkeys_qwertz1" /> + <Key + latin:keySpec="!text/keyspec_swiss_row1_11" + latin:moreKeys="!text/morekeys_swiss_row1_11" /> +</merge> diff --git a/java/res/xml/rowkeys_swiss2.xml b/java/res/xml/rowkeys_swiss2.xml new file mode 100644 index 000000000..770911179 --- /dev/null +++ b/java/res/xml/rowkeys_swiss2.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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/rowkeys_qwerty2" /> + <Key + latin:keySpec="!text/keyspec_swiss_row2_10" + latin:moreKeys="!text/morekeys_swiss_row2_10" /> + <Key + latin:keySpec="!text/keyspec_swiss_row2_11" + latin:moreKeys="!text/morekeys_swiss_row2_11" /> +</merge> diff --git a/java/res/xml/rowkeys_symbols1.xml b/java/res/xml/rowkeys_symbols1.xml index 6e2f92dd9..daf9087b2 100644 --- a/java/res/xml/rowkeys_symbols1.xml +++ b/java/res/xml/rowkeys_symbols1.xml @@ -22,43 +22,43 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="!text/keylabel_for_symbols_1" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_1" - latin:moreKeys="!text/more_keys_for_symbols_1" /> + latin:keySpec="!text/keyspec_symbols_1" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_1" + latin:moreKeys="!text/morekeys_symbols_1" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_2" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_2" - latin:moreKeys="!text/more_keys_for_symbols_2" /> + latin:keySpec="!text/keyspec_symbols_2" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_2" + latin:moreKeys="!text/morekeys_symbols_2" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_3" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_3" - latin:moreKeys="!text/more_keys_for_symbols_3" /> + latin:keySpec="!text/keyspec_symbols_3" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_3" + latin:moreKeys="!text/morekeys_symbols_3" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_4" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_4" - latin:moreKeys="!text/more_keys_for_symbols_4" /> + latin:keySpec="!text/keyspec_symbols_4" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_4" + latin:moreKeys="!text/morekeys_symbols_4" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_5" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_5" - latin:moreKeys="!text/more_keys_for_symbols_5" /> + latin:keySpec="!text/keyspec_symbols_5" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_5" + latin:moreKeys="!text/morekeys_symbols_5" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_6" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_6" - latin:moreKeys="!text/more_keys_for_symbols_6" /> + latin:keySpec="!text/keyspec_symbols_6" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_6" + latin:moreKeys="!text/morekeys_symbols_6" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_7" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_7" - latin:moreKeys="!text/more_keys_for_symbols_7" /> + latin:keySpec="!text/keyspec_symbols_7" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_7" + latin:moreKeys="!text/morekeys_symbols_7" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_8" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_8" - latin:moreKeys="!text/more_keys_for_symbols_8" /> + latin:keySpec="!text/keyspec_symbols_8" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_8" + latin:moreKeys="!text/morekeys_symbols_8" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_9" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_9" - latin:moreKeys="!text/more_keys_for_symbols_9" /> + latin:keySpec="!text/keyspec_symbols_9" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_9" + latin:moreKeys="!text/morekeys_symbols_9" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_0" - latin:additionalMoreKeys="!text/additional_more_keys_for_symbols_0" - latin:moreKeys="!text/more_keys_for_symbols_0" /> + latin:keySpec="!text/keyspec_symbols_0" + latin:additionalMoreKeys="!text/additional_morekeys_symbols_0" + latin:moreKeys="!text/morekeys_symbols_0" /> </merge> diff --git a/java/res/xml/rowkeys_symbols2.xml b/java/res/xml/rowkeys_symbols2.xml index 76cbf6259..811915825 100644 --- a/java/res/xml/rowkeys_symbols2.xml +++ b/java/res/xml/rowkeys_symbols2.xml @@ -28,37 +28,37 @@ <!-- U+066C: "٬" ARABIC THOUSANDS SEPARATOR U+066B: "٫" ARABIC DECIMAL SEPARATOR --> <Key - latin:keyLabel="٬" + latin:keySpec="٬" latin:keyHintLabel="\@" latin:moreKeys="\@" /> <Key - latin:keyLabel="٫" + latin:keySpec="٫" latin:keyHintLabel="\#" latin:moreKeys="\#" /> </case> <default> <Key - latin:keyLabel="\@" /> + latin:keySpec="\@" /> <Key - latin:keyLabel="\#" /> + latin:keySpec="\#" /> </default> </switch> <Key latin:keyStyle="currencyKeyStyle" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_percent" - latin:moreKeys="!text/more_keys_for_symbols_percent" /> + latin:keySpec="!text/keyspec_symbols_percent" + latin:moreKeys="!text/morekeys_symbols_percent" /> <Key - latin:keyLabel="&" /> + latin:keySpec="&" /> <!-- U+2013: "–" EN DASH U+2014: "—" EM DASH U+00B7: "·" MIDDLE DOT --> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:moreKeys="_,–,—,·" /> <Key - latin:keyLabel="+" - latin:moreKeys="!text/more_keys_for_plus" /> + latin:keySpec="+" + latin:moreKeys="!text/morekeys_plus" /> <include latin:keyboardLayout="@xml/keys_parentheses" /> </merge> diff --git a/java/res/xml/rowkeys_symbols3.xml b/java/res/xml/rowkeys_symbols3.xml index 074078cb6..8093081f8 100644 --- a/java/res/xml/rowkeys_symbols3.xml +++ b/java/res/xml/rowkeys_symbols3.xml @@ -22,41 +22,37 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="*" - latin:moreKeys="!text/more_keys_for_star" /> + latin:keySpec="*" + latin:moreKeys="!text/morekeys_star" /> <switch> <case latin:languageCode="fa" > - <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK --> <Key - latin:keyLabel="«" - latin:code="0x00BB" - latin:moreKeys="!text/more_keys_for_double_quote" /> + latin:keySpec="!text/keyspec_left_double_angle_quote" + latin:moreKeys="!text/morekeys_double_quote" /> <Key - latin:keyLabel="»" - latin:code="0x00AB" - latin:moreKeys="!text/more_keys_for_single_quote" /> + latin:keySpec="!text/keyspec_right_double_angle_quote" + latin:moreKeys="!text/morekeys_single_quote" /> </case> <default> <Key - latin:keyLabel=""" - latin:moreKeys="!text/more_keys_for_double_quote" /> + latin:keySpec=""" + latin:moreKeys="!text/morekeys_double_quote" /> <Key - latin:keyLabel="\'" - latin:moreKeys="!text/more_keys_for_single_quote" /> + latin:keySpec="\'" + latin:moreKeys="!text/morekeys_single_quote" /> </default> </switch> <Key - latin:keyLabel=":" /> + latin:keySpec=":" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_semicolon" - latin:moreKeys="!text/more_keys_for_symbols_semicolon" /> + latin:keySpec="!text/keyspec_symbols_semicolon" + latin:moreKeys="!text/morekeys_symbols_semicolon" /> <Key - latin:keyLabel="!" - latin:moreKeys="!text/more_keys_for_symbols_exclamation" /> + latin:keySpec="!" + latin:moreKeys="!text/morekeys_exclamation" /> <Key - latin:keyLabel="!text/keylabel_for_symbols_question" - latin:moreKeys="!text/more_keys_for_symbols_question" /> + latin:keySpec="!text/keyspec_symbols_question" + latin:moreKeys="!text/morekeys_question" /> </merge> diff --git a/java/res/xml/rowkeys_symbols_shift1.xml b/java/res/xml/rowkeys_symbols_shift1.xml index 6013493e5..f232a7de2 100644 --- a/java/res/xml/rowkeys_symbols_shift1.xml +++ b/java/res/xml/rowkeys_symbols_shift1.xml @@ -22,35 +22,35 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="~" /> + latin:keySpec="~" /> <Key - latin:keyLabel="`" /> + latin:keySpec="`" /> <Key - latin:keyLabel="|" /> + latin:keySpec="|" /> <!-- U+2022: "•" BULLET --> <Key - latin:keyLabel="•" - latin:moreKeys="!text/more_keys_for_bullet" /> + latin:keySpec="•" + latin:moreKeys="!text/morekeys_bullet" /> <!-- U+221A: "√" SQUARE ROOT --> <Key - latin:keyLabel="√" /> - <!-- U+03A0: "Π" GREEK CAPITAL LETTER PI - U+03C0: "π" GREEK SMALL LETTER PI --> + latin:keySpec="√" /> + <!-- U+03C0: "π" GREEK SMALL LETTER PI + U+03A0: "Π" GREEK CAPITAL LETTER PI --> <Key - latin:keyLabel="Π" - latin:moreKeys="π" /> + latin:keySpec="π" + latin:moreKeys="Π" /> <!-- U+00F7: "÷" DIVISION SIGN --> <Key - latin:keyLabel="÷" /> + latin:keySpec="÷" /> <!-- U+00D7: "×" MULTIPLICATION SIGN --> <Key - latin:keyLabel="×" /> + latin:keySpec="×" /> <!-- U+00B6: "¶" PILCROW SIGN U+00A7: "§" SECTION SIGN --> <Key - latin:keyLabel="¶" + latin:keySpec="¶" latin:moreKeys="§" /> <!-- U+2206: "∆" INCREMENT --> <Key - latin:keyLabel="∆" /> + latin:keySpec="∆" /> </merge> diff --git a/java/res/xml/rowkeys_symbols_shift2.xml b/java/res/xml/rowkeys_symbols_shift2.xml index 36f92143f..39a58030b 100644 --- a/java/res/xml/rowkeys_symbols_shift2.xml +++ b/java/res/xml/rowkeys_symbols_shift2.xml @@ -34,19 +34,19 @@ U+2190: "←" LEFTWARDS ARROW U+2192: "→" RIGHTWARDS ARROW --> <Key - latin:keyLabel="^" + latin:keySpec="^" latin:moreKeys="↑,↓,←,→" /> <!-- U+00B0: "°" DEGREE SIGN U+2032: "′" PRIME U+2033: "″" DOUBLE PRIME --> <Key - latin:keyLabel="°" + latin:keySpec="°" latin:moreKeys="′,″" /> <!-- U+2260: "≠" NOT EQUAL TO U+2248: "≈" ALMOST EQUAL TO U+221E: "∞" INFINITY --> <Key - latin:keyLabel="=" + latin:keySpec="=" latin:moreKeys="≠,≈,∞" /> <include latin:keyboardLayout="@xml/keys_curly_brackets" /> diff --git a/java/res/xml/rowkeys_symbols_shift3.xml b/java/res/xml/rowkeys_symbols_shift3.xml index 5fe1c7450..92ff97bb0 100644 --- a/java/res/xml/rowkeys_symbols_shift3.xml +++ b/java/res/xml/rowkeys_symbols_shift3.xml @@ -22,19 +22,19 @@ xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" > <Key - latin:keyLabel="\\" /> + latin:keySpec="\\" /> <!-- U+00A9: "©" COPYRIGHT SIGN --> <Key - latin:keyLabel="©" /> + latin:keySpec="©" /> <!-- U+00AE: "®" REGISTERED SIGN --> <Key - latin:keyLabel="®" /> + latin:keySpec="®" /> <!-- U+2122: "™" TRADE MARK SIGN --> <Key - latin:keyLabel="™" /> + latin:keySpec="™" /> <!-- U+2105: "℅" CARE OF --> <Key - latin:keyLabel="℅" /> + latin:keySpec="℅" /> <include latin:keyboardLayout="@xml/keys_square_brackets" /> </merge> diff --git a/java/res/xml/rowkeys_thai1.xml b/java/res/xml/rowkeys_thai1.xml index cd536656f..864bca876 100644 --- a/java/res/xml/rowkeys_thai1.xml +++ b/java/res/xml/rowkeys_thai1.xml @@ -18,153 +18,120 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <Key - latin:keyLabel="+" /> + latin:keySpec="+" + latin:keyLabelFlags="fontDefault" /> <!-- U+0E51: "๑" THAI DIGIT ONE --> - <Key - latin:keyLabel="๑" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๑" /> <!-- U+0E52: "๒" THAI DIGIT TWO --> - <Key - latin:keyLabel="๒" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๒" /> <!-- U+0E53: "๓" THAI DIGIT THREE --> - <Key - latin:keyLabel="๓" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๓" /> <!-- U+0E54: "๔" THAI DIGIT FOUR --> - <Key - latin:keyLabel="๔" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๔" /> <!-- U+0020: " " SPACE U+0E39: " ู" THAI CHARACTER SARA UU --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ู" - latin:code="0x0E39" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ู|ู" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT --> - <Key - latin:keyLabel="฿" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="฿" /> <!-- U+0E55: "๕" THAI DIGIT FIVE --> - <Key - latin:keyLabel="๕" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๕" /> <!-- U+0E56: "๖" THAI DIGIT SIX --> - <Key - latin:keyLabel="๖" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๖" /> <!-- U+0E57: "๗" THAI DIGIT SEVEN --> - <Key - latin:keyLabel="๗" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๗" /> <!-- U+0E58: "๘" THAI DIGIT EIGHT --> - <Key - latin:keyLabel="๘" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๘" /> <!-- U+0E59: "๙" THAI DIGIT NINE --> - <Key - latin:keyLabel="๙" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="๙" /> </case> <default> <!-- U+0E45: "ๅ" THAI CHARACTER LAKKHANGYAO --> - <Key - latin:keyLabel="ๅ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ๅ" /> <!-- U+0E51: "๑" THAI DIGIT ONE --> <Key + latin:keySpec="/" latin:keyHintLabel="1" latin:additionalMoreKeys="1" latin:moreKeys="๑" - latin:keyLabel="/" /> + latin:keyLabelFlags="fontDefault" /> <!-- U+0E52: "๒" THAI DIGIT TWO --> <Key + latin:keySpec="_" latin:keyHintLabel="2" latin:additionalMoreKeys="2" latin:moreKeys="๒" - latin:keyLabel="_" /> + latin:keyLabelFlags="fontDefault" /> <!-- U+0E20: "ภ" THAI CHARACTER PHO SAMPHAO U+0E53: "๓" THAI DIGIT THREE --> <Key - latin:keyLabel="ภ" + latin:keySpec="ภ" latin:keyHintLabel="3" latin:additionalMoreKeys="3" - latin:moreKeys="๓" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๓" /> <!-- U+0E16: "ถ" THAI CHARACTER THO THUNG U+0E54: "๔" THAI DIGIT FOUR --> <Key - latin:keyLabel="ถ" + latin:keySpec="ถ" latin:keyHintLabel="4" latin:additionalMoreKeys="4" - latin:moreKeys="๔" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๔" /> <!-- U+0020: " " SPACE U+0E38: " ุ" THAI CHARACTER SARA U --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ุ" - latin:code="0x0E38" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ุ|ุ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E36: " ึ" THAI CHARACTER SARA UE --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ึ" - latin:code="0x0E36" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ึ|ึ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E04: "ค" THAI CHARACTER KHO KHWAI U+0E55: "๕" THAI DIGIT FIVE --> <Key - latin:keyLabel="ค" + latin:keySpec="ค" latin:keyHintLabel="5" latin:additionalMoreKeys="5" - latin:moreKeys="๕" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๕" /> <!-- U+0E15: "ต" THAI CHARACTER TO TAO U+0E56: "๖" THAI DIGIT SIX --> <Key - latin:keyLabel="ต" + latin:keySpec="ต" latin:keyHintLabel="6" latin:additionalMoreKeys="6" - latin:moreKeys="๖" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๖" /> <!-- U+0E08: "จ" THAI CHARACTER CHO CHAN U+0E57: "๗" THAI DIGIT SEVEN --> <Key - latin:keyLabel="จ" + latin:keySpec="จ" latin:keyHintLabel="7" latin:additionalMoreKeys="7" - latin:moreKeys="๗" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๗" /> <!-- U+0E02: "ข" THAI CHARACTER KHO KHAI U+0E58: "๘" THAI DIGIT EIGHT --> <Key - latin:keyLabel="ข" + latin:keySpec="ข" latin:keyHintLabel="8" latin:additionalMoreKeys="8" - latin:moreKeys="๘" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๘" /> <!-- U+0E0A: "ช" THAI CHARACTER CHO CHANG U+0E59: "๙" THAI DIGIT NINE --> <Key - latin:keyLabel="ช" + latin:keySpec="ช" latin:keyHintLabel="9" latin:additionalMoreKeys="9" - latin:moreKeys="๙" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๙" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_thai2.xml b/java/res/xml/rowkeys_thai2.xml index 4bcbbbf8d..f43d31fff 100644 --- a/java/res/xml/rowkeys_thai2.xml +++ b/java/res/xml/rowkeys_thai2.xml @@ -18,127 +18,86 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0E50: "๐" THAI DIGIT ZERO --> + <Key latin:keySpec="๐" /> <Key - latin:keyLabel="๐" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel=""" /> + latin:keySpec=""" + latin:keyLabelFlags="fontDefault" /> <!-- U+0E0E: "ฎ" THAI CHARACTER DO CHADA --> - <Key - latin:keyLabel="ฎ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฎ" /> <!-- U+0E11: "ฑ" THAI CHARACTER THO NANGMONTHO --> - <Key - latin:keyLabel="ฑ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฑ" /> <!-- U+0E18: "ธ" THAI CHARACTER THO THONG --> - <Key - latin:keyLabel="ธ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ธ" /> <!-- U+0020: " " SPACE U+0E4D: " ํ" THAI CHARACTER THANTHAKHAT --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ํ" - latin:code="0x0E4D" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ํ|ํ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E4A: " ๊" THAI CHARACTER MAI TRI --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ๊" - latin:code="0x0E4A" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ๊|๊" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E13: "ณ" THAI CHARACTER NO NEN --> - <Key - latin:keyLabel="ณ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ณ" /> <!-- U+0E2F: "ฯ" THAI CHARACTER PAIYANNOI --> - <Key - latin:keyLabel="ฯ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฯ" /> <!-- U+0E0D: "ญ" THAI CHARACTER YO YING --> - <Key - latin:keyLabel="ญ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ญ" /> <!-- U+0E10: "ฐ" THAI CHARACTER THO THAN --> + <Key latin:keySpec="ฐ" /> <Key - latin:keyLabel="ฐ" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel="," /> + latin:keySpec="," + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+0E46: "ๆ" THAI CHARACTER MAIYAMOK U+0E50: "๐" THAI DIGIT ZERO --> <Key - latin:keyLabel="ๆ" + latin:keySpec="ๆ" latin:keyHintLabel="0" latin:additionalMoreKeys="0" - latin:moreKeys="๐" - latin:keyLabelFlags="fontNormal" /> + latin:moreKeys="๐" /> <!-- U+0E44: "ไ" THAI CHARACTER SARA AI MAIMALAI --> - <Key - latin:keyLabel="ไ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ไ" /> <!-- U+0E33: "ำ" THAI CHARACTER SARA AM --> - <Key - latin:keyLabel="ำ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ำ" /> <!-- U+0E1E: "พ" THAI CHARACTER PHO PHAN --> - <Key - latin:keyLabel="พ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="พ" /> <!-- U+0E30: "ะ" THAI CHARACTER SARA A --> - <Key - latin:keyLabel="ะ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ะ" /> <!-- U+0020: " " SPACE U+0E31: " ั" THAI CHARACTER MAI HAN-AKAT --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ั" - latin:code="0x0E31" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ั|ั" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E35: " ี" HAI CHARACTER SARA II --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ี" - latin:code="0x0E35" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ี|ี" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E23: "ร" THAI CHARACTER RO RUA --> - <Key - latin:keyLabel="ร" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ร" /> <!-- U+0E19: "น" THAI CHARACTER NO NU --> - <Key - latin:keyLabel="น" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="น" /> <!-- U+0E22: "ย" THAI CHARACTER YO YAK --> - <Key - latin:keyLabel="ย" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ย" /> <!-- U+0E1A: "บ" THAI CHARACTER BO BAIMAI --> - <Key - latin:keyLabel="บ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="บ" /> <!-- U+0E25: "ล" THAI CHARACTER LO LING --> - <Key - latin:keyLabel="ล" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ล" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_thai3.xml b/java/res/xml/rowkeys_thai3.xml index 7b6e6372e..03959b9aa 100644 --- a/java/res/xml/rowkeys_thai3.xml +++ b/java/res/xml/rowkeys_thai3.xml @@ -18,117 +18,76 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <!-- U+0E24: "ฤ" THAI CHARACTER RU --> - <Key - latin:keyLabel="ฤ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฤ" /> <!-- U+0E06: "ฆ" THAI CHARACTER KHO RAKHANG --> - <Key - latin:keyLabel="ฆ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฆ" /> <!-- U+0E0F: "ฏ" THAI CHARACTER TO PATAK --> - <Key - latin:keyLabel="ฏ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฏ" /> <!-- U+0E42: "โ" THAI CHARACTER SARA O --> - <Key - latin:keyLabel="โ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="โ" /> <!-- U+0E0C: "ฌ" THAI CHARACTER CHO CHOE --> - <Key - latin:keyLabel="ฌ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฌ" /> <!-- U+0020: " " SPACE U+0E47: " ็" THAI CHARACTER MAITAIKHU --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ็" - latin:code="0x0E47" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ็|็" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E4B: " ๋" THAI CHARACTER MAI CHATTAWA --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ๋" - latin:code="0x0E4B" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ๋|๋" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E29: "ษ" THAI CHARACTER SO RUSI --> - <Key - latin:keyLabel="ษ" - latin:keyLabelFlags="fontNormal" /> - <!-- U+0E28: "ศ" THAI CHARACTER SO SALA --> - <Key - latin:keyLabel="ศ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ษ" /> + <!-- U+0E28: "ศ" THAI CHARACTER SO SALA --> + <Key latin:keySpec="ศ" /> <!-- U+0E0B: "ซ" THAI CHARACTER SO SO --> + <Key latin:keySpec="ซ" /> <Key - latin:keyLabel="ซ" - latin:keyLabelFlags="fontNormal" /> - <Key - latin:keyLabel="." /> + latin:keySpec="." + latin:keyLabelFlags="fontDefault" /> </case> <default> <!-- U+0E1F: "ฟ" THAI CHARACTER FO FAN --> - <Key - latin:keyLabel="ฟ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฟ" /> <!-- U+0E2B: "ห" THAI CHARACTER HO HIP --> - <Key - latin:keyLabel="ห" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ห" /> <!-- U+0E01: "ก" THAI CHARACTER KO KAI --> - <Key - latin:keyLabel="ก" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ก" /> <!-- U+0E14: "ด" THAI CHARACTER DO DEK --> - <Key - latin:keyLabel="ด" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ด" /> <!-- U+0E40: "เ" THAI CHARACTER SARA E --> - <Key - latin:keyLabel="เ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="เ" /> <!-- U+0020: " " SPACE U+0E49: " ้" THAI CHARACTER MAI THO --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ้" - latin:code="0x0E49" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ้|้" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E48: " ่" THAI CHARACTER MAI EK --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ่" - latin:code="0x0E48" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ่|่" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E32: "า" THAI CHARACTER SARA AA --> - <Key - latin:keyLabel="า" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="า" /> <!-- U+0E2A: "ส" THAI CHARACTER SO SUA --> - <Key - latin:keyLabel="ส" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ส" /> <!-- U+0E27: "ว" THAI CHARACTER WO WAEN --> - <Key - latin:keyLabel="ว" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ว" /> <!-- U+0E07: "ง" THAI CHARACTER NGO NGU --> - <Key - latin:keyLabel="ง" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ง" /> </default> </switch> </merge> diff --git a/java/res/xml/rowkeys_thai4.xml b/java/res/xml/rowkeys_thai4.xml index 8a784242c..db665bed5 100644 --- a/java/res/xml/rowkeys_thai4.xml +++ b/java/res/xml/rowkeys_thai4.xml @@ -18,105 +18,74 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> <switch> - <case - latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" - > + <case latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted"> <Key - latin:keyLabel="(" /> + latin:keySpec="(" + latin:keyLabelFlags="fontDefault" /> <Key - latin:keyLabel=")" /> + latin:keySpec=")" + latin:keyLabelFlags="fontDefault" /> <!-- U+0E09: "ฉ" THAI CHARACTER CHO CHING --> - <Key - latin:keyLabel="ฉ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฉ" /> <!-- U+0E2E: "ฮ" THAI CHARACTER HO NOKHUK --> - <Key - latin:keyLabel="ฮ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฮ" /> <!-- U+0020: " " SPACE U+0E3A: " ฺ" THAI CHARACTER PHINTHU --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ฺ" - latin:code="0x0E3A" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ฺ|ฺ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E4C: " ์" THAI CHARACTER THANTHAKHAT --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ์" - latin:code="0x0E4C" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ์|์" + latin:keyLabelFlags="followKeyLetterRatio" /> <Key - latin:keyLabel="\?" /> + latin:keySpec="\?" + latin:keyLabelFlags="fontDefault" /> <!-- U+0E12: "ฒ" THAI CHARACTER THO PHUTHAO --> - <Key - latin:keyLabel="ฒ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฒ" /> <!-- U+0E2C: "ฬ" THAI CHARACTER LO CHULA --> - <Key - latin:keyLabel="ฬ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฬ" /> <!-- U+0E26: "ฦ" THAI CHARACTER LU --> - <Key - latin:keyLabel="ฦ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฦ" /> </case> <default> <!-- U+0E1C: "ผ" THAI CHARACTER PHO PHUNG --> - <Key - latin:keyLabel="ผ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ผ" /> <!-- U+0E1B: "ป" THAI CHARACTER PO PLA --> - <Key - latin:keyLabel="ป" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ป" /> <!-- U+0E41: "แ" THAI CHARACTER SARA AE --> - <Key - latin:keyLabel="แ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="แ" /> <!-- U+0E2D: "อ" THAI CHARACTER O ANG --> - <Key - latin:keyLabel="อ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="อ" /> <!-- U+0020: " " SPACE U+0E34: " ิ" THAI CHARACTER SARA I --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ิ" - latin:code="0x0E34" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ิ|ิ" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0020: " " SPACE U+0E37: " ื" THAI CHARACTER SARA UEE --> <!-- Note: The space character is needed as a preceding letter to draw some Thai composing characters correctly. --> <Key - latin:keyLabel=" ื" - latin:code="0x0E37" - latin:keyLabelFlags="fontNormal|followKeyLetterRatio" /> + latin:keySpec=" ื|ื" + latin:keyLabelFlags="followKeyLetterRatio" /> <!-- U+0E17: "ท" THAI CHARACTER THO THAHAN --> - <Key - latin:keyLabel="ท" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ท" /> <!-- U+0E21: "ม" THAI CHARACTER MO MA --> - <Key - latin:keyLabel="ม" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ม" /> <!-- U+0E43: "ใ" THAI CHARACTER SARA AI MAIMUAN --> - <Key - latin:keyLabel="ใ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ใ" /> <!-- U+0E1D: "ฝ" THAI CHARACTER FO FA --> - <Key - latin:keyLabel="ฝ" - latin:keyLabelFlags="fontNormal" /> + <Key latin:keySpec="ฝ" /> </default> </switch> </merge> diff --git a/java/res/xml/rows_arabic.xml b/java/res/xml/rows_arabic.xml index 798c23e81..3f765f347 100644 --- a/java/res/xml/rows_arabic.xml +++ b/java/res/xml/rows_arabic.xml @@ -18,32 +18,28 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic1" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic1" /> </Row> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic2" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic2" /> </Row> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_arabic3" /> + <include latin:keyboardLayout="@xml/rowkeys_arabic3" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_armenian_phonetic.xml b/java/res/xml/rows_armenian_phonetic.xml index ea8870e1a..198436ca1 100644 --- a/java/res/xml/rows_armenian_phonetic.xml +++ b/java/res/xml/rows_armenian_phonetic.xml @@ -18,47 +18,40 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> - <include - latin:keyboardLayout="@xml/key_styles_currency" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> + <include latin:keyboardLayout="@xml/key_styles_currency" /> <Row latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic1" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic1" /> </Row> <Row latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic2" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic2" /> </Row> <Row latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic3" /> - <include - latin:keyboardLayout="@xml/key_armenian_xeh" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic3" /> + <include latin:keyboardLayout="@xml/key_armenian_xeh" /> </Row> <Row latin:keyWidth="9.8000%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.8%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_armenian_phonetic4" /> - <include - latin:keyboardLayout="@xml/key_armenian_sha" /> + <include latin:keyboardLayout="@xml/rowkeys_armenian_phonetic4" /> + <include latin:keyboardLayout="@xml/key_armenian_sha" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_bengali.xml b/java/res/xml/rows_bengali.xml new file mode 100644 index 000000000..4e4223b03 --- /dev/null +++ b/java/res/xml/rows_bengali.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali1" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali2" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_bengali3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml/rows_colemak.xml b/java/res/xml/rows_colemak.xml index d74c2c9ec..ec553c244 100644 --- a/java/res/xml/rows_colemak.xml +++ b/java/res/xml/rows_colemak.xml @@ -28,8 +28,6 @@ > <include latin:keyboardLayout="@xml/rowkeys_colemak1" /> - <include - latin:keyboardLayout="@xml/key_colemak_colon" /> </Row> <Row latin:keyWidth="10%p" diff --git a/java/res/xml/rows_farsi.xml b/java/res/xml/rows_farsi.xml index c74614fcf..b78048c9d 100644 --- a/java/res/xml/rows_farsi.xml +++ b/java/res/xml/rows_farsi.xml @@ -18,32 +18,28 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_farsi1" /> + <include latin:keyboardLayout="@xml/rowkeys_farsi1" /> </Row> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_farsi2" /> + <include latin:keyboardLayout="@xml/rowkeys_farsi2" /> </Row> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_farsi3" /> + <include latin:keyboardLayout="@xml/rowkeys_farsi3" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_greek.xml b/java/res/xml/rows_greek.xml index ca6d24005..e00b927a0 100644 --- a/java/res/xml/rows_greek.xml +++ b/java/res/xml/rows_greek.xml @@ -27,8 +27,6 @@ latin:keyWidth="10%p" > <include - latin:keyboardLayout="@xml/key_greek_semicolon" /> - <include latin:keyboardLayout="@xml/rowkeys_greek1" /> </Row> <Row diff --git a/java/res/xml/rows_hindi.xml b/java/res/xml/rows_hindi.xml index 5c631ebff..da869b144 100644 --- a/java/res/xml/rows_hindi.xml +++ b/java/res/xml/rows_hindi.xml @@ -18,35 +18,31 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_hindi1" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi1" /> </Row> <Row - latin:keyWidth="9.091%p" + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_hindi2" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi2" /> </Row> <Row latin:keyWidth="8.711%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.8%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_hindi3" /> + <include latin:keyboardLayout="@xml/rowkeys_hindi3" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_hindi_compact.xml b/java/res/xml/rows_hindi_compact.xml new file mode 100644 index 000000000..d21fada1c --- /dev/null +++ b/java/res/xml/rows_hindi_compact.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact1" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact2" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_hindi_compact3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml/rows_khmer.xml b/java/res/xml/rows_khmer.xml index e3993871b..69334f33e 100644 --- a/java/res/xml/rows_khmer.xml +++ b/java/res/xml/rows_khmer.xml @@ -18,39 +18,33 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer1" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer1" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer2" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer2" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <include - latin:keyboardLayout="@xml/rowkeys_khmer3" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer3" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal|autoXScale" > - <Key - latin:keyStyle="shiftKeyStyle" /> - <include - latin:keyboardLayout="@xml/rowkeys_khmer4" /> - <Key - latin:keyStyle="deleteKeyStyle" /> + <Key latin:keyStyle="shiftKeyStyle" /> + <include latin:keyboardLayout="@xml/rowkeys_khmer4" /> + <Key latin:keyStyle="deleteKeyStyle" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_lao.xml b/java/res/xml/rows_lao.xml index 321f4112a..b3fbf56c5 100644 --- a/java/res/xml/rows_lao.xml +++ b/java/res/xml/rows_lao.xml @@ -18,39 +18,33 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao1" /> + <include latin:keyboardLayout="@xml/rowkeys_lao1" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao2" /> + <include latin:keyboardLayout="@xml/rowkeys_lao2" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_lao3" /> + <include latin:keyboardLayout="@xml/rowkeys_lao3" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <Key - latin:keyStyle="shiftKeyStyle" /> - <include - latin:keyboardLayout="@xml/rowkeys_lao4" /> - <Key - latin:keyStyle="deleteKeyStyle" /> + <Key latin:keyStyle="shiftKeyStyle" /> + <include latin:keyboardLayout="@xml/rowkeys_lao4" /> + <Key latin:keyStyle="deleteKeyStyle" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_marathi.xml b/java/res/xml/rows_marathi.xml new file mode 100644 index 000000000..ff11adb75 --- /dev/null +++ b/java/res/xml/rows_marathi.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi1" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi2" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" + > + <include latin:keyboardLayout="@xml/rowkeys_marathi3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge>
\ No newline at end of file diff --git a/java/res/xml/rows_myanmar.xml b/java/res/xml/rows_myanmar.xml new file mode 100644 index 000000000..54538a9b9 --- /dev/null +++ b/java/res/xml/rows_myanmar.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar1" /> + </Row> + <Row + latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar2" /> + </Row> + <Row + latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_myanmar3" /> + </Row> + <Row + latin:keyWidth="10.0%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <Key latin:keyStyle="shiftKeyStyle" /> + <include latin:keyboardLayout="@xml/rowkeys_myanmar4" /> + <Key latin:keyStyle="deleteKeyStyle" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge>
\ No newline at end of file diff --git a/java/res/xml/rows_nepali_romanized.xml b/java/res/xml/rows_nepali_romanized.xml index 6df09c830..daca3ee86 100644 --- a/java/res/xml/rows_nepali_romanized.xml +++ b/java/res/xml/rows_nepali_romanized.xml @@ -18,35 +18,31 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized1" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized1" /> </Row> <Row - latin:keyWidth="9.091%p" + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized2" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized2" /> </Row> <Row latin:keyWidth="8.711%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.8%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_romanized3" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_romanized3" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_nepali_traditional.xml b/java/res/xml/rows_nepali_traditional.xml index 7789135ae..edcc73a20 100644 --- a/java/res/xml/rows_nepali_traditional.xml +++ b/java/res/xml/rows_nepali_traditional.xml @@ -18,39 +18,33 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> - <include - latin:keyboardLayout="@xml/key_styles_currency" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> + <include latin:keyboardLayout="@xml/key_styles_currency" /> <Row latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional1" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional1" /> </Row> <Row - latin:keyWidth="9.091%p" + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional2" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional2" /> </Row> <Row latin:keyWidth="8.711%p" + latin:keyLabelFlags="fontNormal" > <Key latin:keyStyle="shiftKeyStyle" latin:keyWidth="10.8%p" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_left6" /> - <include - latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_right3" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_left6" /> + <include latin:keyboardLayout="@xml/rowkeys_nepali_traditional3_right3" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/rows_number_normal.xml b/java/res/xml/rows_number_normal.xml index 291018a14..d8d15080e 100644 --- a/java/res/xml/rows_number_normal.xml +++ b/java/res/xml/rows_number_normal.xml @@ -23,16 +23,16 @@ > <Row> <Key - latin:keyLabel="1" + latin:keySpec="1" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="2" + latin:keySpec="2" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="3" + latin:keySpec="3" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:moreKeys="+" latin:keyLabelFlags="hasPopupHint" latin:keyStyle="numFunctionalKeyStyle" @@ -40,20 +40,20 @@ </Row> <Row> <Key - latin:keyLabel="4" + latin:keySpec="4" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="5" + latin:keySpec="5" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="6" + latin:keySpec="6" latin:keyStyle="numKeyStyle" /> <switch> <case latin:mode="date" > <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numFunctionalKeyStyle" latin:keyWidth="fillRight" /> </case> @@ -61,15 +61,15 @@ latin:mode="time|datetime" > <Key - latin:keyLabel="." + latin:keySpec="." latin:keyLabelFlags="hasPopupHint" - latin:moreKeys="!text/more_keys_for_am_pm" + latin:moreKeys="!text/morekeys_am_pm" latin:keyStyle="numFunctionalKeyStyle" latin:keyWidth="fillRight" /> </case> <default> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyStyle="numFunctionalKeyStyle" latin:keyWidth="fillRight" /> </default> @@ -77,56 +77,54 @@ </Row> <Row> <Key - latin:keyLabel="7" + latin:keySpec="7" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="8" + latin:keySpec="8" latin:keyStyle="numKeyStyle"/> <Key - latin:keyLabel="9" + latin:keySpec="9" latin:keyStyle="numKeyStyle" /> <Key latin:keyStyle="deleteKeyStyle" latin:keyWidth="fillRight" /> </Row> <Row> - <Key - latin:keyStyle="numSpaceKeyStyle" /> - <Key - latin:keyLabel="0" - latin:keyStyle="numKeyStyle" /> <switch> <case latin:mode="date" > <Key - latin:keyLabel="/" + latin:keySpec="/" latin:keyStyle="numKeyStyle" /> </case> <case latin:mode="time" > <Key - latin:keyLabel=":" + latin:keySpec=":" latin:keyStyle="numKeyStyle" /> </case> <case latin:mode="datetime" > - <!-- U+002F: "/" SOLIDUS --> <Key - latin:code="0x002F" - latin:keyLabel="/ :" + latin:keySpec="/ :|/" latin:moreKeys="!noPanelAutoMoreKey!,:" latin:keyStyle="numKeyStyle" /> </case> <default> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numKeyStyle" /> </default> </switch> <Key + latin:keySpec="0" + latin:keyStyle="numKeyStyle" /> + <Key + latin:keyStyle="numSpaceKeyStyle" /> + <Key latin:keyStyle="enterKeyStyle" latin:keyWidth="fillRight" /> </Row> diff --git a/java/res/xml/rows_pcqwerty.xml b/java/res/xml/rows_pcqwerty.xml index 884698963..a5ed74518 100644 --- a/java/res/xml/rows_pcqwerty.xml +++ b/java/res/xml/rows_pcqwerty.xml @@ -26,19 +26,8 @@ <Row latin:keyWidth="7.692%p" > - <switch> - <case - latin:keyboardLayoutSetElement="alphabet|alphabetAutomaticShifted" - > - <include - latin:keyboardLayout="@xml/rowkeys_pcqwerty1" /> - </case> - <!-- keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLocked|alphabetShiftLockShifted" --> - <default> - <include - latin:keyboardLayout="@xml/rowkeys_pcqwerty1_shift" /> - </default> - </switch> + <include + latin:keyboardLayout="@xml/rowkeys_pcqwerty1" /> </Row> <Row latin:keyWidth="7.692%p" diff --git a/java/res/xml/rows_phone.xml b/java/res/xml/rows_phone.xml index d8dcfbd62..03e45419a 100644 --- a/java/res/xml/rows_phone.xml +++ b/java/res/xml/rows_phone.xml @@ -33,7 +33,7 @@ <Key latin:keyStyle="num3KeyStyle" /> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:moreKeys="+" latin:keyLabelFlags="hasPopupHint" latin:keyStyle="numFunctionalKeyStyle" @@ -47,7 +47,7 @@ <Key latin:keyStyle="num6KeyStyle" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numFunctionalKeyStyle" latin:keyWidth="fillRight" /> </Row> @@ -68,8 +68,7 @@ <!-- U+0030: "0" DIGIT ZERO --> <Key latin:keyStyle="num0KeyStyle" - latin:code="0x0030" - latin:keyLabel="0 +" + latin:keySpec="0 +|0" latin:moreKeys="!noPanelAutoMoreKey!,+" /> <Key latin:keyStyle="numSpaceKeyStyle" /> diff --git a/java/res/xml/rows_phone_symbols.xml b/java/res/xml/rows_phone_symbols.xml index 8c10a2d71..983bfb5c8 100644 --- a/java/res/xml/rows_phone_symbols.xml +++ b/java/res/xml/rows_phone_symbols.xml @@ -27,16 +27,16 @@ latin:keyboardLayout="@xml/key_styles_number" /> <Row> <Key - latin:keyLabel="(" + latin:keySpec="(" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="/" + latin:keySpec="/" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel=")" + latin:keySpec=")" latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="-" + latin:keySpec="-" latin:moreKeys="+" latin:keyLabelFlags="hasPopupHint" latin:keyStyle="numFunctionalKeyStyle" @@ -44,17 +44,17 @@ </Row> <Row> <Key - latin:keyLabel="N" + latin:keySpec="N" latin:keyStyle="numKeyBaseStyle" /> <!-- Pause is a comma. Check PhoneNumberUtils.java to see if this has changed. --> <Key latin:keyStyle="numPauseKeyStyle" /> <Key - latin:keyLabel="," + latin:keySpec="," latin:keyStyle="numKeyStyle" /> <Key - latin:keyLabel="." + latin:keySpec="." latin:keyStyle="numFunctionalKeyStyle" latin:keyWidth="fillRight" /> </Row> @@ -65,7 +65,7 @@ <Key latin:keyStyle="numWaitKeyStyle" /> <Key - latin:keyLabel="\#" + latin:keySpec="\#" latin:keyStyle="numKeyStyle" /> <Key latin:keyStyle="deleteKeyStyle" @@ -75,7 +75,7 @@ <Key latin:keyStyle="numPhoneToNumericKeyStyle" /> <Key - latin:keyLabel="+" + latin:keySpec="+" latin:keyStyle="numKeyStyle" /> <Key latin:keyStyle="numSpaceKeyStyle" /> diff --git a/java/res/xml/rows_sinhala.xml b/java/res/xml/rows_sinhala.xml new file mode 100644 index 000000000..a2ba0bb8b --- /dev/null +++ b/java/res/xml/rows_sinhala.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2014, 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/key_styles_common" /> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_sinhala1" /> + </Row> + <Row + latin:keyWidth="9.091%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <include latin:keyboardLayout="@xml/rowkeys_sinhala2" /> + </Row> + <Row + latin:keyWidth="8.711%p" + latin:keyLabelFlags="fontNormal|autoXScale" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="10.8%p" /> + <include latin:keyboardLayout="@xml/rowkeys_sinhala3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyWidth="fillRight" /> + </Row> + <include latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml/rows_swiss.xml b/java/res/xml/rows_swiss.xml new file mode 100644 index 000000000..03e412940 --- /dev/null +++ b/java/res/xml/rows_swiss.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2013, 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/key_styles_common" /> + <Row + latin:keyWidth="9.091%p" + > + <include + latin:keyboardLayout="@xml/rowkeys_swiss1" /> + </Row> + <Row + latin:keyWidth="9.091%p" + > + <include + latin:keyboardLayout="@xml/rowkeys_swiss2" /> + </Row> + <Row + latin:keyWidth="9.2%p" + > + <Key + latin:keyStyle="shiftKeyStyle" + latin:keyWidth="15%p" + latin:visualInsetsRight="1%p" /> + <Spacer + latin:keyWidth="2.8%p" /> + <include + latin:keyboardLayout="@xml/rowkeys_qwertz3" /> + <Key + latin:keyStyle="deleteKeyStyle" + latin:keyXPos="-15%p" + latin:keyWidth="fillRight" + latin:visualInsetsLeft="1%p" /> + </Row> + <include + latin:keyboardLayout="@xml/row_qwerty4" /> +</merge> diff --git a/java/res/xml/rows_symbols.xml b/java/res/xml/rows_symbols.xml index d0606c63b..6fd876f4e 100644 --- a/java/res/xml/rows_symbols.xml +++ b/java/res/xml/rows_symbols.xml @@ -54,6 +54,7 @@ </Row> <Row latin:keyWidth="10%p" + latin:backgroundType="functional" > <Key latin:keyStyle="toAlphaKeyStyle" diff --git a/java/res/xml/rows_symbols_shift.xml b/java/res/xml/rows_symbols_shift.xml index c4bdb9f38..64f6e6114 100644 --- a/java/res/xml/rows_symbols_shift.xml +++ b/java/res/xml/rows_symbols_shift.xml @@ -54,6 +54,7 @@ </Row> <Row latin:keyWidth="10%p" + latin:backgroundType="functional" > <Key latin:keyStyle="toAlphaKeyStyle" diff --git a/java/res/xml/rows_thai.xml b/java/res/xml/rows_thai.xml index 108b7e1fc..fffdb4415 100644 --- a/java/res/xml/rows_thai.xml +++ b/java/res/xml/rows_thai.xml @@ -18,41 +18,34 @@ */ --> -<merge - xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" -> - <include - latin:keyboardLayout="@xml/key_styles_common" /> +<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"> + <include latin:keyboardLayout="@xml/key_styles_common" /> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_thai1" /> + <include latin:keyboardLayout="@xml/rowkeys_thai1" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_thai2" /> + <include latin:keyboardLayout="@xml/rowkeys_thai2" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <include - latin:keyboardLayout="@xml/rowkeys_thai3" /> - <include - latin:keyboardLayout="@xml/key_thai_kho_khuat" /> + <include latin:keyboardLayout="@xml/rowkeys_thai3" /> + <include latin:keyboardLayout="@xml/key_thai_kho_khuat" /> </Row> <Row latin:keyWidth="8.3333%p" + latin:keyLabelFlags="fontNormal" > - <Key - latin:keyStyle="shiftKeyStyle" /> - <include - latin:keyboardLayout="@xml/rowkeys_thai4" /> - <Key - latin:keyStyle="deleteKeyStyle" /> + <Key latin:keyStyle="shiftKeyStyle" /> + <include latin:keyboardLayout="@xml/rowkeys_thai4" /> + <Key latin:keyStyle="deleteKeyStyle" /> </Row> - <include - latin:keyboardLayout="@xml/row_qwerty4" /> + <include latin:keyboardLayout="@xml/row_qwerty4" /> </merge> diff --git a/java/res/xml/spell_checker_settings.xml b/java/res/xml/spell_checker_settings.xml index de67e7f81..3d9501857 100644 --- a/java/res/xml/spell_checker_settings.xml +++ b/java/res/xml/spell_checker_settings.xml @@ -15,11 +15,12 @@ --> <PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android"> - <CheckBoxPreference - android:key="pref_spellcheck_use_contacts" - android:title="@string/use_contacts_for_spellchecking_option_title" - android:summary="@string/use_contacts_for_spellchecking_option_summary" - android:persistent="true" - android:defaultValue="true" /> + xmlns:android="http://schemas.android.com/apk/res/android" +> + <CheckBoxPreference + android:key="pref_spellcheck_use_contacts" + android:title="@string/use_contacts_for_spellchecking_option_title" + android:summary="@string/use_contacts_for_spellchecking_option_summary" + android:defaultValue="true" + android:persistent="true" /> </PreferenceScreen> diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityLongPressTimer.java b/java/src/com/android/inputmethod/accessibility/AccessibilityLongPressTimer.java new file mode 100644 index 000000000..37d910edb --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityLongPressTimer.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2014 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.accessibility; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.latin.R; + +// Handling long press timer to show a more keys keyboard. +final class AccessibilityLongPressTimer extends Handler { + public interface LongPressTimerCallback { + public void performLongClickOn(Key key); + } + + private static final int MSG_LONG_PRESS = 1; + + private final LongPressTimerCallback mCallback; + private final long mConfigAccessibilityLongPressTimeout; + + public AccessibilityLongPressTimer(final LongPressTimerCallback callback, + final Context context) { + super(); + mCallback = callback; + mConfigAccessibilityLongPressTimeout = context.getResources().getInteger( + R.integer.config_accessibility_long_press_key_timeout); + } + + @Override + public void handleMessage(final Message msg) { + switch (msg.what) { + case MSG_LONG_PRESS: + cancelLongPress(); + mCallback.performLongClickOn((Key)msg.obj); + return; + default: + super.handleMessage(msg); + return; + } + } + + public void startLongPress(final Key key) { + cancelLongPress(); + final Message longPressMessage = obtainMessage(MSG_LONG_PRESS, key); + sendMessageDelayed(longPressMessage, mConfigAccessibilityLongPressTimeout); + } + + public void cancelLongPress() { + removeMessages(MSG_LONG_PRESS); + } +} diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java index 10fb9fef4..2762a9f25 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java @@ -17,7 +17,6 @@ package com.android.inputmethod.accessibility; import android.content.Context; -import android.inputmethodservice.InputMethodService; import android.media.AudioManager; import android.os.Build; import android.os.SystemClock; @@ -63,13 +62,11 @@ public final class AccessibilityUtils { */ private static final boolean ENABLE_ACCESSIBILITY = true; - public static void init(final InputMethodService inputMethod) { + public static void init(final Context context) { if (!ENABLE_ACCESSIBILITY) return; // These only need to be initialized if the kill switch is off. - sInstance.initInternal(inputMethod); - KeyCodeDescriptionMapper.init(); - AccessibleKeyboardViewProxy.init(inputMethod); + sInstance.initInternal(context); } public static AccessibilityUtils getInstance() { @@ -116,7 +113,7 @@ public final class AccessibilityUtils { * @param event The event to check. * @return {@true} is the event is a touch exploration event */ - public boolean isTouchExplorationEvent(final MotionEvent event) { + public static boolean isTouchExplorationEvent(final MotionEvent event) { final int action = event.getAction(); return action == MotionEvent.ACTION_HOVER_ENTER || action == MotionEvent.ACTION_HOVER_EXIT @@ -158,7 +155,7 @@ public final class AccessibilityUtils { * @param typedWord the currently typed word */ public void setAutoCorrection(final SuggestedWords suggestedWords, final String typedWord) { - if (suggestedWords != null && suggestedWords.mWillAutoCorrect) { + if (suggestedWords.mWillAutoCorrect) { mAutoCorrectionWord = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION); mTypedWord = typedWord; } else { diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java deleted file mode 100644 index 73896dfd3..000000000 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.accessibility; - -import android.content.Context; -import android.inputmethodservice.InputMethodService; -import android.support.v4.view.AccessibilityDelegateCompat; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.accessibility.AccessibilityEventCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; -import android.util.SparseIntArray; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewParent; -import android.view.accessibility.AccessibilityEvent; - -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.KeyboardId; -import com.android.inputmethod.keyboard.MainKeyboardView; -import com.android.inputmethod.keyboard.PointerTracker; -import com.android.inputmethod.latin.R; - -public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat { - private static final AccessibleKeyboardViewProxy sInstance = new AccessibleKeyboardViewProxy(); - - /** Map of keyboard modes to resource IDs. */ - private static final SparseIntArray KEYBOARD_MODE_RES_IDS = new SparseIntArray(); - - static { - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATE, R.string.keyboard_mode_date); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATETIME, R.string.keyboard_mode_date_time); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_EMAIL, R.string.keyboard_mode_email); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_IM, R.string.keyboard_mode_im); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_NUMBER, R.string.keyboard_mode_number); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_PHONE, R.string.keyboard_mode_phone); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TEXT, R.string.keyboard_mode_text); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TIME, R.string.keyboard_mode_time); - KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_URL, R.string.keyboard_mode_url); - } - - private InputMethodService mInputMethod; - private MainKeyboardView mView; - private AccessibilityEntityProvider mAccessibilityNodeProvider; - - private Key mLastHoverKey = null; - - /** - * Inset in pixels to look for keys when the user's finger exits the keyboard area. - */ - private int mEdgeSlop; - - /** The most recently set keyboard mode. */ - private int mLastKeyboardMode; - - public static void init(final InputMethodService inputMethod) { - sInstance.initInternal(inputMethod); - } - - public static AccessibleKeyboardViewProxy getInstance() { - return sInstance; - } - - private AccessibleKeyboardViewProxy() { - // Not publicly instantiable. - } - - private void initInternal(final InputMethodService inputMethod) { - mInputMethod = inputMethod; - mEdgeSlop = inputMethod.getResources().getDimensionPixelSize( - R.dimen.accessibility_edge_slop); - } - - /** - * Sets the view wrapped by this proxy. - * - * @param view The view to wrap. - */ - public void setView(final MainKeyboardView view) { - if (view == null) { - // Ignore null views. - return; - } - mView = view; - - // Ensure that the view has an accessibility delegate. - ViewCompat.setAccessibilityDelegate(view, this); - - if (mAccessibilityNodeProvider == null) { - return; - } - mAccessibilityNodeProvider.setView(view); - } - - /** - * Called when the keyboard layout changes. - * <p> - * <b>Note:</b> This method will be called even if accessibility is not - * enabled. - */ - public void setKeyboard() { - if (mView == null) { - return; - } - if (mAccessibilityNodeProvider != null) { - mAccessibilityNodeProvider.setKeyboard(); - } - final int keyboardMode = mView.getKeyboard().mId.mMode; - - // Since this method is called even when accessibility is off, make sure - // to check the state before announcing anything. Also, don't announce - // changes within the same mode. - if (AccessibilityUtils.getInstance().isAccessibilityEnabled() - && (mLastKeyboardMode != keyboardMode)) { - announceKeyboardMode(keyboardMode); - } - mLastKeyboardMode = keyboardMode; - } - - /** - * Called when the keyboard is hidden and accessibility is enabled. - */ - public void onHideWindow() { - if (mView == null) { - return; - } - announceKeyboardHidden(); - mLastKeyboardMode = -1; - } - - /** - * Announces which type of keyboard is being displayed. If the keyboard type - * is unknown, no announcement is made. - * - * @param mode The new keyboard mode. - */ - private void announceKeyboardMode(int mode) { - final int resId = KEYBOARD_MODE_RES_IDS.get(mode); - if (resId == 0) { - return; - } - final Context context = mView.getContext(); - final String keyboardMode = context.getString(resId); - final String text = context.getString(R.string.announce_keyboard_mode, keyboardMode); - sendWindowStateChanged(text); - } - - /** - * Announces that the keyboard has been hidden. - */ - private void announceKeyboardHidden() { - final Context context = mView.getContext(); - final String text = context.getString(R.string.announce_keyboard_hidden); - - sendWindowStateChanged(text); - } - - /** - * Sends a window state change event with the specified text. - * - * @param text The text to send with the event. - */ - private void sendWindowStateChanged(final String text) { - final AccessibilityEvent stateChange = AccessibilityEvent.obtain( - AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - mView.onInitializeAccessibilityEvent(stateChange); - stateChange.getText().add(text); - stateChange.setContentDescription(null); - - final ViewParent parent = mView.getParent(); - if (parent != null) { - parent.requestSendAccessibilityEvent(mView, stateChange); - } - } - - /** - * Proxy method for View.getAccessibilityNodeProvider(). This method is called in SDK - * version 15 (Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) and higher to obtain the virtual - * node hierarchy provider. - * - * @param host The host view for the provider. - * @return The accessibility node provider for the current keyboard. - */ - @Override - public AccessibilityEntityProvider getAccessibilityNodeProvider(final View host) { - if (mView == null) { - return null; - } - return getAccessibilityNodeProvider(); - } - - /** - * Intercepts touch events before dispatch when touch exploration is turned on in ICS and - * higher. - * - * @param event The motion event being dispatched. - * @return {@code true} if the event is handled - */ - public boolean dispatchTouchEvent(final MotionEvent event) { - // To avoid accidental key presses during touch exploration, always drop - // touch events generated by the user. - return false; - } - - /** - * Receives hover events when touch exploration is turned on in SDK versions ICS and higher. - * - * @param event The hover event. - * @return {@code true} if the event is handled - */ - public boolean dispatchHoverEvent(final MotionEvent event, final PointerTracker tracker) { - if (mView == null) { - return false; - } - - final int x = (int) event.getX(); - final int y = (int) event.getY(); - final Key previousKey = mLastHoverKey; - final Key key; - - if (pointInView(x, y)) { - key = tracker.getKeyOn(x, y); - } else { - key = null; - } - mLastHoverKey = key; - - switch (event.getAction()) { - case MotionEvent.ACTION_HOVER_EXIT: - // Make sure we're not getting an EXIT event because the user slid - // off the keyboard area, then force a key press. - if (key != null) { - getAccessibilityNodeProvider().simulateKeyPress(key); - } - //$FALL-THROUGH$ - case MotionEvent.ACTION_HOVER_ENTER: - return onHoverKey(key, event); - case MotionEvent.ACTION_HOVER_MOVE: - if (key != previousKey) { - return onTransitionKey(key, previousKey, event); - } - return onHoverKey(key, event); - } - return false; - } - - /** - * @return A lazily-instantiated node provider for this view proxy. - */ - private AccessibilityEntityProvider getAccessibilityNodeProvider() { - // Instantiate the provide only when requested. Since the system - // will call this method multiple times it is a good practice to - // cache the provider instance. - if (mAccessibilityNodeProvider == null) { - mAccessibilityNodeProvider = new AccessibilityEntityProvider(mView, mInputMethod); - } - return mAccessibilityNodeProvider; - } - - /** - * Utility method to determine whether the given point, in local coordinates, is inside the - * view, where the area of the view is contracted by the edge slop factor. - * - * @param localX The local x-coordinate. - * @param localY The local y-coordinate. - */ - private boolean pointInView(final int localX, final int localY) { - return (localX >= mEdgeSlop) && (localY >= mEdgeSlop) - && (localX < (mView.getWidth() - mEdgeSlop)) - && (localY < (mView.getHeight() - mEdgeSlop)); - } - - /** - * Simulates a transition between two {@link Key}s by sending a HOVER_EXIT on the previous key, - * a HOVER_ENTER on the current key, and a HOVER_MOVE on the current key. - * - * @param currentKey The currently hovered key. - * @param previousKey The previously hovered key. - * @param event The event that triggered the transition. - * @return {@code true} if the event was handled. - */ - private boolean onTransitionKey(final Key currentKey, final Key previousKey, - final MotionEvent event) { - final int savedAction = event.getAction(); - event.setAction(MotionEvent.ACTION_HOVER_EXIT); - onHoverKey(previousKey, event); - event.setAction(MotionEvent.ACTION_HOVER_ENTER); - onHoverKey(currentKey, event); - event.setAction(MotionEvent.ACTION_HOVER_MOVE); - final boolean handled = onHoverKey(currentKey, event); - event.setAction(savedAction); - return handled; - } - - /** - * Handles a hover event on a key. If {@link Key} extended View, this would be analogous to - * calling View.onHoverEvent(MotionEvent). - * - * @param key The currently hovered key. - * @param event The hover event. - * @return {@code true} if the event was handled. - */ - private boolean onHoverKey(final Key key, final MotionEvent event) { - // Null keys can't receive events. - if (key == null) { - return false; - } - final AccessibilityEntityProvider provider = getAccessibilityNodeProvider(); - - switch (event.getAction()) { - case MotionEvent.ACTION_HOVER_ENTER: - provider.sendAccessibilityEventForKey( - key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER); - provider.performActionForKey( - key, AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS, null); - break; - case MotionEvent.ACTION_HOVER_EXIT: - provider.sendAccessibilityEventForKey( - key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT); - break; - } - return true; - } - - /** - * Notifies the user of changes in the keyboard shift state. - */ - public void notifyShiftState() { - if (mView == null) { - return; - } - - final Keyboard keyboard = mView.getKeyboard(); - final KeyboardId keyboardId = keyboard.mId; - final int elementId = keyboardId.mElementId; - final Context context = mView.getContext(); - final CharSequence text; - - switch (elementId) { - case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED: - case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED: - text = context.getText(R.string.spoken_description_shiftmode_locked); - break; - case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED: - case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED: - case KeyboardId.ELEMENT_SYMBOLS_SHIFTED: - text = context.getText(R.string.spoken_description_shiftmode_on); - break; - default: - text = context.getText(R.string.spoken_description_shiftmode_off); - } - AccessibilityUtils.getInstance().announceForAccessibility(mView, text); - } - - /** - * Notifies the user of changes in the keyboard symbols state. - */ - public void notifySymbolsState() { - if (mView == null) { - return; - } - - final Keyboard keyboard = mView.getKeyboard(); - final Context context = mView.getContext(); - final KeyboardId keyboardId = keyboard.mId; - final int elementId = keyboardId.mElementId; - final int resId; - - switch (elementId) { - case KeyboardId.ELEMENT_ALPHABET: - case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED: - case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED: - case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED: - case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED: - resId = R.string.spoken_description_mode_alpha; - break; - case KeyboardId.ELEMENT_SYMBOLS: - case KeyboardId.ELEMENT_SYMBOLS_SHIFTED: - resId = R.string.spoken_description_mode_symbol; - break; - case KeyboardId.ELEMENT_PHONE: - resId = R.string.spoken_description_mode_phone; - break; - case KeyboardId.ELEMENT_PHONE_SYMBOLS: - resId = R.string.spoken_description_mode_phone_shift; - break; - default: - resId = -1; - } - - if (resId < 0) { - return; - } - final String text = context.getString(resId); - AccessibilityUtils.getInstance().announceForAccessibility(mView, text); - } -} diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java index 58624a2e6..7a3510ee1 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java +++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java @@ -17,6 +17,7 @@ package com.android.inputmethod.accessibility; import android.content.Context; +import android.content.res.Resources; import android.text.TextUtils; import android.util.Log; import android.util.SparseIntArray; @@ -27,40 +28,29 @@ import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.StringUtils; -import java.util.HashMap; +import java.util.Locale; -public final class KeyCodeDescriptionMapper { +final class KeyCodeDescriptionMapper { private static final String TAG = KeyCodeDescriptionMapper.class.getSimpleName(); + private static final String SPOKEN_LETTER_RESOURCE_NAME_FORMAT = "spoken_accented_letter_%04X"; + private static final String SPOKEN_SYMBOL_RESOURCE_NAME_FORMAT = "spoken_symbol_%04X"; + private static final String SPOKEN_EMOJI_RESOURCE_NAME_FORMAT = "spoken_emoji_%04X"; // The resource ID of the string spoken for obscured keys private static final int OBSCURED_KEY_RES_ID = R.string.spoken_description_dot; - private static KeyCodeDescriptionMapper sInstance = new KeyCodeDescriptionMapper(); - - // Map of key labels to spoken description resource IDs - private final HashMap<CharSequence, Integer> mKeyLabelMap = CollectionUtils.newHashMap(); - - // Sparse array of spoken description resource IDs indexed by key codes - private final SparseIntArray mKeyCodeMap; - - public static void init() { - sInstance.initInternal(); - } + private static final KeyCodeDescriptionMapper sInstance = new KeyCodeDescriptionMapper(); public static KeyCodeDescriptionMapper getInstance() { return sInstance; } - private KeyCodeDescriptionMapper() { - mKeyCodeMap = new SparseIntArray(); - } - - private void initInternal() { - // Manual label substitutions for key labels with no string resource - mKeyLabelMap.put(":-)", R.string.spoken_description_smiley); + // Sparse array of spoken description resource IDs indexed by key codes + private final SparseIntArray mKeyCodeMap = new SparseIntArray(); + private KeyCodeDescriptionMapper() { // Special non-character codes defined in Keyboard mKeyCodeMap.put(Constants.CODE_SPACE, R.string.spoken_description_space); mKeyCodeMap.put(Constants.CODE_DELETE, R.string.spoken_description_delete); @@ -75,19 +65,21 @@ public final class KeyCodeDescriptionMapper { mKeyCodeMap.put(Constants.CODE_ACTION_NEXT, R.string.spoken_description_action_next); mKeyCodeMap.put(Constants.CODE_ACTION_PREVIOUS, R.string.spoken_description_action_previous); + mKeyCodeMap.put(Constants.CODE_EMOJI, R.string.spoken_description_emoji); + // Because the upper-case and lower-case mappings of the following letters is depending on + // the locale, the upper case descriptions should be defined here. The lower case + // descriptions are handled in {@link #getSpokenLetterDescriptionId(Context,int)}. + // U+0049: "I" LATIN CAPITAL LETTER I + // U+0069: "i" LATIN SMALL LETTER I + // U+0130: "İ" LATIN CAPITAL LETTER I WITH DOT ABOVE + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + mKeyCodeMap.put(0x0049, R.string.spoken_letter_0049); + mKeyCodeMap.put(0x0130, R.string.spoken_letter_0130); } /** * Returns the localized description of the action performed by a specified * key based on the current keyboard state. - * <p> - * The order of precedence for key descriptions is: - * <ol> - * <li>Manually-defined based on the key label</li> - * <li>Automatic or manually-defined based on the key code</li> - * <li>Automatically based on the key label</li> - * <li>{code null} for keys with no label or key code defined</li> - * </p> * * @param context The package's context. * @param keyboard The keyboard on which the key resides. @@ -116,18 +108,26 @@ public final class KeyCodeDescriptionMapper { return getDescriptionForActionKey(context, keyboard, key); } - if (!TextUtils.isEmpty(key.getLabel())) { - final String label = key.getLabel().trim(); - - // First, attempt to map the label to a pre-defined description. - if (mKeyLabelMap.containsKey(label)) { - return context.getString(mKeyLabelMap.get(label)); - } + if (code == Constants.CODE_OUTPUT_TEXT) { + return key.getOutputText(); } // Just attempt to speak the description. - if (key.getCode() != Constants.CODE_UNSPECIFIED) { - return getDescriptionForKeyCode(context, keyboard, key, shouldObscure); + if (code != Constants.CODE_UNSPECIFIED) { + // If the key description should be obscured, now is the time to do it. + final boolean isDefinedNonCtrl = Character.isDefined(code) + && !Character.isISOControl(code); + if (shouldObscure && isDefinedNonCtrl) { + return context.getString(OBSCURED_KEY_RES_ID); + } + final String description = getDescriptionForCodePoint(context, code); + if (description != null) { + return description; + } + if (!TextUtils.isEmpty(key.getLabel())) { + return key.getLabel(); + } + return context.getString(R.string.spoken_description_unknown); } return null; } @@ -141,7 +141,7 @@ public final class KeyCodeDescriptionMapper { * @param keyboard The keyboard on which the key resides. * @return a character sequence describing the action performed by pressing the key */ - private String getDescriptionForSwitchAlphaSymbol(final Context context, + private static String getDescriptionForSwitchAlphaSymbol(final Context context, final Keyboard keyboard) { final KeyboardId keyboardId = keyboard.mId; final int elementId = keyboardId.mElementId; @@ -179,7 +179,8 @@ public final class KeyCodeDescriptionMapper { * @param keyboard The keyboard on which the key resides. * @return A context-sensitive description of the "Shift" key. */ - private String getDescriptionForShiftKey(final Context context, final Keyboard keyboard) { + private static String getDescriptionForShiftKey(final Context context, + final Keyboard keyboard) { final KeyboardId keyboardId = keyboard.mId; final int elementId = keyboardId.mElementId; final int resId; @@ -191,9 +192,14 @@ public final class KeyCodeDescriptionMapper { break; case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED: case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED: - case KeyboardId.ELEMENT_SYMBOLS_SHIFTED: resId = R.string.spoken_description_shift_shifted; break; + case KeyboardId.ELEMENT_SYMBOLS: + resId = R.string.spoken_description_symbols_shift; + break; + case KeyboardId.ELEMENT_SYMBOLS_SHIFTED: + resId = R.string.spoken_description_symbols_shift_shifted; + break; default: resId = R.string.spoken_description_shift; } @@ -208,7 +214,7 @@ public final class KeyCodeDescriptionMapper { * @param key The key to describe. * @return Returns a context-sensitive description of the "Enter" action key. */ - private String getDescriptionForActionKey(final Context context, final Keyboard keyboard, + private static String getDescriptionForActionKey(final Context context, final Keyboard keyboard, final Key key) { final KeyboardId keyboardId = keyboard.mId; final int actionId = keyboardId.imeAction(); @@ -247,42 +253,91 @@ public final class KeyCodeDescriptionMapper { /** * Returns a localized character sequence describing what will happen when - * the specified key is pressed based on its key code. - * <p> - * The order of precedence for key code descriptions is: - * <ol> - * <li>Manually-defined shift-locked description</li> - * <li>Manually-defined shifted description</li> - * <li>Manually-defined normal description</li> - * <li>Automatic based on the character represented by the key code</li> - * <li>Fall-back for undefined or control characters</li> - * </ol> - * </p> + * the specified key is pressed based on its key code point. * * @param context The package's context. - * @param keyboard The keyboard on which the key resides. - * @param key The key from which to obtain a description. - * @param shouldObscure {@true} if text (e.g. non-control) characters should be obscured. - * @return a character sequence describing the action performed by pressing the key + * @param codePoint The code point from which to obtain a description. + * @return a character sequence describing the code point. */ - private String getDescriptionForKeyCode(final Context context, final Keyboard keyboard, - final Key key, final boolean shouldObscure) { - final int code = key.getCode(); - + public String getDescriptionForCodePoint(final Context context, final int codePoint) { // If the key description should be obscured, now is the time to do it. - final boolean isDefinedNonCtrl = Character.isDefined(code) && !Character.isISOControl(code); - if (shouldObscure && isDefinedNonCtrl) { - return context.getString(OBSCURED_KEY_RES_ID); + final int index = mKeyCodeMap.indexOfKey(codePoint); + if (index >= 0) { + return context.getString(mKeyCodeMap.valueAt(index)); } - if (mKeyCodeMap.indexOfKey(code) >= 0) { - return context.getString(mKeyCodeMap.get(code)); + final String accentedLetter = getSpokenAccentedLetterDescription(context, codePoint); + if (accentedLetter != null) { + return accentedLetter; } - if (isDefinedNonCtrl) { - return Character.toString((char) code); + // Here, <code>code</code> may be a base (non-accented) letter. + final String unsupportedSymbol = getSpokenSymbolDescription(context, codePoint); + if (unsupportedSymbol != null) { + return unsupportedSymbol; } - if (!TextUtils.isEmpty(key.getLabel())) { - return key.getLabel(); + final String emojiDescription = getSpokenEmojiDescription(context, codePoint); + if (emojiDescription != null) { + return emojiDescription; + } + if (Character.isDefined(codePoint) && !Character.isISOControl(codePoint)) { + return StringUtils.newSingleCodePointString(codePoint); + } + return null; + } + + // TODO: Remove this method once TTS supports those accented letters' verbalization. + private String getSpokenAccentedLetterDescription(final Context context, final int code) { + final boolean isUpperCase = Character.isUpperCase(code); + final int baseCode = isUpperCase ? Character.toLowerCase(code) : code; + final int baseIndex = mKeyCodeMap.indexOfKey(baseCode); + final int resId = (baseIndex >= 0) ? mKeyCodeMap.valueAt(baseIndex) + : getSpokenDescriptionId(context, baseCode, SPOKEN_LETTER_RESOURCE_NAME_FORMAT); + if (resId == 0) { + return null; + } + final String spokenText = context.getString(resId); + return isUpperCase ? context.getString(R.string.spoken_description_upper_case, spokenText) + : spokenText; + } + + // TODO: Remove this method once TTS supports those symbols' verbalization. + private String getSpokenSymbolDescription(final Context context, final int code) { + final int resId = getSpokenDescriptionId(context, code, SPOKEN_SYMBOL_RESOURCE_NAME_FORMAT); + if (resId == 0) { + return null; + } + final String spokenText = context.getString(resId); + if (!TextUtils.isEmpty(spokenText)) { + return spokenText; + } + // If a translated description is empty, fall back to unknown symbol description. + return context.getString(R.string.spoken_symbol_unknown); + } + + // TODO: Remove this method once TTS supports emoji verbalization. + private String getSpokenEmojiDescription(final Context context, final int code) { + final int resId = getSpokenDescriptionId(context, code, SPOKEN_EMOJI_RESOURCE_NAME_FORMAT); + if (resId == 0) { + return null; + } + final String spokenText = context.getString(resId); + if (!TextUtils.isEmpty(spokenText)) { + return spokenText; + } + // If a translated description is empty, fall back to unknown emoji description. + return context.getString(R.string.spoken_emoji_unknown); + } + + private int getSpokenDescriptionId(final Context context, final int code, + final String resourceNameFormat) { + final String resourceName = String.format(Locale.ROOT, resourceNameFormat, code); + final Resources resources = context.getResources(); + // Note that the resource package name may differ from the context package name. + final String resourcePackageName = resources.getResourcePackageName( + R.string.spoken_description_unknown); + final int resId = resources.getIdentifier(resourceName, "string", resourcePackageName); + if (resId != 0) { + mKeyCodeMap.append(code, resId); } - return context.getString(R.string.spoken_description_unknown, code); + return resId; } } diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java new file mode 100644 index 000000000..237117d10 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java @@ -0,0 +1,327 @@ +/* + * 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.accessibility; + +import android.content.Context; +import android.os.SystemClock; +import android.support.v4.view.AccessibilityDelegateCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardView; + +/** + * This class represents a delegate that can be registered in a class that extends + * {@link KeyboardView} to enhance accessibility support via composition rather via inheritance. + * + * To implement accessibility mode, the target keyboard view has to:<p> + * - Call {@link #setKeyboard(Keyboard)} when a new keyboard is set to the keyboard view. + * - Dispatch a hover event by calling {@link #onHoverEnter(MotionEvent)}. + * + * @param <KV> The keyboard view class type. + */ +public class KeyboardAccessibilityDelegate<KV extends KeyboardView> + extends AccessibilityDelegateCompat { + private static final String TAG = KeyboardAccessibilityDelegate.class.getSimpleName(); + protected static final boolean DEBUG_HOVER = false; + + protected final KV mKeyboardView; + protected final KeyDetector mKeyDetector; + private Keyboard mKeyboard; + private KeyboardAccessibilityNodeProvider<KV> mAccessibilityNodeProvider; + private Key mLastHoverKey; + + public static final int HOVER_EVENT_POINTER_ID = 0; + + public KeyboardAccessibilityDelegate(final KV keyboardView, final KeyDetector keyDetector) { + super(); + mKeyboardView = keyboardView; + mKeyDetector = keyDetector; + + // Ensure that the view has an accessibility delegate. + ViewCompat.setAccessibilityDelegate(keyboardView, this); + } + + /** + * Called when the keyboard layout changes. + * <p> + * <b>Note:</b> This method will be called even if accessibility is not + * enabled. + * @param keyboard The keyboard that is being set to the wrapping view. + */ + public void setKeyboard(final Keyboard keyboard) { + if (keyboard == null) { + return; + } + if (mAccessibilityNodeProvider != null) { + mAccessibilityNodeProvider.setKeyboard(keyboard); + } + mKeyboard = keyboard; + } + + protected final Keyboard getKeyboard() { + return mKeyboard; + } + + protected final void setLastHoverKey(final Key key) { + mLastHoverKey = key; + } + + protected final Key getLastHoverKey() { + return mLastHoverKey; + } + + /** + * Sends a window state change event with the specified string resource id. + * + * @param resId The string resource id of the text to send with the event. + */ + protected void sendWindowStateChanged(final int resId) { + if (resId == 0) { + return; + } + final Context context = mKeyboardView.getContext(); + sendWindowStateChanged(context.getString(resId)); + } + + /** + * Sends a window state change event with the specified text. + * + * @param text The text to send with the event. + */ + protected void sendWindowStateChanged(final String text) { + final AccessibilityEvent stateChange = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mKeyboardView.onInitializeAccessibilityEvent(stateChange); + stateChange.getText().add(text); + stateChange.setContentDescription(null); + + final ViewParent parent = mKeyboardView.getParent(); + if (parent != null) { + parent.requestSendAccessibilityEvent(mKeyboardView, stateChange); + } + } + + /** + * Delegate method for View.getAccessibilityNodeProvider(). This method is called in SDK + * version 15 (Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) and higher to obtain the virtual + * node hierarchy provider. + * + * @param host The host view for the provider. + * @return The accessibility node provider for the current keyboard. + */ + @Override + public KeyboardAccessibilityNodeProvider<KV> getAccessibilityNodeProvider(final View host) { + return getAccessibilityNodeProvider(); + } + + /** + * @return A lazily-instantiated node provider for this view delegate. + */ + protected KeyboardAccessibilityNodeProvider<KV> getAccessibilityNodeProvider() { + // Instantiate the provide only when requested. Since the system + // will call this method multiple times it is a good practice to + // cache the provider instance. + if (mAccessibilityNodeProvider == null) { + mAccessibilityNodeProvider = + new KeyboardAccessibilityNodeProvider<>(mKeyboardView, this); + } + return mAccessibilityNodeProvider; + } + + /** + * Get a key that a hover event is on. + * + * @param event The hover event. + * @return key The key that the <code>event</code> is on. + */ + protected final Key getHoverKeyOf(final MotionEvent event) { + final int actionIndex = event.getActionIndex(); + final int x = (int)event.getX(actionIndex); + final int y = (int)event.getY(actionIndex); + return mKeyDetector.detectHitKey(x, y); + } + + /** + * Receives hover events when touch exploration is turned on in SDK versions ICS and higher. + * + * @param event The hover event. + * @return {@code true} if the event is handled. + */ + public boolean onHoverEvent(final MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_HOVER_ENTER: + onHoverEnter(event); + break; + case MotionEvent.ACTION_HOVER_MOVE: + onHoverMove(event); + break; + case MotionEvent.ACTION_HOVER_EXIT: + onHoverExit(event); + break; + default: + Log.w(getClass().getSimpleName(), "Unknown hover event: " + event); + break; + } + return true; + } + + /** + * Process {@link MotionEvent#ACTION_HOVER_ENTER} event. + * + * @param event A hover enter event. + */ + protected void onHoverEnter(final MotionEvent event) { + final Key key = getHoverKeyOf(event); + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverEnter: key=" + key); + } + if (key != null) { + onHoverEnterTo(key); + } + setLastHoverKey(key); + } + + /** + * Process {@link MotionEvent#ACTION_HOVER_MOVE} event. + * + * @param event A hover move event. + */ + protected void onHoverMove(final MotionEvent event) { + final Key lastKey = getLastHoverKey(); + final Key key = getHoverKeyOf(event); + if (key != lastKey) { + if (lastKey != null) { + onHoverExitFrom(lastKey); + } + if (key != null) { + onHoverEnterTo(key); + } + } + if (key != null) { + onHoverMoveWithin(key); + } + setLastHoverKey(key); + } + + /** + * Process {@link MotionEvent#ACTION_HOVER_EXIT} event. + * + * @param event A hover exit event. + */ + protected void onHoverExit(final MotionEvent event) { + final Key lastKey = getLastHoverKey(); + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverExit: key=" + getHoverKeyOf(event) + " last=" + lastKey); + } + if (lastKey != null) { + onHoverExitFrom(lastKey); + } + final Key key = getHoverKeyOf(event); + // Make sure we're not getting an EXIT event because the user slid + // off the keyboard area, then force a key press. + if (key != null) { + performClickOn(key); + onHoverExitFrom(key); + } + setLastHoverKey(null); + } + + /** + * Perform click on a key. + * + * @param key A key to be registered. + */ + public void performClickOn(final Key key) { + if (DEBUG_HOVER) { + Log.d(TAG, "performClickOn: key=" + key); + } + simulateTouchEvent(MotionEvent.ACTION_DOWN, key); + simulateTouchEvent(MotionEvent.ACTION_UP, key); + } + + /** + * Simulating a touch event by injecting a synthesized touch event into {@link KeyboardView}. + * + * @param touchAction The action of the synthesizing touch event. + * @param key The key that a synthesized touch event is on. + */ + private void simulateTouchEvent(final int touchAction, final Key key) { + final int x = key.getHitBox().centerX(); + final int y = key.getHitBox().centerY(); + final long eventTime = SystemClock.uptimeMillis(); + final MotionEvent touchEvent = MotionEvent.obtain( + eventTime, eventTime, touchAction, x, y, 0 /* metaState */); + mKeyboardView.onTouchEvent(touchEvent); + touchEvent.recycle(); + } + + /** + * Handles a hover enter event on a key. + * + * @param key The currently hovered key. + */ + protected void onHoverEnterTo(final Key key) { + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverEnterTo: key=" + key); + } + key.onPressed(); + mKeyboardView.invalidateKey(key); + final KeyboardAccessibilityNodeProvider<KV> provider = getAccessibilityNodeProvider(); + provider.onHoverEnterTo(key); + provider.performActionForKey(key, AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS); + } + + /** + * Handles a hover move event on a key. + * + * @param key The currently hovered key. + */ + protected void onHoverMoveWithin(final Key key) { } + + /** + * Handles a hover exit event on a key. + * + * @param key The currently hovered key. + */ + protected void onHoverExitFrom(final Key key) { + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverExitFrom: key=" + key); + } + key.onReleased(); + mKeyboardView.invalidateKey(key); + final KeyboardAccessibilityNodeProvider<KV> provider = getAccessibilityNodeProvider(); + provider.onHoverExitFrom(key); + } + + /** + * Perform long click on a key. + * + * @param key A key to be long pressed on. + */ + public void performLongClickOn(final Key key) { + // A extended class should override this method to implement long press. + } +} diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java index c628c5b09..66b0acb2f 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java +++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java @@ -17,17 +17,13 @@ package com.android.inputmethod.accessibility; import android.graphics.Rect; -import android.inputmethodservice.InputMethodService; import android.os.Bundle; -import android.os.SystemClock; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat; import android.support.v4.view.accessibility.AccessibilityRecordCompat; import android.util.Log; -import android.util.SparseArray; -import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.EditorInfo; @@ -37,9 +33,10 @@ import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardView; import com.android.inputmethod.latin.settings.Settings; import com.android.inputmethod.latin.settings.SettingsValues; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; +import java.util.List; + /** * Exposes a virtual view sub-tree for {@link KeyboardView} and generates * {@link AccessibilityEvent}s for individual {@link Key}s. @@ -50,17 +47,16 @@ import com.android.inputmethod.latin.utils.CoordinateUtils; * virtual views, thus conveying their logical structure. * </p> */ -public final class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat { - private static final String TAG = AccessibilityEntityProvider.class.getSimpleName(); - private static final int UNDEFINED = Integer.MIN_VALUE; +final class KeyboardAccessibilityNodeProvider<KV extends KeyboardView> + extends AccessibilityNodeProviderCompat { + private static final String TAG = KeyboardAccessibilityNodeProvider.class.getSimpleName(); + + // From {@link android.view.accessibility.AccessibilityNodeInfo#UNDEFINED_ITEM_ID}. + private static final int UNDEFINED = Integer.MAX_VALUE; - private final InputMethodService mInputMethodService; private final KeyCodeDescriptionMapper mKeyCodeDescriptionMapper; private final AccessibilityUtils mAccessibilityUtils; - /** A map of integer IDs to {@link Key}s. */ - private final SparseArray<Key> mVirtualViewIdToKey = CollectionUtils.newSparseArray(); - /** Temporary rect used to calculate in-screen bounds. */ private final Rect mTempBoundsInScreen = new Rect(); @@ -70,36 +66,64 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider /** The virtual view identifier for the focused node. */ private int mAccessibilityFocusedView = UNDEFINED; - /** The current keyboard view. */ - private KeyboardView mKeyboardView; + /** The virtual view identifier for the hovering node. */ + private int mHoveringNodeId = UNDEFINED; + + /** The keyboard view to provide an accessibility node info. */ + private final KV mKeyboardView; + /** The accessibility delegate. */ + private final KeyboardAccessibilityDelegate<KV> mDelegate; - public AccessibilityEntityProvider(final KeyboardView keyboardView, - final InputMethodService inputMethod) { - mInputMethodService = inputMethod; + /** The current keyboard. */ + private Keyboard mKeyboard; + + public KeyboardAccessibilityNodeProvider(final KV keyboardView, + final KeyboardAccessibilityDelegate<KV> delegate) { + super(); mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance(); mAccessibilityUtils = AccessibilityUtils.getInstance(); - setView(keyboardView); - } - - /** - * Sets the keyboard view represented by this node provider. - * - * @param keyboardView The keyboard view to represent. - */ - public void setView(final KeyboardView keyboardView) { mKeyboardView = keyboardView; - updateParentLocation(); + mDelegate = delegate; // Since this class is constructed lazily, we might not get a subsequent // call to setKeyboard() and therefore need to call it now. - setKeyboard(); + setKeyboard(keyboardView.getKeyboard()); } /** * Sets the keyboard represented by this node provider. + * + * @param keyboard The keyboard that is being set to the keyboard view. */ - public void setKeyboard() { - assignVirtualViewIds(); + public void setKeyboard(final Keyboard keyboard) { + mKeyboard = keyboard; + } + + private Key getKeyOf(final int virtualViewId) { + if (mKeyboard == null) { + return null; + } + final List<Key> sortedKeys = mKeyboard.getSortedKeys(); + // Use a virtual view id as an index of the sorted keys list. + if (virtualViewId >= 0 && virtualViewId < sortedKeys.size()) { + return sortedKeys.get(virtualViewId); + } + return null; + } + + private int getVirtualViewIdOf(final Key key) { + if (mKeyboard == null) { + return View.NO_ID; + } + final List<Key> sortedKeys = mKeyboard.getSortedKeys(); + final int size = sortedKeys.size(); + for (int index = 0; index < size; index++) { + if (sortedKeys.get(index) == key) { + // Use an index of the sorted keys list as a virtual view id. + return index; + } + } + return View.NO_ID; } /** @@ -112,18 +136,40 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider * @see AccessibilityEvent */ public AccessibilityEvent createAccessibilityEvent(final Key key, final int eventType) { - final int virtualViewId = generateVirtualViewIdForKey(key); + final int virtualViewId = getVirtualViewIdOf(key); final String keyDescription = getKeyDescription(key); final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); event.setPackageName(mKeyboardView.getContext().getPackageName()); event.setClassName(key.getClass().getName()); event.setContentDescription(keyDescription); event.setEnabled(true); - final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); + final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); record.setSource(mKeyboardView, virtualViewId); return event; } + public void onHoverEnterTo(final Key key) { + final int id = getVirtualViewIdOf(key); + if (id == View.NO_ID) { + return; + } + // Start hovering on the key. Because our accessibility model is lift-to-type, we should + // report the node info without click and long click actions to avoid unnecessary + // announcements. + mHoveringNodeId = id; + // Invalidate the node info of the key. + sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED); + sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER); + } + + public void onHoverExitFrom(final Key key) { + mHoveringNodeId = UNDEFINED; + // Invalidate the node info of the key to be able to revert the change we have done + // in {@link #onHoverEnterTo(Key)}. + sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED); + sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT); + } + /** * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual * view, i.e. a descendant of the host View, with the given <code>virtualViewId</code> or @@ -156,19 +202,24 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider final AccessibilityNodeInfoCompat rootInfo = AccessibilityNodeInfoCompat.obtain(mKeyboardView); ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, rootInfo); + updateParentLocation(); // Add the virtual children of the root View. - final Keyboard keyboard = mKeyboardView.getKeyboard(); - final Key[] keys = keyboard.getKeys(); - for (Key key : keys) { - final int childVirtualViewId = generateVirtualViewIdForKey(key); - rootInfo.addChild(mKeyboardView, childVirtualViewId); + final List<Key> sortedKeys = mKeyboard.getSortedKeys(); + final int size = sortedKeys.size(); + for (int index = 0; index < size; index++) { + final Key key = sortedKeys.get(index); + if (key.isSpacer()) { + continue; + } + // Use an index of the sorted keys list as a virtual view id. + rootInfo.addChild(mKeyboardView, index); } return rootInfo; } - // Find the view that corresponds to the given id. - final Key key = mVirtualViewIdToKey.get(virtualViewId); + // Find the key that corresponds to the given virtual view id. + final Key key = getKeyOf(virtualViewId); if (key == null) { Log.e(TAG, "Invalid virtual view ID: " + virtualViewId); return null; @@ -191,9 +242,16 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider info.setBoundsInScreen(boundsInScreen); info.setParent(mKeyboardView); info.setSource(mKeyboardView, virtualViewId); - info.setBoundsInScreen(boundsInScreen); - info.setEnabled(true); + info.setEnabled(key.isEnabled()); info.setVisibleToUser(true); + // Don't add ACTION_CLICK and ACTION_LONG_CLOCK actions while hovering on the key. + // See {@link #onHoverEnterTo(Key)} and {@link #onHoverExitFrom(Key)}. + if (virtualViewId != mHoveringNodeId) { + info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK); + if (key.isLongPressEnabled()) { + info.addAction(AccessibilityNodeInfoCompat.ACTION_LONG_CLICK); + } + } if (mAccessibilityFocusedView == virtualViewId) { info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS); @@ -203,35 +261,14 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider return info; } - /** - * Simulates a key press by injecting touch events into the keyboard view. - * This avoids the complexity of trackers and listeners within the keyboard. - * - * @param key The key to press. - */ - void simulateKeyPress(final Key key) { - final int x = key.getHitBox().centerX(); - final int y = key.getHitBox().centerY(); - final long downTime = SystemClock.uptimeMillis(); - final MotionEvent downEvent = MotionEvent.obtain( - downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0); - final MotionEvent upEvent = MotionEvent.obtain( - downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0); - - mKeyboardView.onTouchEvent(downEvent); - mKeyboardView.onTouchEvent(upEvent); - downEvent.recycle(); - upEvent.recycle(); - } - @Override public boolean performAction(final int virtualViewId, final int action, final Bundle arguments) { - final Key key = mVirtualViewIdToKey.get(virtualViewId); + final Key key = getKeyOf(virtualViewId); if (key == null) { return false; } - return performActionForKey(key, action, arguments); + return performActionForKey(key, action); } /** @@ -239,29 +276,28 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider * * @param key The on which to perform the action. * @param action The action to perform. - * @param arguments The action's arguments. * @return The result of performing the action, or false if the action is not supported. */ - boolean performActionForKey(final Key key, final int action, final Bundle arguments) { - final int virtualViewId = generateVirtualViewIdForKey(key); - + boolean performActionForKey(final Key key, final int action) { switch (action) { case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS: - if (mAccessibilityFocusedView == virtualViewId) { - return false; - } - mAccessibilityFocusedView = virtualViewId; + mAccessibilityFocusedView = getVirtualViewIdOf(key); sendAccessibilityEventForKey( key, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED); return true; case AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS: - if (mAccessibilityFocusedView != virtualViewId) { - return false; - } mAccessibilityFocusedView = UNDEFINED; sendAccessibilityEventForKey( key, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED); return true; + case AccessibilityNodeInfoCompat.ACTION_CLICK: + sendAccessibilityEventForKey(key, AccessibilityEvent.TYPE_VIEW_CLICKED); + mDelegate.performClickOn(key); + return true; + case AccessibilityNodeInfoCompat.ACTION_LONG_CLICK: + sendAccessibilityEventForKey(key, AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); + mDelegate.performLongClickOn(key); + return true; default: return false; } @@ -285,11 +321,11 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider * @return The context-specific description of the key. */ private String getKeyDescription(final Key key) { - final EditorInfo editorInfo = mInputMethodService.getCurrentInputEditorInfo(); + final EditorInfo editorInfo = mKeyboard.mId.mEditorInfo; final boolean shouldObscure = mAccessibilityUtils.shouldObscureInput(editorInfo); final SettingsValues currentSettings = Settings.getInstance().getCurrent(); final String keyCodeDescription = mKeyCodeDescriptionMapper.getDescriptionForKey( - mKeyboardView.getContext(), mKeyboardView.getKeyboard(), key, shouldObscure); + mKeyboardView.getContext(), mKeyboard, key, shouldObscure); if (currentSettings.isWordSeparator(key.getCode())) { return mAccessibilityUtils.getAutoCorrectionDescription( keyCodeDescription, shouldObscure); @@ -299,40 +335,9 @@ public final class AccessibilityEntityProvider extends AccessibilityNodeProvider } /** - * Assigns virtual view IDs to keyboard keys and populates the related maps. - */ - private void assignVirtualViewIds() { - final Keyboard keyboard = mKeyboardView.getKeyboard(); - if (keyboard == null) { - return; - } - mVirtualViewIdToKey.clear(); - - final Key[] keys = keyboard.getKeys(); - for (Key key : keys) { - final int virtualViewId = generateVirtualViewIdForKey(key); - mVirtualViewIdToKey.put(virtualViewId, key); - } - } - - /** * Updates the parent's on-screen location. */ private void updateParentLocation() { mKeyboardView.getLocationOnScreen(mParentLocation); } - - /** - * Generates a virtual view identifier for the given key. Returned - * identifiers are valid until the next global layout state change. - * - * @param key The key to identify. - * @return A virtual view identifier. - */ - private static int generateVirtualViewIdForKey(final Key key) { - // The key x- and y-coordinates are stable between layout changes. - // Generate an identifier by bit-shifting the x-coordinate to the - // left-half of the integer and OR'ing with the y-coordinate. - return ((0xFFFF & key.getX()) << (Integer.SIZE / 2)) | (0xFFFF & key.getY()); - } } diff --git a/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java new file mode 100644 index 000000000..b84d402fb --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2014 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.accessibility; + +import android.content.Context; +import android.graphics.Rect; +import android.os.SystemClock; +import android.util.Log; +import android.util.SparseIntArray; +import android.view.MotionEvent; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.keyboard.MainKeyboardView; +import com.android.inputmethod.keyboard.PointerTracker; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; + +/** + * This class represents a delegate that can be registered in {@link MainKeyboardView} to enhance + * accessibility support via composition rather via inheritance. + */ +public final class MainKeyboardAccessibilityDelegate + extends KeyboardAccessibilityDelegate<MainKeyboardView> + implements AccessibilityLongPressTimer.LongPressTimerCallback { + private static final String TAG = MainKeyboardAccessibilityDelegate.class.getSimpleName(); + + /** Map of keyboard modes to resource IDs. */ + private static final SparseIntArray KEYBOARD_MODE_RES_IDS = new SparseIntArray(); + + static { + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATE, R.string.keyboard_mode_date); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_DATETIME, R.string.keyboard_mode_date_time); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_EMAIL, R.string.keyboard_mode_email); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_IM, R.string.keyboard_mode_im); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_NUMBER, R.string.keyboard_mode_number); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_PHONE, R.string.keyboard_mode_phone); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TEXT, R.string.keyboard_mode_text); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_TIME, R.string.keyboard_mode_time); + KEYBOARD_MODE_RES_IDS.put(KeyboardId.MODE_URL, R.string.keyboard_mode_url); + } + + /** The most recently set keyboard mode. */ + private int mLastKeyboardMode = KEYBOARD_IS_HIDDEN; + private static final int KEYBOARD_IS_HIDDEN = -1; + // The rectangle region to ignore hover events. + private final Rect mBoundsToIgnoreHoverEvent = new Rect(); + + private final AccessibilityLongPressTimer mAccessibilityLongPressTimer; + + public MainKeyboardAccessibilityDelegate(final MainKeyboardView mainKeyboardView, + final KeyDetector keyDetector) { + super(mainKeyboardView, keyDetector); + mAccessibilityLongPressTimer = new AccessibilityLongPressTimer( + this /* callback */, mainKeyboardView.getContext()); + } + + /** + * {@inheritDoc} + */ + @Override + public void setKeyboard(final Keyboard keyboard) { + if (keyboard == null) { + return; + } + final Keyboard lastKeyboard = getKeyboard(); + super.setKeyboard(keyboard); + final int lastKeyboardMode = mLastKeyboardMode; + mLastKeyboardMode = keyboard.mId.mMode; + + // Since this method is called even when accessibility is off, make sure + // to check the state before announcing anything. + if (!AccessibilityUtils.getInstance().isAccessibilityEnabled()) { + return; + } + // Announce the language name only when the language is changed. + if (lastKeyboard == null || !keyboard.mId.mSubtype.equals(lastKeyboard.mId.mSubtype)) { + announceKeyboardLanguage(keyboard); + return; + } + // Announce the mode only when the mode is changed. + if (keyboard.mId.mMode != lastKeyboardMode) { + announceKeyboardMode(keyboard); + return; + } + // Announce the keyboard type only when the type is changed. + if (keyboard.mId.mElementId != lastKeyboard.mId.mElementId) { + announceKeyboardType(keyboard, lastKeyboard); + return; + } + } + + /** + * Called when the keyboard is hidden and accessibility is enabled. + */ + public void onHideWindow() { + announceKeyboardHidden(); + mLastKeyboardMode = KEYBOARD_IS_HIDDEN; + } + + /** + * Announces which language of keyboard is being displayed. + * + * @param keyboard The new keyboard. + */ + private void announceKeyboardLanguage(final Keyboard keyboard) { + final String languageText = SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale( + keyboard.mId.mSubtype); + sendWindowStateChanged(languageText); + } + + /** + * Announces which type of keyboard is being displayed. + * If the keyboard type is unknown, no announcement is made. + * + * @param keyboard The new keyboard. + */ + private void announceKeyboardMode(final Keyboard keyboard) { + final Context context = mKeyboardView.getContext(); + final int modeTextResId = KEYBOARD_MODE_RES_IDS.get(keyboard.mId.mMode); + if (modeTextResId == 0) { + return; + } + final String modeText = context.getString(modeTextResId); + final String text = context.getString(R.string.announce_keyboard_mode, modeText); + sendWindowStateChanged(text); + } + + /** + * Announces which type of keyboard is being displayed. + * + * @param keyboard The new keyboard. + * @param lastKeyboard The last keyboard. + */ + private void announceKeyboardType(final Keyboard keyboard, final Keyboard lastKeyboard) { + final int lastElementId = lastKeyboard.mId.mElementId; + final int resId; + switch (keyboard.mId.mElementId) { + case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED: + case KeyboardId.ELEMENT_ALPHABET: + if (lastElementId == KeyboardId.ELEMENT_ALPHABET + || lastElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) { + // Transition between alphabet mode and automatic shifted mode should be silently + // ignored because it can be determined by each key's talk back announce. + return; + } + resId = R.string.spoken_description_mode_alpha; + break; + case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED: + if (lastElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) { + // Resetting automatic shifted mode by pressing the shift key causes the transition + // from automatic shifted to manual shifted that should be silently ignored. + return; + } + resId = R.string.spoken_description_shiftmode_on; + break; + case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED: + if (lastElementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED) { + // Resetting caps locked mode by pressing the shift key causes the transition + // from shift locked to shift lock shifted that should be silently ignored. + return; + } + resId = R.string.spoken_description_shiftmode_locked; + break; + case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED: + resId = R.string.spoken_description_shiftmode_locked; + break; + case KeyboardId.ELEMENT_SYMBOLS: + resId = R.string.spoken_description_mode_symbol; + break; + case KeyboardId.ELEMENT_SYMBOLS_SHIFTED: + resId = R.string.spoken_description_mode_symbol_shift; + break; + case KeyboardId.ELEMENT_PHONE: + resId = R.string.spoken_description_mode_phone; + break; + case KeyboardId.ELEMENT_PHONE_SYMBOLS: + resId = R.string.spoken_description_mode_phone_shift; + break; + default: + return; + } + sendWindowStateChanged(resId); + } + + /** + * Announces that the keyboard has been hidden. + */ + private void announceKeyboardHidden() { + sendWindowStateChanged(R.string.announce_keyboard_hidden); + } + + @Override + public void performClickOn(final Key key) { + final int x = key.getHitBox().centerX(); + final int y = key.getHitBox().centerY(); + if (DEBUG_HOVER) { + Log.d(TAG, "performClickOn: key=" + key + + " inIgnoreBounds=" + mBoundsToIgnoreHoverEvent.contains(x, y)); + } + if (mBoundsToIgnoreHoverEvent.contains(x, y)) { + // This hover exit event points to the key that should be ignored. + // Clear the ignoring region to handle further hover events. + mBoundsToIgnoreHoverEvent.setEmpty(); + return; + } + super.performClickOn(key); + } + + @Override + protected void onHoverEnterTo(final Key key) { + final int x = key.getHitBox().centerX(); + final int y = key.getHitBox().centerY(); + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverEnterTo: key=" + key + + " inIgnoreBounds=" + mBoundsToIgnoreHoverEvent.contains(x, y)); + } + mAccessibilityLongPressTimer.cancelLongPress(); + if (mBoundsToIgnoreHoverEvent.contains(x, y)) { + return; + } + // This hover enter event points to the key that isn't in the ignoring region. + // Further hover events should be handled. + mBoundsToIgnoreHoverEvent.setEmpty(); + super.onHoverEnterTo(key); + if (key.isLongPressEnabled()) { + mAccessibilityLongPressTimer.startLongPress(key); + } + } + + @Override + protected void onHoverExitFrom(final Key key) { + final int x = key.getHitBox().centerX(); + final int y = key.getHitBox().centerY(); + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverExitFrom: key=" + key + + " inIgnoreBounds=" + mBoundsToIgnoreHoverEvent.contains(x, y)); + } + mAccessibilityLongPressTimer.cancelLongPress(); + super.onHoverExitFrom(key); + } + + @Override + public void performLongClickOn(final Key key) { + if (DEBUG_HOVER) { + Log.d(TAG, "performLongClickOn: key=" + key); + } + final PointerTracker tracker = PointerTracker.getPointerTracker(HOVER_EVENT_POINTER_ID); + final long eventTime = SystemClock.uptimeMillis(); + final int x = key.getHitBox().centerX(); + final int y = key.getHitBox().centerY(); + final MotionEvent downEvent = MotionEvent.obtain( + eventTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0 /* metaState */); + // Inject a fake down event to {@link PointerTracker} to handle a long press correctly. + tracker.processMotionEvent(downEvent, mKeyDetector); + // The above fake down event triggers an unnecessary long press timer that should be + // canceled. + tracker.cancelLongPressTimer(); + downEvent.recycle(); + // Invoke {@link MainKeyboardView#onLongPress(PointerTracker)} as if a long press timeout + // has passed. + mKeyboardView.onLongPress(tracker); + // If {@link Key#hasNoPanelAutoMoreKeys()} is true (such as "0 +" key on the phone layout) + // or a key invokes IME switcher dialog, we should just ignore the next + // {@link #onRegisterHoverKey(Key,MotionEvent)}. It can be determined by whether + // {@link PointerTracker} is in operation or not. + if (tracker.isInOperation()) { + // This long press shows a more keys keyboard and further hover events should be + // handled. + mBoundsToIgnoreHoverEvent.setEmpty(); + return; + } + // This long press has handled at {@link MainKeyboardView#onLongPress(PointerTracker)}. + // We should ignore further hover events on this key. + mBoundsToIgnoreHoverEvent.set(key.getHitBox()); + if (key.hasNoPanelAutoMoreKey()) { + // This long press has registered a code point without showing a more keys keyboard. + // We should talk back the code point if possible. + final int codePointOfNoPanelAutoMoreKey = key.getMoreKeys()[0].mCode; + final String text = KeyCodeDescriptionMapper.getInstance().getDescriptionForCodePoint( + mKeyboardView.getContext(), codePointOfNoPanelAutoMoreKey); + if (text != null) { + sendWindowStateChanged(text); + } + } + } +} diff --git a/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java new file mode 100644 index 000000000..4022da343 --- /dev/null +++ b/java/src/com/android/inputmethod/accessibility/MoreKeysKeyboardAccessibilityDelegate.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2014 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.accessibility; + +import android.graphics.Rect; +import android.util.Log; +import android.view.MotionEvent; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.MoreKeysKeyboardView; +import com.android.inputmethod.keyboard.PointerTracker; + +/** + * This class represents a delegate that can be registered in {@link MoreKeysKeyboardView} to + * enhance accessibility support via composition rather via inheritance. + */ +public class MoreKeysKeyboardAccessibilityDelegate + extends KeyboardAccessibilityDelegate<MoreKeysKeyboardView> { + private static final String TAG = MoreKeysKeyboardAccessibilityDelegate.class.getSimpleName(); + + private final Rect mMoreKeysKeyboardValidBounds = new Rect(); + private static final int CLOSING_INSET_IN_PIXEL = 1; + private int mOpenAnnounceResId; + private int mCloseAnnounceResId; + + public MoreKeysKeyboardAccessibilityDelegate(final MoreKeysKeyboardView moreKeysKeyboardView, + final KeyDetector keyDetector) { + super(moreKeysKeyboardView, keyDetector); + } + + public void setOpenAnnounce(final int resId) { + mOpenAnnounceResId = resId; + } + + public void setCloseAnnounce(final int resId) { + mCloseAnnounceResId = resId; + } + + public void onShowMoreKeysKeyboard() { + sendWindowStateChanged(mOpenAnnounceResId); + } + + public void onDismissMoreKeysKeyboard() { + sendWindowStateChanged(mCloseAnnounceResId); + } + + @Override + protected void onHoverEnter(final MotionEvent event) { + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverEnter: key=" + getHoverKeyOf(event)); + } + super.onHoverEnter(event); + final int actionIndex = event.getActionIndex(); + final int x = (int)event.getX(actionIndex); + final int y = (int)event.getY(actionIndex); + final int pointerId = event.getPointerId(actionIndex); + final long eventTime = event.getEventTime(); + mKeyboardView.onDownEvent(x, y, pointerId, eventTime); + } + + @Override + protected void onHoverMove(final MotionEvent event) { + super.onHoverMove(event); + final int actionIndex = event.getActionIndex(); + final int x = (int)event.getX(actionIndex); + final int y = (int)event.getY(actionIndex); + final int pointerId = event.getPointerId(actionIndex); + final long eventTime = event.getEventTime(); + mKeyboardView.onMoveEvent(x, y, pointerId, eventTime); + } + + @Override + protected void onHoverExit(final MotionEvent event) { + final Key lastKey = getLastHoverKey(); + if (DEBUG_HOVER) { + Log.d(TAG, "onHoverExit: key=" + getHoverKeyOf(event) + " last=" + lastKey); + } + if (lastKey != null) { + super.onHoverExitFrom(lastKey); + } + setLastHoverKey(null); + final int actionIndex = event.getActionIndex(); + final int x = (int)event.getX(actionIndex); + final int y = (int)event.getY(actionIndex); + final int pointerId = event.getPointerId(actionIndex); + final long eventTime = event.getEventTime(); + // A hover exit event at one pixel width or height area on the edges of more keys keyboard + // are treated as closing. + mMoreKeysKeyboardValidBounds.set(0, 0, mKeyboardView.getWidth(), mKeyboardView.getHeight()); + mMoreKeysKeyboardValidBounds.inset(CLOSING_INSET_IN_PIXEL, CLOSING_INSET_IN_PIXEL); + if (mMoreKeysKeyboardValidBounds.contains(x, y)) { + // Invoke {@link MoreKeysKeyboardView#onUpEvent(int,int,int,long)} as if this hover + // exit event selects a key. + mKeyboardView.onUpEvent(x, y, pointerId, eventTime); + // TODO: Should fix this reference. This is a hack to clear the state of + // {@link PointerTracker}. + PointerTracker.dismissAllMoreKeysPanels(); + return; + } + // Close the more keys keyboard. + // TODO: Should fix this reference. This is a hack to clear the state of + // {@link PointerTracker}. + PointerTracker.dismissAllMoreKeysPanels(); + } +} diff --git a/java/src/com/android/inputmethod/compat/AppWorkaroundsUtils.java b/java/src/com/android/inputmethod/compat/AppWorkaroundsUtils.java index 7e9e2e37b..6e43cc9a7 100644 --- a/java/src/com/android/inputmethod/compat/AppWorkaroundsUtils.java +++ b/java/src/com/android/inputmethod/compat/AppWorkaroundsUtils.java @@ -23,10 +23,10 @@ import android.os.Build.VERSION_CODES; * A class to encapsulate work-arounds specific to particular apps. */ public class AppWorkaroundsUtils { - private PackageInfo mPackageInfo; // May be null - private boolean mIsBrokenByRecorrection = false; + private final PackageInfo mPackageInfo; // May be null + private final boolean mIsBrokenByRecorrection; - public void setPackageInfo(final PackageInfo packageInfo) { + public AppWorkaroundsUtils(final PackageInfo packageInfo) { mPackageInfo = packageInfo; mIsBrokenByRecorrection = AppWorkaroundsHelper.evaluateIsBrokenByRecorrection( packageInfo); diff --git a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java index a80c3fefe..18b3a6060 100644 --- a/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java +++ b/java/src/com/android/inputmethod/compat/InputMethodManagerCompatWrapper.java @@ -28,6 +28,12 @@ public final class InputMethodManagerCompatWrapper { private static final Method METHOD_switchToNextInputMethod = CompatUtils.getMethod( InputMethodManager.class, "switchToNextInputMethod", IBinder.class, Boolean.TYPE); + // Note that InputMethodManager.shouldOfferSwitchingToNextInputMethod() has been introduced + // in API level 19 (Build.VERSION_CODES.KITKAT). + private static final Method METHOD_shouldOfferSwitchingToNextInputMethod = + CompatUtils.getMethod(InputMethodManager.class, + "shouldOfferSwitchingToNextInputMethod", IBinder.class); + public final InputMethodManager mImm; public InputMethodManagerCompatWrapper(final Context context) { @@ -38,4 +44,9 @@ public final class InputMethodManagerCompatWrapper { return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */, METHOD_switchToNextInputMethod, token, onlyCurrentIme); } + + public boolean shouldOfferSwitchingToNextInputMethod(final IBinder token) { + return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */, + METHOD_shouldOfferSwitchingToNextInputMethod, token); + } } diff --git a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java index 14ee654f3..81df17127 100644 --- a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java @@ -17,11 +17,12 @@ package com.android.inputmethod.compat; import android.inputmethodservice.InputMethodService; +import com.android.inputmethod.latin.define.ProductionFlag; import java.lang.reflect.Method; public final class InputMethodServiceCompatUtils { - // Note that InputMethodService.enableHardwareAcceleration() has been introduced + // Note that {@link InputMethodService#enableHardwareAcceleration} has been introduced // in API level 17 (Build.VERSION_CODES.JELLY_BEAN_MR1). private static final Method METHOD_enableHardwareAcceleration = CompatUtils.getMethod(InputMethodService.class, "enableHardwareAcceleration"); @@ -34,4 +35,30 @@ public final class InputMethodServiceCompatUtils { return (Boolean)CompatUtils.invoke(ims, false /* defaultValue */, METHOD_enableHardwareAcceleration); } + + public static void setCursorAnchorMonitorMode(final InputMethodService ims, final int mode) { + if (ProductionFlag.USES_CURSOR_ANCHOR_MONITOR) { + ExperimentalAPIUtils.setCursorAnchorMonitorMode(ims, mode); + } + } + + /* + * For unreleased APIs. ProGuard will strip this class entirely, unless used explicitly. + */ + private static final class ExperimentalAPIUtils { + // Note that {@link InputMethodManager#setCursorAnchorMonitorMode} is not yet available as + // an official API as of API level 19 (Build.VERSION_CODES.KITKAT). + private static final Method METHOD_setCursorAnchorMonitorMode = CompatUtils.getMethod( + InputMethodService.class, "setCursorAnchorMonitorMode", int.class); + + private ExperimentalAPIUtils() { + // This utility class is not publicly instantiable. + } + + public static void setCursorAnchorMonitorMode(final InputMethodService ims, + final int mode) { + CompatUtils.invoke(ims, null /* defaultValue */, + METHOD_setCursorAnchorMonitorMode, mode); + } + } } diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatUtils.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatUtils.java index b119d6c82..ee9125a07 100644 --- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatUtils.java @@ -19,7 +19,11 @@ package com.android.inputmethod.compat; import android.os.Build; import android.view.inputmethod.InputMethodSubtype; +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Constants; + import java.lang.reflect.Constructor; +import java.lang.reflect.Method; public final class InputMethodSubtypeCompatUtils { private static final String TAG = InputMethodSubtypeCompatUtils.class.getSimpleName(); @@ -37,6 +41,12 @@ public final class InputMethodSubtypeCompatUtils { } } } + + // Note that {@link InputMethodSubtype#isAsciiCapable()} has been introduced in API level 19 + // (Build.VERSION_CODE.KITKAT). + private static final Method METHOD_isAsciiCapable = CompatUtils.getMethod( + InputMethodSubtype.class, "isAsciiCapable"); + private InputMethodSubtypeCompatUtils() { // This utility class is not publicly instantiable. } @@ -53,4 +63,14 @@ public final class InputMethodSubtypeCompatUtils { nameId, iconId, locale, mode, extraValue, isAuxiliary, overridesImplicitlyEnabledSubtype, id); } + + public static boolean isAsciiCapable(final InputMethodSubtype subtype) { + return isAsciiCapableWithAPI(subtype) + || subtype.containsExtraValueKey(Constants.Subtype.ExtraValue.ASCII_CAPABLE); + } + + @UsedForTesting + public static boolean isAsciiCapableWithAPI(final InputMethodSubtype subtype) { + return (Boolean)CompatUtils.invoke(subtype, false, METHOD_isAsciiCapable); + } } diff --git a/java/src/com/android/inputmethod/compat/LocaleSpanCompatUtils.java b/java/src/com/android/inputmethod/compat/LocaleSpanCompatUtils.java new file mode 100644 index 000000000..f411f181b --- /dev/null +++ b/java/src/com/android/inputmethod/compat/LocaleSpanCompatUtils.java @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2014 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.compat; + +import android.text.Spannable; +import android.text.style.LocaleSpan; +import android.util.Log; + +import com.android.inputmethod.annotations.UsedForTesting; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Locale; + +@UsedForTesting +public final class LocaleSpanCompatUtils { + private static final String TAG = LocaleSpanCompatUtils.class.getSimpleName(); + + // Note that LocaleSpan(Locale locale) has been introduced in API level 17 + // (Build.VERSION_CODE.JELLY_BEAN_MR1). + private static Class<?> getLocaleSpanClass() { + try { + return Class.forName("android.text.style.LocaleSpan"); + } catch (ClassNotFoundException e) { + return null; + } + } + private static final Class<?> LOCALE_SPAN_TYPE; + private static final Constructor<?> LOCALE_SPAN_CONSTRUCTOR; + private static final Method LOCALE_SPAN_GET_LOCALE; + static { + LOCALE_SPAN_TYPE = getLocaleSpanClass(); + LOCALE_SPAN_CONSTRUCTOR = CompatUtils.getConstructor(LOCALE_SPAN_TYPE, Locale.class); + LOCALE_SPAN_GET_LOCALE = CompatUtils.getMethod(LOCALE_SPAN_TYPE, "getLocale"); + } + + @UsedForTesting + public static boolean isLocaleSpanAvailable() { + return (LOCALE_SPAN_CONSTRUCTOR != null && LOCALE_SPAN_GET_LOCALE != null); + } + + @UsedForTesting + public static Object newLocaleSpan(final Locale locale) { + return CompatUtils.newInstance(LOCALE_SPAN_CONSTRUCTOR, locale); + } + + @UsedForTesting + public static Locale getLocaleFromLocaleSpan(final Object localeSpan) { + return (Locale) CompatUtils.invoke(localeSpan, null, LOCALE_SPAN_GET_LOCALE); + } + + /** + * Ensures that the specified range is covered with only one {@link LocaleSpan} with the given + * locale. If the region is already covered by one or more {@link LocaleSpan}, their ranges are + * updated so that each character has only one locale. + * @param spannable the spannable object to be updated. + * @param start the start index from which {@link LocaleSpan} is attached (inclusive). + * @param end the end index to which {@link LocaleSpan} is attached (exclusive). + * @param locale the locale to be attached to the specified range. + */ + @UsedForTesting + public static void updateLocaleSpan(final Spannable spannable, final int start, + final int end, final Locale locale) { + if (end < start) { + Log.e(TAG, "Invalid range: start=" + start + " end=" + end); + return; + } + if (!isLocaleSpanAvailable()) { + return; + } + // A brief summary of our strategy; + // 1. Enumerate all LocaleSpans between [start - 1, end + 1]. + // 2. For each LocaleSpan S: + // - Update the range of S so as not to cover [start, end] if S doesn't have the + // expected locale. + // - Mark S as "to be merged" if S has the expected locale. + // 3. Merge all the LocaleSpans that are marked as "to be merged" into one LocaleSpan. + // If no appropriate span is found, create a new one with newLocaleSpan method. + final int searchStart = Math.max(start - 1, 0); + final int searchEnd = Math.min(end + 1, spannable.length()); + // LocaleSpans found in the target range. See the step 1 in the above comment. + final Object[] existingLocaleSpans = spannable.getSpans(searchStart, searchEnd, + LOCALE_SPAN_TYPE); + // LocaleSpans that are marked as "to be merged". See the step 2 in the above comment. + final ArrayList<Object> existingLocaleSpansToBeMerged = new ArrayList<>(); + boolean isStartExclusive = true; + boolean isEndExclusive = true; + int newStart = start; + int newEnd = end; + for (final Object existingLocaleSpan : existingLocaleSpans) { + final Locale attachedLocale = getLocaleFromLocaleSpan(existingLocaleSpan); + if (!locale.equals(attachedLocale)) { + // This LocaleSpan does not have the expected locale. Update its range if it has + // an intersection with the range [start, end] (the first case of the step 2 in the + // above comment). + removeLocaleSpanFromRange(existingLocaleSpan, spannable, start, end); + continue; + } + final int spanStart = spannable.getSpanStart(existingLocaleSpan); + final int spanEnd = spannable.getSpanEnd(existingLocaleSpan); + if (spanEnd < spanStart) { + Log.e(TAG, "Invalid span: spanStart=" + spanStart + " spanEnd=" + spanEnd); + continue; + } + if (spanEnd < start || end < spanStart) { + // No intersection found. + continue; + } + + // Here existingLocaleSpan has the expected locale and an intersection with the + // range [start, end] (the second case of the the step 2 in the above comment). + final int spanFlag = spannable.getSpanFlags(existingLocaleSpan); + if (spanStart < newStart) { + newStart = spanStart; + isStartExclusive = ((spanFlag & Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) == + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + if (newEnd < spanEnd) { + newEnd = spanEnd; + isEndExclusive = ((spanFlag & Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) == + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + existingLocaleSpansToBeMerged.add(existingLocaleSpan); + } + + int originalLocaleSpanFlag = 0; + Object localeSpan = null; + if (existingLocaleSpansToBeMerged.isEmpty()) { + // If there is no LocaleSpan that is marked as to be merged, create a new one. + localeSpan = newLocaleSpan(locale); + } else { + // Reuse the first LocaleSpan to avoid unnecessary object instantiation. + localeSpan = existingLocaleSpansToBeMerged.get(0); + originalLocaleSpanFlag = spannable.getSpanFlags(localeSpan); + // No need to keep other instances. + for (int i = 1; i < existingLocaleSpansToBeMerged.size(); ++i) { + spannable.removeSpan(existingLocaleSpansToBeMerged.get(i)); + } + } + final int localeSpanFlag = getSpanFlag(originalLocaleSpanFlag, isStartExclusive, + isEndExclusive); + spannable.setSpan(localeSpan, newStart, newEnd, localeSpanFlag); + } + + private static void removeLocaleSpanFromRange(final Object localeSpan, + final Spannable spannable, final int removeStart, final int removeEnd) { + if (!isLocaleSpanAvailable()) { + return; + } + final int spanStart = spannable.getSpanStart(localeSpan); + final int spanEnd = spannable.getSpanEnd(localeSpan); + if (spanStart > spanEnd) { + Log.e(TAG, "Invalid span: spanStart=" + spanStart + " spanEnd=" + spanEnd); + return; + } + if (spanEnd < removeStart) { + // spanStart < spanEnd < removeStart < removeEnd + return; + } + if (removeEnd < spanStart) { + // spanStart < removeEnd < spanStart < spanEnd + return; + } + final int spanFlags = spannable.getSpanFlags(localeSpan); + if (spanStart < removeStart) { + if (removeEnd < spanEnd) { + // spanStart < removeStart < removeEnd < spanEnd + final Locale locale = getLocaleFromLocaleSpan(localeSpan); + spannable.setSpan(localeSpan, spanStart, removeStart, spanFlags); + final Object attionalLocaleSpan = newLocaleSpan(locale); + spannable.setSpan(attionalLocaleSpan, removeEnd, spanEnd, spanFlags); + return; + } + // spanStart < removeStart < spanEnd <= removeEnd + spannable.setSpan(localeSpan, spanStart, removeStart, spanFlags); + return; + } + if (removeEnd < spanEnd) { + // removeStart <= spanStart < removeEnd < spanEnd + spannable.setSpan(localeSpan, removeEnd, spanEnd, spanFlags); + return; + } + // removeStart <= spanStart < spanEnd < removeEnd + spannable.removeSpan(localeSpan); + } + + private static int getSpanFlag(final int originalFlag, + final boolean isStartExclusive, final boolean isEndExclusive) { + return (originalFlag & ~Spannable.SPAN_POINT_MARK_MASK) | + getSpanPointMarkFlag(isStartExclusive, isEndExclusive); + } + + private static int getSpanPointMarkFlag(final boolean isStartExclusive, + final boolean isEndExclusive) { + if (isStartExclusive) { + if (isEndExclusive) { + return Spannable.SPAN_EXCLUSIVE_EXCLUSIVE; + } else { + return Spannable.SPAN_EXCLUSIVE_INCLUSIVE; + } + } else { + if (isEndExclusive) { + return Spannable.SPAN_INCLUSIVE_EXCLUSIVE; + } else { + return Spannable.SPAN_INCLUSIVE_INCLUSIVE; + } + } + } +} diff --git a/java/src/com/android/inputmethod/compat/LooperCompatUtils.java b/java/src/com/android/inputmethod/compat/LooperCompatUtils.java new file mode 100644 index 000000000..d647dbbd3 --- /dev/null +++ b/java/src/com/android/inputmethod/compat/LooperCompatUtils.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 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.compat; + +import android.os.Looper; + +import java.lang.reflect.Method; + +/** + * Helper to call Looper#quitSafely, which was introduced in API + * level 18 (Build.VERSION_CODES.JELLY_BEAN_MR2). + * + * In unit tests, we create lots of instances of LatinIME, which means we need to clean up + * some Loopers lest we leak file descriptors. In normal use on a device though, this is never + * necessary (although it does not hurt). + */ +public final class LooperCompatUtils { + private static final Method METHOD_quitSafely = CompatUtils.getMethod( + Looper.class, "quitSafely"); + + public static void quitSafely(final Looper looper) { + if (null != METHOD_quitSafely) { + CompatUtils.invoke(looper, null /* default return value */, METHOD_quitSafely); + } else { + looper.quit(); + } + } +} diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java index 55282c583..4d51821f2 100644 --- a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java +++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java @@ -25,8 +25,8 @@ import android.text.style.SuggestionSpan; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.SuggestionSpanPickedNotificationReceiver; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.lang.reflect.Field; import java.util.ArrayList; @@ -66,30 +66,30 @@ public final class SuggestionSpanUtils { } public static CharSequence getTextWithSuggestionSpan(final Context context, - final String pickedWord, final SuggestedWords suggestedWords, - final boolean dictionaryAvailable) { - if (!dictionaryAvailable || TextUtils.isEmpty(pickedWord) || suggestedWords.isEmpty() - || suggestedWords.mIsPrediction || suggestedWords.mIsPunctuationSuggestions) { + final String pickedWord, final SuggestedWords suggestedWords) { + if (TextUtils.isEmpty(pickedWord) || suggestedWords.isEmpty() + || suggestedWords.mIsPrediction || suggestedWords.isPunctuationSuggestions()) { return pickedWord; } - final Spannable spannable = new SpannableString(pickedWord); - final ArrayList<String> suggestionsList = CollectionUtils.newArrayList(); + final ArrayList<String> suggestionsList = new ArrayList<>(); for (int i = 0; i < suggestedWords.size(); ++i) { if (suggestionsList.size() >= SuggestionSpan.SUGGESTIONS_MAX_SIZE) { break; } + final SuggestedWordInfo info = suggestedWords.getInfo(i); + if (info.isKindOf(SuggestedWordInfo.KIND_PREDICTION)) { + continue; + } final String word = suggestedWords.getWord(i); if (!TextUtils.equals(pickedWord, word)) { suggestionsList.add(word.toString()); } } - - // TODO: We should avoid adding suggestion span candidates that came from the bigram - // prediction. final SuggestionSpan suggestionSpan = new SuggestionSpan(context, null /* locale */, suggestionsList.toArray(new String[suggestionsList.size()]), 0 /* flags */, SuggestionSpanPickedNotificationReceiver.class); + final Spannable spannable = new SpannableString(pickedWord); spannable.setSpan(suggestionSpan, 0, pickedWord.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spannable; } diff --git a/java/src/com/android/inputmethod/compat/UserDictionaryCompatUtils.java b/java/src/com/android/inputmethod/compat/UserDictionaryCompatUtils.java index a0d76415c..6e32e74ab 100644 --- a/java/src/com/android/inputmethod/compat/UserDictionaryCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/UserDictionaryCompatUtils.java @@ -29,8 +29,8 @@ public final class UserDictionaryCompatUtils { Context.class, String.class, Integer.TYPE, String.class, Locale.class); @SuppressWarnings("deprecation") - public static void addWord(final Context context, final String word, final int freq, - final String shortcut, final Locale locale) { + public static void addWord(final Context context, final String word, + final int freq, final String shortcut, final Locale locale) { if (hasNewerAddWord()) { CompatUtils.invoke(Words.class, null, METHOD_addWord, context, word, freq, shortcut, locale); diff --git a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java index a8fab8855..767cc423d 100644 --- a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java @@ -20,24 +20,17 @@ import android.view.View; import java.lang.reflect.Method; +// TODO: Use {@link android.support.v4.view.ViewCompat} instead of this utility class. +// Currently {@link #getPaddingEnd(View)} and {@link #setPaddingRelative(View,int,int,int,int)} +// are missing from android-support-v4 static library in KitKat SDK. public final class ViewCompatUtils { - // Note that View.LAYOUT_DIRECTION_LTR and View.LAYOUT_DIRECTION_RTL have been introduced in - // API level 17 (Build.VERSION_CODE.JELLY_BEAN_MR1). - public static final int LAYOUT_DIRECTION_LTR = (Integer)CompatUtils.getFieldValue(null, 0x0, - CompatUtils.getField(View.class, "LAYOUT_DIRECTION_LTR")); - public static final int LAYOUT_DIRECTION_RTL = (Integer)CompatUtils.getFieldValue(null, 0x1, - CompatUtils.getField(View.class, "LAYOUT_DIRECTION_RTL")); - - // Note that View.getPaddingEnd(), View.setPaddingRelative(int,int,int,int), and - // View.getLayoutDirection() have been introduced in API level 17 - // (Build.VERSION_CODE.JELLY_BEAN_MR1). + // Note that View.getPaddingEnd(), View.setPaddingRelative(int,int,int,int) have been + // introduced in API level 17 (Build.VERSION_CODE.JELLY_BEAN_MR1). private static final Method METHOD_getPaddingEnd = CompatUtils.getMethod( View.class, "getPaddingEnd"); private static final Method METHOD_setPaddingRelative = CompatUtils.getMethod( View.class, "setPaddingRelative", Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE); - private static final Method METHOD_getLayoutDirection = CompatUtils.getMethod( - View.class, "getLayoutDirection"); private ViewCompatUtils() { // This utility class is not publicly instantiable. @@ -58,11 +51,4 @@ public final class ViewCompatUtils { } CompatUtils.invoke(view, null, METHOD_setPaddingRelative, start, top, end, bottom); } - - public static int getLayoutDirection(final View view) { - if (METHOD_getLayoutDirection == null) { - return LAYOUT_DIRECTION_LTR; - } - return (Integer)CompatUtils.invoke(view, 0, METHOD_getLayoutDirection); - } } diff --git a/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java b/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java index d5e638e7e..3d294acd7 100644 --- a/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java +++ b/java/src/com/android/inputmethod/dictionarypack/ActionBatch.java @@ -16,7 +16,6 @@ package com.android.inputmethod.dictionarypack; -import android.app.DownloadManager; import android.app.DownloadManager.Request; import android.content.ContentValues; import android.content.Context; @@ -117,16 +116,11 @@ public final class ActionBatch { final ContentValues values = MetadataDbHelper.getContentValuesByWordListId(db, mWordList.mId, mWordList.mVersion); final int status = values.getAsInteger(MetadataDbHelper.STATUS_COLUMN); - final DownloadManager manager = - (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + final DownloadManagerWrapper manager = new DownloadManagerWrapper(context); if (MetadataDbHelper.STATUS_DOWNLOADING == status) { // The word list is still downloading. Cancel the download and revert the // word list status to "available". - if (null != manager) { - // DownloadManager is disabled (or not installed?). We can't cancel - there - // is nothing we can do. We still need to mark the entry as available. - manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN)); - } + manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN)); MetadataDbHelper.markEntryAsAvailable(db, mWordList.mId, mWordList.mVersion); } else if (MetadataDbHelper.STATUS_AVAILABLE != status) { // Should never happen @@ -136,9 +130,6 @@ public final class ActionBatch { // Download it. DebugLogUtils.l("Upgrade word list, downloading", mWordList.mRemoteFilename); - // TODO: if DownloadManager is disabled or not installed, download by ourselves - if (null == manager) return; - // This is an upgraded word list: we should download it. // Adding a disambiguator to circumvent a bug in older versions of DownloadManager. // DownloadManager also stupidly cuts the extension to replace with its own that it @@ -293,13 +284,8 @@ public final class ActionBatch { } // The word list is still downloading. Cancel the download and revert the // word list status to "available". - final DownloadManager manager = - (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - if (null != manager) { - // If we can't cancel the download because DownloadManager is not available, - // we still need to mark the entry as available. - manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN)); - } + final DownloadManagerWrapper manager = new DownloadManagerWrapper(context); + manager.remove(values.getAsLong(MetadataDbHelper.PENDINGID_COLUMN)); MetadataDbHelper.markEntryAsAvailable(db, mWordList.mId, mWordList.mVersion); } } @@ -338,8 +324,9 @@ public final class ActionBatch { MetadataDbHelper.TYPE_BULK, MetadataDbHelper.STATUS_AVAILABLE, mWordList.mId, mWordList.mLocale, mWordList.mDescription, null == mWordList.mLocalFilename ? "" : mWordList.mLocalFilename, - mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mChecksum, - mWordList.mFileSize, mWordList.mVersion, mWordList.mFormatVersion); + mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum, + mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion, + mWordList.mFormatVersion); PrivateLog.log("Insert 'available' record for " + mWordList.mDescription + " and locale " + mWordList.mLocale); db.insert(MetadataDbHelper.METADATA_TABLE_NAME, null, values); @@ -387,7 +374,7 @@ public final class ActionBatch { final ContentValues values = MetadataDbHelper.makeContentValues(0, MetadataDbHelper.TYPE_BULK, MetadataDbHelper.STATUS_INSTALLED, mWordList.mId, mWordList.mLocale, mWordList.mDescription, - "", mWordList.mRemoteFilename, mWordList.mLastUpdate, + "", mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum, mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion, mWordList.mFormatVersion); PrivateLog.log("Insert 'preinstalled' record for " + mWordList.mDescription @@ -429,8 +416,9 @@ public final class ActionBatch { oldValues.getAsInteger(MetadataDbHelper.STATUS_COLUMN), mWordList.mId, mWordList.mLocale, mWordList.mDescription, oldValues.getAsString(MetadataDbHelper.LOCAL_FILENAME_COLUMN), - mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mChecksum, - mWordList.mFileSize, mWordList.mVersion, mWordList.mFormatVersion); + mWordList.mRemoteFilename, mWordList.mLastUpdate, mWordList.mRawChecksum, + mWordList.mChecksum, mWordList.mFileSize, mWordList.mVersion, + mWordList.mFormatVersion); PrivateLog.log("Updating record for " + mWordList.mDescription + " and locale " + mWordList.mLocale); db.update(MetadataDbHelper.METADATA_TABLE_NAME, values, @@ -611,7 +599,7 @@ public final class ActionBatch { private final Queue<Action> mActions; public ActionBatch() { - mActions = new LinkedList<Action>(); + mActions = new LinkedList<>(); } public void add(final Action a) { diff --git a/java/src/com/android/inputmethod/dictionarypack/CommonPreferences.java b/java/src/com/android/inputmethod/dictionarypack/CommonPreferences.java index 7c27e6d51..3d0e29ed0 100644 --- a/java/src/com/android/inputmethod/dictionarypack/CommonPreferences.java +++ b/java/src/com/android/inputmethod/dictionarypack/CommonPreferences.java @@ -23,7 +23,7 @@ public final class CommonPreferences { private static final String COMMON_PREFERENCES_NAME = "LatinImeDictPrefs"; public static SharedPreferences getCommonPreferences(final Context context) { - return context.getSharedPreferences(COMMON_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); + return context.getSharedPreferences(COMMON_PREFERENCES_NAME, 0); } public static void enable(final SharedPreferences pref, final String id) { diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java index 88b5032e3..1d84e5888 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java @@ -29,7 +29,6 @@ import android.view.View; import android.widget.ProgressBar; public class DictionaryDownloadProgressBar extends ProgressBar { - @SuppressWarnings("unused") private static final String TAG = DictionaryDownloadProgressBar.class.getSimpleName(); private static final int NOT_A_DOWNLOADMANAGER_PENDING_ID = 0; @@ -100,32 +99,28 @@ public class DictionaryDownloadProgressBar extends ProgressBar { @Override protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); mIsCurrentlyAttachedToWindow = false; updateReporterThreadRunningStatusAccordingToVisibility(); } private class UpdaterThread extends Thread { private final static int REPORT_PERIOD = 150; // how often to report progress, in ms - final DownloadManager mDownloadManager; + final DownloadManagerWrapper mDownloadManagerWrapper; final int mId; public UpdaterThread(final Context context, final int id) { super(); - mDownloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + mDownloadManagerWrapper = new DownloadManagerWrapper(context); mId = id; } @Override public void run() { try { - // It's almost impossible that mDownloadManager is null (it would mean it has been - // disabled between pressing the 'install' button and displaying the progress - // bar), but just in case. - if (null == mDownloadManager) return; final UpdateHelper updateHelper = new UpdateHelper(); final Query query = new Query().setFilterById(mId); - int lastProgress = 0; setIndeterminate(true); while (!isInterrupted()) { - final Cursor cursor = mDownloadManager.query(query); + final Cursor cursor = mDownloadManagerWrapper.query(query); if (null == cursor) { // Can't contact DownloadManager: this should never happen. return; diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java index 13c07de35..8e026171d 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java @@ -18,8 +18,6 @@ package com.android.inputmethod.dictionarypack; import android.view.View; -import com.android.inputmethod.latin.utils.CollectionUtils; - import java.util.ArrayList; import java.util.HashMap; @@ -39,8 +37,8 @@ public class DictionaryListInterfaceState { public int mStatus = MetadataDbHelper.STATUS_UNKNOWN; } - private HashMap<String, State> mWordlistToState = CollectionUtils.newHashMap(); - private ArrayList<View> mViewCache = CollectionUtils.newArrayList(); + private HashMap<String, State> mWordlistToState = new HashMap<>(); + private ArrayList<View> mViewCache = new ArrayList<>(); public boolean isOpen(final String wordlistId) { final State state = mWordlistToState.get(wordlistId); diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java index 1d9b9991e..f5bd84c8c 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java @@ -89,10 +89,13 @@ public final class DictionaryProvider extends ContentProvider { private static final class WordListInfo { public final String mId; public final String mLocale; + public final String mRawChecksum; public final int mMatchLevel; - public WordListInfo(final String id, final String locale, final int matchLevel) { + public WordListInfo(final String id, final String locale, final String rawChecksum, + final int matchLevel) { mId = id; mLocale = locale; + mRawChecksum = rawChecksum; mMatchLevel = matchLevel; } } @@ -106,7 +109,8 @@ public final class DictionaryProvider extends ContentProvider { private static final class ResourcePathCursor extends AbstractCursor { // Column names for the cursor returned by this content provider. - static private final String[] columnNames = { "id", "locale" }; + static private final String[] columnNames = { MetadataDbHelper.WORDLISTID_COLUMN, + MetadataDbHelper.LOCALE_COLUMN, MetadataDbHelper.RAW_CHECKSUM_COLUMN }; // The list of word lists served by this provider that match the client request. final WordListInfo[] mWordLists; @@ -141,6 +145,7 @@ public final class DictionaryProvider extends ContentProvider { switch (column) { case 0: return mWordLists[mPos].mId; case 1: return mWordLists[mPos].mLocale; + case 2: return mWordLists[mPos].mRawChecksum; default : return null; } } @@ -350,12 +355,15 @@ public final class DictionaryProvider extends ContentProvider { clientId); if (null == results) { return Collections.<WordListInfo>emptyList(); - } else { - final HashMap<String, WordListInfo> dicts = new HashMap<String, WordListInfo>(); + } + try { + final HashMap<String, WordListInfo> dicts = new HashMap<>(); final int idIndex = results.getColumnIndex(MetadataDbHelper.WORDLISTID_COLUMN); final int localeIndex = results.getColumnIndex(MetadataDbHelper.LOCALE_COLUMN); final int localFileNameIndex = results.getColumnIndex(MetadataDbHelper.LOCAL_FILENAME_COLUMN); + final int rawChecksumIndex = + results.getColumnIndex(MetadataDbHelper.RAW_CHECKSUM_COLUMN); final int statusIndex = results.getColumnIndex(MetadataDbHelper.STATUS_COLUMN); if (results.moveToFirst()) { do { @@ -378,6 +386,7 @@ public final class DictionaryProvider extends ContentProvider { } final String wordListLocale = results.getString(localeIndex); final String wordListLocalFilename = results.getString(localFileNameIndex); + final String wordListRawChecksum = results.getString(rawChecksumIndex); final int wordListStatus = results.getInt(statusIndex); // Test the requested locale against this wordlist locale. The requested locale // has to either match exactly or be more specific than the dictionary - a @@ -411,13 +420,14 @@ public final class DictionaryProvider extends ContentProvider { final WordListInfo currentBestMatch = dicts.get(wordListCategory); if (null == currentBestMatch || currentBestMatch.mMatchLevel < matchLevel) { - dicts.put(wordListCategory, - new WordListInfo(wordListId, wordListLocale, matchLevel)); + dicts.put(wordListCategory, new WordListInfo(wordListId, wordListLocale, + wordListRawChecksum, matchLevel)); } } while (results.moveToNext()); } - results.close(); return Collections.unmodifiableCollection(dicts.values()); + } finally { + results.close(); } } diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java index 7bbd041e7..11982fa65 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java @@ -33,13 +33,13 @@ import android.preference.PreferenceGroup; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; -import android.view.animation.AnimationUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.animation.AnimationUtils; import com.android.inputmethod.latin.R; @@ -67,8 +67,8 @@ public final class DictionarySettingsFragment extends PreferenceFragment private boolean mChangedSettings; private DictionaryListInterfaceState mDictionaryListInterfaceState = new DictionaryListInterfaceState(); - private TreeMap<String, WordListPreference> mCurrentPreferenceMap = - new TreeMap<String, WordListPreference>(); // never null + // never null + private TreeMap<String, WordListPreference> mCurrentPreferenceMap = new TreeMap<>(); private final BroadcastReceiver mConnectivityChangedReceiver = new BroadcastReceiver() { @Override @@ -280,62 +280,72 @@ public final class DictionarySettingsFragment extends PreferenceFragment : activity.getContentResolver().query(contentUri, null, null, null, null); if (null == cursor) { - final ArrayList<Preference> result = new ArrayList<Preference>(); + final ArrayList<Preference> result = new ArrayList<>(); result.add(createErrorMessage(activity, R.string.cannot_connect_to_dict_service)); return result; - } else if (!cursor.moveToFirst()) { - final ArrayList<Preference> result = new ArrayList<Preference>(); - result.add(createErrorMessage(activity, R.string.no_dictionaries_available)); - cursor.close(); - return result; - } else { - final String systemLocaleString = Locale.getDefault().toString(); - final TreeMap<String, WordListPreference> prefMap = - new TreeMap<String, WordListPreference>(); - final int idIndex = cursor.getColumnIndex(MetadataDbHelper.WORDLISTID_COLUMN); - final int versionIndex = cursor.getColumnIndex(MetadataDbHelper.VERSION_COLUMN); - final int localeIndex = cursor.getColumnIndex(MetadataDbHelper.LOCALE_COLUMN); - final int descriptionIndex = cursor.getColumnIndex(MetadataDbHelper.DESCRIPTION_COLUMN); - final int statusIndex = cursor.getColumnIndex(MetadataDbHelper.STATUS_COLUMN); - final int filesizeIndex = cursor.getColumnIndex(MetadataDbHelper.FILESIZE_COLUMN); - do { - final String wordlistId = cursor.getString(idIndex); - final int version = cursor.getInt(versionIndex); - final String localeString = cursor.getString(localeIndex); - final Locale locale = new Locale(localeString); - final String description = cursor.getString(descriptionIndex); - final int status = cursor.getInt(statusIndex); - final int matchLevel = LocaleUtils.getMatchLevel(systemLocaleString, localeString); - final String matchLevelString = LocaleUtils.getMatchLevelSortedString(matchLevel); - final int filesize = cursor.getInt(filesizeIndex); - // The key is sorted in lexicographic order, according to the match level, then - // the description. - final String key = matchLevelString + "." + description + "." + wordlistId; - final WordListPreference existingPref = prefMap.get(key); - if (null == existingPref || existingPref.hasPriorityOver(status)) { - final WordListPreference oldPreference = mCurrentPreferenceMap.get(key); - final WordListPreference pref; - if (null != oldPreference - && oldPreference.mVersion == version - && oldPreference.mLocale.equals(locale)) { - // If the old preference has all the new attributes, reuse it. We test - // for version and locale because although attributes other than status - // need to be the same, others have been tested through the key of the - // map. Also, status may differ so we don't want to use #equals() here. - pref = oldPreference; - pref.setStatus(status); - } else { - // Otherwise, discard it and create a new one instead. - pref = new WordListPreference(activity, mDictionaryListInterfaceState, - mClientId, wordlistId, version, locale, description, status, - filesize); + } + try { + if (!cursor.moveToFirst()) { + final ArrayList<Preference> result = new ArrayList<>(); + result.add(createErrorMessage(activity, R.string.no_dictionaries_available)); + return result; + } else { + final String systemLocaleString = Locale.getDefault().toString(); + final TreeMap<String, WordListPreference> prefMap = new TreeMap<>(); + final int idIndex = cursor.getColumnIndex(MetadataDbHelper.WORDLISTID_COLUMN); + final int versionIndex = cursor.getColumnIndex(MetadataDbHelper.VERSION_COLUMN); + final int localeIndex = cursor.getColumnIndex(MetadataDbHelper.LOCALE_COLUMN); + final int descriptionIndex = + cursor.getColumnIndex(MetadataDbHelper.DESCRIPTION_COLUMN); + final int statusIndex = cursor.getColumnIndex(MetadataDbHelper.STATUS_COLUMN); + final int filesizeIndex = cursor.getColumnIndex(MetadataDbHelper.FILESIZE_COLUMN); + do { + final String wordlistId = cursor.getString(idIndex); + final int version = cursor.getInt(versionIndex); + final String localeString = cursor.getString(localeIndex); + final Locale locale = new Locale(localeString); + final String description = cursor.getString(descriptionIndex); + final int status = cursor.getInt(statusIndex); + final int matchLevel = + LocaleUtils.getMatchLevel(systemLocaleString, localeString); + final String matchLevelString = + LocaleUtils.getMatchLevelSortedString(matchLevel); + final int filesize = cursor.getInt(filesizeIndex); + // The key is sorted in lexicographic order, according to the match level, then + // the description. + final String key = matchLevelString + "." + description + "." + wordlistId; + final WordListPreference existingPref = prefMap.get(key); + if (null == existingPref || existingPref.hasPriorityOver(status)) { + final WordListPreference oldPreference = mCurrentPreferenceMap.get(key); + final WordListPreference pref; + if (null != oldPreference + && oldPreference.mVersion == version + && oldPreference.hasStatus(status) + && oldPreference.mLocale.equals(locale)) { + // If the old preference has all the new attributes, reuse it. Ideally, + // we should reuse the old pref even if its status is different and call + // setStatus here, but setStatus calls Preference#setSummary() which + // needs to be done on the UI thread and we're not on the UI thread + // here. We could do all this work on the UI thread, but in this case + // it's probably lighter to stay on a background thread and throw this + // old preference out. + pref = oldPreference; + } else { + // Otherwise, discard it and create a new one instead. + // TODO: when the status is different from the old one, we need to + // animate the old one out before animating the new one in. + pref = new WordListPreference(activity, mDictionaryListInterfaceState, + mClientId, wordlistId, version, locale, description, status, + filesize); + } + prefMap.put(key, pref); } - prefMap.put(key, pref); - } - } while (cursor.moveToNext()); + } while (cursor.moveToNext()); + mCurrentPreferenceMap = prefMap; + return prefMap.values(); + } + } finally { cursor.close(); - mCurrentPreferenceMap = prefMap; - return prefMap.values(); } } diff --git a/java/src/com/android/inputmethod/dictionarypack/DownloadManagerWrapper.java b/java/src/com/android/inputmethod/dictionarypack/DownloadManagerWrapper.java new file mode 100644 index 000000000..75cc7d4cb --- /dev/null +++ b/java/src/com/android/inputmethod/dictionarypack/DownloadManagerWrapper.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2014 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.dictionarypack; + +import android.app.DownloadManager; +import android.app.DownloadManager.Query; +import android.app.DownloadManager.Request; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteException; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import java.io.FileNotFoundException; + +/** + * A class to help with calling DownloadManager methods. + * + * Mostly, the problem here is that most methods from DownloadManager may throw SQL exceptions if + * they can't open the database on disk. We want to avoid crashing in these cases but can't do + * much more, so this class insulates the callers from these. SQLiteException also inherit from + * RuntimeException so they are unchecked :( + * While we're at it, we also insulate callers from the cases where DownloadManager is disabled, + * and getSystemService returns null. + */ +public class DownloadManagerWrapper { + private final static String TAG = DownloadManagerWrapper.class.getSimpleName(); + private final DownloadManager mDownloadManager; + + public DownloadManagerWrapper(final Context context) { + this((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)); + } + + private DownloadManagerWrapper(final DownloadManager downloadManager) { + mDownloadManager = downloadManager; + } + + public void remove(final long... ids) { + try { + if (null != mDownloadManager) { + mDownloadManager.remove(ids); + } + } catch (SQLiteException e) { + // We couldn't remove the file from DownloadManager. Apparently, the database can't + // be opened. It may be a problem with file system corruption. In any case, there is + // not much we can do apart from avoiding crashing. + Log.e(TAG, "Can't remove files with ID " + ids + " from download manager", e); + } catch (IllegalArgumentException e) { + // Not sure how this can happen, but it could be another case where the provider + // is disabled. Or it could be a bug in older versions of the framework. + Log.e(TAG, "Can't find the content URL for DownloadManager?", e); + } + } + + public ParcelFileDescriptor openDownloadedFile(final long fileId) throws FileNotFoundException { + try { + if (null != mDownloadManager) { + return mDownloadManager.openDownloadedFile(fileId); + } + } catch (SQLiteException e) { + Log.e(TAG, "Can't open downloaded file with ID " + fileId, e); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Can't find the content URL for DownloadManager?", e); + } + // We come here if mDownloadManager is null or if an exception was thrown. + throw new FileNotFoundException(); + } + + public Cursor query(final Query query) { + try { + if (null != mDownloadManager) { + return mDownloadManager.query(query); + } + } catch (SQLiteException e) { + Log.e(TAG, "Can't query the download manager", e); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Can't find the content URL for DownloadManager?", e); + } + // We come here if mDownloadManager is null or if an exception was thrown. + return null; + } + + public long enqueue(final Request request) { + try { + if (null != mDownloadManager) { + return mDownloadManager.enqueue(request); + } + } catch (SQLiteException e) { + Log.e(TAG, "Can't enqueue a request with the download manager", e); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Can't find the content URL for DownloadManager?", e); + } + return 0; + } +} diff --git a/java/src/com/android/inputmethod/dictionarypack/LocaleUtils.java b/java/src/com/android/inputmethod/dictionarypack/LocaleUtils.java index 77f67b8a3..4f0805c5c 100644 --- a/java/src/com/android/inputmethod/dictionarypack/LocaleUtils.java +++ b/java/src/com/android/inputmethod/dictionarypack/LocaleUtils.java @@ -175,7 +175,7 @@ public final class LocaleUtils { return saveLocale; } - private static final HashMap<String, Locale> sLocaleCache = new HashMap<String, Locale>(); + private static final HashMap<String, Locale> sLocaleCache = new HashMap<>(); /** * Creates a locale from a string specification. diff --git a/java/src/com/android/inputmethod/dictionarypack/MD5Calculator.java b/java/src/com/android/inputmethod/dictionarypack/MD5Calculator.java index e47e86e4b..ccd054c84 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MD5Calculator.java +++ b/java/src/com/android/inputmethod/dictionarypack/MD5Calculator.java @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.IOException; import java.security.MessageDigest; -final class MD5Calculator { +public final class MD5Calculator { private MD5Calculator() {} // This helper class is not instantiable public static String checksum(final InputStream in) throws IOException { diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java index ff5aba6d8..17dd781d5 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java @@ -20,6 +20,7 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.text.TextUtils; import android.util.Log; @@ -45,10 +46,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper { // This is the first released version of the database that implements CLIENTID. It is // used to identify the versions for upgrades. This should never change going forward. private static final int METADATA_DATABASE_VERSION_WITH_CLIENTID = 6; - // This is the current database version. It should be updated when the database schema - // gets updated. It is passed to the framework constructor of SQLiteOpenHelper, so - // that's what the framework uses to track our database version. - private static final int METADATA_DATABASE_VERSION = 6; + // The current database version. + private static final int CURRENT_METADATA_DATABASE_VERSION = 9; private final static long NOT_A_DOWNLOAD_ID = -1; @@ -68,7 +67,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper { public static final String VERSION_COLUMN = "version"; public static final String FORMATVERSION_COLUMN = "formatversion"; public static final String FLAGS_COLUMN = "flags"; - public static final int COLUMN_COUNT = 13; + public static final String RAW_CHECKSUM_COLUMN = "rawChecksum"; + public static final int COLUMN_COUNT = 14; private static final String CLIENT_CLIENT_ID_COLUMN = "clientid"; private static final String CLIENT_METADATA_URI_COLUMN = "uri"; @@ -121,8 +121,9 @@ public class MetadataDbHelper extends SQLiteOpenHelper { + CHECKSUM_COLUMN + " TEXT, " + FILESIZE_COLUMN + " INTEGER, " + VERSION_COLUMN + " INTEGER," - + FORMATVERSION_COLUMN + " INTEGER," - + FLAGS_COLUMN + " INTEGER," + + FORMATVERSION_COLUMN + " INTEGER, " + + FLAGS_COLUMN + " INTEGER, " + + RAW_CHECKSUM_COLUMN + " TEXT," + "PRIMARY KEY (" + WORDLISTID_COLUMN + "," + VERSION_COLUMN + "));"; private static final String METADATA_CREATE_CLIENT_TABLE = "CREATE TABLE IF NOT EXISTS " + CLIENT_TABLE_NAME + " (" @@ -138,7 +139,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper { static final String[] METADATA_TABLE_COLUMNS = { PENDINGID_COLUMN, TYPE_COLUMN, STATUS_COLUMN, WORDLISTID_COLUMN, LOCALE_COLUMN, DESCRIPTION_COLUMN, LOCAL_FILENAME_COLUMN, REMOTE_FILENAME_COLUMN, DATE_COLUMN, CHECKSUM_COLUMN, - FILESIZE_COLUMN, VERSION_COLUMN, FORMATVERSION_COLUMN, FLAGS_COLUMN }; + FILESIZE_COLUMN, VERSION_COLUMN, FORMATVERSION_COLUMN, FLAGS_COLUMN, + RAW_CHECKSUM_COLUMN }; // List of all client table columns. static final String[] CLIENT_TABLE_COLUMNS = { CLIENT_CLIENT_ID_COLUMN, CLIENT_METADATA_URI_COLUMN, CLIENT_PENDINGID_COLUMN, FLAGS_COLUMN }; @@ -158,7 +160,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { // this legacy database. New clients should make sure to always pass a client ID so as // to avoid conflicts. final String clientId = null != clientIdOrNull ? clientIdOrNull : ""; - if (null == sInstanceMap) sInstanceMap = new TreeMap<String, MetadataDbHelper>(); + if (null == sInstanceMap) sInstanceMap = new TreeMap<>(); MetadataDbHelper helper = sInstanceMap.get(clientId); if (null == helper) { helper = new MetadataDbHelper(context, clientId); @@ -169,7 +171,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { private MetadataDbHelper(final Context context, final String clientId) { super(context, METADATA_DATABASE_NAME_STEM + (TextUtils.isEmpty(clientId) ? "" : "." + clientId), - null, METADATA_DATABASE_VERSION); + null, CURRENT_METADATA_DATABASE_VERSION); mContext = context; mClientId = clientId; } @@ -217,28 +219,68 @@ public class MetadataDbHelper extends SQLiteOpenHelper { createClientTable(db); } + private void addRawChecksumColumnUnlessPresent(final SQLiteDatabase db, final String clientId) { + try { + db.execSQL("SELECT " + RAW_CHECKSUM_COLUMN + " FROM " + + METADATA_TABLE_NAME + " LIMIT 0;"); + } catch (SQLiteException e) { + Log.i(TAG, "No " + RAW_CHECKSUM_COLUMN + " column : creating it"); + db.execSQL("ALTER TABLE " + METADATA_TABLE_NAME + " ADD COLUMN " + + RAW_CHECKSUM_COLUMN + " TEXT;"); + } + } + /** * Upgrade the database. Upgrade from version 3 is supported. + * Version 3 has a DB named METADATA_DATABASE_NAME_STEM containing a table METADATA_TABLE_NAME. + * Version 6 and above has a DB named METADATA_DATABASE_NAME_STEM containing a + * table CLIENT_TABLE_NAME, and for each client a table called METADATA_TABLE_STEM + "." + the + * name of the client and contains a table METADATA_TABLE_NAME. + * For schemas, see the above create statements. The schemas have never changed so far. + * + * This method is called by the framework. See {@link SQLiteOpenHelper#onUpgrade} + * @param db The database we are upgrading + * @param oldVersion The old database version (the one on the disk) + * @param newVersion The new database version as supplied to the constructor of SQLiteOpenHelper */ @Override public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { if (METADATA_DATABASE_INITIAL_VERSION == oldVersion - && METADATA_DATABASE_VERSION_WITH_CLIENTID == newVersion) { + && METADATA_DATABASE_VERSION_WITH_CLIENTID <= newVersion + && CURRENT_METADATA_DATABASE_VERSION >= newVersion) { // Upgrade from version METADATA_DATABASE_INITIAL_VERSION to version // METADATA_DATABASE_VERSION_WITH_CLIENT_ID + // Only the default database should contain the client table, so we test for mClientId. if (TextUtils.isEmpty(mClientId)) { - // Only the default database should contain the client table. - // Anyway in version 3 only the default table existed so the emptyness + // Anyway in version 3 only the default table existed so the emptiness // test should always be true, but better check to be sure. createClientTable(db); } + } else if (METADATA_DATABASE_VERSION_WITH_CLIENTID < newVersion + && CURRENT_METADATA_DATABASE_VERSION >= newVersion) { + // Here we drop the client table, so that all clients send us their information again. + // The client table contains the URL to hit to update the available dictionaries list, + // but the info about the dictionaries themselves is stored in the table called + // METADATA_TABLE_NAME and we want to keep it, so we only drop the client table. + db.execSQL("DROP TABLE IF EXISTS " + CLIENT_TABLE_NAME); + // Only the default database should contain the client table, so we test for mClientId. + if (TextUtils.isEmpty(mClientId)) { + createClientTable(db); + } } else { - // Version 3 was the earliest version, so we should never come here. If we do, we - // have no idea what this database is, so we'd better wipe it off. + // If we're not in the above case, either we are upgrading from an earlier versionCode + // and we should wipe the database, or we are handling a version we never heard about + // (can only be a bug) so it's safer to wipe the database. db.execSQL("DROP TABLE IF EXISTS " + METADATA_TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + CLIENT_TABLE_NAME); onCreate(db); } + // A rawChecksum column that did not exist in the previous versions was added that + // corresponds to the md5 checksum of the file after decompression/decryption. This is to + // strengthen the system against corrupted dictionary files. + // The most secure way to upgrade a database is to just test for the column presence, and + // add it if it's not there. + addRawChecksumColumnUnlessPresent(db, mClientId); } /** @@ -410,7 +452,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { public static ContentValues makeContentValues(final int pendingId, final int type, final int status, final String wordlistId, final String locale, final String description, final String filename, final String url, final long date, - final String checksum, final long filesize, final int version, + final String rawChecksum, final String checksum, final long filesize, final int version, final int formatVersion) { final ContentValues result = new ContentValues(COLUMN_COUNT); result.put(PENDINGID_COLUMN, pendingId); @@ -422,6 +464,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { result.put(LOCAL_FILENAME_COLUMN, filename); result.put(REMOTE_FILENAME_COLUMN, url); result.put(DATE_COLUMN, date); + result.put(RAW_CHECKSUM_COLUMN, rawChecksum); result.put(CHECKSUM_COLUMN, checksum); result.put(FILESIZE_COLUMN, filesize); result.put(VERSION_COLUMN, version); @@ -457,6 +500,8 @@ public class MetadataDbHelper extends SQLiteOpenHelper { if (null == result.get(REMOTE_FILENAME_COLUMN)) result.put(REMOTE_FILENAME_COLUMN, ""); // 0 for the update date : 1970/1/1. Unless specified. if (null == result.get(DATE_COLUMN)) result.put(DATE_COLUMN, 0); + // Raw checksum unknown unless specified + if (null == result.get(RAW_CHECKSUM_COLUMN)) result.put(RAW_CHECKSUM_COLUMN, ""); // Checksum unknown unless specified if (null == result.get(CHECKSUM_COLUMN)) result.put(CHECKSUM_COLUMN, ""); // No filesize unless specified @@ -504,6 +549,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { putStringResult(result, cursor, LOCAL_FILENAME_COLUMN); putStringResult(result, cursor, REMOTE_FILENAME_COLUMN); putIntResult(result, cursor, DATE_COLUMN); + putStringResult(result, cursor, RAW_CHECKSUM_COLUMN); putStringResult(result, cursor, CHECKSUM_COLUMN); putIntResult(result, cursor, FILESIZE_COLUMN); putIntResult(result, cursor, VERSION_COLUMN); @@ -533,12 +579,17 @@ public class MetadataDbHelper extends SQLiteOpenHelper { PENDINGID_COLUMN + "= ?", new String[] { Long.toString(id) }, null, null, null); - // There should never be more than one result. If because of some bug there are, returning - // only one result is the right thing to do, because we couldn't handle several anyway - // and we should still handle one. - final ContentValues result = getFirstLineAsContentValues(cursor); - cursor.close(); - return result; + if (null == cursor) { + return null; + } + try { + // There should never be more than one result. If because of some bug there are, + // returning only one result is the right thing to do, because we couldn't handle + // several anyway and we should still handle one. + return getFirstLineAsContentValues(cursor); + } finally { + cursor.close(); + } } /** @@ -559,11 +610,16 @@ public class MetadataDbHelper extends SQLiteOpenHelper { new String[] { id, Integer.toString(STATUS_INSTALLED), Integer.toString(STATUS_DELETING) }, null, null, null); - // There should only be one result, but if there are several, we can't tell which - // is the best, so we just return the first one. - final ContentValues result = getFirstLineAsContentValues(cursor); - cursor.close(); - return result; + if (null == cursor) { + return null; + } + try { + // There should only be one result, but if there are several, we can't tell which + // is the best, so we just return the first one. + return getFirstLineAsContentValues(cursor); + } finally { + cursor.close(); + } } /** @@ -583,7 +639,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { public static ArrayList<DownloadRecord> getDownloadRecordsForDownloadId(final Context context, final long downloadId) { final SQLiteDatabase defaultDb = getDb(context, ""); - final ArrayList<DownloadRecord> results = new ArrayList<DownloadRecord>(); + final ArrayList<DownloadRecord> results = new ArrayList<>(); final Cursor cursor = defaultDb.query(CLIENT_TABLE_NAME, CLIENT_TABLE_COLUMNS, null, null, null, null, null); try { @@ -622,10 +678,15 @@ public class MetadataDbHelper extends SQLiteOpenHelper { METADATA_TABLE_COLUMNS, WORDLISTID_COLUMN + "= ? AND " + VERSION_COLUMN + "= ?", new String[] { id, Integer.toString(version) }, null, null, null); - // This is a lookup by primary key, so there can't be more than one result. - final ContentValues result = getFirstLineAsContentValues(cursor); - cursor.close(); - return result; + if (null == cursor) { + return null; + } + try { + // This is a lookup by primary key, so there can't be more than one result. + return getFirstLineAsContentValues(cursor); + } finally { + cursor.close(); + } } /** @@ -641,10 +702,15 @@ public class MetadataDbHelper extends SQLiteOpenHelper { METADATA_TABLE_COLUMNS, WORDLISTID_COLUMN + "= ?", new String[] { id }, null, null, VERSION_COLUMN + " DESC", "1"); - // This is a lookup by primary key, so there can't be more than one result. - final ContentValues result = getFirstLineAsContentValues(cursor); - cursor.close(); - return result; + if (null == cursor) { + return null; + } + try { + // This is a lookup by primary key, so there can't be more than one result. + return getFirstLineAsContentValues(cursor); + } finally { + cursor.close(); + } } /** @@ -857,7 +923,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { // - Remove the old entry from the table // - Erase the old file // We start by gathering the names of the files we should delete. - final List<String> filenames = new LinkedList<String>(); + final List<String> filenames = new LinkedList<>(); final Cursor c = db.query(METADATA_TABLE_NAME, new String[] { LOCAL_FILENAME_COLUMN }, LOCALE_COLUMN + " = ? AND " + diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java index a0147b6d6..d66b69050 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java @@ -43,9 +43,8 @@ public class MetadataHandler { * @return the constructed list of wordlist metadata. */ private static List<WordListMetadata> makeMetadataObject(final Cursor results) { - final ArrayList<WordListMetadata> buildingMetadata = new ArrayList<WordListMetadata>(); - - if (results.moveToFirst()) { + final ArrayList<WordListMetadata> buildingMetadata = new ArrayList<>(); + if (null != results && results.moveToFirst()) { final int localeColumn = results.getColumnIndex(MetadataDbHelper.LOCALE_COLUMN); final int typeColumn = results.getColumnIndex(MetadataDbHelper.TYPE_COLUMN); final int descriptionColumn = @@ -53,6 +52,8 @@ public class MetadataHandler { final int idIndex = results.getColumnIndex(MetadataDbHelper.WORDLISTID_COLUMN); final int updateIndex = results.getColumnIndex(MetadataDbHelper.DATE_COLUMN); final int fileSizeIndex = results.getColumnIndex(MetadataDbHelper.FILESIZE_COLUMN); + final int rawChecksumIndex = + results.getColumnIndex(MetadataDbHelper.RAW_CHECKSUM_COLUMN); final int checksumIndex = results.getColumnIndex(MetadataDbHelper.CHECKSUM_COLUMN); final int localFilenameIndex = results.getColumnIndex(MetadataDbHelper.LOCAL_FILENAME_COLUMN); @@ -61,13 +62,13 @@ public class MetadataHandler { final int versionIndex = results.getColumnIndex(MetadataDbHelper.VERSION_COLUMN); final int formatVersionIndex = results.getColumnIndex(MetadataDbHelper.FORMATVERSION_COLUMN); - do { buildingMetadata.add(new WordListMetadata(results.getString(idIndex), results.getInt(typeColumn), results.getString(descriptionColumn), results.getLong(updateIndex), results.getLong(fileSizeIndex), + results.getString(rawChecksumIndex), results.getString(checksumIndex), results.getString(localFilenameIndex), results.getString(remoteFilenameIndex), @@ -75,8 +76,6 @@ public class MetadataHandler { results.getInt(formatVersionIndex), 0, results.getString(localeColumn))); } while (results.moveToNext()); - - results.close(); } return Collections.unmodifiableList(buildingMetadata); } @@ -92,9 +91,14 @@ public class MetadataHandler { // If clientId is null, we get a cursor on the default database (see // MetadataDbHelper#getInstance() for more on this) final Cursor results = MetadataDbHelper.queryCurrentMetadata(context, clientId); - final List<WordListMetadata> resultList = makeMetadataObject(results); - results.close(); - return resultList; + // If null, we should return makeMetadataObject(null), so we go through. + try { + return makeMetadataObject(results); + } finally { + if (null != results) { + results.close(); + } + } } /** diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java index 27670fddf..52290cadc 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java @@ -37,6 +37,7 @@ public class MetadataParser { private static final String DESCRIPTION_FIELD_NAME = MetadataDbHelper.DESCRIPTION_COLUMN; private static final String UPDATE_FIELD_NAME = "update"; private static final String FILESIZE_FIELD_NAME = MetadataDbHelper.FILESIZE_COLUMN; + private static final String RAW_CHECKSUM_FIELD_NAME = MetadataDbHelper.RAW_CHECKSUM_COLUMN; private static final String CHECKSUM_FIELD_NAME = MetadataDbHelper.CHECKSUM_COLUMN; private static final String REMOTE_FILENAME_FIELD_NAME = MetadataDbHelper.REMOTE_FILENAME_COLUMN; @@ -51,7 +52,7 @@ public class MetadataParser { */ private static WordListMetadata parseOneWordList(final JsonReader reader) throws IOException, BadFormatException { - final TreeMap<String, String> arguments = new TreeMap<String, String>(); + final TreeMap<String, String> arguments = new TreeMap<>(); reader.beginObject(); while (reader.hasNext()) { final String name = reader.nextName(); @@ -80,6 +81,7 @@ public class MetadataParser { arguments.get(DESCRIPTION_FIELD_NAME), Long.parseLong(arguments.get(UPDATE_FIELD_NAME)), Long.parseLong(arguments.get(FILESIZE_FIELD_NAME)), + arguments.get(RAW_CHECKSUM_FIELD_NAME), arguments.get(CHECKSUM_FIELD_NAME), null, arguments.get(REMOTE_FILENAME_FIELD_NAME), @@ -98,7 +100,7 @@ public class MetadataParser { public static List<WordListMetadata> parseMetadata(final InputStreamReader input) throws IOException, BadFormatException { JsonReader reader = new JsonReader(input); - final ArrayList<WordListMetadata> readInfo = new ArrayList<WordListMetadata>(); + final ArrayList<WordListMetadata> readInfo = new ArrayList<>(); reader.beginArray(); while (reader.hasNext()) { final WordListMetadata thisMetadata = parseOneWordList(reader); diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java index 0e7c3bb7e..95a094232 100644 --- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java +++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java @@ -177,7 +177,7 @@ public final class UpdateHandler { */ public static boolean tryUpdate(final Context context, final boolean updateNow) { // TODO: loop through all clients instead of only doing the default one. - final TreeSet<String> uris = new TreeSet<String>(); + final TreeSet<String> uris = new TreeSet<>(); final Cursor cursor = MetadataDbHelper.queryClientIds(context); if (null == cursor) return false; try { @@ -249,13 +249,7 @@ public final class UpdateHandler { metadataRequest.setVisibleInDownloadsUi( res.getBoolean(R.bool.metadata_downloads_visible_in_download_UI)); - final DownloadManager manager = - (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - if (null == manager) { - // Download manager is not installed or disabled. - // TODO: fall back to self-managed download? - return; - } + final DownloadManagerWrapper manager = new DownloadManagerWrapper(context); cancelUpdateWithDownloadManager(context, metadataUri, manager); final long downloadId; synchronized (sSharedIdProtector) { @@ -278,10 +272,10 @@ public final class UpdateHandler { * * @param context the context to open the database on * @param metadataUri the URI to cancel - * @param manager an instance of DownloadManager + * @param manager an wrapped instance of DownloadManager */ private static void cancelUpdateWithDownloadManager(final Context context, - final String metadataUri, final DownloadManager manager) { + final String metadataUri, final DownloadManagerWrapper manager) { synchronized (sSharedIdProtector) { final long metadataDownloadId = MetadataDbHelper.getMetadataDownloadIdForURI(context, metadataUri); @@ -306,10 +300,9 @@ public final class UpdateHandler { * @param clientId the ID of the client we want to cancel the update of */ public static void cancelUpdate(final Context context, final String clientId) { - final DownloadManager manager = - (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + final DownloadManagerWrapper manager = new DownloadManagerWrapper(context); final String metadataUri = MetadataDbHelper.getMetadataUriAsString(context, clientId); - if (null != manager) cancelUpdateWithDownloadManager(context, metadataUri, manager); + cancelUpdateWithDownloadManager(context, metadataUri, manager); } /** @@ -323,15 +316,15 @@ public final class UpdateHandler { * download request id, which is not known before submitting the request to the download * manager. Hence, it only updates the relevant line. * - * @param manager the download manager service to register the request with. + * @param manager a wrapped download manager service to register the request with. * @param request the request to register. * @param db the metadata database. * @param id the id of the word list. * @param version the version of the word list. * @return the download id returned by the download manager. */ - public static long registerDownloadRequest(final DownloadManager manager, final Request request, - final SQLiteDatabase db, final String id, final int version) { + public static long registerDownloadRequest(final DownloadManagerWrapper manager, + final Request request, final SQLiteDatabase db, final String id, final int version) { DebugLogUtils.l("RegisterDownloadRequest for word list id : ", id, ", version ", version); final long downloadId; synchronized (sSharedIdProtector) { @@ -345,8 +338,8 @@ public final class UpdateHandler { /** * Retrieve information about a specific download from DownloadManager. */ - private static CompletedDownloadInfo getCompletedDownloadInfo(final DownloadManager manager, - final long downloadId) { + private static CompletedDownloadInfo getCompletedDownloadInfo( + final DownloadManagerWrapper manager, final long downloadId) { final Query query = new Query().setFilterById(downloadId); final Cursor cursor = manager.query(query); @@ -425,8 +418,7 @@ public final class UpdateHandler { DebugLogUtils.l("DownloadFinished with id", fileId); if (NOT_AN_ID == fileId) return; // Spurious wake-up: ignore - final DownloadManager manager = - (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + final DownloadManagerWrapper manager = new DownloadManagerWrapper(context); final CompletedDownloadInfo downloadInfo = getCompletedDownloadInfo(manager, fileId); final ArrayList<DownloadRecord> recordList = @@ -517,7 +509,7 @@ public final class UpdateHandler { } private static boolean handleDownloadedFile(final Context context, - final DownloadRecord downloadRecord, final DownloadManager manager, + final DownloadRecord downloadRecord, final DownloadManagerWrapper manager, final long fileId) { try { // {@link handleWordList(Context,InputStream,ContentValues)}. @@ -565,7 +557,7 @@ public final class UpdateHandler { // Instantiation of a parameterized type is not possible in Java, so it's not possible to // return the same type of list that was passed - probably the same reason why Collections // does not do it. So we need to decide statically which concrete type to return. - return new LinkedList<T>(src); + return new LinkedList<>(src); } /** @@ -748,10 +740,10 @@ public final class UpdateHandler { final ActionBatch actions = new ActionBatch(); // Upgrade existing word lists DebugLogUtils.l("Comparing dictionaries"); - final Set<String> wordListIds = new TreeSet<String>(); + final Set<String> wordListIds = new TreeSet<>(); // TODO: Can these be null? - if (null == from) from = new ArrayList<WordListMetadata>(); - if (null == to) to = new ArrayList<WordListMetadata>(); + if (null == from) from = new ArrayList<>(); + if (null == to) to = new ArrayList<>(); for (WordListMetadata wlData : from) wordListIds.add(wlData.mId); for (WordListMetadata wlData : to) wordListIds.add(wlData.mId); for (String id : wordListIds) { diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java index 69bff9597..9e510a68b 100644 --- a/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java +++ b/java/src/com/android/inputmethod/dictionarypack/WordListMetadata.java @@ -30,6 +30,7 @@ public class WordListMetadata { public final String mDescription; public final long mLastUpdate; public final long mFileSize; + public final String mRawChecksum; public final String mChecksum; public final String mLocalFilename; public final String mRemoteFilename; @@ -50,13 +51,15 @@ public class WordListMetadata { public WordListMetadata(final String id, final int type, final String description, final long lastUpdate, final long fileSize, - final String checksum, final String localFilename, final String remoteFilename, - final int version, final int formatVersion, final int flags, final String locale) { + final String rawChecksum, final String checksum, final String localFilename, + final String remoteFilename, final int version, final int formatVersion, + final int flags, final String locale) { mId = id; mType = type; mDescription = description; mLastUpdate = lastUpdate; // In milliseconds mFileSize = fileSize; + mRawChecksum = rawChecksum; mChecksum = checksum; mLocalFilename = localFilename; mRemoteFilename = remoteFilename; @@ -77,6 +80,7 @@ public class WordListMetadata { final String description = values.getAsString(MetadataDbHelper.DESCRIPTION_COLUMN); final Long lastUpdate = values.getAsLong(MetadataDbHelper.DATE_COLUMN); final Long fileSize = values.getAsLong(MetadataDbHelper.FILESIZE_COLUMN); + final String rawChecksum = values.getAsString(MetadataDbHelper.RAW_CHECKSUM_COLUMN); final String checksum = values.getAsString(MetadataDbHelper.CHECKSUM_COLUMN); final String localFilename = values.getAsString(MetadataDbHelper.LOCAL_FILENAME_COLUMN); final String remoteFilename = values.getAsString(MetadataDbHelper.REMOTE_FILENAME_COLUMN); @@ -98,8 +102,8 @@ public class WordListMetadata { || null == locale) { throw new IllegalArgumentException(); } - return new WordListMetadata(id, type, description, lastUpdate, fileSize, checksum, - localFilename, remoteFilename, version, formatVersion, flags, locale); + return new WordListMetadata(id, type, description, lastUpdate, fileSize, rawChecksum, + checksum, localFilename, remoteFilename, version, formatVersion, flags, locale); } @Override @@ -110,6 +114,7 @@ public class WordListMetadata { sb.append("\nDescription : ").append(mDescription); sb.append("\nLastUpdate : ").append(mLastUpdate); sb.append("\nFileSize : ").append(mFileSize); + sb.append("\nRawChecksum : ").append(mRawChecksum); sb.append("\nChecksum : ").append(mChecksum); sb.append("\nLocalFilename : ").append(mLocalFilename); sb.append("\nRemoteFilename : ").append(mRemoteFilename); diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java index ba1fce1a8..aea16af0d 100644 --- a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java +++ b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java @@ -98,6 +98,10 @@ public final class WordListPreference extends Preference { setSummary(getSummary(status)); } + public boolean hasStatus(final int status) { + return status == mStatus; + } + @Override public View onCreateView(final ViewGroup parent) { final View orphanedView = mInterfaceState.findFirstOrphanedView(); @@ -217,6 +221,7 @@ public final class WordListPreference extends Preference { progressBar.setIds(mClientId, mWordlistId); progressBar.setMax(mFilesize); final boolean showProgressBar = (MetadataDbHelper.STATUS_DOWNLOADING == mStatus); + setSummary(getSummary(mStatus)); status.setVisibility(showProgressBar ? View.INVISIBLE : View.VISIBLE); progressBar.setVisibility(showProgressBar ? View.VISIBLE : View.INVISIBLE); diff --git a/java/src/com/android/inputmethod/event/Combiner.java b/java/src/com/android/inputmethod/event/Combiner.java index ab6b70c04..8b808c6b3 100644 --- a/java/src/com/android/inputmethod/event/Combiner.java +++ b/java/src/com/android/inputmethod/event/Combiner.java @@ -16,14 +16,33 @@ package com.android.inputmethod.event; +import java.util.ArrayList; + /** - * A generic interface for combiners. + * A generic interface for combiners. Combiners are objects that transform chains of input events + * into committable strings and manage feedback to show to the user on the combining state. */ public interface Combiner { /** - * Combine an event with the existing state and return the new event. + * Process an event, possibly combining it with the existing state and return the new event. + * + * If this event does not result in any new event getting passed down the chain, this method + * returns null. It may also modify the previous event list if appropriate. + * + * @param previousEvents the previous events in this composition. * @param event the event to combine with the existing state. * @return the resulting event. */ - Event combine(Event event); + Event processEvent(ArrayList<Event> previousEvents, Event event); + + /** + * Get the feedback that should be shown to the user for the current state of this combiner. + * @return A CharSequence representing the feedback to show users. It may include styles. + */ + CharSequence getCombiningStateFeedback(); + + /** + * Reset the state of this combiner, for example when the cursor was moved. + */ + void reset(); } diff --git a/java/src/com/android/inputmethod/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java new file mode 100644 index 000000000..61bc11b39 --- /dev/null +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2014 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.event; + +import android.text.SpannableStringBuilder; +import android.text.TextUtils; + +import com.android.inputmethod.latin.Constants; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * This class implements the logic chain between receiving events and generating code points. + * + * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard, + * or any exotic input source. + * This class will orchestrate the composing chain that starts with an event as its input. Each + * composer will be given turns one after the other. + * The output is composed of two sequences of code points: the first, representing the already + * finished combining part, will be shown normally as the composing string, while the second is + * feedback on the composing state and will typically be shown with different styling such as + * a colored background. + */ +public class CombinerChain { + // The already combined text, as described above + private StringBuilder mCombinedText; + // The feedback on the composing state, as described above + private SpannableStringBuilder mStateFeedback; + private final ArrayList<Combiner> mCombiners; + + private static final HashMap<String, Class<? extends Combiner>> IMPLEMENTED_COMBINERS = + new HashMap<>(); + static { + IMPLEMENTED_COMBINERS.put("MyanmarReordering", MyanmarReordering.class); + } + private static final String COMBINER_SPEC_SEPARATOR = ";"; + + /** + * Create an combiner chain. + * + * The combiner chain takes events as inputs and outputs code points and combining state. + * For example, if the input language is Japanese, the combining chain will typically perform + * kana conversion. This takes a string for initial text, taken to be present before the + * cursor: we'll start after this. + * + * @param initialText The text that has already been combined so far. + * @param combinerList A list of combiners to be applied in order. + */ + public CombinerChain(final String initialText, final Combiner... combinerList) { + mCombiners = new ArrayList<>(); + // The dead key combiner is always active, and always first + mCombiners.add(new DeadKeyCombiner()); + for (final Combiner combiner : combinerList) { + mCombiners.add(combiner); + } + mCombinedText = new StringBuilder(initialText); + mStateFeedback = new SpannableStringBuilder(); + } + + public void reset() { + mCombinedText.setLength(0); + mStateFeedback.clear(); + for (final Combiner c : mCombiners) { + c.reset(); + } + } + + /** + * Pass a new event through the whole chain. + * @param previousEvents the list of previous events in this composition + * @param newEvent the new event to process + */ + public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) { + final ArrayList<Event> modifiablePreviousEvents = new ArrayList<>(previousEvents); + Event event = newEvent; + for (final Combiner combiner : mCombiners) { + // A combiner can never return more than one event; it can return several + // code points, but they should be encapsulated within one event. + event = combiner.processEvent(modifiablePreviousEvents, event); + if (null == event) { + // Combiners return null if they eat the event. + break; + } + } + if (null != event) { + // TODO: figure out the generic way of doing this + if (Constants.CODE_DELETE == event.mKeyCode) { + final int length = mCombinedText.length(); + if (length > 0) { + final int lastCodePoint = mCombinedText.codePointBefore(length); + mCombinedText.delete(length - Character.charCount(lastCodePoint), length); + } + } else { + final CharSequence textToCommit = event.getTextToCommit(); + if (!TextUtils.isEmpty(textToCommit)) { + mCombinedText.append(textToCommit); + } + } + } + mStateFeedback.clear(); + for (int i = mCombiners.size() - 1; i >= 0; --i) { + mStateFeedback.append(mCombiners.get(i).getCombiningStateFeedback()); + } + } + + /** + * Get the char sequence that should be displayed as the composing word. It may include + * styling spans. + */ + public CharSequence getComposingWordWithCombiningFeedback() { + final SpannableStringBuilder s = new SpannableStringBuilder(mCombinedText); + return s.append(mStateFeedback); + } + + public static Combiner[] createCombiners(final String spec) { + if (TextUtils.isEmpty(spec)) { + return new Combiner[0]; + } + final String[] combinerDescriptors = spec.split(COMBINER_SPEC_SEPARATOR); + final Combiner[] combiners = new Combiner[combinerDescriptors.length]; + int i = 0; + for (final String combinerDescriptor : combinerDescriptors) { + final Class<? extends Combiner> combinerClass = + IMPLEMENTED_COMBINERS.get(combinerDescriptor); + if (null == combinerClass) { + throw new RuntimeException("Unknown combiner descriptor: " + combinerDescriptor); + } + try { + combiners[i++] = combinerClass.newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException("Unable to instantiate combiner: " + combinerDescriptor, + e); + } catch (IllegalAccessException e) { + throw new RuntimeException("Unable to instantiate combiner: " + combinerDescriptor, + e); + } + } + return combiners; + } +} diff --git a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java index 52987d571..bef4d8594 100644 --- a/java/src/com/android/inputmethod/event/DeadKeyCombiner.java +++ b/java/src/com/android/inputmethod/event/DeadKeyCombiner.java @@ -21,14 +21,17 @@ import android.view.KeyCharacterMap; import com.android.inputmethod.latin.Constants; +import java.util.ArrayList; + /** * A combiner that handles dead keys. */ public class DeadKeyCombiner implements Combiner { + // TODO: make this a list of events instead final StringBuilder mDeadSequence = new StringBuilder(); @Override - public Event combine(final Event event) { + public Event processEvent(final ArrayList<Event> previousEvents, final Event event) { if (null == event) return null; // Just in case some combiner is broken if (TextUtils.isEmpty(mDeadSequence)) { if (event.isDead()) { @@ -43,19 +46,33 @@ public class DeadKeyCombiner implements Combiner { final int resultingCodePoint = KeyCharacterMap.getDeadChar(deadCodePoint, event.mCodePoint); if (0 == resultingCodePoint) { - // We can't combine both characters. We need to commit the dead key as a committable + // We can't combine both characters. We need to commit the dead key as a separate // character, and the next char too unless it's a space (because as a special case, // dead key + space should result in only the dead key being committed - that's // how dead keys work). // If the event is a space, we should commit the dead char alone, but if it's // not, we need to commit both. - return Event.createCommittableEvent(deadCodePoint, - Constants.CODE_SPACE == event.mCodePoint ? null : event /* next */); + // TODO: this is not necessarily triggered by hardware key events, so it's not + // a good idea to masquerade as one. This should be typed as a software + // composite event or something. + return Event.createHardwareKeypressEvent(deadCodePoint, event.mKeyCode, + Constants.CODE_SPACE == event.mCodePoint ? null : event /* next */, + false /* isKeyRepeat */); } else { // We could combine the characters. - return Event.createCommittableEvent(resultingCodePoint, null /* next */); + return Event.createHardwareKeypressEvent(resultingCodePoint, event.mKeyCode, + null /* next */, false /* isKeyRepeat */); } } } + @Override + public void reset() { + mDeadSequence.setLength(0); + } + + @Override + public CharSequence getCombiningStateFeedback() { + return mDeadSequence; + } } diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java index 1f3320eb7..d257441e0 100644 --- a/java/src/com/android/inputmethod/event/Event.java +++ b/java/src/com/android/inputmethod/event/Event.java @@ -16,6 +16,10 @@ package com.android.inputmethod.event; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.utils.StringUtils; + /** * Class representing a generic input event as handled by Latin IME. * @@ -32,62 +36,234 @@ public class Event { // Should the types below be represented by separate classes instead? It would be cleaner // but probably a bit too much // An event we don't handle in Latin IME, for example pressing Ctrl on a hardware keyboard. - final public static int EVENT_NOT_HANDLED = 0; - // A character that is already final, for example pressing an alphabetic character on a - // hardware qwerty keyboard. - final public static int EVENT_COMMITTABLE = 1; - // A dead key, which means a character that should combine with what is coming next. Examples - // include the "^" character on an azerty keyboard which combines with "e" to make "ê", or - // AltGr+' on a dvorak international keyboard which combines with "e" to make "é". This is - // true regardless of the language or combining mode, and should be seen as a property of the - // key - a dead key followed by another key with which it can combine should be regarded as if - // the keyboard actually had such a key. - final public static int EVENT_DEAD = 2; + final public static int EVENT_TYPE_NOT_HANDLED = 0; + // A key press that is part of input, for example pressing an alphabetic character on a + // hardware qwerty keyboard. It may be part of a sequence that will be re-interpreted later + // through combination. + final public static int EVENT_TYPE_INPUT_KEYPRESS = 1; // A toggle event is triggered by a key that affects the previous character. An example would // be a numeric key on a 10-key keyboard, which would toggle between 1 - a - b - c with // repeated presses. - final public static int EVENT_TOGGLE = 3; + final public static int EVENT_TYPE_TOGGLE = 2; // A mode event instructs the combiner to change modes. The canonical example would be the // hankaku/zenkaku key on a Japanese keyboard, or even the caps lock key on a qwerty keyboard // if handled at the combiner level. - final public static int EVENT_MODE_KEY = 4; + final public static int EVENT_TYPE_MODE_KEY = 3; + // An event corresponding to a gesture. + final public static int EVENT_TYPE_GESTURE = 4; + // An event corresponding to the manual pick of a suggestion. + final public static int EVENT_TYPE_SUGGESTION_PICKED = 5; + // An event corresponding to a string generated by some software process. + final public static int EVENT_TYPE_SOFTWARE_GENERATED_STRING = 6; + + // 0 is a valid code point, so we use -1 here. + final public static int NOT_A_CODE_POINT = -1; + // -1 is a valid key code, so we use 0 here. + final public static int NOT_A_KEY_CODE = 0; - final private static int NOT_A_CODE_POINT = 0; + final private static int FLAG_NONE = 0; + // This event is a dead character, usually input by a dead key. Examples include dead-acute + // or dead-abovering. + final private static int FLAG_DEAD = 0x1; + // This event is coming from a key repeat, software or hardware. + final private static int FLAG_REPEAT = 0x2; - final private int mType; // The type of event - one of the constants above + final private int mEventType; // The type of event - one of the constants above // The code point associated with the event, if relevant. This is a unicode code point, and // has nothing to do with other representations of the key. It is only relevant if this event - // is the right type: COMMITTABLE or DEAD or TOGGLE, but for a mode key like hankaku/zenkaku or - // ctrl, there is no code point associated so this should be NOT_A_CODE_POINT to avoid - // unintentional use of its value when it's not relevant. + // is of KEYPRESS type, but for a mode key like hankaku/zenkaku or ctrl, there is no code point + // associated so this should be NOT_A_CODE_POINT to avoid unintentional use of its value when + // it's not relevant. final public int mCodePoint; + + // If applicable, this contains the string that should be input. + final public CharSequence mText; + + // The key code associated with the event, if relevant. This is relevant whenever this event + // has been triggered by a key press, but not for a gesture for example. This has conceptually + // no link to the code point, although keys that enter a straight code point may often set + // this to be equal to mCodePoint for convenience. If this is not a key, this must contain + // NOT_A_KEY_CODE. + final public int mKeyCode; + + // Coordinates of the touch event, if relevant. If useful, we may want to replace this with + // a MotionEvent or something in the future. This is only relevant when the keypress is from + // a software keyboard obviously, unless there are touch-sensitive hardware keyboards in the + // future or some other awesome sauce. + final public int mX; + final public int mY; + + // Some flags that can't go into the key code. It's a bit field of FLAG_* + final private int mFlags; + + // If this is of type EVENT_TYPE_SUGGESTION_PICKED, this must not be null (and must be null in + // other cases). + final public SuggestedWordInfo mSuggestedWordInfo; + // The next event, if any. Null if there is no next event yet. final public Event mNextEvent; // This method is private - to create a new event, use one of the create* utility methods. - private Event(final int type, final int codePoint, final Event next) { - mType = type; + private Event(final int type, final CharSequence text, final int codePoint, final int keyCode, + final int x, final int y, final SuggestedWordInfo suggestedWordInfo, final int flags, + final Event next) { + mEventType = type; + mText = text; mCodePoint = codePoint; + mKeyCode = keyCode; + mX = x; + mY = y; + mSuggestedWordInfo = suggestedWordInfo; + mFlags = flags; mNextEvent = next; + // Sanity checks + // mSuggestedWordInfo is non-null if and only if the type is SUGGESTION_PICKED + if (EVENT_TYPE_SUGGESTION_PICKED == mEventType) { + if (null == mSuggestedWordInfo) { + throw new RuntimeException("Wrong event: SUGGESTION_PICKED event must have a " + + "non-null SuggestedWordInfo"); + } + } else { + if (null != mSuggestedWordInfo) { + throw new RuntimeException("Wrong event: only SUGGESTION_PICKED events may have " + + "a non-null SuggestedWordInfo"); + } + } + } + + public static Event createSoftwareKeypressEvent(final int codePoint, final int keyCode, + final int x, final int y, final boolean isKeyRepeat) { + return new Event(EVENT_TYPE_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, x, y, + null /* suggestedWordInfo */, isKeyRepeat ? FLAG_REPEAT : FLAG_NONE, null); + } + + public static Event createHardwareKeypressEvent(final int codePoint, final int keyCode, + final Event next, final boolean isKeyRepeat) { + return new Event(EVENT_TYPE_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, + Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE, + null /* suggestedWordInfo */, isKeyRepeat ? FLAG_REPEAT : FLAG_NONE, next); + } + + // This creates an input event for a dead character. @see {@link #FLAG_DEAD} + public static Event createDeadEvent(final int codePoint, final int keyCode, final Event next) { + // TODO: add an argument or something if we ever create a software layout with dead keys. + return new Event(EVENT_TYPE_INPUT_KEYPRESS, null /* text */, codePoint, keyCode, + Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE, + null /* suggestedWordInfo */, FLAG_DEAD, next); } - public static Event createDeadEvent(final int codePoint, final Event next) { - return new Event(EVENT_DEAD, codePoint, next); + /** + * Create an input event with nothing but a code point. This is the most basic possible input + * event; it contains no information on many things the IME requires to function correctly, + * so avoid using it unless really nothing is known about this input. + * @param codePoint the code point. + * @return an event for this code point. + */ + public static Event createEventForCodePointFromUnknownSource(final int codePoint) { + // TODO: should we have a different type of event for this? After all, it's not a key press. + return new Event(EVENT_TYPE_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null /* next */); } - public static Event createCommittableEvent(final int codePoint, final Event next) { - return new Event(EVENT_COMMITTABLE, codePoint, next); + /** + * Creates an input event with a code point and x, y coordinates. This is typically used when + * resuming a previously-typed word, when the coordinates are still known. + * @param codePoint the code point to input. + * @param x the X coordinate. + * @param y the Y coordinate. + * @return an event for this code point and coordinates. + */ + public static Event createEventForCodePointFromAlreadyTypedText(final int codePoint, + final int x, final int y) { + // TODO: should we have a different type of event for this? After all, it's not a key press. + return new Event(EVENT_TYPE_INPUT_KEYPRESS, null /* text */, codePoint, NOT_A_KEY_CODE, + x, y, null /* suggestedWordInfo */, FLAG_NONE, null /* next */); + } + + /** + * Creates an input event representing the manual pick of a suggestion. + * @return an event for this suggestion pick. + */ + public static Event createSuggestionPickedEvent(final SuggestedWordInfo suggestedWordInfo) { + return new Event(EVENT_TYPE_SUGGESTION_PICKED, suggestedWordInfo.mWord, + NOT_A_CODE_POINT, NOT_A_KEY_CODE, + Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, + suggestedWordInfo, FLAG_NONE, null /* next */); + } + + /** + * Creates an input event with a CharSequence. This is used by some software processes whose + * output is a string, possibly with styling. Examples include press on a multi-character key, + * or combination that outputs a string. + * @param text the CharSequence associated with this event. + * @param keyCode the key code, or NOT_A_KEYCODE if not applicable. + * @return an event for this text. + */ + public static Event createSoftwareTextEvent(final CharSequence text, final int keyCode) { + return new Event(EVENT_TYPE_SOFTWARE_GENERATED_STRING, text, NOT_A_CODE_POINT, keyCode, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null /* next */); + } + + /** + * Creates an input event representing the manual pick of a punctuation suggestion. + * @return an event for this suggestion pick. + */ + public static Event createPunctuationSuggestionPickedEvent( + final SuggestedWordInfo suggestedWordInfo) { + final int primaryCode = suggestedWordInfo.mWord.charAt(0); + return new Event(EVENT_TYPE_SUGGESTION_PICKED, suggestedWordInfo.mWord, primaryCode, + NOT_A_KEY_CODE, Constants.SUGGESTION_STRIP_COORDINATE, + Constants.SUGGESTION_STRIP_COORDINATE, suggestedWordInfo, FLAG_NONE, + null /* next */); } public static Event createNotHandledEvent() { - return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT, null); + return new Event(EVENT_TYPE_NOT_HANDLED, null /* text */, NOT_A_CODE_POINT, NOT_A_KEY_CODE, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, null); } - public boolean isCommittable() { - return EVENT_COMMITTABLE == mType; + // Returns whether this is a function key like backspace, ctrl, settings... as opposed to keys + // that result in input like letters or space. + public boolean isFunctionalKeyEvent() { + // This logic may need to be refined in the future + return NOT_A_CODE_POINT == mCodePoint; } + // Returns whether this event is for a dead character. @see {@link #FLAG_DEAD} public boolean isDead() { - return EVENT_DEAD == mType; + return 0 != (FLAG_DEAD & mFlags); + } + + public boolean isKeyRepeat() { + return 0 != (FLAG_REPEAT & mFlags); + } + + // Returns whether this is a fake key press from the suggestion strip. This happens with + // punctuation signs selected from the suggestion strip. + public boolean isSuggestionStripPress() { + return EVENT_TYPE_SUGGESTION_PICKED == mEventType; + } + + public boolean isHandled() { + return EVENT_TYPE_NOT_HANDLED != mEventType; + } + + public CharSequence getTextToCommit() { + switch (mEventType) { + case EVENT_TYPE_MODE_KEY: + case EVENT_TYPE_NOT_HANDLED: + case EVENT_TYPE_TOGGLE: + return ""; + case EVENT_TYPE_INPUT_KEYPRESS: + return StringUtils.newSingleCodePointString(mCodePoint); + case EVENT_TYPE_GESTURE: + case EVENT_TYPE_SOFTWARE_GENERATED_STRING: + case EVENT_TYPE_SUGGESTION_PICKED: + return mText; + } + throw new RuntimeException("Unknown event type: " + mEventType); } } diff --git a/java/src/com/android/inputmethod/event/EventInterpreter.java b/java/src/com/android/inputmethod/event/EventInterpreter.java deleted file mode 100644 index 726b9206b..000000000 --- a/java/src/com/android/inputmethod/event/EventInterpreter.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.event; - -import android.util.SparseArray; -import android.view.KeyEvent; - -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.LatinIME; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.util.ArrayList; - -/** - * This class implements the logic between receiving events and generating code points. - * - * Event sources are multiple. It may be a hardware keyboard, a D-PAD, a software keyboard, - * or any exotic input source. - * This class will orchestrate the decoding chain that starts with an event and ends up with - * a stream of code points + decoding state. - */ -public class EventInterpreter { - // TODO: Implement an object pool for events, as we'll create a lot of them - // TODO: Create a combiner - // TODO: Create an object type to represent input material + visual feedback + decoding state - // TODO: Create an interface to call back to Latin IME through the above object - - final EventDecoderSpec mDecoderSpec; - final SparseArray<HardwareEventDecoder> mHardwareEventDecoders; - final SoftwareEventDecoder mSoftwareEventDecoder; - final LatinIME mLatinIme; - final ArrayList<Combiner> mCombiners; - - /** - * Create a default interpreter. - * - * This creates a default interpreter that does nothing. A default interpreter should normally - * only be used for fallback purposes, when we really don't know what we want to do with input. - * - * @param latinIme a reference to the ime. - */ - public EventInterpreter(final LatinIME latinIme) { - this(null, latinIme); - } - - /** - * Create an event interpreter according to a specification. - * - * The specification contains information about what to do with events. Typically, it will - * contain information about the type of keyboards - for example, if hardware keyboard(s) is/are - * attached, their type will be included here so that the decoder knows what to do with each - * keypress (a 10-key keyboard is not handled like a qwerty-ish keyboard). - * It also contains information for combining characters. For example, if the input language - * is Japanese, the specification will typically request kana conversion. - * Also note that the specification can be null. This means that we need to create a default - * interpreter that does no specific combining, and assumes the most common cases. - * - * @param specification the specification for event interpretation. null for default. - * @param latinIme a reference to the ime. - */ - public EventInterpreter(final EventDecoderSpec specification, final LatinIME latinIme) { - mDecoderSpec = null != specification ? specification : new EventDecoderSpec(); - // For both, we expect to have only one decoder in almost all cases, hence the default - // capacity of 1. - mHardwareEventDecoders = new SparseArray<HardwareEventDecoder>(1); - mSoftwareEventDecoder = new SoftwareKeyboardEventDecoder(); - mCombiners = CollectionUtils.newArrayList(); - mCombiners.add(new DeadKeyCombiner()); - mLatinIme = latinIme; - } - - // Helper method to decode a hardware key event into a generic event, and execute any - // necessary action. - public boolean onHardwareKeyEvent(final KeyEvent hardwareKeyEvent) { - final Event decodedEvent = getHardwareKeyEventDecoder(hardwareKeyEvent.getDeviceId()) - .decodeHardwareKey(hardwareKeyEvent); - return onEvent(decodedEvent); - } - - public boolean onSoftwareEvent() { - final Event decodedEvent = getSoftwareEventDecoder().decodeSoftwareEvent(); - return onEvent(decodedEvent); - } - - private HardwareEventDecoder getHardwareKeyEventDecoder(final int deviceId) { - final HardwareEventDecoder decoder = mHardwareEventDecoders.get(deviceId); - if (null != decoder) return decoder; - // TODO: create the decoder according to the specification - final HardwareEventDecoder newDecoder = new HardwareKeyboardEventDecoder(deviceId); - mHardwareEventDecoders.put(deviceId, newDecoder); - return newDecoder; - } - - private SoftwareEventDecoder getSoftwareEventDecoder() { - // Within the context of Latin IME, since we never present several software interfaces - // at the time, we should never need multiple software event decoders at a time. - return mSoftwareEventDecoder; - } - - private boolean onEvent(final Event event) { - Event currentlyProcessingEvent = event; - boolean processed = false; - for (int i = 0; i < mCombiners.size(); ++i) { - currentlyProcessingEvent = mCombiners.get(i).combine(event); - } - while (null != currentlyProcessingEvent) { - if (currentlyProcessingEvent.isCommittable()) { - mLatinIme.onCodeInput(currentlyProcessingEvent.mCodePoint, - Constants.EXTERNAL_KEYBOARD_COORDINATE, - Constants.EXTERNAL_KEYBOARD_COORDINATE); - processed = true; - } else if (event.isDead()) { - processed = true; - } - currentlyProcessingEvent = currentlyProcessingEvent.mNextEvent; - } - return processed; - } -} diff --git a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java index 720d07433..c61f45efa 100644 --- a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java +++ b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java @@ -46,28 +46,36 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder { // do not necessarily map to a unicode character. This represents a physical key, like // the key for 'A' or Space, but also Backspace or Ctrl or Caps Lock. final int keyCode = keyEvent.getKeyCode(); + final boolean isKeyRepeat = (0 != keyEvent.getRepeatCount()); if (KeyEvent.KEYCODE_DEL == keyCode) { - return Event.createCommittableEvent(Constants.CODE_DELETE, null /* next */); + return Event.createHardwareKeypressEvent(Event.NOT_A_CODE_POINT, Constants.CODE_DELETE, + null /* next */, isKeyRepeat); } if (keyEvent.isPrintingKey() || KeyEvent.KEYCODE_SPACE == keyCode || KeyEvent.KEYCODE_ENTER == keyCode) { if (0 != (codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT)) { // A dead key. return Event.createDeadEvent( - codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK, null /* next */); + codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK, keyCode, + null /* next */); } if (KeyEvent.KEYCODE_ENTER == keyCode) { // The Enter key. If the Shift key is not being pressed, this should send a // CODE_ENTER to trigger the action if any, or a carriage return otherwise. If the // Shift key is being pressed, this should send a CODE_SHIFT_ENTER and let // Latin IME decide what to do with it. - return Event.createCommittableEvent(keyEvent.isShiftPressed() - ? Constants.CODE_SHIFT_ENTER : Constants.CODE_ENTER, - null /* next */); + if (keyEvent.isShiftPressed()) { + return Event.createHardwareKeypressEvent(Event.NOT_A_CODE_POINT, + Constants.CODE_SHIFT_ENTER, null /* next */, isKeyRepeat); + } else { + return Event.createHardwareKeypressEvent(Constants.CODE_ENTER, keyCode, + null /* next */, isKeyRepeat); + } } - // If not Enter, then we have a committable character. This should be committed - // right away, taking into account the current state. - return Event.createCommittableEvent(codePointAndFlags, null /* next */); + // If not Enter, then this is just a regular keypress event for a normal character + // that can be committed right away, taking into account the current state. + return Event.createHardwareKeypressEvent(codePointAndFlags, keyCode, null /* next */, + isKeyRepeat); } return Event.createNotHandledEvent(); } diff --git a/java/src/com/android/inputmethod/event/InputTransaction.java b/java/src/com/android/inputmethod/event/InputTransaction.java new file mode 100644 index 000000000..cdff265c6 --- /dev/null +++ b/java/src/com/android/inputmethod/event/InputTransaction.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2014 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.event; + +import com.android.inputmethod.latin.settings.SettingsValues; + +/** + * An object encapsulating a single transaction for input. + */ +public class InputTransaction { + // UPDATE_LATER is stronger than UPDATE_NOW. The reason for this is, if we have to update later, + // it's because something will change that we can't evaluate now, which means that even if we + // re-evaluate now we'll have to do it again later. The only case where that wouldn't apply + // would be if we needed to update now to find out the new state right away, but then we + // can't do it with this deferred mechanism anyway. + public static final int SHIFT_NO_UPDATE = 0; + public static final int SHIFT_UPDATE_NOW = 1; + public static final int SHIFT_UPDATE_LATER = 2; + + // Initial conditions + public final SettingsValues mSettingsValues; + public final Event mEvent; + public final long mTimestamp; + public final int mSpaceState; + public final int mShiftState; + + // Outputs + private int mRequiredShiftUpdate = SHIFT_NO_UPDATE; + private boolean mRequiresUpdateSuggestions = false; + private boolean mDidAffectContents = false; + + public InputTransaction(final SettingsValues settingsValues, final Event event, + final long timestamp, final int spaceState, final int shiftState) { + mSettingsValues = settingsValues; + mEvent = event; + mTimestamp = timestamp; + mSpaceState = spaceState; + mShiftState = shiftState; + } + + /** + * Indicate that this transaction requires some type of shift update. + * @param updateType What type of shift update this requires. + */ + public void requireShiftUpdate(final int updateType) { + mRequiredShiftUpdate = Math.max(mRequiredShiftUpdate, updateType); + } + + /** + * Gets what type of shift update this transaction requires. + * @return The shift update type. + */ + public int getRequiredShiftUpdate() { + return mRequiredShiftUpdate; + } + + /** + * Indicate that this transaction requires updating the suggestions. + */ + public void setRequiresUpdateSuggestions() { + mRequiresUpdateSuggestions = true; + } + + /** + * Find out whether this transaction requires updating the suggestions. + * @return Whether this transaction requires updating the suggestions. + */ + public boolean requiresUpdateSuggestions() { + return mRequiresUpdateSuggestions; + } + + /** + * Indicate that this transaction affected the contents of the editor. + */ + public void setDidAffectContents() { + mDidAffectContents = true; + } + + /** + * Find out whether this transaction affected contents of the editor. + * @return Whether this transaction affected contents of the editor. + */ + public boolean didAffectContents() { + return mDidAffectContents; + } +} diff --git a/java/src/com/android/inputmethod/event/MyanmarReordering.java b/java/src/com/android/inputmethod/event/MyanmarReordering.java new file mode 100644 index 000000000..32919932d --- /dev/null +++ b/java/src/com/android/inputmethod/event/MyanmarReordering.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2014 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.event; + +import com.android.inputmethod.latin.Constants; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * A combiner that reorders input for Myanmar. + */ +public class MyanmarReordering implements Combiner { + // U+1031 MYANMAR VOWEL SIGN E + private final static int VOWEL_E = 0x1031; // Code point for vowel E that we need to reorder + // U+200C ZERO WIDTH NON-JOINER + // U+200B ZERO WIDTH SPACE + private final static int ZERO_WIDTH_NON_JOINER = 0x200B; // should be 0x200C + + private final ArrayList<Event> mCurrentEvents = new ArrayList<>(); + + // List of consonants : + // U+1000 MYANMAR LETTER KA + // U+1001 MYANMAR LETTER KHA + // U+1002 MYANMAR LETTER GA + // U+1003 MYANMAR LETTER GHA + // U+1004 MYANMAR LETTER NGA + // U+1005 MYANMAR LETTER CA + // U+1006 MYANMAR LETTER CHA + // U+1007 MYANMAR LETTER JA + // U+1008 MYANMAR LETTER JHA + // U+1009 MYANMAR LETTER NYA + // U+100A MYANMAR LETTER NNYA + // U+100B MYANMAR LETTER TTA + // U+100C MYANMAR LETTER TTHA + // U+100D MYANMAR LETTER DDA + // U+100E MYANMAR LETTER DDHA + // U+100F MYANMAR LETTER NNA + // U+1010 MYANMAR LETTER TA + // U+1011 MYANMAR LETTER THA + // U+1012 MYANMAR LETTER DA + // U+1013 MYANMAR LETTER DHA + // U+1014 MYANMAR LETTER NA + // U+1015 MYANMAR LETTER PA + // U+1016 MYANMAR LETTER PHA + // U+1017 MYANMAR LETTER BA + // U+1018 MYANMAR LETTER BHA + // U+1019 MYANMAR LETTER MA + // U+101A MYANMAR LETTER YA + // U+101B MYANMAR LETTER RA + // U+101C MYANMAR LETTER LA + // U+101D MYANMAR LETTER WA + // U+101E MYANMAR LETTER SA + // U+101F MYANMAR LETTER HA + // U+1020 MYANMAR LETTER LLA + // U+103F MYANMAR LETTER GREAT SA + private static boolean isConsonant(final int codePoint) { + return (codePoint >= 0x1000 && codePoint <= 0x1020) || 0x103F == codePoint; + } + + // List of medials : + // U+103B MYANMAR CONSONANT SIGN MEDIAL YA + // U+103C MYANMAR CONSONANT SIGN MEDIAL RA + // U+103D MYANMAR CONSONANT SIGN MEDIAL WA + // U+103E MYANMAR CONSONANT SIGN MEDIAL HA + // U+105E MYANMAR CONSONANT SIGN MON MEDIAL NA + // U+105F MYANMAR CONSONANT SIGN MON MEDIAL MA + // U+1060 MYANMAR CONSONANT SIGN MON MEDIAL LA + // U+1082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA + private static int[] MEDIAL_LIST = { 0x103B, 0x103C, 0x103D, 0x103E, + 0x105E, 0x105F, 0x1060, 0x1082}; + private static boolean isMedial(final int codePoint) { + return Arrays.binarySearch(MEDIAL_LIST, codePoint) >= 0; + } + + private static boolean isConsonantOrMedial(final int codePoint) { + return isConsonant(codePoint) || isMedial(codePoint); + } + + private Event getLastEvent() { + final int size = mCurrentEvents.size(); + if (size <= 0) { + return null; + } + return mCurrentEvents.get(size - 1); + } + + private CharSequence getCharSequence() { + final StringBuilder s = new StringBuilder(); + for (final Event e : mCurrentEvents) { + s.appendCodePoint(e.mCodePoint); + } + return s; + } + + /** + * Clears the currently combining stream of events and returns the resulting software text + * event corresponding to the stream. Optionally adds a new event to the cleared stream. + * @param newEvent the new event to add to the stream. null if none. + * @return the resulting software text event. Null if none. + */ + private Event clearAndGetResultingEvent(final Event newEvent) { + final CharSequence combinedText; + if (mCurrentEvents.size() > 0) { + combinedText = getCharSequence(); + mCurrentEvents.clear(); + } else { + combinedText = null; + } + if (null != newEvent) { + mCurrentEvents.add(newEvent); + } + return null == combinedText ? null + : Event.createSoftwareTextEvent(combinedText, Event.NOT_A_KEY_CODE); + } + + @Override + public Event processEvent(ArrayList<Event> previousEvents, Event newEvent) { + final int codePoint = newEvent.mCodePoint; + if (VOWEL_E == codePoint) { + final Event lastEvent = getLastEvent(); + if (null == lastEvent) { + mCurrentEvents.add(newEvent); + return null; + } else if (isConsonantOrMedial(lastEvent.mCodePoint)) { + final Event resultingEvent = clearAndGetResultingEvent(null); + mCurrentEvents.add(Event.createSoftwareKeypressEvent(ZERO_WIDTH_NON_JOINER, + Event.NOT_A_KEY_CODE, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + false /* isKeyRepeat */)); + mCurrentEvents.add(newEvent); + return resultingEvent; + } else { // VOWEL_E == lastCodePoint. But if that was anything else this is correct too. + return clearAndGetResultingEvent(newEvent); + } + } if (isConsonant(codePoint)) { + final Event lastEvent = getLastEvent(); + if (null == lastEvent) { + mCurrentEvents.add(newEvent); + return null; + } else if (VOWEL_E == lastEvent.mCodePoint) { + final int eventSize = mCurrentEvents.size(); + if (eventSize >= 2 + && mCurrentEvents.get(eventSize - 2).mCodePoint == ZERO_WIDTH_NON_JOINER) { + // We have a ZWJN before a vowel E. We need to remove the ZWNJ and then + // reorder the vowel with respect to the consonant. + mCurrentEvents.remove(eventSize - 1); + mCurrentEvents.remove(eventSize - 2); + mCurrentEvents.add(newEvent); + mCurrentEvents.add(lastEvent); + return null; + } + // If there is already a consonant, then we are starting a new syllable. + for (int i = eventSize - 2; i >= 0; --i) { + if (isConsonant(mCurrentEvents.get(i).mCodePoint)) { + return clearAndGetResultingEvent(newEvent); + } + } + // If we come here, we didn't have a consonant so we reorder + mCurrentEvents.remove(eventSize - 1); + mCurrentEvents.add(newEvent); + mCurrentEvents.add(lastEvent); + return null; + } else { // lastCodePoint is a consonant/medial. But if it's something else it's fine + return clearAndGetResultingEvent(newEvent); + } + } else if (isMedial(codePoint)) { + final Event lastEvent = getLastEvent(); + if (null == lastEvent) { + mCurrentEvents.add(newEvent); + return null; + } else if (VOWEL_E == lastEvent.mCodePoint) { + final int eventSize = mCurrentEvents.size(); + // If there is already a consonant, then we are in the middle of a syllable, and we + // need to reorder. + boolean hasConsonant = false; + for (int i = eventSize - 2; i >= 0; --i) { + if (isConsonant(mCurrentEvents.get(i).mCodePoint)) { + hasConsonant = true; + break; + } + } + if (hasConsonant) { + mCurrentEvents.remove(eventSize - 1); + mCurrentEvents.add(newEvent); + mCurrentEvents.add(lastEvent); + return null; + } + // Otherwise, we just commit everything. + return clearAndGetResultingEvent(null); + } else { // lastCodePoint is a consonant/medial. But if it's something else it's fine + return clearAndGetResultingEvent(newEvent); + } + } else if (Constants.CODE_DELETE == newEvent.mKeyCode) { + final Event lastEvent = getLastEvent(); + final int eventSize = mCurrentEvents.size(); + if (null != lastEvent) { + if (VOWEL_E == lastEvent.mCodePoint) { + // We have a VOWEL_E at the end. There are four cases. + // - The vowel is the only code point in the buffer. Remove it. + // - The vowel is preceded by a ZWNJ. Remove both vowel E and ZWNJ. + // - The vowel is preceded by a consonant/medial, remove the consonant/medial. + // - In all other cases, it's strange, so just remove the last code point. + if (eventSize <= 1) { + mCurrentEvents.clear(); + } else { // eventSize >= 2 + final int previousCodePoint = mCurrentEvents.get(eventSize - 2).mCodePoint; + if (previousCodePoint == ZERO_WIDTH_NON_JOINER) { + mCurrentEvents.remove(eventSize - 1); + mCurrentEvents.remove(eventSize - 2); + } else if (isConsonantOrMedial(previousCodePoint)) { + mCurrentEvents.remove(eventSize - 2); + } else { + mCurrentEvents.remove(eventSize - 1); + } + } + return null; + } else if (eventSize > 0) { + mCurrentEvents.remove(eventSize - 1); + return null; + } + } + } + // This character is not part of the combining scheme, so we should reset everything. + if (mCurrentEvents.size() > 0) { + // If we have events in flight, then add the new event and return the resulting event. + mCurrentEvents.add(newEvent); + return clearAndGetResultingEvent(null); + } else { + // If we don't have any events in flight, then just pass this one through. + return newEvent; + } + } + + @Override + public CharSequence getCombiningStateFeedback() { + return getCharSequence(); + } + + @Override + public void reset() { + mCurrentEvents.clear(); + } +} diff --git a/java/src/com/android/inputmethod/event/SoftwareEventDecoder.java b/java/src/com/android/inputmethod/event/SoftwareEventDecoder.java deleted file mode 100644 index d81ee0b37..000000000 --- a/java/src/com/android/inputmethod/event/SoftwareEventDecoder.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.event; - -/** - * An event decoder for events out of a software keyboard. - * - * This defines the interface for an event decoder that supports events out of a software keyboard. - * This differs significantly from hardware keyboard event decoders in several respects. First, - * a software keyboard does not have a scancode/layout system; the keypresses that insert - * characters output unicode characters directly. - */ -public interface SoftwareEventDecoder extends EventDecoder { - public Event decodeSoftwareEvent(); -} diff --git a/java/src/com/android/inputmethod/event/SoftwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/SoftwareKeyboardEventDecoder.java deleted file mode 100644 index de91567c7..000000000 --- a/java/src/com/android/inputmethod/event/SoftwareKeyboardEventDecoder.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.event; - -/** - * A decoder for events from software keyboard, like the ones displayed by Latin IME. - */ -public class SoftwareKeyboardEventDecoder implements SoftwareEventDecoder { - @Override - public Event decodeSoftwareEvent() { - return null; - } -} diff --git a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java deleted file mode 100644 index f12373503..000000000 --- a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java +++ /dev/null @@ -1,827 +0,0 @@ -/* - * Copyright (C) 2013 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 static com.android.inputmethod.latin.Constants.NOT_A_COORDINATE; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.ColorStateList; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.os.Build; -import android.preference.PreferenceManager; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.text.format.DateUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.util.Pair; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TabHost; -import android.widget.TabHost.OnTabChangeListener; -import android.widget.TextView; - -import com.android.inputmethod.keyboard.internal.DynamicGridKeyboard; -import com.android.inputmethod.keyboard.internal.ScrollKeyboardView; -import com.android.inputmethod.keyboard.internal.ScrollViewWithNotifier; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.SubtypeSwitcher; -import com.android.inputmethod.latin.settings.Settings; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.ResourceUtils; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.concurrent.ConcurrentHashMap; - -/** - * View class to implement Emoji palettes. - * The Emoji keyboard consists of group of views {@link R.layout#emoji_palettes_view}. - * <ol> - * <li> Emoji category tabs. - * <li> Delete button. - * <li> Emoji keyboard pages that can be scrolled by swiping horizontally or by selecting a tab. - * <li> Back to main keyboard button and enter button. - * </ol> - * Because of the above reasons, this class doesn't extend {@link KeyboardView}. - */ -public final class EmojiPalettesView extends LinearLayout implements OnTabChangeListener, - ViewPager.OnPageChangeListener, View.OnClickListener, - ScrollKeyboardView.OnKeyClickListener { - private static final String TAG = EmojiPalettesView.class.getSimpleName(); - private static final boolean DEBUG_PAGER = false; - private final int mKeyBackgroundId; - private final int mEmojiFunctionalKeyBackgroundId; - private final KeyboardLayoutSet mLayoutSet; - private final ColorStateList mTabLabelColor; - private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener; - private EmojiPalettesAdapter mEmojiPalettesAdapter; - - private TabHost mTabHost; - private ViewPager mEmojiPager; - private int mCurrentPagerPosition = 0; - private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView; - - private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; - - private static final int CATEGORY_ID_UNSPECIFIED = -1; - public static final int CATEGORY_ID_RECENTS = 0; - public static final int CATEGORY_ID_PEOPLE = 1; - public static final int CATEGORY_ID_OBJECTS = 2; - public static final int CATEGORY_ID_NATURE = 3; - public static final int CATEGORY_ID_PLACES = 4; - public static final int CATEGORY_ID_SYMBOLS = 5; - public static final int CATEGORY_ID_EMOTICONS = 6; - - private static class CategoryProperties { - public int mCategoryId; - public int mPageCount; - public CategoryProperties(final int categoryId, final int pageCount) { - mCategoryId = categoryId; - mPageCount = pageCount; - } - } - - private static class EmojiCategory { - private static final String[] sCategoryName = { - "recents", - "people", - "objects", - "nature", - "places", - "symbols", - "emoticons" }; - private static final int[] sCategoryIcon = new int[] { - R.drawable.ic_emoji_recent_light, - R.drawable.ic_emoji_people_light, - R.drawable.ic_emoji_objects_light, - R.drawable.ic_emoji_nature_light, - R.drawable.ic_emoji_places_light, - R.drawable.ic_emoji_symbols_light, - 0 }; - private static final String[] sCategoryLabel = - { null, null, null, null, null, null, ":-)" }; - private static final int[] sCategoryElementId = { - KeyboardId.ELEMENT_EMOJI_RECENTS, - KeyboardId.ELEMENT_EMOJI_CATEGORY1, - KeyboardId.ELEMENT_EMOJI_CATEGORY2, - KeyboardId.ELEMENT_EMOJI_CATEGORY3, - KeyboardId.ELEMENT_EMOJI_CATEGORY4, - KeyboardId.ELEMENT_EMOJI_CATEGORY5, - KeyboardId.ELEMENT_EMOJI_CATEGORY6 }; - private final SharedPreferences mPrefs; - private final int mMaxPageKeyCount; - private final KeyboardLayoutSet mLayoutSet; - private final HashMap<String, Integer> mCategoryNameToIdMap = CollectionUtils.newHashMap(); - private final ArrayList<CategoryProperties> mShownCategories = - CollectionUtils.newArrayList(); - private final ConcurrentHashMap<Long, DynamicGridKeyboard> - mCategoryKeyboardMap = new ConcurrentHashMap<Long, DynamicGridKeyboard>(); - - private int mCurrentCategoryId = CATEGORY_ID_UNSPECIFIED; - private int mCurrentCategoryPageId = 0; - - public EmojiCategory(final SharedPreferences prefs, final Resources res, - final KeyboardLayoutSet layoutSet) { - mPrefs = prefs; - mMaxPageKeyCount = res.getInteger(R.integer.emoji_keyboard_max_key_count); - mLayoutSet = layoutSet; - for (int i = 0; i < sCategoryName.length; ++i) { - mCategoryNameToIdMap.put(sCategoryName[i], i); - } - addShownCategoryId(CATEGORY_ID_RECENTS); - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2 - || android.os.Build.VERSION.CODENAME.equalsIgnoreCase("KeyLimePie") - || android.os.Build.VERSION.CODENAME.equalsIgnoreCase("KitKat")) { - addShownCategoryId(CATEGORY_ID_PEOPLE); - addShownCategoryId(CATEGORY_ID_OBJECTS); - addShownCategoryId(CATEGORY_ID_NATURE); - addShownCategoryId(CATEGORY_ID_PLACES); - mCurrentCategoryId = - Settings.readLastShownEmojiCategoryId(mPrefs, CATEGORY_ID_PEOPLE); - } else { - mCurrentCategoryId = - Settings.readLastShownEmojiCategoryId(mPrefs, CATEGORY_ID_SYMBOLS); - } - addShownCategoryId(CATEGORY_ID_SYMBOLS); - addShownCategoryId(CATEGORY_ID_EMOTICONS); - getKeyboard(CATEGORY_ID_RECENTS, 0 /* cagetoryPageId */) - .loadRecentKeys(mCategoryKeyboardMap.values()); - } - - private void addShownCategoryId(int categoryId) { - // Load a keyboard of categoryId - getKeyboard(categoryId, 0 /* cagetoryPageId */); - final CategoryProperties properties = - new CategoryProperties(categoryId, getCategoryPageCount(categoryId)); - mShownCategories.add(properties); - } - - public String getCategoryName(int categoryId, int categoryPageId) { - return sCategoryName[categoryId] + "-" + categoryPageId; - } - - public int getCategoryId(String name) { - final String[] strings = name.split("-"); - return mCategoryNameToIdMap.get(strings[0]); - } - - public int getCategoryIcon(int categoryId) { - return sCategoryIcon[categoryId]; - } - - public String getCategoryLabel(int categoryId) { - return sCategoryLabel[categoryId]; - } - - public ArrayList<CategoryProperties> getShownCategories() { - return mShownCategories; - } - - public int getCurrentCategoryId() { - return mCurrentCategoryId; - } - - public int getCurrentCategoryPageSize() { - return getCategoryPageSize(mCurrentCategoryId); - } - - public int getCategoryPageSize(int categoryId) { - for (final CategoryProperties prop : mShownCategories) { - if (prop.mCategoryId == categoryId) { - return prop.mPageCount; - } - } - Log.w(TAG, "Invalid category id: " + categoryId); - // Should not reach here. - return 0; - } - - public void setCurrentCategoryId(int categoryId) { - mCurrentCategoryId = categoryId; - Settings.writeLastShownEmojiCategoryId(mPrefs, categoryId); - } - - public void setCurrentCategoryPageId(int id) { - mCurrentCategoryPageId = id; - } - - public int getCurrentCategoryPageId() { - return mCurrentCategoryPageId; - } - - public void saveLastTypedCategoryPage() { - Settings.writeLastTypedEmojiCategoryPageId( - mPrefs, mCurrentCategoryId, mCurrentCategoryPageId); - } - - public boolean isInRecentTab() { - return mCurrentCategoryId == CATEGORY_ID_RECENTS; - } - - public int getTabIdFromCategoryId(int categoryId) { - for (int i = 0; i < mShownCategories.size(); ++i) { - if (mShownCategories.get(i).mCategoryId == categoryId) { - return i; - } - } - Log.w(TAG, "categoryId not found: " + categoryId); - return 0; - } - - // Returns the view pager's page position for the categoryId - public int getPageIdFromCategoryId(int categoryId) { - final int lastSavedCategoryPageId = - Settings.readLastTypedEmojiCategoryPageId(mPrefs, categoryId); - int sum = 0; - for (int i = 0; i < mShownCategories.size(); ++i) { - final CategoryProperties props = mShownCategories.get(i); - if (props.mCategoryId == categoryId) { - return sum + lastSavedCategoryPageId; - } - sum += props.mPageCount; - } - Log.w(TAG, "categoryId not found: " + categoryId); - return 0; - } - - public int getRecentTabId() { - return getTabIdFromCategoryId(CATEGORY_ID_RECENTS); - } - - private int getCategoryPageCount(int categoryId) { - final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]); - return (keyboard.getKeys().length - 1) / mMaxPageKeyCount + 1; - } - - // Returns a pair of the category id and the category page id from the view pager's page - // position. The category page id is numbered in each category. And the view page position - // is the position of the current shown page in the view pager which contains all pages of - // all categories. - public Pair<Integer, Integer> getCategoryIdAndPageIdFromPagePosition(int position) { - int sum = 0; - for (CategoryProperties properties : mShownCategories) { - final int temp = sum; - sum += properties.mPageCount; - if (sum > position) { - return new Pair<Integer, Integer>(properties.mCategoryId, position - temp); - } - } - return null; - } - - // Returns a keyboard from the view pager's page position. - public DynamicGridKeyboard getKeyboardFromPagePosition(int position) { - final Pair<Integer, Integer> categoryAndId = - getCategoryIdAndPageIdFromPagePosition(position); - if (categoryAndId != null) { - return getKeyboard(categoryAndId.first, categoryAndId.second); - } - return null; - } - - public DynamicGridKeyboard getKeyboard(int categoryId, int id) { - synchronized(mCategoryKeyboardMap) { - final long key = (((long) categoryId) << Constants.MAX_INT_BIT_COUNT) | id; - final DynamicGridKeyboard kbd; - if (!mCategoryKeyboardMap.containsKey(key)) { - if (categoryId != CATEGORY_ID_RECENTS) { - final Keyboard keyboard = - mLayoutSet.getKeyboard(sCategoryElementId[categoryId]); - final Key[][] sortedKeys = sortKeys(keyboard.getKeys(), mMaxPageKeyCount); - for (int i = 0; i < sortedKeys.length; ++i) { - final DynamicGridKeyboard tempKbd = new DynamicGridKeyboard(mPrefs, - mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS), - mMaxPageKeyCount, categoryId, i /* categoryPageId */); - for (Key emojiKey : sortedKeys[i]) { - if (emojiKey == null) { - break; - } - tempKbd.addKeyLast(emojiKey); - } - mCategoryKeyboardMap.put((((long) categoryId) - << Constants.MAX_INT_BIT_COUNT) | i, tempKbd); - } - kbd = mCategoryKeyboardMap.get(key); - } else { - kbd = new DynamicGridKeyboard(mPrefs, - mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS), - mMaxPageKeyCount, categoryId, 0 /* categoryPageId */); - mCategoryKeyboardMap.put(key, kbd); - } - } else { - kbd = mCategoryKeyboardMap.get(key); - } - return kbd; - } - } - - public int getTotalPageCountOfAllCategories() { - int sum = 0; - for (CategoryProperties properties : mShownCategories) { - sum += properties.mPageCount; - } - return sum; - } - - private Key[][] sortKeys(Key[] inKeys, int maxPageCount) { - Key[] keys = Arrays.copyOf(inKeys, inKeys.length); - Arrays.sort(keys, 0, keys.length, new Comparator<Key>() { - @Override - public int compare(Key lhs, Key rhs) { - final Rect lHitBox = lhs.getHitBox(); - final Rect rHitBox = rhs.getHitBox(); - if (lHitBox.top < rHitBox.top) { - return -1; - } else if (lHitBox.top > rHitBox.top) { - return 1; - } - if (lHitBox.left < rHitBox.left) { - return -1; - } else if (lHitBox.left > rHitBox.left) { - return 1; - } - if (lhs.getCode() == rhs.getCode()) { - return 0; - } - return lhs.getCode() < rhs.getCode() ? -1 : 1; - } - }); - final int pageCount = (keys.length - 1) / maxPageCount + 1; - final Key[][] retval = new Key[pageCount][maxPageCount]; - for (int i = 0; i < keys.length; ++i) { - retval[i / maxPageCount][i % maxPageCount] = keys[i]; - } - return retval; - } - } - - private final EmojiCategory mEmojiCategory; - - public EmojiPalettesView(final Context context, final AttributeSet attrs) { - this(context, attrs, R.attr.emojiPalettesViewStyle); - } - - public EmojiPalettesView(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - final TypedArray keyboardViewAttr = context.obtainStyledAttributes(attrs, - R.styleable.KeyboardView, defStyle, R.style.KeyboardView); - mKeyBackgroundId = keyboardViewAttr.getResourceId( - R.styleable.KeyboardView_keyBackground, 0); - mEmojiFunctionalKeyBackgroundId = keyboardViewAttr.getResourceId( - R.styleable.KeyboardView_keyBackgroundEmojiFunctional, 0); - keyboardViewAttr.recycle(); - final TypedArray emojiPalettesViewAttr = context.obtainStyledAttributes(attrs, - R.styleable.EmojiPalettesView, defStyle, R.style.EmojiPalettesView); - mTabLabelColor = emojiPalettesViewAttr.getColorStateList( - R.styleable.EmojiPalettesView_emojiTabLabelColor); - emojiPalettesViewAttr.recycle(); - final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( - context, null /* editorInfo */); - final Resources res = context.getResources(); - final EmojiLayoutParams emojiLp = new EmojiLayoutParams(res); - builder.setSubtype(SubtypeSwitcher.getInstance().getEmojiSubtype()); - builder.setKeyboardGeometry(ResourceUtils.getDefaultKeyboardWidth(res), - emojiLp.mEmojiKeyboardHeight); - builder.setOptions(false, false, false /* lanuageSwitchKeyEnabled */); - mLayoutSet = builder.build(); - mEmojiCategory = new EmojiCategory(PreferenceManager.getDefaultSharedPreferences(context), - context.getResources(), builder.build()); - mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); - } - - @Override - protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - final Resources res = getContext().getResources(); - // The main keyboard expands to the entire this {@link KeyboardView}. - final int width = ResourceUtils.getDefaultKeyboardWidth(res) - + getPaddingLeft() + getPaddingRight(); - final int height = ResourceUtils.getDefaultKeyboardHeight(res) - + res.getDimensionPixelSize(R.dimen.suggestions_strip_height) - + getPaddingTop() + getPaddingBottom(); - setMeasuredDimension(width, height); - } - - private void addTab(final TabHost host, final int categoryId) { - final String tabId = mEmojiCategory.getCategoryName(categoryId, 0 /* categoryPageId */); - final TabHost.TabSpec tspec = host.newTabSpec(tabId); - tspec.setContent(R.id.emoji_keyboard_dummy); - if (mEmojiCategory.getCategoryIcon(categoryId) != 0) { - final ImageView iconView = (ImageView)LayoutInflater.from(getContext()).inflate( - R.layout.emoji_keyboard_tab_icon, null); - iconView.setImageResource(mEmojiCategory.getCategoryIcon(categoryId)); - tspec.setIndicator(iconView); - } - if (mEmojiCategory.getCategoryLabel(categoryId) != null) { - final TextView textView = (TextView)LayoutInflater.from(getContext()).inflate( - R.layout.emoji_keyboard_tab_label, null); - textView.setText(mEmojiCategory.getCategoryLabel(categoryId)); - textView.setTextColor(mTabLabelColor); - tspec.setIndicator(textView); - } - host.addTab(tspec); - } - - @Override - protected void onFinishInflate() { - mTabHost = (TabHost)findViewById(R.id.emoji_category_tabhost); - mTabHost.setup(); - for (final CategoryProperties properties : mEmojiCategory.getShownCategories()) { - addTab(mTabHost, properties.mCategoryId); - } - mTabHost.setOnTabChangedListener(this); - mTabHost.getTabWidget().setStripEnabled(true); - - mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, mLayoutSet, this); - - mEmojiPager = (ViewPager)findViewById(R.id.emoji_keyboard_pager); - mEmojiPager.setAdapter(mEmojiPalettesAdapter); - mEmojiPager.setOnPageChangeListener(this); - mEmojiPager.setOffscreenPageLimit(0); - mEmojiPager.setPersistentDrawingCache(ViewPager.PERSISTENT_NO_CACHE); - final Resources res = getResources(); - final EmojiLayoutParams emojiLp = new EmojiLayoutParams(res); - emojiLp.setPagerProperties(mEmojiPager); - - mEmojiCategoryPageIndicatorView = - (EmojiCategoryPageIndicatorView)findViewById(R.id.emoji_category_page_id_view); - emojiLp.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); - - setCurrentCategoryId(mEmojiCategory.getCurrentCategoryId(), true /* force */); - - final LinearLayout actionBar = (LinearLayout)findViewById(R.id.emoji_action_bar); - emojiLp.setActionBarProperties(actionBar); - - final ImageView deleteKey = (ImageView)findViewById(R.id.emoji_keyboard_delete); - deleteKey.setTag(Constants.CODE_DELETE); - deleteKey.setOnTouchListener(mDeleteKeyOnTouchListener); - final ImageView alphabetKey = (ImageView)findViewById(R.id.emoji_keyboard_alphabet); - alphabetKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); - alphabetKey.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL); - alphabetKey.setOnClickListener(this); - final ImageView spaceKey = (ImageView)findViewById(R.id.emoji_keyboard_space); - spaceKey.setBackgroundResource(mKeyBackgroundId); - spaceKey.setTag(Constants.CODE_SPACE); - spaceKey.setOnClickListener(this); - emojiLp.setKeyProperties(spaceKey); - final ImageView alphabetKey2 = (ImageView)findViewById(R.id.emoji_keyboard_alphabet2); - alphabetKey2.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); - alphabetKey2.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL); - alphabetKey2.setOnClickListener(this); - } - - @Override - public void onTabChanged(final String tabId) { - final int categoryId = mEmojiCategory.getCategoryId(tabId); - setCurrentCategoryId(categoryId, false /* force */); - updateEmojiCategoryPageIdView(); - } - - - @Override - public void onPageSelected(final int position) { - final Pair<Integer, Integer> newPos = - mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position); - setCurrentCategoryId(newPos.first /* categoryId */, false /* force */); - mEmojiCategory.setCurrentCategoryPageId(newPos.second /* categoryPageId */); - updateEmojiCategoryPageIdView(); - mCurrentPagerPosition = position; - } - - @Override - public void onPageScrollStateChanged(final int state) { - // Ignore this message. Only want the actual page selected. - } - - @Override - public void onPageScrolled(final int position, final float positionOffset, - final int positionOffsetPixels) { - final Pair<Integer, Integer> newPos = - mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position); - final int newCategoryId = newPos.first; - final int newCategorySize = mEmojiCategory.getCategoryPageSize(newCategoryId); - final int currentCategoryId = mEmojiCategory.getCurrentCategoryId(); - final int currentCategoryPageId = mEmojiCategory.getCurrentCategoryPageId(); - final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageSize(); - if (newCategoryId == currentCategoryId) { - mEmojiCategoryPageIndicatorView.setCategoryPageId( - newCategorySize, newPos.second, positionOffset); - } else if (newCategoryId > currentCategoryId) { - mEmojiCategoryPageIndicatorView.setCategoryPageId( - currentCategorySize, currentCategoryPageId, positionOffset); - } else if (newCategoryId < currentCategoryId) { - mEmojiCategoryPageIndicatorView.setCategoryPageId( - currentCategorySize, currentCategoryPageId, positionOffset - 1); - } - } - - @Override - public void onClick(final View v) { - if (v.getTag() instanceof Integer) { - final int code = (Integer)v.getTag(); - registerCode(code); - return; - } - } - - private void registerCode(final int code) { - mKeyboardActionListener.onPressKey(code, 0 /* repeatCount */, true /* isSinglePointer */); - mKeyboardActionListener.onCodeInput(code, NOT_A_COORDINATE, NOT_A_COORDINATE); - mKeyboardActionListener.onReleaseKey(code, false /* withSliding */); - } - - @Override - public void onKeyClick(final Key key) { - mEmojiPalettesAdapter.addRecentKey(key); - mEmojiCategory.saveLastTypedCategoryPage(); - final int code = key.getCode(); - if (code == Constants.CODE_OUTPUT_TEXT) { - mKeyboardActionListener.onTextInput(key.getOutputText()); - return; - } - registerCode(code); - } - - public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) { - // TODO: - } - - public void startEmojiPalettes() { - if (DEBUG_PAGER) { - Log.d(TAG, "allocate emoji palettes memory " + mCurrentPagerPosition); - } - mEmojiPager.setAdapter(mEmojiPalettesAdapter); - mEmojiPager.setCurrentItem(mCurrentPagerPosition); - } - - public void stopEmojiPalettes() { - if (DEBUG_PAGER) { - Log.d(TAG, "deallocate emoji palettes memory"); - } - mEmojiPalettesAdapter.flushPendingRecentKeys(); - mEmojiPager.setAdapter(null); - } - - public void setKeyboardActionListener(final KeyboardActionListener listener) { - mKeyboardActionListener = listener; - mDeleteKeyOnTouchListener.setKeyboardActionListener(mKeyboardActionListener); - } - - private void updateEmojiCategoryPageIdView() { - if (mEmojiCategoryPageIndicatorView == null) { - return; - } - mEmojiCategoryPageIndicatorView.setCategoryPageId( - mEmojiCategory.getCurrentCategoryPageSize(), - mEmojiCategory.getCurrentCategoryPageId(), 0.0f /* offset */); - } - - private void setCurrentCategoryId(final int categoryId, final boolean force) { - final int oldCategoryId = mEmojiCategory.getCurrentCategoryId(); - if (oldCategoryId == categoryId && !force) { - return; - } - - if (oldCategoryId == CATEGORY_ID_RECENTS) { - // Needs to save pending updates for recent keys when we get out of the recents - // category because we don't want to move the recent emojis around while the user - // is in the recents category. - mEmojiPalettesAdapter.flushPendingRecentKeys(); - } - - mEmojiCategory.setCurrentCategoryId(categoryId); - final int newTabId = mEmojiCategory.getTabIdFromCategoryId(categoryId); - final int newCategoryPageId = mEmojiCategory.getPageIdFromCategoryId(categoryId); - if (force || mEmojiCategory.getCategoryIdAndPageIdFromPagePosition( - mEmojiPager.getCurrentItem()).first != categoryId) { - mEmojiPager.setCurrentItem(newCategoryPageId, false /* smoothScroll */); - } - if (force || mTabHost.getCurrentTab() != newTabId) { - mTabHost.setCurrentTab(newTabId); - } - } - - private static class EmojiPalettesAdapter extends PagerAdapter { - private final ScrollKeyboardView.OnKeyClickListener mListener; - private final DynamicGridKeyboard mRecentsKeyboard; - private final SparseArray<ScrollKeyboardView> mActiveKeyboardViews = - CollectionUtils.newSparseArray(); - private final EmojiCategory mEmojiCategory; - private int mActivePosition = 0; - - public EmojiPalettesAdapter(final EmojiCategory emojiCategory, - final KeyboardLayoutSet layoutSet, - final ScrollKeyboardView.OnKeyClickListener listener) { - mEmojiCategory = emojiCategory; - mListener = listener; - mRecentsKeyboard = mEmojiCategory.getKeyboard(CATEGORY_ID_RECENTS, 0); - } - - public void flushPendingRecentKeys() { - mRecentsKeyboard.flushPendingRecentKeys(); - final KeyboardView recentKeyboardView = - mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); - if (recentKeyboardView != null) { - recentKeyboardView.invalidateAllKeys(); - } - } - - public void addRecentKey(final Key key) { - if (mEmojiCategory.isInRecentTab()) { - mRecentsKeyboard.addPendingKey(key); - return; - } - mRecentsKeyboard.addKeyFirst(key); - final KeyboardView recentKeyboardView = - mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); - if (recentKeyboardView != null) { - recentKeyboardView.invalidateAllKeys(); - } - } - - @Override - public int getCount() { - return mEmojiCategory.getTotalPageCountOfAllCategories(); - } - - @Override - public void setPrimaryItem(final View container, final int position, final Object object) { - if (mActivePosition == position) { - return; - } - final ScrollKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition); - if (oldKeyboardView != null) { - oldKeyboardView.releaseCurrentKey(); - oldKeyboardView.deallocateMemory(); - } - mActivePosition = position; - } - - @Override - public Object instantiateItem(final ViewGroup container, final int position) { - if (DEBUG_PAGER) { - Log.d(TAG, "instantiate item: " + position); - } - final ScrollKeyboardView oldKeyboardView = mActiveKeyboardViews.get(position); - if (oldKeyboardView != null) { - oldKeyboardView.deallocateMemory(); - // This may be redundant but wanted to be safer.. - mActiveKeyboardViews.remove(position); - } - final Keyboard keyboard = - mEmojiCategory.getKeyboardFromPagePosition(position); - final LayoutInflater inflater = LayoutInflater.from(container.getContext()); - final View view = inflater.inflate( - R.layout.emoji_keyboard_page, container, false /* attachToRoot */); - final ScrollKeyboardView keyboardView = (ScrollKeyboardView)view.findViewById( - R.id.emoji_keyboard_page); - keyboardView.setKeyboard(keyboard); - keyboardView.setOnKeyClickListener(mListener); - final ScrollViewWithNotifier scrollView = (ScrollViewWithNotifier)view.findViewById( - R.id.emoji_keyboard_scroller); - keyboardView.setScrollView(scrollView); - container.addView(view); - mActiveKeyboardViews.put(position, keyboardView); - return view; - } - - @Override - public boolean isViewFromObject(final View view, final Object object) { - return view == object; - } - - @Override - public void destroyItem(final ViewGroup container, final int position, - final Object object) { - if (DEBUG_PAGER) { - Log.d(TAG, "destroy item: " + position + ", " + object.getClass().getSimpleName()); - } - final ScrollKeyboardView keyboardView = mActiveKeyboardViews.get(position); - if (keyboardView != null) { - keyboardView.deallocateMemory(); - mActiveKeyboardViews.remove(position); - } - if (object instanceof View) { - container.removeView((View)object); - } else { - Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object); - } - } - } - - // TODO: Do the same things done in PointerTracker - private static class DeleteKeyOnTouchListener implements OnTouchListener { - private static final long MAX_REPEAT_COUNT_TIME = 30 * DateUtils.SECOND_IN_MILLIS; - private final int mDeleteKeyPressedBackgroundColor; - private final long mKeyRepeatStartTimeout; - private final long mKeyRepeatInterval; - - public DeleteKeyOnTouchListener(Context context) { - final Resources res = context.getResources(); - mDeleteKeyPressedBackgroundColor = - res.getColor(R.color.emoji_key_pressed_background_color); - mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); - mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); - } - - private KeyboardActionListener mKeyboardActionListener = - KeyboardActionListener.EMPTY_LISTENER; - private DummyRepeatKeyRepeatTimer mTimer; - - private synchronized void startRepeat() { - if (mTimer != null) { - abortRepeat(); - } - mTimer = new DummyRepeatKeyRepeatTimer(); - mTimer.start(); - } - - private synchronized void abortRepeat() { - mTimer.abort(); - mTimer = null; - } - - // TODO: Remove - // This function is mimicking the repeat code in PointerTracker. - // Specifically referring to PointerTracker#startRepeatKey and PointerTracker#onKeyRepeat. - private class DummyRepeatKeyRepeatTimer extends Thread { - public boolean mAborted = false; - - @Override - public void run() { - int repeatCount = 1; - int timeCount = 0; - while (timeCount < MAX_REPEAT_COUNT_TIME && !mAborted) { - if (timeCount > mKeyRepeatStartTimeout) { - pressDelete(repeatCount); - } - timeCount += mKeyRepeatInterval; - ++repeatCount; - try { - Thread.sleep(mKeyRepeatInterval); - } catch (InterruptedException e) { - } - } - } - - public void abort() { - mAborted = true; - } - } - - public void pressDelete(int repeatCount) { - mKeyboardActionListener.onPressKey( - Constants.CODE_DELETE, repeatCount, true /* isSinglePointer */); - mKeyboardActionListener.onCodeInput( - Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE); - mKeyboardActionListener.onReleaseKey( - Constants.CODE_DELETE, false /* withSliding */); - } - - public void setKeyboardActionListener(KeyboardActionListener listener) { - mKeyboardActionListener = listener; - } - - @Override - public boolean onTouch(View v, MotionEvent event) { - switch(event.getAction()) { - case MotionEvent.ACTION_DOWN: - v.setBackgroundColor(mDeleteKeyPressedBackgroundColor); - pressDelete(0 /* repeatCount */); - startRepeat(); - return true; - case MotionEvent.ACTION_UP: - v.setBackgroundColor(0); - abortRepeat(); - return true; - } - return false; - } - } -} diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index f7ec9509d..ed3b2b347 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -22,14 +22,11 @@ import static com.android.inputmethod.latin.Constants.CODE_SHIFT; import static com.android.inputmethod.latin.Constants.CODE_SWITCH_ALPHA_SYMBOL; import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED; -import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.text.TextUtils; -import android.util.Log; -import android.util.Xml; import com.android.inputmethod.keyboard.internal.KeyDrawParams; import com.android.inputmethod.keyboard.internal.KeySpecParser; @@ -43,9 +40,6 @@ import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.StringUtils; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import java.util.Arrays; import java.util.Locale; @@ -53,8 +47,6 @@ import java.util.Locale; * Class for describing the position and characteristics of a single key in the keyboard. */ public class Key implements Comparable<Key> { - private static final String TAG = Key.class.getSimpleName(); - /** * The key code (unicode or custom code) that this key generates. */ @@ -68,9 +60,13 @@ public class Key implements Comparable<Key> { private final int mLabelFlags; private static final int LABEL_FLAGS_ALIGN_LEFT = 0x01; private static final int LABEL_FLAGS_ALIGN_RIGHT = 0x02; + private static final int LABEL_FLAGS_ALIGN_BUTTOM = 0x04; private static final int LABEL_FLAGS_ALIGN_LEFT_OF_CENTER = 0x08; + // Font typeface specification. + private static final int LABEL_FLAGS_FONT_MASK = 0x30; private static final int LABEL_FLAGS_FONT_NORMAL = 0x10; private static final int LABEL_FLAGS_FONT_MONO_SPACE = 0x20; + private static final int LABEL_FLAGS_FONT_DEFAULT = 0x30; // Start of key text ratio enum values private static final int LABEL_FLAGS_FOLLOW_KEY_TEXT_RATIO_MASK = 0x1C0; private static final int LABEL_FLAGS_FOLLOW_KEY_LARGE_LETTER_RATIO = 0x40; @@ -84,10 +80,17 @@ public class Key implements Comparable<Key> { private static final int LABEL_FLAGS_HAS_HINT_LABEL = 0x800; private static final int LABEL_FLAGS_WITH_ICON_LEFT = 0x1000; private static final int LABEL_FLAGS_WITH_ICON_RIGHT = 0x2000; + // The bit to calculate the ratio of key label width against key width. If autoXScale bit is on + // and autoYScale bit is off, the key label may be shrunk only for X-direction. + // If both autoXScale and autoYScale bits are on, the key label text size may be auto scaled. private static final int LABEL_FLAGS_AUTO_X_SCALE = 0x4000; - private static final int LABEL_FLAGS_PRESERVE_CASE = 0x8000; - private static final int LABEL_FLAGS_SHIFTED_LETTER_ACTIVATED = 0x10000; - private static final int LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL = 0x20000; + private static final int LABEL_FLAGS_AUTO_Y_SCALE = 0x8000; + private static final int LABEL_FLAGS_AUTO_SCALE = LABEL_FLAGS_AUTO_X_SCALE + | LABEL_FLAGS_AUTO_Y_SCALE; + private static final int LABEL_FLAGS_PRESERVE_CASE = 0x10000; + private static final int LABEL_FLAGS_SHIFTED_LETTER_ACTIVATED = 0x20000; + private static final int LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL = 0x40000; + private static final int LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR = 0x80000; private static final int LABEL_FLAGS_DISABLE_HINT_LABEL = 0x40000000; private static final int LABEL_FLAGS_DISABLE_ADDITIONAL_MORE_KEYS = 0x80000000; @@ -139,8 +142,6 @@ public class Key implements Comparable<Key> { private final OptionalAttributes mOptionalAttributes; - private static final int DEFAULT_TEXT_COLOR = 0xFFFFFFFF; - private static final class OptionalAttributes { /** Text to output when pressed. This can be multiple characters, like ".com" */ public final String mOutputText; @@ -185,26 +186,20 @@ public class Key implements Comparable<Key> { private boolean mEnabled = true; /** - * This constructor is being used only for keys in more keys keyboard. + * Constructor for a key on <code>MoreKeyKeyboard</code>, on <code>MoreSuggestions</code>, + * and in a <GridRows/>. */ - public Key(final KeyboardParams params, final MoreKeySpec moreKeySpec, final int x, final int y, - final int width, final int height, final int labelFlags) { - this(params, moreKeySpec.mLabel, null, moreKeySpec.mIconId, moreKeySpec.mCode, - moreKeySpec.mOutputText, x, y, width, height, labelFlags, BACKGROUND_TYPE_NORMAL); - } - - /** - * This constructor is being used only for key in popup suggestions pane. - */ - public Key(final KeyboardParams params, final String label, final String hintLabel, - final int iconId, final int code, final String outputText, final int x, final int y, - final int width, final int height, final int labelFlags, final int backgroundType) { - mHeight = height - params.mVerticalGap; - mWidth = width - params.mHorizontalGap; + public Key(final String label, final int iconId, final int code, final String outputText, + final String hintLabel, final int labelFlags, final int backgroundType, final int x, + final int y, final int width, final int height, final int horizontalGap, + final int verticalGap) { + mHeight = height - verticalGap; + mWidth = width - horizontalGap; mHintLabel = hintLabel; mLabelFlags = labelFlags; mBackgroundType = backgroundType; - mActionFlags = 0; + // TODO: Pass keyActionFlags as an argument. + mActionFlags = ACTION_FLAGS_NO_KEY_PREVIEW; mMoreKeys = null; mMoreKeysColumnAndFlags = 0; mLabel = label; @@ -215,7 +210,7 @@ public class Key implements Comparable<Key> { mEnabled = (code != CODE_UNSPECIFIED); mIconId = iconId; // Horizontal gap is divided equally to both sides of the key. - mX = x + params.mHorizontalGap / 2; + mX = x + horizontalGap / 2; mY = y; mHitBox.set(x, y, x + width + 1, y + height); mKeyVisualAttributes = null; @@ -224,25 +219,22 @@ public class Key implements Comparable<Key> { } /** - * Create a key with the given top-left coordinate and extract its attributes from the XML - * parser. - * @param res resources associated with the caller's context + * Create a key with the given top-left coordinate and extract its attributes from a key + * specification string, Key attribute array, key style, and etc. + * + * @param keySpec the key specification. + * @param keyAttr the Key XML attributes array. + * @param style the {@link KeyStyle} of this key. * @param params the keyboard building parameters. * @param row the row that this key belongs to. row's x-coordinate will be the right edge of * this key. - * @param parser the XML parser containing the attributes for this key - * @throws XmlPullParserException */ - public Key(final Resources res, final KeyboardParams params, final KeyboardRow row, - final XmlPullParser parser) throws XmlPullParserException { + public Key(final String keySpec, final TypedArray keyAttr, final KeyStyle style, + final KeyboardParams params, final KeyboardRow row) { final float horizontalGap = isSpacer() ? 0 : params.mHorizontalGap; final int rowHeight = row.getRowHeight(); mHeight = rowHeight - params.mVerticalGap; - final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.Keyboard_Key); - - final KeyStyle style = params.mKeyStyles.getKeyStyle(keyAttr, parser); final float keyXPos = row.getKeyX(keyAttr); final float keyWidth = row.getKeyWidth(keyAttr, keyXPos); final int keyYPos = row.getKeyY(); @@ -264,12 +256,6 @@ public class Key implements Comparable<Key> { R.styleable.Keyboard_Key_visualInsetsLeft, baseWidth, baseWidth, 0)); final int visualInsetsRight = Math.round(keyAttr.getFraction( R.styleable.Keyboard_Key_visualInsetsRight, baseWidth, baseWidth, 0)); - mIconId = KeySpecParser.getIconId(style.getString(keyAttr, - R.styleable.Keyboard_Key_keyIcon)); - final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr, - R.styleable.Keyboard_Key_keyIconDisabled)); - final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr, - R.styleable.Keyboard_Key_keyIconPreview)); mLabelFlags = style.getFlags(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags) | row.getDefaultKeyLabelFlags(); @@ -281,19 +267,19 @@ public class Key implements Comparable<Key> { int moreKeysColumn = style.getInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMoreKeysKeyboardColumn); int value; - if ((value = KeySpecParser.getIntValue(moreKeys, MORE_KEYS_AUTO_COLUMN_ORDER, -1)) > 0) { + if ((value = MoreKeySpec.getIntValue(moreKeys, MORE_KEYS_AUTO_COLUMN_ORDER, -1)) > 0) { moreKeysColumn = value & MORE_KEYS_COLUMN_MASK; } - if ((value = KeySpecParser.getIntValue(moreKeys, MORE_KEYS_FIXED_COLUMN_ORDER, -1)) > 0) { + if ((value = MoreKeySpec.getIntValue(moreKeys, MORE_KEYS_FIXED_COLUMN_ORDER, -1)) > 0) { moreKeysColumn = MORE_KEYS_FLAGS_FIXED_COLUMN_ORDER | (value & MORE_KEYS_COLUMN_MASK); } - if (KeySpecParser.getBooleanValue(moreKeys, MORE_KEYS_HAS_LABELS)) { + if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_HAS_LABELS)) { moreKeysColumn |= MORE_KEYS_FLAGS_HAS_LABELS; } - if (KeySpecParser.getBooleanValue(moreKeys, MORE_KEYS_NEEDS_DIVIDERS)) { + if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_NEEDS_DIVIDERS)) { moreKeysColumn |= MORE_KEYS_FLAGS_NEEDS_DIVIDERS; } - if (KeySpecParser.getBooleanValue(moreKeys, MORE_KEYS_NO_PANEL_AUTO_MORE_KEY)) { + if (MoreKeySpec.getBooleanValue(moreKeys, MORE_KEYS_NO_PANEL_AUTO_MORE_KEY)) { moreKeysColumn |= MORE_KEYS_FLAGS_NO_PANEL_AUTO_MORE_KEY; } mMoreKeysColumnAndFlags = moreKeysColumn; @@ -305,21 +291,25 @@ public class Key implements Comparable<Key> { additionalMoreKeys = style.getStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys); } - moreKeys = KeySpecParser.insertAdditionalMoreKeys(moreKeys, additionalMoreKeys); + moreKeys = MoreKeySpec.insertAdditionalMoreKeys(moreKeys, additionalMoreKeys); if (moreKeys != null) { actionFlags |= ACTION_FLAGS_ENABLE_LONG_PRESS; mMoreKeys = new MoreKeySpec[moreKeys.length]; for (int i = 0; i < moreKeys.length; i++) { - mMoreKeys[i] = new MoreKeySpec( - moreKeys[i], needsToUpperCase, locale, params.mCodesSet); + mMoreKeys[i] = new MoreKeySpec(moreKeys[i], needsToUpperCase, locale); } } else { mMoreKeys = null; } mActionFlags = actionFlags; - final int code = KeySpecParser.parseCode(style.getString(keyAttr, - R.styleable.Keyboard_Key_code), params.mCodesSet, CODE_UNSPECIFIED); + mIconId = KeySpecParser.getIconId(keySpec); + final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr, + R.styleable.Keyboard_Key_keyIconDisabled)); + final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr, + R.styleable.Keyboard_Key_keyIconPreview)); + + final int code = KeySpecParser.getCode(keySpec); if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) { mLabel = params.mId.mCustomActionLabel; } else if (code >= Character.MIN_SUPPLEMENTARY_CODE_POINT) { @@ -328,25 +318,24 @@ public class Key implements Comparable<Key> { // code point nor as a surrogate pair. mLabel = new StringBuilder().appendCodePoint(code).toString(); } else { - mLabel = KeySpecParser.toUpperCaseOfStringForLocale(style.getString(keyAttr, - R.styleable.Keyboard_Key_keyLabel), needsToUpperCase, locale); + mLabel = StringUtils.toUpperCaseOfStringForLocale( + KeySpecParser.getLabel(keySpec), needsToUpperCase, locale); } if ((mLabelFlags & LABEL_FLAGS_DISABLE_HINT_LABEL) != 0) { mHintLabel = null; } else { - mHintLabel = KeySpecParser.toUpperCaseOfStringForLocale(style.getString(keyAttr, + mHintLabel = StringUtils.toUpperCaseOfStringForLocale(style.getString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel), needsToUpperCase, locale); } - String outputText = KeySpecParser.toUpperCaseOfStringForLocale(style.getString(keyAttr, - R.styleable.Keyboard_Key_keyOutputText), needsToUpperCase, locale); + String outputText = StringUtils.toUpperCaseOfStringForLocale( + KeySpecParser.getOutputText(keySpec), needsToUpperCase, locale); // Choose the first letter of the label as primary code if not specified. if (code == CODE_UNSPECIFIED && TextUtils.isEmpty(outputText) && !TextUtils.isEmpty(mLabel)) { if (StringUtils.codePointCount(mLabel) == 1) { // Use the first letter of the hint label if shiftedLetterActivated flag is // specified. - if (hasShiftedLetterHint() && isShiftedLetterActivated() - && !TextUtils.isEmpty(mHintLabel)) { + if (hasShiftedLetterHint() && isShiftedLetterActivated()) { mCode = mHintLabel.codePointAt(0); } else { mCode = mLabel.codePointAt(0); @@ -365,24 +354,20 @@ public class Key implements Comparable<Key> { mCode = CODE_OUTPUT_TEXT; } } else { - mCode = KeySpecParser.toUpperCaseOfCodeForLocale(code, needsToUpperCase, locale); + mCode = StringUtils.toUpperCaseOfCodeForLocale(code, needsToUpperCase, locale); } - final int altCode = KeySpecParser.toUpperCaseOfCodeForLocale( - KeySpecParser.parseCode(style.getString(keyAttr, - R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED), - needsToUpperCase, locale); + final int altCodeInAttr = KeySpecParser.parseCode( + style.getString(keyAttr, R.styleable.Keyboard_Key_altCode), CODE_UNSPECIFIED); + final int altCode = StringUtils.toUpperCaseOfCodeForLocale( + altCodeInAttr, needsToUpperCase, locale); mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode, disabledIconId, previewIconId, visualInsetsLeft, visualInsetsRight); mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr); - keyAttr.recycle(); mHashCode = computeHashCode(this); - if (hasShiftedLetterHint() && TextUtils.isEmpty(mHintLabel)) { - Log.w(TAG, "hasShiftedLetterHint specified without keyHintLabel: " + this); - } } /** - * Copy constructor. + * Copy constructor for DynamicGridKeyboard.GridKey. * * @param key the original key. */ @@ -486,15 +471,24 @@ public class Key implements Comparable<Key> { @Override public String toString() { - final String label; - if (StringUtils.codePointCount(mLabel) == 1 && mLabel.codePointAt(0) == mCode) { - label = ""; - } else { - label = "/" + mLabel; + return toShortString() + " " + getX() + "," + getY() + " " + getWidth() + "x" + getHeight(); + } + + public String toShortString() { + final int code = getCode(); + if (code == Constants.CODE_OUTPUT_TEXT) { + return getOutputText(); } - return String.format(Locale.ROOT, "%s%s %d,%d %dx%d %s/%s/%s", - Constants.printableCode(mCode), label, mX, mY, mWidth, mHeight, mHintLabel, - KeyboardIconsSet.getIconName(mIconId), backgroundName(mBackgroundType)); + return Constants.printableCode(code); + } + + public String toLongString() { + final int iconId = getIconId(); + final String topVisual = (iconId == KeyboardIconsSet.ICON_UNDEFINED) + ? KeyboardIconsSet.PREFIX_ICON + KeyboardIconsSet.getIconName(iconId) : getLabel(); + final String hintLabel = getHintLabel(); + final String visual = (hintLabel == null) ? topVisual : topVisual + "^" + hintLabel; + return toString() + " " + visual + "/" + backgroundName(mBackgroundType); } private static String backgroundName(final int backgroundType) { @@ -576,14 +570,16 @@ public class Key implements Comparable<Key> { } public final Typeface selectTypeface(final KeyDrawParams params) { - // TODO: Handle "bold" here too? - if ((mLabelFlags & LABEL_FLAGS_FONT_NORMAL) != 0) { + switch (mLabelFlags & LABEL_FLAGS_FONT_MASK) { + case LABEL_FLAGS_FONT_NORMAL: return Typeface.DEFAULT; - } - if ((mLabelFlags & LABEL_FLAGS_FONT_MONO_SPACE) != 0) { + case LABEL_FLAGS_FONT_MONO_SPACE: return Typeface.MONOSPACE; + case LABEL_FLAGS_FONT_DEFAULT: + default: + // The type-face is specified by keyTypeface attribute. + return params.mTypeface; } - return params.mTypeface; } public final int selectTextSize(final KeyDrawParams params) { @@ -604,22 +600,10 @@ public class Key implements Comparable<Key> { } public final int selectTextColor(final KeyDrawParams params) { - if (isShiftedLetterActivated()) { - return params.mTextInactivatedColor; - } - if (params.mTextColorStateList == null) { - return DEFAULT_TEXT_COLOR; + if ((mLabelFlags & LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR) != 0) { + return params.mFunctionalTextColor; } - final int[] state; - // TODO: Hack!!!!!!!! Consider having a new attribute for the functional text labels. - // Currently, we distinguish "input key" from "functional key" by checking the - // length of the label( > 1) and "functional" attributes (= true). - if (mLabel != null && mLabel.length() > 1) { - state = getCurrentDrawableState(); - } else { - state = KEY_STATE_NORMAL; - } - return params.mTextColorStateList.getColorForState(state, DEFAULT_TEXT_COLOR); + return isShiftedLetterActivated() ? params.mTextInactivatedColor : params.mTextColor; } public final int selectHintTextSize(final KeyDrawParams params) { @@ -678,6 +662,10 @@ public class Key implements Comparable<Key> { return (mLabelFlags & LABEL_FLAGS_ALIGN_RIGHT) != 0; } + public final boolean isAlignButtom() { + return (mLabelFlags & LABEL_FLAGS_ALIGN_BUTTOM) != 0; + } + public final boolean isAlignLeftOfCenter() { return (mLabelFlags & LABEL_FLAGS_ALIGN_LEFT_OF_CENTER) != 0; } @@ -687,7 +675,8 @@ public class Key implements Comparable<Key> { } public final boolean hasShiftedLetterHint() { - return (mLabelFlags & LABEL_FLAGS_HAS_SHIFTED_LETTER_HINT) != 0; + return (mLabelFlags & LABEL_FLAGS_HAS_SHIFTED_LETTER_HINT) != 0 + && !TextUtils.isEmpty(mHintLabel); } public final boolean hasHintLabel() { @@ -702,12 +691,17 @@ public class Key implements Comparable<Key> { return (mLabelFlags & LABEL_FLAGS_WITH_ICON_RIGHT) != 0; } - public final boolean needsXScale() { + public final boolean needsAutoXScale() { return (mLabelFlags & LABEL_FLAGS_AUTO_X_SCALE) != 0; } - public final boolean isShiftedLetterActivated() { - return (mLabelFlags & LABEL_FLAGS_SHIFTED_LETTER_ACTIVATED) != 0; + public final boolean needsAutoScale() { + return (mLabelFlags & LABEL_FLAGS_AUTO_SCALE) == LABEL_FLAGS_AUTO_SCALE; + } + + private final boolean isShiftedLetterActivated() { + return (mLabelFlags & LABEL_FLAGS_SHIFTED_LETTER_ACTIVATED) != 0 + && !TextUtils.isEmpty(mHintLabel); } public final int getMoreKeysColumn() { @@ -746,10 +740,14 @@ public class Key implements Comparable<Key> { return (attrs != null) ? attrs.mAltCode : CODE_UNSPECIFIED; } + public int getIconId() { + return mIconId; + } + public Drawable getIcon(final KeyboardIconsSet iconSet, final int alpha) { final OptionalAttributes attrs = mOptionalAttributes; final int disabledIconId = (attrs != null) ? attrs.mDisabledIconId : ICON_UNDEFINED; - final int iconId = mEnabled ? mIconId : disabledIconId; + final int iconId = mEnabled ? getIconId() : disabledIconId; final Drawable icon = iconSet.getIconDrawable(iconId); if (icon != null) { icon.setAlpha(alpha); @@ -761,7 +759,7 @@ public class Key implements Comparable<Key> { final OptionalAttributes attrs = mOptionalAttributes; final int previewIconId = (attrs != null) ? attrs.mPreviewIconId : ICON_UNDEFINED; return previewIconId != ICON_UNDEFINED - ? iconSet.getIconDrawable(previewIconId) : iconSet.getIconDrawable(mIconId); + ? iconSet.getIconDrawable(previewIconId) : iconSet.getIconDrawable(getIconId()); } public int getWidth() { @@ -883,17 +881,6 @@ public class Key implements Comparable<Key> { android.R.attr.state_empty }; - // 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 - }; - // action normal state (with properties) private static final int[] KEY_STATE_ACTIVE_NORMAL = { android.R.attr.state_active @@ -906,31 +893,49 @@ public class Key implements Comparable<Key> { }; /** - * Returns the drawable state for the key, based on the current state and type of the key. - * @return the drawable state of the key. + * Returns the background drawable for the key, based on the current state and type of the key. + * @return the background drawable of the key. * @see android.graphics.drawable.StateListDrawable#setState(int[]) */ - public final int[] getCurrentDrawableState() { + public final Drawable selectBackgroundDrawable(final Drawable keyBackground, + final Drawable functionalKeyBackground, final Drawable spacebarBackground) { + final Drawable background; + if (mBackgroundType == BACKGROUND_TYPE_FUNCTIONAL) { + background = functionalKeyBackground; + } else if (getCode() == Constants.CODE_SPACE) { + background = spacebarBackground; + } else { + background = keyBackground; + } + final int[] stateSet; switch (mBackgroundType) { - case BACKGROUND_TYPE_FUNCTIONAL: - return mPressed ? KEY_STATE_FUNCTIONAL_PRESSED : KEY_STATE_FUNCTIONAL_NORMAL; case BACKGROUND_TYPE_ACTION: - return mPressed ? KEY_STATE_ACTIVE_PRESSED : KEY_STATE_ACTIVE_NORMAL; + stateSet = mPressed ? KEY_STATE_ACTIVE_PRESSED : KEY_STATE_ACTIVE_NORMAL; + break; case BACKGROUND_TYPE_STICKY_OFF: - return mPressed ? KEY_STATE_PRESSED_HIGHLIGHT_OFF : KEY_STATE_NORMAL_HIGHLIGHT_OFF; + stateSet = mPressed ? KEY_STATE_PRESSED_HIGHLIGHT_OFF : KEY_STATE_NORMAL_HIGHLIGHT_OFF; + break; case BACKGROUND_TYPE_STICKY_ON: - return mPressed ? KEY_STATE_PRESSED_HIGHLIGHT_ON : KEY_STATE_NORMAL_HIGHLIGHT_ON; + stateSet = mPressed ? KEY_STATE_PRESSED_HIGHLIGHT_ON : KEY_STATE_NORMAL_HIGHLIGHT_ON; + break; case BACKGROUND_TYPE_EMPTY: - return mPressed ? KEY_STATE_PRESSED : KEY_STATE_EMPTY; + stateSet = mPressed ? KEY_STATE_PRESSED : KEY_STATE_EMPTY; + break; + case BACKGROUND_TYPE_FUNCTIONAL: + stateSet = mPressed ? KEY_STATE_PRESSED : KEY_STATE_NORMAL; + break; default: /* BACKGROUND_TYPE_NORMAL */ - return mPressed ? KEY_STATE_PRESSED : KEY_STATE_NORMAL; + stateSet = mPressed ? KEY_STATE_PRESSED : KEY_STATE_NORMAL; + break; } + background.setState(stateSet); + return background; } public static class Spacer extends Key { - public Spacer(final Resources res, final KeyboardParams params, final KeyboardRow row, - final XmlPullParser parser) throws XmlPullParserException { - super(res, params, row, parser); + public Spacer(final TypedArray keyAttr, final KeyStyle keyStyle, + final KeyboardParams params, final KeyboardRow row) { + super(null /* keySpec */, keyAttr, keyStyle, params, row); } /** @@ -938,8 +943,9 @@ public class Key implements Comparable<Key> { */ protected Spacer(final KeyboardParams params, final int x, final int y, final int width, final int height) { - super(params, null, null, ICON_UNDEFINED, CODE_UNSPECIFIED, - null, x, y, width, height, 0, BACKGROUND_TYPE_EMPTY); + super(null /* label */, ICON_UNDEFINED, CODE_UNSPECIFIED, null /* outputText */, + null /* hintLabel */, 0 /* labelFlags */, BACKGROUND_TYPE_EMPTY, x, y, width, + height, params.mHorizontalGap, params.mVerticalGap); } } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java index befb6fa92..87368d4ef 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java @@ -16,9 +16,9 @@ package com.android.inputmethod.keyboard; -import com.android.inputmethod.latin.Constants; - - +/** + * This class handles key detection. + */ public class KeyDetector { private final int mKeyHysteresisDistanceSquared; private final int mKeyHysteresisDistanceForSlidingModifierSquared; @@ -27,31 +27,27 @@ public class KeyDetector { private int mCorrectionX; private int mCorrectionY; - /** - * This class handles key detection. - * - * @param keyHysteresisDistance if the pointer movement distance is smaller than this, the - * movement will not be handled as meaningful movement. The unit is pixel. - */ - public KeyDetector(float keyHysteresisDistance) { - this(keyHysteresisDistance, keyHysteresisDistance); + public KeyDetector() { + this(0.0f /* keyHysteresisDistance */, 0.0f /* keyHysteresisDistanceForSlidingModifier */); } /** - * This class handles key detection. + * Key detection object constructor with key hysteresis distances. * * @param keyHysteresisDistance if the pointer movement distance is smaller than this, the * movement will not be handled as meaningful movement. The unit is pixel. * @param keyHysteresisDistanceForSlidingModifier the same parameter for sliding input that * starts from a modifier key such as shift and symbols key. */ - public KeyDetector(float keyHysteresisDistance, float keyHysteresisDistanceForSlidingModifier) { + public KeyDetector(final float keyHysteresisDistance, + final float keyHysteresisDistanceForSlidingModifier) { mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance); mKeyHysteresisDistanceForSlidingModifierSquared = (int)( keyHysteresisDistanceForSlidingModifier * keyHysteresisDistanceForSlidingModifier); } - public void setKeyboard(Keyboard keyboard, float correctionX, float correctionY) { + public void setKeyboard(final Keyboard keyboard, final float correctionX, + final float correctionY) { if (keyboard == null) { throw new NullPointerException(); } @@ -60,28 +56,25 @@ public class KeyDetector { mKeyboard = keyboard; } - public int getKeyHysteresisDistanceSquared(boolean isSlidingFromModifier) { + public int getKeyHysteresisDistanceSquared(final boolean isSlidingFromModifier) { return isSlidingFromModifier ? mKeyHysteresisDistanceForSlidingModifierSquared : mKeyHysteresisDistanceSquared; } - public int getTouchX(int x) { + public int getTouchX(final int x) { return x + mCorrectionX; } // TODO: Remove vertical correction. - public int getTouchY(int y) { + public int getTouchY(final int y) { return y + mCorrectionY; } public Keyboard getKeyboard() { - if (mKeyboard == null) { - throw new IllegalStateException("keyboard isn't set"); - } return mKeyboard; } - public boolean alwaysAllowsSlidingInput() { + public boolean alwaysAllowsKeySelectionByDraggingFinger() { return false; } @@ -92,7 +85,10 @@ public class KeyDetector { * @param y The y-coordinate of a touch point * @return the key that the touch point hits. */ - public Key detectHitKey(int x, int y) { + public Key detectHitKey(final int x, final int y) { + if (mKeyboard == null) { + return null; + } final int touchX = getTouchX(x); final int touchY = getTouchY(y); @@ -117,20 +113,4 @@ public class KeyDetector { } return primaryKey; } - - public static String printableCode(Key key) { - return key != null ? Constants.printableCode(key.getCode()) : "none"; - } - - public static String printableCodes(int[] codes) { - final StringBuilder sb = new StringBuilder(); - boolean addDelimiter = false; - for (final int code : codes) { - if (code == Constants.NOT_A_CODE) break; - if (addDelimiter) sb.append(", "); - sb.append(Constants.printableCode(code)); - addDelimiter = true; - } - return "[" + sb + "]"; - } } diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index bc1383aff..85dfea4e7 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -22,7 +22,11 @@ import com.android.inputmethod.keyboard.internal.KeyVisualAttributes; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.keyboard.internal.KeyboardParams; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.CoordinateUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard @@ -73,13 +77,13 @@ public class Keyboard { /** Maximum column for more keys keyboard */ public final int mMaxMoreKeysKeyboardColumn; - /** Array of keys and icons in this keyboard */ - private final Key[] mKeys; - public final Key[] mShiftKeys; - public final Key[] mAltCodeKeysWhileTyping; + /** List of keys in this keyboard */ + private final List<Key> mSortedKeys; + public final List<Key> mShiftKeys; + public final List<Key> mAltCodeKeysWhileTyping; public final KeyboardIconsSet mIconsSet; - private final SparseArray<Key> mKeyCache = CollectionUtils.newSparseArray(); + private final SparseArray<Key> mKeyCache = new SparseArray<>(); private final ProximityInfo mProximityInfo; private final boolean mProximityCharsCorrectionEnabled; @@ -99,15 +103,15 @@ public class Keyboard { mTopPadding = params.mTopPadding; mVerticalGap = params.mVerticalGap; - mKeys = params.mKeys.toArray(new Key[params.mKeys.size()]); - mShiftKeys = params.mShiftKeys.toArray(new Key[params.mShiftKeys.size()]); - mAltCodeKeysWhileTyping = params.mAltCodeKeysWhileTyping.toArray( - new Key[params.mAltCodeKeysWhileTyping.size()]); + mSortedKeys = Collections.unmodifiableList(new ArrayList<>(params.mSortedKeys)); + mShiftKeys = Collections.unmodifiableList(params.mShiftKeys); + mAltCodeKeysWhileTyping = Collections.unmodifiableList(params.mAltCodeKeysWhileTyping); mIconsSet = params.mIconsSet; mProximityInfo = new ProximityInfo(params.mId.mLocale.toString(), params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight, - mMostCommonKeyWidth, mMostCommonKeyHeight, mKeys, params.mTouchPositionCorrection); + mMostCommonKeyWidth, mMostCommonKeyHeight, mSortedKeys, + params.mTouchPositionCorrection); mProximityCharsCorrectionEnabled = params.mProximityCharsCorrectionEnabled; } @@ -126,7 +130,7 @@ public class Keyboard { mTopPadding = keyboard.mTopPadding; mVerticalGap = keyboard.mVerticalGap; - mKeys = keyboard.mKeys; + mSortedKeys = keyboard.mSortedKeys; mShiftKeys = keyboard.mShiftKeys; mAltCodeKeysWhileTyping = keyboard.mAltCodeKeysWhileTyping; mIconsSet = keyboard.mIconsSet; @@ -151,17 +155,14 @@ public class Keyboard { return mProximityInfo; } - public Key[] getKeys() { - return mKeys; - } - - public Key getKeyFromOutputText(final String outputText) { - for (final Key key : getKeys()) { - if (outputText.equals(key.getOutputText())) { - return key; - } - } - return null; + /** + * Return the sorted list of keys of this keyboard. + * The keys are sorted from top-left to bottom-right order. + * The list may contain {@link Key.Spacer} object as well. + * @return the sorted unmodifiable list of {@link Key}s of this keyboard. + */ + public List<Key> getSortedKeys() { + return mSortedKeys; } public Key getKey(final int code) { @@ -174,7 +175,7 @@ public class Keyboard { return mKeyCache.valueAt(index); } - for (final Key key : getKeys()) { + for (final Key key : getSortedKeys()) { if (key.getCode() == code) { mKeyCache.put(code, key); return key; @@ -190,7 +191,7 @@ public class Keyboard { return true; } - for (final Key key : getKeys()) { + for (final Key key : getSortedKeys()) { if (key == aKey) { mKeyCache.put(key.getCode(), key); return true; @@ -208,13 +209,29 @@ public class Keyboard { * Returns the array 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 the nearest keys to the given point. If the given + * @return the list of the nearest keys to the given point. If the given * point is out of range, then an array of size zero is returned. */ - public Key[] getNearestKeys(final int x, final int y) { + public List<Key> getNearestKeys(final int x, final int y) { // Avoid dead pixels at edges of the keyboard final int adjustedX = Math.max(0, Math.min(x, mOccupiedWidth - 1)); final int adjustedY = Math.max(0, Math.min(y, mOccupiedHeight - 1)); return mProximityInfo.getNearestKeys(adjustedX, adjustedY); } + + public int[] getCoordinates(final int[] codePoints) { + final int length = codePoints.length; + final int[] coordinates = CoordinateUtils.newCoordinateArray(length); + for (int i = 0; i < length; ++i) { + final Key key = getKey(codePoints[i]); + if (null != key) { + CoordinateUtils.setXYInArray(coordinates, i, + key.getX() + key.getWidth() / 2, key.getY() + key.getHeight() / 2); + } else { + CoordinateUtils.setXYInArray(coordinates, i, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); + } + } + return coordinates; + } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java index dc760e685..c565866b7 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java @@ -53,8 +53,10 @@ public interface KeyboardActionListener { * {@link PointerTracker} or so, the value should be * {@link Constants#NOT_A_COORDINATE}.If it's called on insertion from the * suggestion strip, it should be {@link Constants#SUGGESTION_STRIP_COORDINATE}. + * @param isKeyRepeat true if this is a key repeat, false otherwise */ - public void onCodeInput(int primaryCode, int x, int y); + // TODO: change this to send an Event object instead + public void onCodeInput(int primaryCode, int x, int y, boolean isKeyRepeat); /** * Sends a string of characters to the listener. @@ -107,7 +109,7 @@ public interface KeyboardActionListener { @Override public void onReleaseKey(int primaryCode, boolean withSliding) {} @Override - public void onCodeInput(int primaryCode, int x, int y) {} + public void onCodeInput(int primaryCode, int x, int y, boolean isKeyRepeat) {} @Override public void onTextInput(String text) {} @Override diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java index 736f13ed6..3c1167538 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java @@ -68,10 +68,8 @@ public final class KeyboardId { public final int mHeight; public final int mMode; public final int mElementId; - private final EditorInfo mEditorInfo; + public final EditorInfo mEditorInfo; public final boolean mClobberSettingsKey; - public final boolean mShortcutKeyEnabled; - public final boolean mShortcutKeyOnSymbols; public final boolean mLanguageSwitchKeyEnabled; public final String mCustomActionLabel; public final boolean mHasShortcutKey; @@ -87,17 +85,10 @@ public final class KeyboardId { mElementId = elementId; mEditorInfo = params.mEditorInfo; mClobberSettingsKey = params.mNoSettingsKey; - mShortcutKeyEnabled = params.mVoiceKeyEnabled; - mShortcutKeyOnSymbols = mShortcutKeyEnabled && !params.mVoiceKeyOnMain; mLanguageSwitchKeyEnabled = params.mLanguageSwitchKeyEnabled; mCustomActionLabel = (mEditorInfo.actionLabel != null) ? mEditorInfo.actionLabel.toString() : null; - final boolean alphabetMayHaveShortcutKey = isAlphabetKeyboard(elementId) - && !mShortcutKeyOnSymbols; - final boolean symbolsMayHaveShortcutKey = (elementId == KeyboardId.ELEMENT_SYMBOLS) - && mShortcutKeyOnSymbols; - mHasShortcutKey = mShortcutKeyEnabled - && (alphabetMayHaveShortcutKey || symbolsMayHaveShortcutKey); + mHasShortcutKey = params.mVoiceInputKeyEnabled; mHashCode = computeHashCode(this); } @@ -110,8 +101,7 @@ public final class KeyboardId { id.mHeight, id.passwordInput(), id.mClobberSettingsKey, - id.mShortcutKeyEnabled, - id.mShortcutKeyOnSymbols, + id.mHasShortcutKey, id.mLanguageSwitchKeyEnabled, id.isMultiLine(), id.imeAction(), @@ -131,8 +121,7 @@ public final class KeyboardId { && other.mHeight == mHeight && other.passwordInput() == passwordInput() && other.mClobberSettingsKey == mClobberSettingsKey - && other.mShortcutKeyEnabled == mShortcutKeyEnabled - && other.mShortcutKeyOnSymbols == mShortcutKeyOnSymbols + && other.mHasShortcutKey == mHasShortcutKey && other.mLanguageSwitchKeyEnabled == mLanguageSwitchKeyEnabled && other.isMultiLine() == isMultiLine() && other.imeAction() == imeAction() @@ -186,21 +175,19 @@ public final class KeyboardId { @Override public String toString() { - return String.format(Locale.ROOT, "[%s %s:%s %dx%d %s %s %s%s%s%s%s%s%s%s%s]", + return String.format(Locale.ROOT, "[%s %s:%s %dx%d %s %s%s%s%s%s%s%s%s]", elementIdToName(mElementId), mLocale, mSubtype.getExtraValueOf(KEYBOARD_LAYOUT_SET), mWidth, mHeight, modeName(mMode), - imeAction(), - (navigateNext() ? "navigateNext" : ""), - (navigatePrevious() ? "navigatePrevious" : ""), + actionName(imeAction()), + (navigateNext() ? " navigateNext" : ""), + (navigatePrevious() ? " navigatePrevious" : ""), (mClobberSettingsKey ? " clobberSettingsKey" : ""), (passwordInput() ? " passwordInput" : ""), - (mShortcutKeyEnabled ? " shortcutKeyEnabled" : ""), - (mShortcutKeyOnSymbols ? " shortcutKeyOnSymbols" : ""), (mHasShortcutKey ? " hasShortcutKey" : ""), (mLanguageSwitchKeyEnabled ? " languageSwitchKeyEnabled" : ""), - (isMultiLine() ? "isMultiLine" : "") + (isMultiLine() ? " isMultiLine" : "") ); } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java index 1eccdf341..d01c4cc8f 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java @@ -17,10 +17,7 @@ package com.android.inputmethod.keyboard; import static com.android.inputmethod.latin.Constants.ImeOption.FORCE_ASCII; -import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE; -import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE_COMPAT; import static com.android.inputmethod.latin.Constants.ImeOption.NO_SETTINGS_KEY; -import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.ASCII_CAPABLE; import android.content.Context; import android.content.res.Resources; @@ -34,6 +31,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.compat.EditorInfoCompatUtils; +import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardParams; import com.android.inputmethod.keyboard.internal.KeysCache; @@ -41,8 +39,8 @@ import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SubtypeSwitcher; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.InputTypeUtils; +import com.android.inputmethod.latin.utils.ScriptUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.XmlParseUtils; @@ -66,6 +64,7 @@ public final class KeyboardLayoutSet { private static final String TAG_KEYBOARD_SET = "KeyboardLayoutSet"; private static final String TAG_ELEMENT = "Element"; + private static final String TAG_FEATURE = "Feature"; private static final String KEYBOARD_LAYOUT_SET_RESOURCE_PREFIX = "keyboard_layout_set_"; @@ -81,7 +80,7 @@ public final class KeyboardLayoutSet { // them from disappearing from sKeyboardCache. private static final Keyboard[] sForcibleKeyboardCache = new Keyboard[FORCIBLE_CACHE_SIZE]; private static final HashMap<KeyboardId, SoftReference<Keyboard>> sKeyboardCache = - CollectionUtils.newHashMap(); + new HashMap<>(); private static final KeysCache sKeysCache = new KeysCache(); @SuppressWarnings("serial") @@ -103,21 +102,21 @@ public final class KeyboardLayoutSet { public static final class Params { String mKeyboardLayoutSetName; int mMode; - EditorInfo mEditorInfo; boolean mDisableTouchPositionCorrectionDataForTest; - boolean mVoiceKeyEnabled; - // TODO: Remove mVoiceKeyOnMain when it's certainly confirmed that we no longer show - // the voice input key on the symbol layout - boolean mVoiceKeyOnMain; + // TODO: Use {@link InputAttributes} instead of these variables. + EditorInfo mEditorInfo; + boolean mIsPasswordField; + boolean mVoiceInputKeyEnabled; boolean mNoSettingsKey; boolean mLanguageSwitchKeyEnabled; InputMethodSubtype mSubtype; boolean mIsSpellChecker; int mKeyboardWidth; int mKeyboardHeight; + int mScriptId; // Sparse array of KeyboardLayoutSet element parameters indexed by element's id. final SparseArray<ElementParams> mKeyboardLayoutSetElementIdToParamsMap = - CollectionUtils.newSparseArray(); + new SparseArray<>(); } public static void clearKeyboardCache() { @@ -181,7 +180,7 @@ public final class KeyboardLayoutSet { } final KeyboardBuilder<KeyboardParams> builder = - new KeyboardBuilder<KeyboardParams>(mContext, new KeyboardParams()); + new KeyboardBuilder<>(mContext, new KeyboardParams()); if (id.isAlphabetKeyboard()) { builder.setAutoGenerate(sKeysCache); } @@ -192,7 +191,7 @@ public final class KeyboardLayoutSet { } builder.setProximityCharsCorrectionEnabled(elementParams.mProximityCharsCorrectionEnabled); final Keyboard keyboard = builder.build(); - sKeyboardCache.put(id, new SoftReference<Keyboard>(keyboard)); + sKeyboardCache.put(id, new SoftReference<>(keyboard)); if ((id.mElementId == KeyboardId.ELEMENT_ALPHABET || id.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) && !mParams.mIsSpellChecker) { @@ -212,6 +211,10 @@ public final class KeyboardLayoutSet { return keyboard; } + public int getScriptId() { + return mParams.mScriptId; + } + public static final class Builder { private final Context mContext; private final String mPackageName; @@ -221,16 +224,19 @@ public final class KeyboardLayoutSet { private static final EditorInfo EMPTY_EDITOR_INFO = new EditorInfo(); - public Builder(final Context context, final EditorInfo editorInfo) { + public Builder(final Context context, final EditorInfo ei) { mContext = context; mPackageName = context.getPackageName(); mResources = context.getResources(); final Params params = mParams; + final EditorInfo editorInfo = (ei != null) ? ei : EMPTY_EDITOR_INFO; params.mMode = getKeyboardMode(editorInfo); - params.mEditorInfo = (editorInfo != null) ? editorInfo : EMPTY_EDITOR_INFO; + // TODO: Consolidate those with {@link InputAttributes}. + params.mEditorInfo = editorInfo; + params.mIsPasswordField = InputTypeUtils.isPasswordInputType(editorInfo.inputType); params.mNoSettingsKey = InputAttributes.inPrivateImeOptions( - mPackageName, NO_SETTINGS_KEY, params.mEditorInfo); + mPackageName, NO_SETTINGS_KEY, editorInfo); } public Builder setKeyboardGeometry(final int keyboardWidth, final int keyboardHeight) { @@ -240,7 +246,8 @@ public final class KeyboardLayoutSet { } public Builder setSubtype(final InputMethodSubtype subtype) { - final boolean asciiCapable = subtype.containsExtraValueKey(ASCII_CAPABLE); + final boolean asciiCapable = InputMethodSubtypeCompatUtils.isAsciiCapable(subtype); + // TODO: Consolidate with {@link InputAttributes}. @SuppressWarnings("deprecation") final boolean deprecatedForceAscii = InputAttributes.inPrivateImeOptions( mPackageName, FORCE_ASCII, mParams.mEditorInfo); @@ -261,19 +268,13 @@ public final class KeyboardLayoutSet { return this; } - // TODO: Remove mVoiceKeyOnMain when it's certainly confirmed that we no longer show - // the voice input key on the symbol layout - public Builder setOptions(final boolean voiceKeyEnabled, final boolean voiceKeyOnMain, - final boolean languageSwitchKeyEnabled) { - @SuppressWarnings("deprecation") - final boolean deprecatedNoMicrophone = InputAttributes.inPrivateImeOptions( - null, NO_MICROPHONE_COMPAT, mParams.mEditorInfo); - final boolean noMicrophone = InputAttributes.inPrivateImeOptions( - mPackageName, NO_MICROPHONE, mParams.mEditorInfo) - || deprecatedNoMicrophone; - mParams.mVoiceKeyEnabled = voiceKeyEnabled && !noMicrophone; - mParams.mVoiceKeyOnMain = voiceKeyOnMain; - mParams.mLanguageSwitchKeyEnabled = languageSwitchKeyEnabled; + public Builder setVoiceInputKeyEnabled(final boolean enabled) { + mParams.mVoiceInputKeyEnabled = enabled; + return this; + } + + public Builder setLanguageSwitchKeyEnabled(final boolean enabled) { + mParams.mLanguageSwitchKeyEnabled = enabled; return this; } @@ -281,6 +282,10 @@ public final class KeyboardLayoutSet { mParams.mDisableTouchPositionCorrectionDataForTest = true; } + public void setScriptId(final int scriptId) { + mParams.mScriptId = scriptId; + } + public KeyboardLayoutSet build() { if (mParams.mSubtype == null) throw new RuntimeException("KeyboardLayoutSet subtype is not specified"); @@ -326,6 +331,8 @@ public final class KeyboardLayoutSet { final String tag = parser.getName(); if (TAG_ELEMENT.equals(tag)) { parseKeyboardLayoutSetElement(parser); + } else if (TAG_FEATURE.equals(tag)) { + parseKeyboardLayoutSetFeature(parser); } else { throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD_SET); } @@ -367,10 +374,22 @@ public final class KeyboardLayoutSet { } } - private static int getKeyboardMode(final EditorInfo editorInfo) { - if (editorInfo == null) - return KeyboardId.MODE_TEXT; + private void parseKeyboardLayoutSetFeature(final XmlPullParser parser) + throws XmlPullParserException, IOException { + final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.KeyboardLayoutSet_Feature); + try { + final int scriptId = a.getInt( + R.styleable.KeyboardLayoutSet_Feature_supportedScript, + ScriptUtils.SCRIPT_LATIN); + XmlParseUtils.checkEndTag(TAG_FEATURE, parser); + setScriptId(scriptId); + } finally { + a.recycle(); + } + } + private static int getKeyboardMode(final EditorInfo editorInfo) { final int inputType = editorInfo.inputType; final int variation = inputType & InputType.TYPE_MASK_VARIATION; diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 5abc9ab38..f35126750 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -26,46 +26,24 @@ import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; -import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; import com.android.inputmethod.compat.InputMethodServiceCompatUtils; import com.android.inputmethod.keyboard.KeyboardLayoutSet.KeyboardLayoutSetException; +import com.android.inputmethod.keyboard.emoji.EmojiPalettesView; import com.android.inputmethod.keyboard.internal.KeyboardState; +import com.android.inputmethod.keyboard.internal.KeyboardTextsSet; import com.android.inputmethod.latin.InputView; import com.android.inputmethod.latin.LatinIME; -import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodManager; import com.android.inputmethod.latin.SubtypeSwitcher; import com.android.inputmethod.latin.WordComposer; -import com.android.inputmethod.latin.settings.Settings; import com.android.inputmethod.latin.settings.SettingsValues; import com.android.inputmethod.latin.utils.ResourceUtils; +import com.android.inputmethod.latin.utils.ScriptUtils; public final class KeyboardSwitcher implements KeyboardState.SwitchActions { private static final String TAG = KeyboardSwitcher.class.getSimpleName(); - static final class KeyboardTheme { - public final int mThemeId; - public final int mStyleId; - - // Note: The themeId should be aligned with "themeId" attribute of Keyboard style - // in values/style.xml. - public KeyboardTheme(final int themeId, final int styleId) { - mThemeId = themeId; - mStyleId = styleId; - } - } - - public static final int THEME_INDEX_ICS = 0; - public static final int THEME_INDEX_GB = 1; - public static final int THEME_INDEX_KLP = 2; - public static final int THEME_INDEX_DEFAULT = THEME_INDEX_KLP; - public static final KeyboardTheme[] KEYBOARD_THEMES = { - new KeyboardTheme(THEME_INDEX_ICS, R.style.KeyboardTheme_ICS), - new KeyboardTheme(THEME_INDEX_GB, R.style.KeyboardTheme_GB), - new KeyboardTheme(THEME_INDEX_KLP, R.style.KeyboardTheme_KLP), - }; - private SubtypeSwitcher mSubtypeSwitcher; private SharedPreferences mPrefs; @@ -74,18 +52,16 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { private MainKeyboardView mKeyboardView; private EmojiPalettesView mEmojiPalettesView; private LatinIME mLatinIME; - private Resources mResources; private boolean mIsHardwareAcceleratedDrawingEnabled; private KeyboardState mState; private KeyboardLayoutSet mKeyboardLayoutSet; + // TODO: The following {@link KeyboardTextsSet} should be in {@link KeyboardLayoutSet}. + private final KeyboardTextsSet mKeyboardTextsSet = new KeyboardTextsSet(); + private SettingsValues mCurrentSettingsValues; - /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of - * what user actually typed. */ - private boolean mIsAutoCorrectionActive; - - private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[THEME_INDEX_DEFAULT]; + private KeyboardTheme mKeyboardTheme; private Context mThemeContext; private static final KeyboardSwitcher sInstance = new KeyboardSwitcher(); @@ -105,7 +81,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { private void initInternal(final LatinIME latinIme, final SharedPreferences prefs) { mLatinIME = latinIme; - mResources = latinIme.getResources(); mPrefs = prefs; mSubtypeSwitcher = SubtypeSwitcher.getInstance(); mState = new KeyboardState(this); @@ -115,28 +90,15 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { public void updateKeyboardTheme() { final boolean themeUpdated = updateKeyboardThemeAndContextThemeWrapper( - mLatinIME, getKeyboardTheme(mLatinIME, mPrefs)); + mLatinIME, KeyboardTheme.getKeyboardTheme(mPrefs)); if (themeUpdated && mKeyboardView != null) { mLatinIME.setInputView(onCreateInputView(mIsHardwareAcceleratedDrawingEnabled)); } } - private static KeyboardTheme getKeyboardTheme(final Context context, - final SharedPreferences prefs) { - final Resources res = context.getResources(); - final int index = Settings.readKeyboardThemeIndex(prefs, res); - if (index >= 0 && index < KEYBOARD_THEMES.length) { - return KEYBOARD_THEMES[index]; - } - final int defaultThemeIndex = Settings.resetAndGetDefaultKeyboardThemeIndex(prefs, res); - Log.w(TAG, "Illegal keyboard theme in preference: " + index + ", default to " - + defaultThemeIndex); - return KEYBOARD_THEMES[defaultThemeIndex]; - } - private boolean updateKeyboardThemeAndContextThemeWrapper(final Context context, final KeyboardTheme keyboardTheme) { - if (mThemeContext == null || mKeyboardTheme.mThemeId != keyboardTheme.mThemeId) { + if (mThemeContext == null || !keyboardTheme.equals(mKeyboardTheme)) { mKeyboardTheme = keyboardTheme; mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId); KeyboardLayoutSet.clearKeyboardCache(); @@ -145,7 +107,8 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return false; } - public void loadKeyboard(final EditorInfo editorInfo, final SettingsValues settingsValues) { + public void loadKeyboard(final EditorInfo editorInfo, final SettingsValues settingsValues, + final int currentAutoCapsState, final int currentRecapitalizeState) { final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( mThemeContext, editorInfo); final Resources res = mThemeContext.getResources(); @@ -153,16 +116,15 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res); builder.setKeyboardGeometry(keyboardWidth, keyboardHeight); builder.setSubtype(mSubtypeSwitcher.getCurrentSubtype()); - builder.setOptions( - settingsValues.isVoiceKeyEnabled(editorInfo), - true /* always show a voice key on the main keyboard */, - settingsValues.isLanguageSwitchKeyEnabled()); + builder.setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey); + builder.setLanguageSwitchKeyEnabled(mLatinIME.shouldShowLanguageSwitchKey()); mKeyboardLayoutSet = builder.build(); + mCurrentSettingsValues = settingsValues; try { - mState.onLoadKeyboard(); + mState.onLoadKeyboard(currentAutoCapsState, currentRecapitalizeState); + mKeyboardTextsSet.setLocale(mSubtypeSwitcher.getCurrentSubtypeLocale(), mThemeContext); } catch (KeyboardLayoutSetException e) { Log.w(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause()); - LatinImeLogger.logOnException(e.mKeyboardId.toString(), e.getCause()); return; } } @@ -173,12 +135,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } } - public void onFinishInputView() { - mIsAutoCorrectionActive = false; - } - public void onHideWindow() { - mIsAutoCorrectionActive = false; + if (mKeyboardView != null) { + mKeyboardView.onHideWindow(); + } } private void setKeyboard(final Keyboard keyboard) { @@ -187,18 +147,24 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { final MainKeyboardView keyboardView = mKeyboardView; final Keyboard oldKeyboard = keyboardView.getKeyboard(); keyboardView.setKeyboard(keyboard); - mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding); + mCurrentInputView.setKeyboardTopPadding(keyboard.mTopPadding); keyboardView.setKeyPreviewPopupEnabled( - Settings.readKeyPreviewPopupEnabled(mPrefs, mResources), - Settings.readKeyPreviewPopupDismissDelay(mPrefs, mResources)); - keyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive); + mCurrentSettingsValues.mKeyPreviewPopupOn, + mCurrentSettingsValues.mKeyPreviewPopupDismissDelay); + keyboardView.setKeyPreviewAnimationParams( + mCurrentSettingsValues.mKeyPreviewShowUpStartScale, + mCurrentSettingsValues.mKeyPreviewShowUpDuration, + mCurrentSettingsValues.mKeyPreviewDismissEndScale, + mCurrentSettingsValues.mKeyPreviewDismissDuration); keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady()); final boolean subtypeChanged = (oldKeyboard == null) || !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale); - final boolean needsToDisplayLanguage = mSubtypeSwitcher.needsToDisplayLanguage( - keyboard.mId.mLocale); - keyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, needsToDisplayLanguage, - RichInputMethodManager.getInstance().hasMultipleEnabledIMEsOrSubtypes(true)); + final int languageOnSpacebarFormatType = mSubtypeSwitcher.getLanguageOnSpacebarFormatType( + keyboard.mId.mSubtype); + final boolean hasMultipleEnabledIMEsOrSubtypes = RichInputMethodManager.getInstance() + .hasMultipleEnabledIMEsOrSubtypes(true /* shouldIncludeAuxiliarySubtypes */); + keyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, languageOnSpacebarFormatType, + hasMultipleEnabledIMEsOrSubtypes); } public Keyboard getKeyboard() { @@ -208,30 +174,26 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return null; } - /** - * Update keyboard shift state triggered by connected EditText status change. - */ - public void updateShiftState() { - mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState(), - mLatinIME.getCurrentRecapitalizeState()); - } - // TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout // when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal(). - public void resetKeyboardStateToAlphabet() { - mState.onResetKeyboardStateToAlphabet(); + public void resetKeyboardStateToAlphabet(final int currentAutoCapsState, + final int currentRecapitalizeState) { + mState.onResetKeyboardStateToAlphabet(currentAutoCapsState, currentRecapitalizeState); } - public void onPressKey(final int code, final boolean isSinglePointer) { - mState.onPressKey(code, isSinglePointer, mLatinIME.getCurrentAutoCapsState()); + public void onPressKey(final int code, final boolean isSinglePointer, + final int currentAutoCapsState, final int currentRecapitalizeState) { + mState.onPressKey(code, isSinglePointer, currentAutoCapsState, currentRecapitalizeState); } - public void onReleaseKey(final int code, final boolean withSliding) { - mState.onReleaseKey(code, withSliding); + public void onReleaseKey(final int code, final boolean withSliding, + final int currentAutoCapsState, final int currentRecapitalizeState) { + mState.onReleaseKey(code, withSliding, currentAutoCapsState, currentRecapitalizeState); } - public void onFinishSlidingInput() { - mState.onFinishSlidingInput(); + public void onFinishSlidingInput(final int currentAutoCapsState, + final int currentRecapitalizeState) { + mState.onFinishSlidingInput(currentAutoCapsState, currentRecapitalizeState); } // Implements {@link KeyboardState.SwitchActions}. @@ -279,8 +241,11 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public void setEmojiKeyboard() { + final Keyboard keyboard = mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET); mMainKeyboardFrame.setVisibility(View.GONE); - mEmojiPalettesView.startEmojiPalettes(); + mEmojiPalettesView.startEmojiPalettes( + mKeyboardTextsSet.getText(KeyboardTextsSet.SWITCH_TO_ALPHA_KEY_LABEL), + mKeyboardView.getKeyVisualAttribute(), keyboard.mIconsSet); mEmojiPalettesView.setVisibility(View.VISIBLE); } @@ -290,11 +255,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_SYMBOLS_SHIFTED)); } - // Implements {@link KeyboardState.SwitchActions}. - @Override - public void requestUpdatingShiftState() { - mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState(), - mLatinIME.getCurrentRecapitalizeState()); + // Future method for requesting an updating to the shift state. + public void requestUpdatingShiftState(final int currentAutoCapsState, + final int currentRecapitalizeState) { + mState.onUpdateShiftState(currentAutoCapsState, currentRecapitalizeState); } // Implements {@link KeyboardState.SwitchActions}. @@ -325,12 +289,9 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { /** * Updates state machine to figure out when to automatically switch back to the previous mode. */ - public void onCodeInput(final int code) { - mState.onCodeInput(code, mLatinIME.getCurrentAutoCapsState()); - } - - private boolean isShowingMainKeyboard() { - return null != mKeyboardView && mKeyboardView.isShown(); + public void onCodeInput(final int code, final int currentAutoCapsState, + final int currentRecapitalizeState) { + mState.onCodeInput(code, currentAutoCapsState, currentRecapitalizeState); } public boolean isShowingEmojiPalettes() { @@ -365,16 +326,13 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } } - public boolean isShowingMainKeyboardOrEmojiPalettes() { - return isShowingMainKeyboard() || isShowingEmojiPalettes(); - } - public View onCreateInputView(final boolean isHardwareAcceleratedDrawingEnabled) { if (mKeyboardView != null) { mKeyboardView.closing(); } - updateKeyboardThemeAndContextThemeWrapper(mLatinIME, mKeyboardTheme); + updateKeyboardThemeAndContextThemeWrapper( + mLatinIME, KeyboardTheme.getKeyboardTheme(mPrefs)); mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate( R.layout.input_view, null); mMainKeyboardFrame = mCurrentInputView.findViewById(R.id.main_keyboard_frame); @@ -387,11 +345,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mEmojiPalettesView.setHardwareAcceleratedDrawingEnabled( isHardwareAcceleratedDrawingEnabled); mEmojiPalettesView.setKeyboardActionListener(mLatinIME); - - // This always needs to be set since the accessibility state can - // potentially change without the input view being re-created. - AccessibleKeyboardViewProxy.getInstance().setView(mKeyboardView); - return mCurrentInputView; } @@ -401,15 +354,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } } - public void onAutoCorrectionStateChanged(final boolean isAutoCorrection) { - if (mIsAutoCorrectionActive != isAutoCorrection) { - mIsAutoCorrectionActive = isAutoCorrection; - if (mKeyboardView != null) { - mKeyboardView.updateAutoCorrectionState(isAutoCorrection); - } - } - } - public int getKeyboardShiftMode() { final Keyboard keyboard = getKeyboard(); if (keyboard == null) { @@ -427,4 +371,11 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return WordComposer.CAPS_MODE_OFF; } } + + public int getCurrentKeyboardScriptId() { + if (null == mKeyboardLayoutSet) { + return ScriptUtils.SCRIPT_UNKNOWN; + } + return mKeyboardLayoutSet.getScriptId(); + } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java new file mode 100644 index 000000000..7b41dfef6 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2014 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 android.content.SharedPreferences; +import android.os.Build; +import android.os.Build.VERSION_CODES; +import android.util.Log; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.R; + +import java.util.Arrays; + +public final class KeyboardTheme implements Comparable<KeyboardTheme> { + private static final String TAG = KeyboardTheme.class.getSimpleName(); + + static final String KLP_KEYBOARD_THEME_KEY = "pref_keyboard_layout_20110916"; + static final String LXX_KEYBOARD_THEME_KEY = "pref_keyboard_theme_20140509"; + + public static final int THEME_ID_ICS = 0; + public static final int THEME_ID_KLP = 2; + public static final int THEME_ID_LXX_DARK = 3; + public static final int DEFAULT_THEME_ID = THEME_ID_KLP; + + private static final KeyboardTheme[] KEYBOARD_THEMES = { + new KeyboardTheme(THEME_ID_ICS, R.style.KeyboardTheme_ICS, + // This has never been selected because we support ICS or later. + VERSION_CODES.BASE), + new KeyboardTheme(THEME_ID_KLP, R.style.KeyboardTheme_KLP, + // Default theme for ICS, JB, and KLP. + VERSION_CODES.ICE_CREAM_SANDWICH), + new KeyboardTheme(THEME_ID_LXX_DARK, R.style.KeyboardTheme_LXX_Dark, + // Default theme for LXX. + // TODO: Update this constant once the *next* version becomes available. + VERSION_CODES.CUR_DEVELOPMENT), + }; + + static { + // Sort {@link #KEYBOARD_THEME} by descending order of {@link #mMinApiVersion}. + Arrays.sort(KEYBOARD_THEMES); + } + + public final int mThemeId; + public final int mStyleId; + private final int mMinApiVersion; + + // Note: The themeId should be aligned with "themeId" attribute of Keyboard style + // in values/themes-<style>.xml. + private KeyboardTheme(final int themeId, final int styleId, final int minApiVersion) { + mThemeId = themeId; + mStyleId = styleId; + mMinApiVersion = minApiVersion; + } + + @Override + public int compareTo(final KeyboardTheme rhs) { + if (mMinApiVersion > rhs.mMinApiVersion) return -1; + if (mMinApiVersion < rhs.mMinApiVersion) return 1; + return 0; + } + + @Override + public boolean equals(final Object o) { + if (o == this) return true; + return (o instanceof KeyboardTheme) && ((KeyboardTheme)o).mThemeId == mThemeId; + } + + @Override + public int hashCode() { + return mThemeId; + } + + @UsedForTesting + static KeyboardTheme searchKeyboardThemeById(final int themeId) { + // TODO: This search algorithm isn't optimal if there are many themes. + for (final KeyboardTheme theme : KEYBOARD_THEMES) { + if (theme.mThemeId == themeId) { + return theme; + } + } + return null; + } + + private static int getSdkVersion() { + final int sdkVersion = Build.VERSION.SDK_INT; + // TODO: Consider to remove this check once the *next* version becomes available. + if (sdkVersion > VERSION_CODES.KITKAT) { + return VERSION_CODES.CUR_DEVELOPMENT; + } + return sdkVersion; + } + + @UsedForTesting + static KeyboardTheme getDefaultKeyboardTheme(final SharedPreferences prefs, + final int sdkVersion) { + final String klpThemeIdString = prefs.getString(KLP_KEYBOARD_THEME_KEY, null); + if (klpThemeIdString != null) { + if (sdkVersion <= VERSION_CODES.KITKAT) { + try { + final int themeId = Integer.parseInt(klpThemeIdString); + final KeyboardTheme theme = searchKeyboardThemeById(themeId); + if (theme != null) { + return theme; + } + Log.w(TAG, "Unknown keyboard theme in KLP preference: " + klpThemeIdString); + } catch (final NumberFormatException e) { + Log.w(TAG, "Illegal keyboard theme in KLP preference: " + klpThemeIdString, e); + } + } + // Remove old preference. + Log.i(TAG, "Remove KLP keyboard theme preference: " + klpThemeIdString); + prefs.edit().remove(KLP_KEYBOARD_THEME_KEY).apply(); + } + // TODO: This search algorithm isn't optimal if there are many themes. + for (final KeyboardTheme theme : KEYBOARD_THEMES) { + if (sdkVersion >= theme.mMinApiVersion) { + return theme; + } + } + return searchKeyboardThemeById(DEFAULT_THEME_ID); + } + + public static void saveKeyboardThemeId(final String themeIdString, + final SharedPreferences prefs) { + saveKeyboardThemeId(themeIdString, prefs, getSdkVersion()); + } + + @UsedForTesting + static String getPreferenceKey(final int sdkVersion) { + if (sdkVersion <= VERSION_CODES.KITKAT) { + return KLP_KEYBOARD_THEME_KEY; + } + return LXX_KEYBOARD_THEME_KEY; + } + + @UsedForTesting + static void saveKeyboardThemeId(final String themeIdString, + final SharedPreferences prefs, final int sdkVersion) { + final String prefKey = getPreferenceKey(sdkVersion); + prefs.edit().putString(prefKey, themeIdString).apply(); + } + + public static KeyboardTheme getKeyboardTheme(final SharedPreferences prefs) { + return getKeyboardTheme(prefs, getSdkVersion()); + } + + @UsedForTesting + static KeyboardTheme getKeyboardTheme(final SharedPreferences prefs, final int sdkVersion) { + final String lxxThemeIdString = prefs.getString(LXX_KEYBOARD_THEME_KEY, null); + if (lxxThemeIdString == null) { + return getDefaultKeyboardTheme(prefs, sdkVersion); + } + try { + final int themeId = Integer.parseInt(lxxThemeIdString); + final KeyboardTheme theme = searchKeyboardThemeById(themeId); + if (theme != null) { + return theme; + } + Log.w(TAG, "Unknown keyboard theme in LXX preference: " + lxxThemeIdString); + } catch (final NumberFormatException e) { + Log.w(TAG, "Illegal keyboard theme in LXX preference: " + lxxThemeIdString, e); + } + // Remove preference that contains unknown or illegal theme id. + prefs.edit().remove(LXX_KEYBOARD_THEME_KEY).apply(); + return getDefaultKeyboardTheme(prefs, sdkVersion); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 5578713a0..c4ca1c495 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -28,18 +28,15 @@ import android.graphics.Rect; import android.graphics.Region; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.graphics.drawable.NinePatchDrawable; import android.util.AttributeSet; import android.view.View; import com.android.inputmethod.keyboard.internal.KeyDrawParams; import com.android.inputmethod.keyboard.internal.KeyVisualAttributes; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.define.ProductionFlag; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.TypefaceUtils; -import com.android.inputmethod.research.ResearchLogger; import java.util.HashSet; @@ -47,6 +44,9 @@ import java.util.HashSet; * A view that renders a virtual {@link Keyboard}. * * @attr ref R.styleable#KeyboardView_keyBackground + * @attr ref R.styleable#KeyboardView_functionalKeyBackground + * @attr ref R.styleable#KeyboardView_spacebarBackground + * @attr ref R.styleable#KeyboardView_spacebarIconWidthRatio * @attr ref R.styleable#KeyboardView_keyLabelHorizontalPadding * @attr ref R.styleable#KeyboardView_keyHintLetterPadding * @attr ref R.styleable#KeyboardView_keyPopupHintLetterPadding @@ -81,7 +81,11 @@ public class KeyboardView extends View { private final float mKeyTextShadowRadius; private final float mVerticalCorrection; private final Drawable mKeyBackground; + private final Drawable mFunctionalKeyBackground; + private final Drawable mSpacebarBackground; + private final float mSpacebarIconWidthRatio; private final Rect mKeyBackgroundPadding = new Rect(); + private static final float KET_TEXT_SHADOW_RADIUS_DISABLED = -1.0f; // HORIZONTAL ELLIPSIS "...", character for popup hint. private static final String POPUP_HINT_CHAR = "\u2026"; @@ -102,7 +106,7 @@ public class KeyboardView extends View { /** True if all keys should be drawn */ private boolean mInvalidateAllKeys; /** The keys that should be drawn */ - private final HashSet<Key> mInvalidatedKeys = CollectionUtils.newHashSet(); + private final HashSet<Key> mInvalidatedKeys = new HashSet<>(); /** The working rectangle variable */ private final Rect mWorkingRect = new Rect(); /** The keyboard bitmap buffer for faster updates */ @@ -113,9 +117,6 @@ public class KeyboardView extends View { private final Canvas mOffscreenCanvas = new Canvas(); private final Paint mPaint = new Paint(); private final Paint.FontMetrics mFontMetrics = new Paint.FontMetrics(); - private static final char[] KEY_LABEL_REFERENCE_CHAR = { 'M' }; - private static final char[] KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR = { '8' }; - public KeyboardView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.keyboardViewStyle); } @@ -127,6 +128,15 @@ public class KeyboardView extends View { R.styleable.KeyboardView, defStyle, R.style.KeyboardView); mKeyBackground = keyboardViewAttr.getDrawable(R.styleable.KeyboardView_keyBackground); mKeyBackground.getPadding(mKeyBackgroundPadding); + final Drawable functionalKeyBackground = keyboardViewAttr.getDrawable( + R.styleable.KeyboardView_functionalKeyBackground); + mFunctionalKeyBackground = (functionalKeyBackground != null) ? functionalKeyBackground + : mKeyBackground; + final Drawable spacebarBackground = keyboardViewAttr.getDrawable( + R.styleable.KeyboardView_spacebarBackground); + mSpacebarBackground = (spacebarBackground != null) ? spacebarBackground : mKeyBackground; + mSpacebarIconWidthRatio = keyboardViewAttr.getFloat( + R.styleable.KeyboardView_spacebarIconWidthRatio, 1.0f); mKeyLabelHorizontalPadding = keyboardViewAttr.getDimensionPixelOffset( R.styleable.KeyboardView_keyLabelHorizontalPadding, 0); mKeyHintLetterPadding = keyboardViewAttr.getDimension( @@ -136,7 +146,7 @@ public class KeyboardView extends View { mKeyShiftedLetterHintPadding = keyboardViewAttr.getDimension( R.styleable.KeyboardView_keyShiftedLetterHintPadding, 0.0f); mKeyTextShadowRadius = keyboardViewAttr.getFloat( - R.styleable.KeyboardView_keyTextShadowRadius, 0.0f); + R.styleable.KeyboardView_keyTextShadowRadius, KET_TEXT_SHADOW_RADIUS_DISABLED); mVerticalCorrection = keyboardViewAttr.getDimension( R.styleable.KeyboardView_verticalCorrection, 0.0f); keyboardViewAttr.recycle(); @@ -149,6 +159,10 @@ public class KeyboardView extends View { mPaint.setAntiAlias(true); } + public KeyVisualAttributes getKeyVisualAttribute() { + return mKeyVisualAttributes; + } + private static void blendAlpha(final Paint paint, final int alpha) { final int color = paint.getColor(); paint.setARGB((paint.getAlpha() * alpha) / Constants.Color.ALPHA_OPAQUE, @@ -170,7 +184,6 @@ public class KeyboardView extends View { */ public void setKeyboard(final Keyboard keyboard) { mKeyboard = keyboard; - LatinImeLogger.onSetKeyboard(keyboard); final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap; mKeyDrawParams.updateParams(keyHeight, mKeyVisualAttributes); mKeyDrawParams.updateParams(keyHeight, keyboard.mKeyVisualAttributes); @@ -288,7 +301,7 @@ public class KeyboardView extends View { // TODO: Confirm if it's really required to draw all keys when hardware acceleration is on. if (drawAllKeys || isHardwareAccelerated) { // Draw all keys. - for (final Key key : mKeyboard.getKeys()) { + for (final Key key : mKeyboard.getSortedKeys()) { onDrawKey(key, canvas, paint); } } else { @@ -300,13 +313,6 @@ public class KeyboardView extends View { } } - // Research Logging (Development Only Diagnostics) indicator. - // TODO: Reimplement using a keyboard background image specific to the ResearchLogger, - // and remove this call. - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().paintIndicator(this, paint, canvas, width, height); - } - mInvalidatedKeys.clear(); mInvalidateAllKeys = false; } @@ -322,7 +328,9 @@ public class KeyboardView extends View { params.mAnimAlpha = Constants.Color.ALPHA_OPAQUE; if (!key.isSpacer()) { - onDrawKeyBackground(key, canvas); + final Drawable background = key.selectBackgroundDrawable( + mKeyBackground, mFunctionalKeyBackground, mSpacebarBackground); + onDrawKeyBackground(key, canvas, background); } onDrawKeyTopVisuals(key, canvas, paint, params); @@ -330,24 +338,19 @@ public class KeyboardView extends View { } // Draw key background. - protected void onDrawKeyBackground(final Key key, final Canvas canvas) { + protected void onDrawKeyBackground(final Key key, final Canvas canvas, + final Drawable background) { final Rect padding = mKeyBackgroundPadding; final int bgWidth = key.getDrawWidth() + padding.left + padding.right; final int bgHeight = key.getHeight() + padding.top + padding.bottom; final int bgX = -padding.left; final int bgY = -padding.top; - final int[] drawableState = key.getCurrentDrawableState(); - final Drawable background = mKeyBackground; - background.setState(drawableState); final Rect bounds = background.getBounds(); if (bgWidth != bounds.right || bgHeight != bounds.bottom) { background.setBounds(0, 0, bgWidth, bgHeight); } canvas.translate(bgX, bgY); background.draw(canvas); - if (LatinImeLogger.sVISUALDEBUG) { - drawRectangle(canvas, 0.0f, 0.0f, bgWidth, bgHeight, 0x80c00000, new Paint()); - } canvas.translate(-bgX, -bgY); } @@ -359,10 +362,6 @@ public class KeyboardView extends View { final float centerX = keyWidth * 0.5f; final float centerY = keyHeight * 0.5f; - if (LatinImeLogger.sVISUALDEBUG) { - drawRectangle(canvas, 0.0f, 0.0f, keyWidth, keyHeight, 0x800000c0, new Paint()); - } - // Draw key label. final Drawable icon = key.getIcon(mKeyboard.mIconsSet, params.mAnimAlpha); float positionX = centerX; @@ -370,10 +369,8 @@ public class KeyboardView extends View { if (label != null) { paint.setTypeface(key.selectTypeface(params)); paint.setTextSize(key.selectTextSize(params)); - final float labelCharHeight = TypefaceUtils.getCharHeight( - KEY_LABEL_REFERENCE_CHAR, paint); - final float labelCharWidth = TypefaceUtils.getCharWidth( - KEY_LABEL_REFERENCE_CHAR, paint); + final float labelCharHeight = TypefaceUtils.getReferenceCharHeight(paint); + final float labelCharWidth = TypefaceUtils.getReferenceCharWidth(paint); // Vertical label text alignment. final float baseline = centerY + labelCharHeight / 2.0f; @@ -391,12 +388,12 @@ public class KeyboardView extends View { positionX = centerX - labelCharWidth * 7.0f / 4.0f; paint.setTextAlign(Align.LEFT); } else if (key.hasLabelWithIconLeft() && icon != null) { - labelWidth = TypefaceUtils.getLabelWidth(label, paint) + icon.getIntrinsicWidth() + labelWidth = TypefaceUtils.getStringWidth(label, paint) + icon.getIntrinsicWidth() + LABEL_ICON_MARGIN * keyWidth; positionX = centerX + labelWidth / 2.0f; paint.setTextAlign(Align.RIGHT); } else if (key.hasLabelWithIconRight() && icon != null) { - labelWidth = TypefaceUtils.getLabelWidth(label, paint) + icon.getIntrinsicWidth() + labelWidth = TypefaceUtils.getStringWidth(label, paint) + icon.getIntrinsicWidth() + LABEL_ICON_MARGIN * keyWidth; positionX = centerX - labelWidth / 2.0f; paint.setTextAlign(Align.LEFT); @@ -404,23 +401,34 @@ public class KeyboardView extends View { positionX = centerX; paint.setTextAlign(Align.CENTER); } - if (key.needsXScale()) { - paint.setTextScaleX(Math.min(1.0f, - (keyWidth * MAX_LABEL_RATIO) / TypefaceUtils.getLabelWidth(label, paint))); + if (key.needsAutoXScale()) { + final float ratio = Math.min(1.0f, (keyWidth * MAX_LABEL_RATIO) / + TypefaceUtils.getStringWidth(label, paint)); + if (key.needsAutoScale()) { + final float autoSize = paint.getTextSize() * ratio; + paint.setTextSize(autoSize); + } else { + paint.setTextScaleX(ratio); + } } - paint.setColor(key.selectTextColor(params)); if (key.isEnabled()) { - // Set a drop shadow for the text - paint.setShadowLayer(mKeyTextShadowRadius, 0.0f, 0.0f, params.mTextShadowColor); + paint.setColor(key.selectTextColor(params)); + // Set a drop shadow for the text if the shadow radius is positive value. + if (mKeyTextShadowRadius > 0.0f) { + paint.setShadowLayer(mKeyTextShadowRadius, 0.0f, 0.0f, params.mTextShadowColor); + } else { + paint.clearShadowLayer(); + } } else { // Make label invisible paint.setColor(Color.TRANSPARENT); + paint.clearShadowLayer(); } blendAlpha(paint, params.mAnimAlpha); canvas.drawText(label, 0, label.length(), positionX, baseline, paint); // Turn off drop shadow and reset x-scale. - paint.setShadowLayer(0.0f, 0.0f, 0.0f, Color.TRANSPARENT); + paint.clearShadowLayer(); paint.setTextScaleX(1.0f); if (icon != null) { @@ -435,12 +443,6 @@ public class KeyboardView extends View { drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight); } } - - if (LatinImeLogger.sVISUALDEBUG) { - final Paint line = new Paint(); - drawHorizontalLine(canvas, baseline, keyWidth, 0xc0008000, line); - drawVerticalLine(canvas, positionX, keyHeight, 0xc0800080, line); - } } // Draw hint label. @@ -451,67 +453,57 @@ public class KeyboardView extends View { // TODO: Should add a way to specify type face for hint letters paint.setTypeface(Typeface.DEFAULT_BOLD); blendAlpha(paint, params.mAnimAlpha); + final float labelCharHeight = TypefaceUtils.getReferenceCharHeight(paint); + final float labelCharWidth = TypefaceUtils.getReferenceCharWidth(paint); + final KeyVisualAttributes visualAttr = key.getVisualAttributes(); + final float adjustmentY = (visualAttr == null) ? 0.0f + : visualAttr.mHintLabelVerticalAdjustment * labelCharHeight; final float hintX, hintY; if (key.hasHintLabel()) { // The hint label is placed just right of the key label. Used mainly on // "phone number" layout. // TODO: Generalize the following calculations. - hintX = positionX - + TypefaceUtils.getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) * 2.0f; - hintY = centerY - + TypefaceUtils.getCharHeight(KEY_LABEL_REFERENCE_CHAR, paint) / 2.0f; + hintX = positionX + labelCharWidth * 2.0f; + hintY = centerY + labelCharHeight / 2.0f; paint.setTextAlign(Align.LEFT); } else if (key.hasShiftedLetterHint()) { // The hint label is placed at top-right corner of the key. Used mainly on tablet. - hintX = keyWidth - mKeyShiftedLetterHintPadding - - TypefaceUtils.getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) / 2.0f; + hintX = keyWidth - mKeyShiftedLetterHintPadding - labelCharWidth / 2.0f; paint.getFontMetrics(mFontMetrics); hintY = -mFontMetrics.top; paint.setTextAlign(Align.CENTER); } else { // key.hasHintLetter() // The hint letter is placed at top-right corner of the key. Used mainly on phone. - final float keyNumericHintLabelReferenceCharWidth = - TypefaceUtils.getCharWidth(KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR, paint); - final float keyHintLabelStringWidth = - TypefaceUtils.getStringWidth(hintLabel, paint); + final float hintDigitWidth = TypefaceUtils.getReferenceDigitWidth(paint); + final float hintLabelWidth = TypefaceUtils.getStringWidth(hintLabel, paint); hintX = keyWidth - mKeyHintLetterPadding - - Math.max(keyNumericHintLabelReferenceCharWidth, keyHintLabelStringWidth) - / 2.0f; + - Math.max(hintDigitWidth, hintLabelWidth) / 2.0f; hintY = -paint.ascent(); paint.setTextAlign(Align.CENTER); } - canvas.drawText(hintLabel, 0, hintLabel.length(), hintX, hintY, paint); - - if (LatinImeLogger.sVISUALDEBUG) { - final Paint line = new Paint(); - drawHorizontalLine(canvas, (int)hintY, keyWidth, 0xc0808000, line); - drawVerticalLine(canvas, (int)hintX, keyHeight, 0xc0808000, line); - } + canvas.drawText(hintLabel, 0, hintLabel.length(), hintX, hintY + adjustmentY, paint); } // Draw key icon. if (label == null && icon != null) { - final int iconWidth = Math.min(icon.getIntrinsicWidth(), keyWidth); + final int iconWidth; + if (key.getCode() == Constants.CODE_SPACE && icon instanceof NinePatchDrawable) { + iconWidth = (int)(keyWidth * mSpacebarIconWidthRatio); + } else { + iconWidth = Math.min(icon.getIntrinsicWidth(), keyWidth); + } final int iconHeight = icon.getIntrinsicHeight(); - final int iconX, alignX; - final int iconY = (keyHeight - iconHeight) / 2; + final int iconY = key.isAlignButtom() ? keyHeight - iconHeight + : (keyHeight - iconHeight) / 2; + final int iconX; if (key.isAlignLeft()) { iconX = mKeyLabelHorizontalPadding; - alignX = iconX; } else if (key.isAlignRight()) { iconX = keyWidth - mKeyLabelHorizontalPadding - iconWidth; - alignX = iconX + iconWidth; } else { // Align center iconX = (keyWidth - iconWidth) / 2; - alignX = iconX + iconWidth / 2; } drawIcon(canvas, icon, iconX, iconY, iconWidth, iconHeight); - - if (LatinImeLogger.sVISUALDEBUG) { - final Paint line = new Paint(); - drawVerticalLine(canvas, alignX, keyHeight, 0xc0800080, line); - drawRectangle(canvas, iconX, iconY, iconWidth, iconHeight, 0x80c00000, line); - } } if (key.hasPopupHint() && key.getMoreKeys() != null) { @@ -530,15 +522,9 @@ public class KeyboardView extends View { paint.setColor(params.mHintLabelColor); paint.setTextAlign(Align.CENTER); final float hintX = keyWidth - mKeyHintLetterPadding - - TypefaceUtils.getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) / 2.0f; + - TypefaceUtils.getReferenceCharWidth(paint) / 2.0f; final float hintY = keyHeight - mKeyPopupHintLetterPadding; canvas.drawText(POPUP_HINT_CHAR, hintX, hintY, paint); - - if (LatinImeLogger.sVISUALDEBUG) { - final Paint line = new Paint(); - drawHorizontalLine(canvas, (int)hintY, keyWidth, 0xc0808000, line); - drawVerticalLine(canvas, (int)hintX, keyHeight, 0xc0808000, line); - } } protected static void drawIcon(final Canvas canvas, final Drawable icon, final int x, @@ -549,32 +535,6 @@ public class KeyboardView extends View { canvas.translate(-x, -y); } - private static void drawHorizontalLine(final Canvas canvas, final float y, final float w, - final int color, final Paint paint) { - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(1.0f); - paint.setColor(color); - canvas.drawLine(0.0f, y, w, y, paint); - } - - private static void drawVerticalLine(final Canvas canvas, final float x, final float h, - final int color, final Paint paint) { - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(1.0f); - paint.setColor(color); - canvas.drawLine(x, 0.0f, x, h, paint); - } - - private static void drawRectangle(final Canvas canvas, final float x, final float y, - final float w, final float h, final int color, final Paint paint) { - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(1.0f); - paint.setColor(color); - canvas.translate(x, y); - canvas.drawRect(0.0f, 0.0f, w, h, paint); - canvas.translate(-x, -y); - } - public Paint newLabelPaint(final Key key) { final Paint paint = new Paint(); paint.setAntiAlias(true); @@ -582,6 +542,7 @@ public class KeyboardView extends View { paint.setTypeface(mKeyDrawParams.mTypeface); paint.setTextSize(mKeyDrawParams.mLabelSize); } else { + paint.setColor(key.selectTextColor(mKeyDrawParams)); paint.setTypeface(key.selectTypeface(mKeyDrawParams)); paint.setTextSize(key.selectTextSize(mKeyDrawParams)); } diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 13db47004..702efb3d7 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -27,60 +27,47 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; -import android.os.Message; -import android.os.SystemClock; import android.preference.PreferenceManager; import android.util.AttributeSet; -import android.util.DisplayMetrics; import android.util.Log; -import android.util.SparseArray; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.inputmethod.InputMethodSubtype; -import android.widget.TextView; import com.android.inputmethod.accessibility.AccessibilityUtils; -import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; +import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate; import com.android.inputmethod.annotations.ExternallyReferenced; -import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy; -import com.android.inputmethod.keyboard.PointerTracker.TimerProxy; -import com.android.inputmethod.keyboard.internal.GestureFloatingPreviewText; -import com.android.inputmethod.keyboard.internal.GestureTrailsPreview; +import com.android.inputmethod.keyboard.internal.DrawingHandler; +import com.android.inputmethod.keyboard.internal.DrawingPreviewPlacerView; +import com.android.inputmethod.keyboard.internal.GestureFloatingTextDrawingPreview; +import com.android.inputmethod.keyboard.internal.GestureTrailsDrawingPreview; import com.android.inputmethod.keyboard.internal.KeyDrawParams; +import com.android.inputmethod.keyboard.internal.KeyPreviewChoreographer; import com.android.inputmethod.keyboard.internal.KeyPreviewDrawParams; +import com.android.inputmethod.keyboard.internal.LanguageOnSpacebarHelper; +import com.android.inputmethod.keyboard.internal.MoreKeySpec; import com.android.inputmethod.keyboard.internal.NonDistinctMultitouchHelper; -import com.android.inputmethod.keyboard.internal.PreviewPlacerView; -import com.android.inputmethod.keyboard.internal.SlidingKeyInputPreview; +import com.android.inputmethod.keyboard.internal.SlidingKeyInputDrawingPreview; +import com.android.inputmethod.keyboard.internal.TimerHandler; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.settings.DebugSettings; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; -import com.android.inputmethod.latin.utils.StaticInnerHandlerWrapper; -import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; +import com.android.inputmethod.latin.utils.SpacebarLanguageUtils; import com.android.inputmethod.latin.utils.TypefaceUtils; -import com.android.inputmethod.latin.utils.UsabilityStudyLogUtils; -import com.android.inputmethod.latin.utils.ViewLayoutUtils; -import com.android.inputmethod.research.ResearchLogger; import java.util.WeakHashMap; /** * A view that is responsible for detecting key presses and touch movements. * - * @attr ref R.styleable#MainKeyboardView_autoCorrectionSpacebarLedEnabled - * @attr ref R.styleable#MainKeyboardView_autoCorrectionSpacebarLedIcon - * @attr ref R.styleable#MainKeyboardView_spacebarTextRatio - * @attr ref R.styleable#MainKeyboardView_spacebarTextColor - * @attr ref R.styleable#MainKeyboardView_spacebarTextShadowColor + * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextRatio + * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextColor + * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextShadowRadius + * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextShadowColor * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarFinalAlpha * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarFadeoutAnimator * @attr ref R.styleable#MainKeyboardView_altCodeKeyWhileTypingFadeoutAnimator @@ -88,7 +75,7 @@ import java.util.WeakHashMap; * @attr ref R.styleable#MainKeyboardView_keyHysteresisDistance * @attr ref R.styleable#MainKeyboardView_touchNoiseThresholdTime * @attr ref R.styleable#MainKeyboardView_touchNoiseThresholdDistance - * @attr ref R.styleable#MainKeyboardView_slidingKeyInputEnable + * @attr ref R.styleable#MainKeyboardView_keySelectionByDraggingFinger * @attr ref R.styleable#MainKeyboardView_keyRepeatStartTimeout * @attr ref R.styleable#MainKeyboardView_keyRepeatInterval * @attr ref R.styleable#MainKeyboardView_longPressKeyTimeout @@ -114,61 +101,51 @@ import java.util.WeakHashMap; * @attr ref R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold * @attr ref R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration */ -public final class MainKeyboardView extends KeyboardView implements PointerTracker.KeyEventHandler, - PointerTracker.DrawingProxy, MoreKeysPanel.Controller { +public final class MainKeyboardView extends KeyboardView implements PointerTracker.DrawingProxy, + MoreKeysPanel.Controller, DrawingHandler.Callbacks, TimerHandler.Callbacks { private static final String TAG = MainKeyboardView.class.getSimpleName(); /** Listener for {@link KeyboardActionListener}. */ private KeyboardActionListener mKeyboardActionListener; - /* Space key and its icons */ + /* Space key and its icon and background. */ private Key mSpaceKey; - private Drawable mSpaceIcon; // Stuff to draw language name on spacebar. private final int mLanguageOnSpacebarFinalAlpha; private ObjectAnimator mLanguageOnSpacebarFadeoutAnimator; - private boolean mNeedsToDisplayLanguage; + private int mLanguageOnSpacebarFormatType; private boolean mHasMultipleEnabledIMEsOrSubtypes; private int mLanguageOnSpacebarAnimAlpha = Constants.Color.ALPHA_OPAQUE; - private final float mSpacebarTextRatio; - private float mSpacebarTextSize; - private final int mSpacebarTextColor; - private final int mSpacebarTextShadowColor; + private final float mLanguageOnSpacebarTextRatio; + private float mLanguageOnSpacebarTextSize; + private final int mLanguageOnSpacebarTextColor; + private final float mLanguageOnSpacebarTextShadowRadius; + private final int mLanguageOnSpacebarTextShadowColor; + private static final float LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED = -1.0f; // The minimum x-scale to fit the language name on spacebar. private static final float MINIMUM_XSCALE_OF_LANGUAGE_NAME = 0.8f; - // Stuff to draw auto correction LED on spacebar. - private boolean mAutoCorrectionSpacebarLedOn; - private final boolean mAutoCorrectionSpacebarLedEnabled; - private final Drawable mAutoCorrectionSpacebarLedIcon; - private static final int SPACE_LED_LENGTH_PERCENT = 80; // Stuff to draw altCodeWhileTyping keys. - private ObjectAnimator mAltCodeKeyWhileTypingFadeoutAnimator; - private ObjectAnimator mAltCodeKeyWhileTypingFadeinAnimator; + private final ObjectAnimator mAltCodeKeyWhileTypingFadeoutAnimator; + private final ObjectAnimator mAltCodeKeyWhileTypingFadeinAnimator; private int mAltCodeKeyWhileTypingAnimAlpha = Constants.Color.ALPHA_OPAQUE; - // Preview placer view - private final PreviewPlacerView mPreviewPlacerView; + // Drawing preview placer view + private final DrawingPreviewPlacerView mDrawingPreviewPlacerView; private final int[] mOriginCoords = CoordinateUtils.newInstance(); - private final GestureFloatingPreviewText mGestureFloatingPreviewText; - private final GestureTrailsPreview mGestureTrailsPreview; - private final SlidingKeyInputPreview mSlidingKeyInputPreview; + private final GestureFloatingTextDrawingPreview mGestureFloatingTextDrawingPreview; + private final GestureTrailsDrawingPreview mGestureTrailsDrawingPreview; + private final SlidingKeyInputDrawingPreview mSlidingKeyInputDrawingPreview; // Key preview - private final int mKeyPreviewLayoutId; - private final int mKeyPreviewOffset; - private final int mKeyPreviewHeight; - private final SparseArray<TextView> mKeyPreviewTexts = CollectionUtils.newSparseArray(); - private final KeyPreviewDrawParams mKeyPreviewDrawParams = new KeyPreviewDrawParams(); - private boolean mShowKeyPreviewPopup = true; - private int mKeyPreviewLingerTimeout; + private final KeyPreviewDrawParams mKeyPreviewDrawParams; + private final KeyPreviewChoreographer mKeyPreviewChoreographer; // More keys keyboard private final Paint mBackgroundDimAlphaPaint = new Paint(); private boolean mNeedsToDimEntireKeyboard; private final View mMoreKeysKeyboardContainer; - private final WeakHashMap<Key, Keyboard> mMoreKeysKeyboardCache = - CollectionUtils.newWeakHashMap(); + private final WeakHashMap<Key, Keyboard> mMoreKeysKeyboardCache = new WeakHashMap<>(); private final boolean mConfigShowMoreKeysKeyboardAtTouchedPoint; // More keys panel (used by both more keys keyboard and more suggestions view) // TODO: Consider extending to support multiple more keys panels @@ -178,244 +155,15 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack // TODO: Make this parameter customizable by user via settings. private int mGestureFloatingPreviewTextLingerTimeout; - private KeyDetector mKeyDetector; + private final KeyDetector mKeyDetector; private final NonDistinctMultitouchHelper mNonDistinctMultitouchHelper; - private final KeyTimerHandler mKeyTimerHandler; + private final TimerHandler mKeyTimerHandler; private final int mLanguageOnSpacebarHorizontalMargin; - private static final class KeyTimerHandler extends StaticInnerHandlerWrapper<MainKeyboardView> - implements TimerProxy { - private static final int MSG_TYPING_STATE_EXPIRED = 0; - private static final int MSG_REPEAT_KEY = 1; - private static final int MSG_LONGPRESS_KEY = 2; - private static final int MSG_DOUBLE_TAP_SHIFT_KEY = 3; - private static final int MSG_UPDATE_BATCH_INPUT = 4; - - private final int mIgnoreAltCodeKeyTimeout; - private final int mGestureRecognitionUpdateTime; - - public KeyTimerHandler(final MainKeyboardView outerInstance, - final TypedArray mainKeyboardViewAttr) { - super(outerInstance); - - mIgnoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0); - mGestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0); - } - - @Override - public void handleMessage(final Message msg) { - final MainKeyboardView keyboardView = getOuterInstance(); - if (keyboardView == null) { - return; - } - final PointerTracker tracker = (PointerTracker) msg.obj; - switch (msg.what) { - case MSG_TYPING_STATE_EXPIRED: - startWhileTypingFadeinAnimation(keyboardView); - break; - case MSG_REPEAT_KEY: - tracker.onKeyRepeat(msg.arg1 /* code */, msg.arg2 /* repeatCount */); - break; - case MSG_LONGPRESS_KEY: - keyboardView.onLongPress(tracker); - break; - case MSG_UPDATE_BATCH_INPUT: - tracker.updateBatchInputByTimer(SystemClock.uptimeMillis()); - startUpdateBatchInputTimer(tracker); - break; - } - } - - @Override - public void startKeyRepeatTimer(final PointerTracker tracker, final int repeatCount, - final int delay) { - final Key key = tracker.getKey(); - if (key == null || delay == 0) { - return; - } - sendMessageDelayed( - obtainMessage(MSG_REPEAT_KEY, key.getCode(), repeatCount, tracker), delay); - } - - public void cancelKeyRepeatTimer() { - removeMessages(MSG_REPEAT_KEY); - } - - // TODO: Suppress layout changes in key repeat mode - public boolean isInKeyRepeat() { - return hasMessages(MSG_REPEAT_KEY); - } - - @Override - public void startLongPressTimer(final PointerTracker tracker, final int delay) { - cancelLongPressTimer(); - if (delay <= 0) return; - sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, tracker), delay); - } - - @Override - public void cancelLongPressTimer() { - removeMessages(MSG_LONGPRESS_KEY); - } - - private static void cancelAndStartAnimators(final ObjectAnimator animatorToCancel, - final ObjectAnimator animatorToStart) { - if (animatorToCancel == null || animatorToStart == null) { - // TODO: Stop using null as a no-operation animator. - return; - } - float startFraction = 0.0f; - if (animatorToCancel.isStarted()) { - animatorToCancel.cancel(); - startFraction = 1.0f - animatorToCancel.getAnimatedFraction(); - } - final long startTime = (long)(animatorToStart.getDuration() * startFraction); - animatorToStart.start(); - animatorToStart.setCurrentPlayTime(startTime); - } - - private static void startWhileTypingFadeinAnimation(final MainKeyboardView keyboardView) { - cancelAndStartAnimators(keyboardView.mAltCodeKeyWhileTypingFadeoutAnimator, - keyboardView.mAltCodeKeyWhileTypingFadeinAnimator); - } - - private static void startWhileTypingFadeoutAnimation(final MainKeyboardView keyboardView) { - cancelAndStartAnimators(keyboardView.mAltCodeKeyWhileTypingFadeinAnimator, - keyboardView.mAltCodeKeyWhileTypingFadeoutAnimator); - } - - @Override - public void startTypingStateTimer(final Key typedKey) { - if (typedKey.isModifier() || typedKey.altCodeWhileTyping()) { - return; - } - - final boolean isTyping = isTypingState(); - removeMessages(MSG_TYPING_STATE_EXPIRED); - final MainKeyboardView keyboardView = getOuterInstance(); - - // When user hits the space or the enter key, just cancel the while-typing timer. - final int typedCode = typedKey.getCode(); - if (typedCode == Constants.CODE_SPACE || typedCode == Constants.CODE_ENTER) { - if (isTyping) { - startWhileTypingFadeinAnimation(keyboardView); - } - return; - } - - sendMessageDelayed( - obtainMessage(MSG_TYPING_STATE_EXPIRED), mIgnoreAltCodeKeyTimeout); - if (isTyping) { - return; - } - startWhileTypingFadeoutAnimation(keyboardView); - } - - @Override - public boolean isTypingState() { - return hasMessages(MSG_TYPING_STATE_EXPIRED); - } - - @Override - public void startDoubleTapShiftKeyTimer() { - sendMessageDelayed(obtainMessage(MSG_DOUBLE_TAP_SHIFT_KEY), - ViewConfiguration.getDoubleTapTimeout()); - } - - @Override - public void cancelDoubleTapShiftKeyTimer() { - removeMessages(MSG_DOUBLE_TAP_SHIFT_KEY); - } - - @Override - public boolean isInDoubleTapShiftKeyTimeout() { - return hasMessages(MSG_DOUBLE_TAP_SHIFT_KEY); - } - - @Override - public void cancelKeyTimers() { - cancelKeyRepeatTimer(); - cancelLongPressTimer(); - } - - @Override - public void startUpdateBatchInputTimer(final PointerTracker tracker) { - if (mGestureRecognitionUpdateTime <= 0) { - return; - } - removeMessages(MSG_UPDATE_BATCH_INPUT, tracker); - sendMessageDelayed(obtainMessage(MSG_UPDATE_BATCH_INPUT, tracker), - mGestureRecognitionUpdateTime); - } - - @Override - public void cancelUpdateBatchInputTimer(final PointerTracker tracker) { - removeMessages(MSG_UPDATE_BATCH_INPUT, tracker); - } - - @Override - public void cancelAllUpdateBatchInputTimers() { - removeMessages(MSG_UPDATE_BATCH_INPUT); - } - - public void cancelAllMessages() { - cancelKeyTimers(); - cancelAllUpdateBatchInputTimers(); - } - } - private final DrawingHandler mDrawingHandler = new DrawingHandler(this); - public static class DrawingHandler extends StaticInnerHandlerWrapper<MainKeyboardView> { - private static final int MSG_DISMISS_KEY_PREVIEW = 0; - private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1; - - public DrawingHandler(final MainKeyboardView outerInstance) { - super(outerInstance); - } - - @Override - public void handleMessage(final Message msg) { - final MainKeyboardView mainKeyboardView = getOuterInstance(); - if (mainKeyboardView == null) return; - final PointerTracker tracker = (PointerTracker) msg.obj; - switch (msg.what) { - case MSG_DISMISS_KEY_PREVIEW: - final TextView previewText = mainKeyboardView.mKeyPreviewTexts.get( - tracker.mPointerId); - if (previewText != null) { - previewText.setVisibility(INVISIBLE); - } - break; - case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT: - mainKeyboardView.showGestureFloatingPreviewText(SuggestedWords.EMPTY); - break; - } - } - - public void dismissKeyPreview(final long delay, final PointerTracker tracker) { - sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, tracker), delay); - } - - public void cancelDismissKeyPreview(final PointerTracker tracker) { - removeMessages(MSG_DISMISS_KEY_PREVIEW, tracker); - } - - private void cancelAllDismissKeyPreviews() { - removeMessages(MSG_DISMISS_KEY_PREVIEW); - } - - public void dismissGestureFloatingPreviewText(final long delay) { - sendMessageDelayed(obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT), delay); - } - - public void cancelAllMessages() { - cancelAllDismissKeyPreviews(); - } - } + private MainKeyboardAccessibilityDelegate mAccessibilityDelegate; public MainKeyboardView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.mainKeyboardViewStyle); @@ -424,7 +172,26 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack public MainKeyboardView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); - PointerTracker.init(getResources()); + mDrawingPreviewPlacerView = new DrawingPreviewPlacerView(context, attrs); + + final TypedArray mainKeyboardViewAttr = context.obtainStyledAttributes( + attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView); + final int ignoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0); + final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0); + mKeyTimerHandler = new TimerHandler( + this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime); + + final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension( + R.styleable.MainKeyboardView_keyHysteresisDistance, 0.0f); + final float keyHysteresisDistanceForSlidingModifier = mainKeyboardViewAttr.getDimension( + R.styleable.MainKeyboardView_keyHysteresisDistanceForSlidingModifier, 0.0f); + mKeyDetector = new KeyDetector( + keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier); + + PointerTracker.init(mainKeyboardViewAttr, mKeyTimerHandler, this /* DrawingProxy */); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final boolean forceNonDistinctMultitouch = prefs.getBoolean( DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH, false); @@ -434,24 +201,19 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mNonDistinctMultitouchHelper = hasDistinctMultitouch ? null : new NonDistinctMultitouchHelper(); - mPreviewPlacerView = new PreviewPlacerView(context, attrs); - - final TypedArray mainKeyboardViewAttr = context.obtainStyledAttributes( - attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView); final int backgroundDimAlpha = mainKeyboardViewAttr.getInt( R.styleable.MainKeyboardView_backgroundDimAlpha, 0); mBackgroundDimAlphaPaint.setColor(Color.BLACK); mBackgroundDimAlphaPaint.setAlpha(backgroundDimAlpha); - mAutoCorrectionSpacebarLedEnabled = mainKeyboardViewAttr.getBoolean( - R.styleable.MainKeyboardView_autoCorrectionSpacebarLedEnabled, false); - mAutoCorrectionSpacebarLedIcon = mainKeyboardViewAttr.getDrawable( - R.styleable.MainKeyboardView_autoCorrectionSpacebarLedIcon); - mSpacebarTextRatio = mainKeyboardViewAttr.getFraction( - R.styleable.MainKeyboardView_spacebarTextRatio, 1, 1, 1.0f); - mSpacebarTextColor = mainKeyboardViewAttr.getColor( - R.styleable.MainKeyboardView_spacebarTextColor, 0); - mSpacebarTextShadowColor = mainKeyboardViewAttr.getColor( - R.styleable.MainKeyboardView_spacebarTextShadowColor, 0); + mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction( + R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f); + mLanguageOnSpacebarTextColor = mainKeyboardViewAttr.getColor( + R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0); + mLanguageOnSpacebarTextShadowRadius = mainKeyboardViewAttr.getFloat( + R.styleable.MainKeyboardView_languageOnSpacebarTextShadowRadius, + LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED); + mLanguageOnSpacebarTextShadowColor = mainKeyboardViewAttr.getColor( + R.styleable.MainKeyboardView_languageOnSpacebarTextShadowColor, 0); mLanguageOnSpacebarFinalAlpha = mainKeyboardViewAttr.getInt( R.styleable.MainKeyboardView_languageOnSpacebarFinalAlpha, Constants.Color.ALPHA_OPAQUE); @@ -462,24 +224,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack final int altCodeKeyWhileTypingFadeinAnimatorResId = mainKeyboardViewAttr.getResourceId( R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeinAnimator, 0); - final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension( - R.styleable.MainKeyboardView_keyHysteresisDistance, 0.0f); - final float keyHysteresisDistanceForSlidingModifier = mainKeyboardViewAttr.getDimension( - R.styleable.MainKeyboardView_keyHysteresisDistanceForSlidingModifier, 0.0f); - mKeyDetector = new KeyDetector( - keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier); - mKeyTimerHandler = new KeyTimerHandler(this, mainKeyboardViewAttr); - mKeyPreviewOffset = mainKeyboardViewAttr.getDimensionPixelOffset( - R.styleable.MainKeyboardView_keyPreviewOffset, 0); - mKeyPreviewHeight = mainKeyboardViewAttr.getDimensionPixelSize( - R.styleable.MainKeyboardView_keyPreviewHeight, 0); - mKeyPreviewLingerTimeout = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_keyPreviewLingerTimeout, 0); - mKeyPreviewLayoutId = mainKeyboardViewAttr.getResourceId( - R.styleable.MainKeyboardView_keyPreviewLayout, 0); - if (mKeyPreviewLayoutId == 0) { - mShowKeyPreviewPopup = false; - } + mKeyPreviewDrawParams = new KeyPreviewDrawParams(mainKeyboardViewAttr); + mKeyPreviewChoreographer = new KeyPreviewChoreographer(mKeyPreviewDrawParams); + final int moreKeysKeyboardLayoutId = mainKeyboardViewAttr.getResourceId( R.styleable.MainKeyboardView_moreKeysKeyboardLayout, 0); mConfigShowMoreKeysKeyboardAtTouchedPoint = mainKeyboardViewAttr.getBoolean( @@ -487,19 +234,16 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mGestureFloatingPreviewTextLingerTimeout = mainKeyboardViewAttr.getInt( R.styleable.MainKeyboardView_gestureFloatingPreviewTextLingerTimeout, 0); - PointerTracker.setParameters(mainKeyboardViewAttr); - mGestureFloatingPreviewText = new GestureFloatingPreviewText( - mPreviewPlacerView, mainKeyboardViewAttr); - mPreviewPlacerView.addPreview(mGestureFloatingPreviewText); + mGestureFloatingTextDrawingPreview = new GestureFloatingTextDrawingPreview( + mainKeyboardViewAttr); + mGestureFloatingTextDrawingPreview.setDrawingView(mDrawingPreviewPlacerView); - mGestureTrailsPreview = new GestureTrailsPreview( - mPreviewPlacerView, mainKeyboardViewAttr); - mPreviewPlacerView.addPreview(mGestureTrailsPreview); + mGestureTrailsDrawingPreview = new GestureTrailsDrawingPreview(mainKeyboardViewAttr); + mGestureTrailsDrawingPreview.setDrawingView(mDrawingPreviewPlacerView); - mSlidingKeyInputPreview = new SlidingKeyInputPreview( - mPreviewPlacerView, mainKeyboardViewAttr); - mPreviewPlacerView.addPreview(mSlidingKeyInputPreview); + mSlidingKeyInputDrawingPreview = new SlidingKeyInputDrawingPreview(mainKeyboardViewAttr); + mSlidingKeyInputDrawingPreview.setDrawingView(mDrawingPreviewPlacerView); mainKeyboardViewAttr.recycle(); mMoreKeysKeyboardContainer = LayoutInflater.from(getContext()) @@ -513,14 +257,14 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; - mLanguageOnSpacebarHorizontalMargin = - (int) getResources().getDimension(R.dimen.language_on_spacebar_horizontal_margin); + mLanguageOnSpacebarHorizontalMargin = (int)getResources().getDimension( + R.dimen.config_language_on_spacebar_horizontal_margin); } @Override public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) { super.setHardwareAcceleratedDrawingEnabled(enabled); - mPreviewPlacerView.setHardwareAcceleratedDrawingEnabled(enabled); + mDrawingPreviewPlacerView.setHardwareAcceleratedDrawingEnabled(enabled); } private ObjectAnimator loadObjectAnimator(final int resId, final Object target) { @@ -536,6 +280,35 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack return animator; } + private static void cancelAndStartAnimators(final ObjectAnimator animatorToCancel, + final ObjectAnimator animatorToStart) { + if (animatorToCancel == null || animatorToStart == null) { + // TODO: Stop using null as a no-operation animator. + return; + } + float startFraction = 0.0f; + if (animatorToCancel.isStarted()) { + animatorToCancel.cancel(); + startFraction = 1.0f - animatorToCancel.getAnimatedFraction(); + } + final long startTime = (long)(animatorToStart.getDuration() * startFraction); + animatorToStart.start(); + animatorToStart.setCurrentPlayTime(startTime); + } + + // Implements {@link TimerHander.Callbacks} method. + @Override + public void startWhileTypingFadeinAnimation() { + cancelAndStartAnimators( + mAltCodeKeyWhileTypingFadeoutAnimator, mAltCodeKeyWhileTypingFadeinAnimator); + } + + @Override + public void startWhileTypingFadeoutAnimation() { + cancelAndStartAnimators( + mAltCodeKeyWhileTypingFadeinAnimator, mAltCodeKeyWhileTypingFadeoutAnimator); + } + @ExternallyReferenced public int getLanguageOnSpacebarAnimAlpha() { return mLanguageOnSpacebarAnimAlpha; @@ -573,28 +346,16 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack PointerTracker.setKeyboardActionListener(listener); } - /** - * Returns the {@link KeyboardActionListener} object. - * @return the listener attached to this keyboard - */ - @Override - public KeyboardActionListener getKeyboardActionListener() { - return mKeyboardActionListener; - } - - @Override - public KeyDetector getKeyDetector() { - return mKeyDetector; + // TODO: We should reconsider which coordinate system should be used to represent keyboard + // event. + public int getKeyX(final int x) { + return Constants.isValidCoordinate(x) ? mKeyDetector.getTouchX(x) : x; } - @Override - public DrawingProxy getDrawingProxy() { - return this; - } - - @Override - public TimerProxy getTimerProxy() { - return mKeyTimerHandler; + // TODO: We should reconsider which coordinate system should be used to represent keyboard + // event. + public int getKeyY(final int y) { + return Constants.isValidCoordinate(y) ? mKeyDetector.getTouchY(y) : y; } /** @@ -607,7 +368,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack @Override public void setKeyboard(final Keyboard keyboard) { // Remove any pending messages, except dismissing preview and key repeat. - mKeyTimerHandler.cancelLongPressTimer(); + mKeyTimerHandler.cancelLongPressTimers(); super.setKeyboard(keyboard); mKeyDetector.setKeyboard( keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection()); @@ -615,18 +376,17 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mMoreKeysKeyboardCache.clear(); mSpaceKey = keyboard.getKey(Constants.CODE_SPACE); - mSpaceIcon = (mSpaceKey != null) - ? mSpaceKey.getIcon(keyboard.mIconsSet, Constants.Color.ALPHA_OPAQUE) : null; final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap; - mSpacebarTextSize = keyHeight * mSpacebarTextRatio; - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final int orientation = getContext().getResources().getConfiguration().orientation; - ResearchLogger.mainKeyboardView_setKeyboard(keyboard, orientation); - } + mLanguageOnSpacebarTextSize = keyHeight * mLanguageOnSpacebarTextRatio; - // This always needs to be set since the accessibility state can - // potentially change without the keyboard being set again. - AccessibleKeyboardViewProxy.getInstance().setKeyboard(); + if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) { + if (mAccessibilityDelegate == null) { + mAccessibilityDelegate = new MainKeyboardAccessibilityDelegate(this, mKeyDetector); + } + mAccessibilityDelegate.setKeyboard(keyboard); + } else { + mAccessibilityDelegate = null; + } } /** @@ -637,26 +397,21 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack * @see #isKeyPreviewPopupEnabled() */ public void setKeyPreviewPopupEnabled(final boolean previewEnabled, final int delay) { - mShowKeyPreviewPopup = previewEnabled; - mKeyPreviewLingerTimeout = delay; + mKeyPreviewDrawParams.setPopupEnabled(previewEnabled, delay); + } + + public void setKeyPreviewAnimationParams(final float showUpStartScale, final int showUpDuration, + final float dismissEndScale, final int dismissDuration) { + mKeyPreviewDrawParams.setAnimationParams( + showUpStartScale, showUpDuration, dismissEndScale, dismissDuration); } private void locatePreviewPlacerView() { - if (mPreviewPlacerView.getParent() != null) { - return; - } - final int width = getWidth(); - final int height = getHeight(); - if (width == 0 || height == 0) { - // In transient state. - return; - } getLocationInWindow(mOriginCoords); - final DisplayMetrics dm = getResources().getDisplayMetrics(); - if (CoordinateUtils.y(mOriginCoords) < dm.heightPixels / 4) { - // In transient state. - return; - } + mDrawingPreviewPlacerView.setKeyboardViewGeometry(mOriginCoords, getWidth(), getHeight()); + } + + private void installPreviewPlacerView() { final View rootView = getRootView(); if (rootView == null) { Log.w(TAG, "Cannot find root view"); @@ -665,191 +420,85 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack final ViewGroup windowContentView = (ViewGroup)rootView.findViewById(android.R.id.content); // Note: It'd be very weird if we get null by android.R.id.content. if (windowContentView == null) { - Log.w(TAG, "Cannot find android.R.id.content view to add PreviewPlacerView"); - } else { - windowContentView.addView(mPreviewPlacerView); - mPreviewPlacerView.setKeyboardViewGeometry(mOriginCoords, width, height); - } - } - - /** - * Returns the enabled state of the key feedback preview - * @return whether or not the key feedback preview is enabled - * @see #setKeyPreviewPopupEnabled(boolean, int) - */ - public boolean isKeyPreviewPopupEnabled() { - return mShowKeyPreviewPopup; - } - - private void addKeyPreview(final TextView keyPreview) { - locatePreviewPlacerView(); - mPreviewPlacerView.addView( - keyPreview, ViewLayoutUtils.newLayoutParam(mPreviewPlacerView, 0, 0)); - } - - private TextView getKeyPreviewText(final int pointerId) { - TextView previewText = mKeyPreviewTexts.get(pointerId); - if (previewText != null) { - return previewText; - } - final Context context = getContext(); - if (mKeyPreviewLayoutId != 0) { - previewText = (TextView)LayoutInflater.from(context).inflate(mKeyPreviewLayoutId, null); - } else { - previewText = new TextView(context); + Log.w(TAG, "Cannot find android.R.id.content view to add DrawingPreviewPlacerView"); + return; } - mKeyPreviewTexts.put(pointerId, previewText); - return previewText; + windowContentView.addView(mDrawingPreviewPlacerView); } - private void dismissAllKeyPreviews() { - final int pointerCount = mKeyPreviewTexts.size(); - for (int id = 0; id < pointerCount; id++) { - final TextView previewText = mKeyPreviewTexts.get(id); - if (previewText != null) { - previewText.setVisibility(INVISIBLE); - } - } + // Implements {@link DrawingHandler.Callbacks} method. + @Override + public void dismissAllKeyPreviews() { + mKeyPreviewChoreographer.dismissAllKeyPreviews(); PointerTracker.setReleasedKeyGraphicsToAllKeys(); } - // Background state set - private static final int[][][] KEY_PREVIEW_BACKGROUND_STATE_TABLE = { - { // STATE_MIDDLE - EMPTY_STATE_SET, - { R.attr.state_has_morekeys } - }, - { // STATE_LEFT - { R.attr.state_left_edge }, - { R.attr.state_left_edge, R.attr.state_has_morekeys } - }, - { // STATE_RIGHT - { R.attr.state_right_edge }, - { R.attr.state_right_edge, R.attr.state_has_morekeys } - } - }; - private static final int STATE_MIDDLE = 0; - private static final int STATE_LEFT = 1; - private static final int STATE_RIGHT = 2; - private static final int STATE_NORMAL = 0; - private static final int STATE_HAS_MOREKEYS = 1; - @Override - public void showKeyPreview(final PointerTracker tracker) { - final KeyPreviewDrawParams previewParams = mKeyPreviewDrawParams; - final Keyboard keyboard = getKeyboard(); - if (!mShowKeyPreviewPopup) { - previewParams.mPreviewVisibleOffset = -keyboard.mVerticalGap; + public void showKeyPreview(final Key key) { + // If the key is invalid or has no key preview, we must not show key preview. + if (key == null || key.noKeyPreview()) { return; } - - final TextView previewText = getKeyPreviewText(tracker.mPointerId); - // If the key preview has no parent view yet, add it to the ViewGroup which can place - // key preview absolutely in SoftInputWindow. - if (previewText.getParent() == null) { - addKeyPreview(previewText); - } - - mDrawingHandler.cancelDismissKeyPreview(tracker); - final Key key = tracker.getKey(); - // If key is invalid or IME is already closed, we must not show key preview. - // Trying to show key preview while root window is closed causes - // WindowManager.BadTokenException. - if (key == null) { + final Keyboard keyboard = getKeyboard(); + if (keyboard == null) { return; } - - final KeyDrawParams drawParams = mKeyDrawParams; - previewText.setTextColor(drawParams.mPreviewTextColor); - final Drawable background = previewText.getBackground(); - final String label = key.getPreviewLabel(); - // What we show as preview should match what we show on a key top in onDraw(). - if (label != null) { - // TODO Should take care of temporaryShiftLabel here. - previewText.setCompoundDrawables(null, null, null, null); - previewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, - key.selectPreviewTextSize(drawParams)); - previewText.setTypeface(key.selectPreviewTypeface(drawParams)); - previewText.setText(label); - } else { - previewText.setCompoundDrawables(null, null, null, - key.getPreviewIcon(keyboard.mIconsSet)); - previewText.setText(null); + final KeyPreviewDrawParams previewParams = mKeyPreviewDrawParams; + if (!previewParams.isPopupEnabled()) { + previewParams.setVisibleOffset(-keyboard.mVerticalGap); + return; } - previewText.measure( - ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - final int keyDrawWidth = key.getDrawWidth(); - final int previewWidth = previewText.getMeasuredWidth(); - final int previewHeight = mKeyPreviewHeight; - // The width and height of visible part of the key preview background. The content marker - // of the background 9-patch have to cover the visible part of the background. - previewParams.mPreviewVisibleWidth = previewWidth - previewText.getPaddingLeft() - - previewText.getPaddingRight(); - previewParams.mPreviewVisibleHeight = previewHeight - previewText.getPaddingTop() - - previewText.getPaddingBottom(); - // The distance between the top edge of the parent key and the bottom of the visible part - // of the key preview background. - previewParams.mPreviewVisibleOffset = mKeyPreviewOffset - previewText.getPaddingBottom(); + locatePreviewPlacerView(); getLocationInWindow(mOriginCoords); - // The key preview is horizontally aligned with the center of the visible part of the - // parent key. If it doesn't fit in this {@link KeyboardView}, it is moved inward to fit and - // the left/right background is used if such background is specified. - final int statePosition; - int previewX = key.getDrawX() - (previewWidth - keyDrawWidth) / 2 - + CoordinateUtils.x(mOriginCoords); - if (previewX < 0) { - previewX = 0; - statePosition = STATE_LEFT; - } else if (previewX > getWidth() - previewWidth) { - previewX = getWidth() - previewWidth; - statePosition = STATE_RIGHT; - } else { - statePosition = STATE_MIDDLE; - } - // The key preview is placed vertically above the top edge of the parent key with an - // arbitrary offset. - final int previewY = key.getY() - previewHeight + mKeyPreviewOffset - + CoordinateUtils.y(mOriginCoords); - - if (background != null) { - final int hasMoreKeys = (key.getMoreKeys() != null) ? STATE_HAS_MOREKEYS : STATE_NORMAL; - background.setState(KEY_PREVIEW_BACKGROUND_STATE_TABLE[statePosition][hasMoreKeys]); - } - ViewLayoutUtils.placeViewAt( - previewText, previewX, previewY, previewWidth, previewHeight); - previewText.setVisibility(VISIBLE); + mKeyPreviewChoreographer.placeAndShowKeyPreview(key, keyboard.mIconsSet, mKeyDrawParams, + getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated()); } + // Implements {@link TimerHandler.Callbacks} method. @Override - public void dismissKeyPreview(final PointerTracker tracker) { - mDrawingHandler.dismissKeyPreview(mKeyPreviewLingerTimeout, tracker); + public void dismissKeyPreviewWithoutDelay(final Key key) { + mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */); + // To redraw key top letter. + invalidateKey(key); + } + + @Override + public void dismissKeyPreview(final Key key) { + if (!isHardwareAccelerated()) { + // TODO: Implement preference option to control key preview method and duration. + mDrawingHandler.dismissKeyPreview(mKeyPreviewDrawParams.getLingerTimeout(), key); + return; + } + mKeyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */); } public void setSlidingKeyInputPreviewEnabled(final boolean enabled) { - mSlidingKeyInputPreview.setPreviewEnabled(enabled); + mSlidingKeyInputDrawingPreview.setPreviewEnabled(enabled); } @Override public void showSlidingKeyInputPreview(final PointerTracker tracker) { locatePreviewPlacerView(); - mSlidingKeyInputPreview.setPreviewPosition(tracker); + mSlidingKeyInputDrawingPreview.setPreviewPosition(tracker); } @Override public void dismissSlidingKeyInputPreview() { - mSlidingKeyInputPreview.dismissSlidingKeyInputPreview(); + mSlidingKeyInputDrawingPreview.dismissSlidingKeyInputPreview(); } private void setGesturePreviewMode(final boolean isGestureTrailEnabled, final boolean isGestureFloatingPreviewTextEnabled) { - mGestureFloatingPreviewText.setPreviewEnabled(isGestureFloatingPreviewTextEnabled); - mGestureTrailsPreview.setPreviewEnabled(isGestureTrailEnabled); + mGestureFloatingTextDrawingPreview.setPreviewEnabled(isGestureFloatingPreviewTextEnabled); + mGestureTrailsDrawingPreview.setPreviewEnabled(isGestureTrailEnabled); } + // Implements {@link DrawingHandler.Callbacks} method. + @Override public void showGestureFloatingPreviewText(final SuggestedWords suggestedWords) { locatePreviewPlacerView(); - mGestureFloatingPreviewText.setSuggetedWords(suggestedWords); + mGestureFloatingTextDrawingPreview.setSuggetedWords(suggestedWords); } public void dismissGestureFloatingPreviewText() { @@ -862,12 +511,13 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack final boolean showsFloatingPreviewText) { locatePreviewPlacerView(); if (showsFloatingPreviewText) { - mGestureFloatingPreviewText.setPreviewPosition(tracker); + mGestureFloatingTextDrawingPreview.setPreviewPosition(tracker); } - mGestureTrailsPreview.setPreviewPosition(tracker); + mGestureTrailsDrawingPreview.setPreviewPosition(tracker); } // Note that this method is called from a non-UI thread. + @SuppressWarnings("static-method") public void setMainDictionaryAvailability(final boolean mainDictionaryAvailable) { PointerTracker.setMainDictionaryAvailability(mainDictionaryAvailable); } @@ -883,34 +533,35 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - // Notify the ResearchLogger (development only diagnostics) that the keyboard view has - // been attached. This is needed to properly show the splash screen, which requires that - // the window token of the KeyboardView be non-null. - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().mainKeyboardView_onAttachedToWindow(this); - } + installPreviewPlacerView(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mPreviewPlacerView.removeAllViews(); - // Notify the ResearchLogger (development only diagnostics) that the keyboard view has - // been detached. This is needed to invalidate the reference of {@link MainKeyboardView} - // to null. - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().mainKeyboardView_onDetachedFromWindow(); - } + mDrawingPreviewPlacerView.removeAllViews(); } private MoreKeysPanel onCreateMoreKeysPanel(final Key key, final Context context) { - if (key.getMoreKeys() == null) { + final MoreKeySpec[] moreKeys = key.getMoreKeys(); + if (moreKeys == null) { return null; } Keyboard moreKeysKeyboard = mMoreKeysKeyboardCache.get(key); if (moreKeysKeyboard == null) { - moreKeysKeyboard = new MoreKeysKeyboard.Builder( - context, key, this, mKeyPreviewDrawParams).build(); + // {@link KeyPreviewDrawParams#mPreviewVisibleWidth} should have been set at + // {@link KeyPreviewChoreographer#placeKeyPreview(Key,TextView,KeyboardIconsSet,KeyDrawParams,int,int[]}, + // though there may be some chances that the value is zero. <code>width == 0</code> + // will cause zero-division error at + // {@link MoreKeysKeyboardParams#setParameters(int,int,int,int,int,int,boolean,int)}. + final boolean isSingleMoreKeyWithPreview = mKeyPreviewDrawParams.isPopupEnabled() + && !key.noKeyPreview() && moreKeys.length == 1 + && mKeyPreviewDrawParams.getVisibleWidth() > 0; + final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder( + context, key, getKeyboard(), isSingleMoreKeyWithPreview, + mKeyPreviewDrawParams.getVisibleWidth(), + mKeyPreviewDrawParams.getVisibleHeight(), newLabelPaint(key)); + moreKeysKeyboard = builder.build(); mMoreKeysKeyboardCache.put(key, moreKeysKeyboard); } @@ -922,11 +573,13 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack return moreKeysKeyboardView; } + // Implements {@link TimerHandler.Callbacks} method. /** * Called when a key is long pressed. * @param tracker the pointer tracker which pressed the parent key */ - private void onLongPress(final PointerTracker tracker) { + @Override + public void onLongPress(final PointerTracker tracker) { if (isShowingMoreKeysPanel()) { return; } @@ -934,16 +587,13 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack if (key == null) { return; } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.mainKeyboardView_onLongPress(); - } final KeyboardActionListener listener = mKeyboardActionListener; if (key.hasNoPanelAutoMoreKey()) { final int moreKeyCode = key.getMoreKeys()[0].mCode; tracker.onLongPressed(); listener.onPressKey(moreKeyCode, 0 /* repeatCount */, true /* isSinglePointer */); - listener.onCodeInput(moreKeyCode, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); + listener.onCodeInput(moreKeyCode, Constants.NOT_A_COORDINATE, + Constants.NOT_A_COORDINATE, false /* isKeyRepeat */); listener.onReleaseKey(moreKeyCode, false /* withSliding */); return; } @@ -967,7 +617,8 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack final int[] lastCoords = CoordinateUtils.newInstance(); tracker.getLastCoordinates(lastCoords); - final boolean keyPreviewEnabled = isKeyPreviewPopupEnabled() && !key.noKeyPreview(); + final boolean keyPreviewEnabled = mKeyPreviewDrawParams.isPopupEnabled() + && !key.noKeyPreview(); // The more keys keyboard is usually horizontally aligned with the center of the parent key. // If showMoreKeysKeyboardAtTouchedPoint is true and the key preview is disabled, the more // keys keyboard is placed at the touch point of the parent key. @@ -979,26 +630,24 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack // aligned with the bottom edge of the visible part of the key preview. // {@code mPreviewVisibleOffset} has been set appropriately in // {@link KeyboardView#showKeyPreview(PointerTracker)}. - final int pointY = key.getY() + mKeyPreviewDrawParams.mPreviewVisibleOffset; + final int pointY = key.getY() + mKeyPreviewDrawParams.getVisibleOffset(); moreKeysPanel.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener); tracker.onShowMoreKeysPanel(moreKeysPanel); + // TODO: Implement zoom in animation of more keys panel. + dismissKeyPreviewWithoutDelay(key); } - public boolean isInSlidingKeyInput() { + public boolean isInDraggingFinger() { if (isShowingMoreKeysPanel()) { return true; } - return PointerTracker.isAnyInSlidingKeyInput(); + return PointerTracker.isAnyInDraggingFinger(); } @Override public void onShowMoreKeysPanel(final MoreKeysPanel panel) { locatePreviewPlacerView(); - // TODO: Remove this check - if (panel.isShowingInParent()) { - panel.dismissMoreKeysPanel(); - } - mPreviewPlacerView.addView(panel.getContainerView()); + panel.showInParent(mDrawingPreviewPlacerView); mMoreKeysPanel = panel; dimEntireKeyboard(true /* dimmed */); } @@ -1008,15 +657,15 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } @Override - public void onCancelMoreKeysPanel(final MoreKeysPanel panel) { + public void onCancelMoreKeysPanel() { PointerTracker.dismissAllMoreKeysPanels(); } @Override - public void onDismissMoreKeysPanel(final MoreKeysPanel panel) { + public void onDismissMoreKeysPanel() { dimEntireKeyboard(false /* dimmed */); if (isShowingMoreKeysPanel()) { - mPreviewPlacerView.removeView(mMoreKeysPanel.getContainerView()); + mMoreKeysPanel.removeFromParent(); mMoreKeysPanel = null; } } @@ -1034,14 +683,6 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } @Override - public boolean dispatchTouchEvent(MotionEvent event) { - if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { - return AccessibleKeyboardViewProxy.getInstance().dispatchTouchEvent(event); - } - return super.dispatchTouchEvent(event); - } - - @Override public boolean onTouchEvent(final MotionEvent me) { if (getKeyboard() == null) { return false; @@ -1049,28 +690,26 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack if (mNonDistinctMultitouchHelper != null) { if (me.getPointerCount() > 1 && mKeyTimerHandler.isInKeyRepeat()) { // Key repeating timer will be canceled if 2 or more keys are in action. - mKeyTimerHandler.cancelKeyRepeatTimer(); + mKeyTimerHandler.cancelKeyRepeatTimers(); } // Non distinct multitouch screen support - mNonDistinctMultitouchHelper.processMotionEvent(me, this); + mNonDistinctMultitouchHelper.processMotionEvent(me, mKeyDetector); return true; } return processMotionEvent(me); } public boolean processMotionEvent(final MotionEvent me) { - if (LatinImeLogger.sUsabilityStudy) { - UsabilityStudyLogUtils.writeMotionEvent(me); - } - // Currently the same "move" event is being logged twice. - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.mainKeyboardView_processMotionEvent(me); - } - final int index = me.getActionIndex(); final int id = me.getPointerId(index); - final PointerTracker tracker = PointerTracker.getPointerTracker(id, this); - tracker.processMotionEvent(me, this); + final PointerTracker tracker = PointerTracker.getPointerTracker(id); + // When a more keys panel is showing, we should ignore other fingers' single touch events + // other than the finger that is showing the more keys panel. + if (isShowingMoreKeysPanel() && !tracker.isShowingMoreKeysPanel() + && PointerTracker.getActivePointerTrackerCount() == 1) { + return true; + } + tracker.processMotionEvent(me, mKeyDetector); return true; } @@ -1089,22 +728,24 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mMoreKeysKeyboardCache.clear(); } + public void onHideWindow() { + onDismissMoreKeysPanel(); + final MainKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + accessibilityDelegate.onHideWindow(); + } + } + /** - * Receives hover events from the input framework. - * - * @param event The motion event to be dispatched. - * @return {@code true} if the event was handled by the view, {@code false} - * otherwise + * {@inheritDoc} */ @Override - public boolean dispatchHoverEvent(final MotionEvent event) { - if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { - final PointerTracker tracker = PointerTracker.getPointerTracker(0, this); - return AccessibleKeyboardViewProxy.getInstance().dispatchHoverEvent(event, tracker); + public boolean onHoverEvent(final MotionEvent event) { + final MainKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + return accessibilityDelegate.onHoverEvent(event); } - - // Reflection doesn't support calling superclass methods. - return false; + return super.onHoverEvent(event); } public void updateShortcutKey(final boolean available) { @@ -1121,14 +762,16 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } public void startDisplayLanguageOnSpacebar(final boolean subtypeChanged, - final boolean needsToDisplayLanguage, final boolean hasMultipleEnabledIMEsOrSubtypes) { - mNeedsToDisplayLanguage = needsToDisplayLanguage; + final int languageOnSpacebarFormatType, + final boolean hasMultipleEnabledIMEsOrSubtypes) { + mLanguageOnSpacebarFormatType = languageOnSpacebarFormatType; mHasMultipleEnabledIMEsOrSubtypes = hasMultipleEnabledIMEsOrSubtypes; final ObjectAnimator animator = mLanguageOnSpacebarFadeoutAnimator; if (animator == null) { - mNeedsToDisplayLanguage = false; + mLanguageOnSpacebarFormatType = LanguageOnSpacebarHelper.FORMAT_TYPE_NONE; } else { - if (subtypeChanged && needsToDisplayLanguage) { + if (subtypeChanged + && languageOnSpacebarFormatType != LanguageOnSpacebarHelper.FORMAT_TYPE_NONE) { setLanguageOnSpacebarAnimAlpha(Constants.Color.ALPHA_OPAQUE); if (animator.isStarted()) { animator.cancel(); @@ -1143,14 +786,6 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack invalidateKey(mSpaceKey); } - public void updateAutoCorrectionState(final boolean isAutoCorrection) { - if (!mAutoCorrectionSpacebarLedEnabled) { - return; - } - mAutoCorrectionSpacebarLedOn = isAutoCorrection; - invalidateKey(mSpaceKey); - } - private void dimEntireKeyboard(final boolean dimmed) { final boolean needsRedrawing = mNeedsToDimEntireKeyboard != dimmed; mNeedsToDimEntireKeyboard = dimmed; @@ -1175,25 +810,26 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack if (key.altCodeWhileTyping() && key.isEnabled()) { params.mAnimAlpha = mAltCodeKeyWhileTypingAnimAlpha; } + super.onDrawKeyTopVisuals(key, canvas, paint, params); final int code = key.getCode(); if (code == Constants.CODE_SPACE) { - drawSpacebar(key, canvas, paint); + // If input language are explicitly selected. + if (mLanguageOnSpacebarFormatType != LanguageOnSpacebarHelper.FORMAT_TYPE_NONE) { + drawLanguageOnSpacebar(key, canvas, paint); + } // Whether space key needs to show the "..." popup hint for special purposes if (key.isLongPressEnabled() && mHasMultipleEnabledIMEsOrSubtypes) { drawKeyPopupHint(key, canvas, paint, params); } } else if (code == Constants.CODE_LANGUAGE_SWITCH) { - super.onDrawKeyTopVisuals(key, canvas, paint, params); drawKeyPopupHint(key, canvas, paint, params); - } else { - super.onDrawKeyTopVisuals(key, canvas, paint, params); } } private boolean fitsTextIntoWidth(final int width, final String text, final Paint paint) { final int maxTextWidth = width - mLanguageOnSpacebarHorizontalMargin * 2; paint.setTextScaleX(1.0f); - final float textWidth = TypefaceUtils.getLabelWidth(text, paint); + final float textWidth = TypefaceUtils.getStringWidth(text, paint); if (textWidth < width) { return true; } @@ -1204,74 +840,56 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } paint.setTextScaleX(scaleX); - return TypefaceUtils.getLabelWidth(text, paint) < maxTextWidth; + return TypefaceUtils.getStringWidth(text, paint) < maxTextWidth; } // Layout language name on spacebar. private String layoutLanguageOnSpacebar(final Paint paint, final InputMethodSubtype subtype, final int width) { - // Choose appropriate language name to fit into the width. - final String fullText = SubtypeLocaleUtils.getFullDisplayName(subtype); - if (fitsTextIntoWidth(width, fullText, paint)) { - return fullText; + if (mLanguageOnSpacebarFormatType == LanguageOnSpacebarHelper.FORMAT_TYPE_FULL_LOCALE) { + final String fullText = SpacebarLanguageUtils.getFullDisplayName(subtype); + if (fitsTextIntoWidth(width, fullText, paint)) { + return fullText; + } } - final String middleText = SubtypeLocaleUtils.getMiddleDisplayName(subtype); + final String middleText = SpacebarLanguageUtils.getMiddleDisplayName(subtype); if (fitsTextIntoWidth(width, middleText, paint)) { return middleText; } - final String shortText = SubtypeLocaleUtils.getShortDisplayName(subtype); - if (fitsTextIntoWidth(width, shortText, paint)) { - return shortText; - } - return ""; } - private void drawSpacebar(final Key key, final Canvas canvas, final Paint paint) { + private void drawLanguageOnSpacebar(final Key key, final Canvas canvas, final Paint paint) { final int width = key.getWidth(); final int height = key.getHeight(); - - // If input language are explicitly selected. - if (mNeedsToDisplayLanguage) { - paint.setTextAlign(Align.CENTER); - paint.setTypeface(Typeface.DEFAULT); - paint.setTextSize(mSpacebarTextSize); - final InputMethodSubtype subtype = getKeyboard().mId.mSubtype; - final String language = layoutLanguageOnSpacebar(paint, subtype, width); - // Draw language text with shadow - final float descent = paint.descent(); - final float textHeight = -paint.ascent() + descent; - final float baseline = height / 2 + textHeight / 2; - paint.setColor(mSpacebarTextShadowColor); - paint.setAlpha(mLanguageOnSpacebarAnimAlpha); - canvas.drawText(language, width / 2, baseline - descent - 1, paint); - paint.setColor(mSpacebarTextColor); - paint.setAlpha(mLanguageOnSpacebarAnimAlpha); - canvas.drawText(language, width / 2, baseline - descent, paint); - } - - // Draw the spacebar icon at the bottom - if (mAutoCorrectionSpacebarLedOn) { - final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100; - final int iconHeight = mAutoCorrectionSpacebarLedIcon.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - drawIcon(canvas, mAutoCorrectionSpacebarLedIcon, x, y, iconWidth, iconHeight); - } else if (mSpaceIcon != null) { - final int iconWidth = mSpaceIcon.getIntrinsicWidth(); - final int iconHeight = mSpaceIcon.getIntrinsicHeight(); - int x = (width - iconWidth) / 2; - int y = height - iconHeight; - drawIcon(canvas, mSpaceIcon, x, y, iconWidth, iconHeight); + paint.setTextAlign(Align.CENTER); + paint.setTypeface(Typeface.DEFAULT); + paint.setTextSize(mLanguageOnSpacebarTextSize); + final InputMethodSubtype subtype = getKeyboard().mId.mSubtype; + final String language = layoutLanguageOnSpacebar(paint, subtype, width); + // Draw language text with shadow + final float descent = paint.descent(); + final float textHeight = -paint.ascent() + descent; + final float baseline = height / 2 + textHeight / 2; + if (mLanguageOnSpacebarTextShadowRadius > 0.0f) { + paint.setShadowLayer(mLanguageOnSpacebarTextShadowRadius, 0, 0, + mLanguageOnSpacebarTextShadowColor); + } else { + paint.clearShadowLayer(); } + paint.setColor(mLanguageOnSpacebarTextColor); + paint.setAlpha(mLanguageOnSpacebarAnimAlpha); + canvas.drawText(language, width / 2, baseline - descent, paint); + paint.clearShadowLayer(); + paint.setTextScaleX(1.0f); } @Override public void deallocateMemory() { super.deallocateMemory(); - mGestureTrailsPreview.deallocateMemory(); + mDrawingPreviewPlacerView.deallocateMemory(); } } diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java index 6b76e2461..5a9d4755f 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysDetector.java @@ -21,25 +21,29 @@ public final class MoreKeysDetector extends KeyDetector { private final int mSlideAllowanceSquareTop; public MoreKeysDetector(float slideAllowance) { - super(/* keyHysteresisDistance */0); + super(); mSlideAllowanceSquare = (int)(slideAllowance * slideAllowance); // Top slide allowance is slightly longer (sqrt(2) times) than other edges. mSlideAllowanceSquareTop = mSlideAllowanceSquare * 2; } @Override - public boolean alwaysAllowsSlidingInput() { + public boolean alwaysAllowsKeySelectionByDraggingFinger() { return true; } @Override - public Key detectHitKey(int x, int y) { + public Key detectHitKey(final int x, final int y) { + final Keyboard keyboard = getKeyboard(); + if (keyboard == null) { + return null; + } final int touchX = getTouchX(x); final int touchY = getTouchY(y); Key nearestKey = null; int nearestDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare; - for (final Key key : getKeyboard().getKeys()) { + for (final Key key : keyboard.getSortedKeys()) { final int dist = key.squaredDistanceToEdge(touchX, touchY); if (dist < nearestDist) { nearestKey = key; diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java index 8256d4623..e0184d7f1 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java @@ -21,7 +21,6 @@ import android.graphics.Paint; import android.graphics.drawable.Drawable; import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.keyboard.internal.KeyPreviewDrawParams; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.keyboard.internal.KeyboardParams; @@ -223,7 +222,7 @@ public final class MoreKeysKeyboard extends Keyboard { } public int getDefaultKeyCoordX() { - return mLeftKeys * mColumnWidth; + return mLeftKeys * mColumnWidth + mLeftPadding; } public int getX(final int n, final int row) { @@ -260,33 +259,27 @@ public final class MoreKeysKeyboard extends Keyboard { /** * The builder of MoreKeysKeyboard. * @param context the context of {@link MoreKeysKeyboardView}. - * @param parentKey the {@link Key} that invokes more keys keyboard. - * @param parentKeyboardView the {@link KeyboardView} that contains the parentKey. + * @param key the {@link Key} that invokes more keys keyboard. + * @param keyboard the {@link Keyboard} that contains the parentKey. + * @param isSingleMoreKeyWithPreview true if the <code>key</code> has just a single + * "more key" and its key popup preview is enabled. * @param keyPreviewDrawParams the parameter to place key preview. + * @param paintToMeasure the {@link Paint} object to measure a "more key" width */ - public Builder(final Context context, final Key parentKey, - final MainKeyboardView parentKeyboardView, - final KeyPreviewDrawParams keyPreviewDrawParams) { + public Builder(final Context context, final Key key, final Keyboard keyboard, + final boolean isSingleMoreKeyWithPreview, final int keyPreviewVisibleWidth, + final int keyPreviewVisibleHeight, final Paint paintToMeasure) { super(context, new MoreKeysKeyboardParams()); - final Keyboard parentKeyboard = parentKeyboardView.getKeyboard(); - load(parentKeyboard.mMoreKeysTemplate, parentKeyboard.mId); + load(keyboard.mMoreKeysTemplate, keyboard.mId); // TODO: More keys keyboard's vertical gap is currently calculated heuristically. // Should revise the algorithm. - mParams.mVerticalGap = parentKeyboard.mVerticalGap / 2; - mParentKey = parentKey; - - final MoreKeySpec[] moreKeys = parentKey.getMoreKeys(); - final int width, height; - // {@link KeyPreviewDrawParams#mPreviewVisibleWidth} should have been set at - // {@link MainKeyboardView#showKeyPreview(PointerTracker}, though there may be - // some chances that the value is zero. <code>width == 0</code> will cause - // zero-division error at - // {@link MoreKeysKeyboardParams#setParameters(int,int,int,int,int,int,boolean,int)}. - final boolean singleMoreKeyWithPreview = parentKeyboardView.isKeyPreviewPopupEnabled() - && !parentKey.noKeyPreview() && moreKeys.length == 1 - && keyPreviewDrawParams.mPreviewVisibleWidth > 0; - if (singleMoreKeyWithPreview) { + mParams.mVerticalGap = keyboard.mVerticalGap / 2; + // This {@link MoreKeysKeyboard} is invoked from the <code>key</code>. + mParentKey = key; + + final int keyWidth, rowHeight; + if (isSingleMoreKeyWithPreview) { // Use pre-computed width and height if this more keys keyboard has only one key to // mitigate visual flicker between key preview and more keys keyboard. // Caveats for the visual assets: To achieve this effect, both the key preview @@ -294,29 +287,28 @@ public final class MoreKeysKeyboard extends Keyboard { // left/right/top paddings. The bottom paddings of both backgrounds don't need to // be considered because the vertical positions of both backgrounds were already // adjusted with their bottom paddings deducted. - width = keyPreviewDrawParams.mPreviewVisibleWidth; - height = keyPreviewDrawParams.mPreviewVisibleHeight + mParams.mVerticalGap; + keyWidth = keyPreviewVisibleWidth; + rowHeight = keyPreviewVisibleHeight + mParams.mVerticalGap; } else { final float padding = context.getResources().getDimension( - R.dimen.more_keys_keyboard_key_horizontal_padding) - + (parentKey.hasLabelsInMoreKeys() + R.dimen.config_more_keys_keyboard_key_horizontal_padding) + + (key.hasLabelsInMoreKeys() ? mParams.mDefaultKeyWidth * LABEL_PADDING_RATIO : 0.0f); - width = getMaxKeyWidth(parentKey, mParams.mDefaultKeyWidth, padding, - parentKeyboardView.newLabelPaint(parentKey)); - height = parentKeyboard.mMostCommonKeyHeight; + keyWidth = getMaxKeyWidth(key, mParams.mDefaultKeyWidth, padding, paintToMeasure); + rowHeight = keyboard.mMostCommonKeyHeight; } final int dividerWidth; - if (parentKey.needsDividersInMoreKeys()) { + if (key.needsDividersInMoreKeys()) { mDivider = mResources.getDrawable(R.drawable.more_keys_divider); - dividerWidth = (int)(width * DIVIDER_RATIO); + dividerWidth = (int)(keyWidth * DIVIDER_RATIO); } else { mDivider = null; dividerWidth = 0; } - mParams.setParameters(moreKeys.length, parentKey.getMoreKeysColumn(), - width, height, parentKey.getX() + parentKey.getWidth() / 2, - parentKeyboard.mId.mWidth, parentKey.isFixedColumnOrderMoreKeys(), - dividerWidth); + final MoreKeySpec[] moreKeys = key.getMoreKeys(); + mParams.setParameters(moreKeys.length, key.getMoreKeysColumn(), keyWidth, rowHeight, + key.getX() + key.getWidth() / 2, keyboard.mId.mWidth, + key.isFixedColumnOrderMoreKeys(), dividerWidth); } private static int getMaxKeyWidth(final Key parentKey, final int minKeyWidth, @@ -327,7 +319,7 @@ public final class MoreKeysKeyboard extends Keyboard { // If the label is single letter, minKeyWidth is enough to hold the label. if (label != null && StringUtils.codePointCount(label) > 1) { maxWidth = Math.max(maxWidth, - (int)(TypefaceUtils.getLabelWidth(label, paint) + padding)); + (int)(TypefaceUtils.getStringWidth(label, paint) + padding)); } } return maxWidth; @@ -343,8 +335,7 @@ public final class MoreKeysKeyboard extends Keyboard { final int row = n / params.mNumColumns; final int x = params.getX(n, row); final int y = params.getY(row); - final Key key = new Key(params, moreKeySpec, x, y, - params.mDefaultKeyWidth, params.mDefaultRowHeight, moreKeyFlags); + final Key key = moreKeySpec.buildKey(x, y, moreKeyFlags, params); params.markAsEdgeKey(key, row); params.onAddKey(key); diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java index 973128d36..5140c4ffc 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java @@ -17,11 +17,13 @@ package com.android.inputmethod.keyboard; import android.content.Context; -import android.content.res.Resources; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; +import com.android.inputmethod.accessibility.AccessibilityUtils; +import com.android.inputmethod.accessibility.MoreKeysKeyboardAccessibilityDelegate; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.CoordinateUtils; @@ -42,6 +44,8 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel private int mActivePointerId; + protected MoreKeysKeyboardAccessibilityDelegate mAccessibilityDelegate; + public MoreKeysKeyboardView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.moreKeysKeyboardViewStyle); } @@ -49,10 +53,8 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel public MoreKeysKeyboardView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); - - final Resources res = context.getResources(); - mKeyDetector = new MoreKeysDetector( - res.getDimension(R.dimen.more_keys_keyboard_slide_allowance)); + mKeyDetector = new MoreKeysDetector(getResources().getDimension( + R.dimen.config_more_keys_keyboard_slide_allowance)); } @Override @@ -70,8 +72,19 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel @Override public void setKeyboard(final Keyboard keyboard) { super.setKeyboard(keyboard); - mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), - -getPaddingTop() + getVerticalCorrection()); + mKeyDetector.setKeyboard( + keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection()); + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + if (mAccessibilityDelegate == null) { + mAccessibilityDelegate = new MoreKeysKeyboardAccessibilityDelegate( + this, mKeyDetector); + mAccessibilityDelegate.setOpenAnnounce(R.string.spoken_open_more_keys_keyboard); + mAccessibilityDelegate.setCloseAnnounce(R.string.spoken_close_more_keys_keyboard); + } + mAccessibilityDelegate.setKeyboard(keyboard); + } else { + mAccessibilityDelegate = null; + } } @Override @@ -81,11 +94,13 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel mListener = listener; final View container = getContainerView(); // The coordinates of panel's left-top corner in parentView's coordinate system. - final int x = pointX - getDefaultCoordX() - container.getPaddingLeft(); - final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom(); + // We need to consider background drawable paddings. + final int x = pointX - getDefaultCoordX() - container.getPaddingLeft() - getPaddingLeft(); + final int y = pointY - container.getMeasuredHeight() + container.getPaddingBottom() + + getPaddingBottom(); parentView.getLocationInWindow(mCoordinates); - // Ensure the horizontal position of the panel does not extend past the screen edges. + // Ensure the horizontal position of the panel does not extend past the parentView edges. final int maxX = parentView.getMeasuredWidth() - container.getMeasuredWidth(); final int panelX = Math.max(0, Math.min(maxX, x)) + CoordinateUtils.x(mCoordinates); final int panelY = y + CoordinateUtils.y(mCoordinates); @@ -95,6 +110,10 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel mOriginX = x + container.getPaddingLeft(); mOriginY = y + container.getPaddingTop(); controller.onShowMoreKeysPanel(this); + final MoreKeysKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + accessibilityDelegate.onShowMoreKeysKeyboard(); + } } /** @@ -107,27 +126,33 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel @Override public void onDownEvent(final int x, final int y, final int pointerId, final long eventTime) { mActivePointerId = pointerId; - onMoveKeyInternal(x, y, pointerId); + mCurrentKey = detectKey(x, y); } @Override - public void onMoveEvent(int x, int y, final int pointerId, long eventTime) { + public void onMoveEvent(final int x, final int y, final int pointerId, final long eventTime) { if (mActivePointerId != pointerId) { return; } final boolean hasOldKey = (mCurrentKey != null); - onMoveKeyInternal(x, y, pointerId); + mCurrentKey = detectKey(x, y); if (hasOldKey && mCurrentKey == null) { - // If the pointer has moved too far away from any target then cancel the panel. - mController.onCancelMoreKeysPanel(this); + // A more keys keyboard is canceled when detecting no key. + mController.onCancelMoreKeysPanel(); } } @Override public void onUpEvent(final int x, final int y, final int pointerId, final long eventTime) { - if (mCurrentKey != null && mActivePointerId == pointerId) { + if (mActivePointerId != pointerId) { + return; + } + // Calling {@link #detectKey(int,int,int)} here is harmless because the last move event and + // the following up event share the same coordinates. + mCurrentKey = detectKey(x, y); + if (mCurrentKey != null) { updateReleaseKeyGraphics(mCurrentKey); - onCodeInput(mCurrentKey.getCode(), x, y); + onKeyInput(mCurrentKey, x, y); mCurrentKey = null; } } @@ -135,31 +160,36 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel /** * Performs the specific action for this panel when the user presses a key on the panel. */ - protected void onCodeInput(final int code, final int x, final int y) { + protected void onKeyInput(final Key key, final int x, final int y) { + final int code = key.getCode(); if (code == Constants.CODE_OUTPUT_TEXT) { mListener.onTextInput(mCurrentKey.getOutputText()); } else if (code != Constants.CODE_UNSPECIFIED) { - mListener.onCodeInput(code, x, y); + if (getKeyboard().hasProximityCharsCorrection(code)) { + mListener.onCodeInput(code, x, y, false /* isKeyRepeat */); + } else { + mListener.onCodeInput(code, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + false /* isKeyRepeat */); + } } } - private void onMoveKeyInternal(int x, int y, int pointerId) { - if (mActivePointerId != pointerId) { - // Ignore old pointers when newer pointer is active. - return; - } + private Key detectKey(int x, int y) { final Key oldKey = mCurrentKey; final Key newKey = mKeyDetector.detectHitKey(x, y); - if (newKey != oldKey) { - mCurrentKey = newKey; - invalidateKey(mCurrentKey); - if (oldKey != null) { - updateReleaseKeyGraphics(oldKey); - } - if (newKey != null) { - updatePressKeyGraphics(newKey); - } + if (newKey == oldKey) { + return newKey; } + // A new key is detected. + if (oldKey != null) { + updateReleaseKeyGraphics(oldKey); + invalidateKey(oldKey); + } + if (newKey != null) { + updatePressKeyGraphics(newKey); + invalidateKey(newKey); + } + return newKey; } private void updateReleaseKeyGraphics(final Key key) { @@ -177,7 +207,11 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel if (!isShowingInParent()) { return; } - mController.onDismissMoreKeysPanel(this); + final MoreKeysKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + accessibilityDelegate.onDismissMoreKeysKeyboard(); + } + mController.onDismissMoreKeysPanel(); } @Override @@ -214,12 +248,38 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel return true; } + /** + * {@inheritDoc} + */ @Override - public View getContainerView() { + public boolean onHoverEvent(final MotionEvent event) { + final MoreKeysKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate; + if (accessibilityDelegate != null) { + return accessibilityDelegate.onHoverEvent(event); + } + return super.onHoverEvent(event); + } + + private View getContainerView() { return (View)getParent(); } @Override + public void showInParent(final ViewGroup parentView) { + removeFromParent(); + parentView.addView(getContainerView()); + } + + @Override + public void removeFromParent() { + final View containerView = getContainerView(); + final ViewGroup currentParent = (ViewGroup)containerView.getParent(); + if (currentParent != null) { + currentParent.removeView(containerView); + } + } + + @Override public boolean isShowingInParent() { return (getContainerView().getParent() != null); } diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java index 886c6286f..7bddd09f6 100644 --- a/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java @@ -17,6 +17,7 @@ package com.android.inputmethod.keyboard; import android.view.View; +import android.view.ViewGroup; public interface MoreKeysPanel { public interface Controller { @@ -28,24 +29,22 @@ public interface MoreKeysPanel { /** * Remove the current {@link MoreKeysPanel} from the target view. - * @param panel the panel to be dismissed. */ - public void onDismissMoreKeysPanel(final MoreKeysPanel panel); + public void onDismissMoreKeysPanel(); /** * Instructs the parent to cancel the panel (e.g., when entering a different input mode). - * @param panel the panel to be canceled. */ - public void onCancelMoreKeysPanel(final MoreKeysPanel panel); + public void onCancelMoreKeysPanel(); } public static final Controller EMPTY_CONTROLLER = new Controller() { @Override public void onShowMoreKeysPanel(final MoreKeysPanel panel) {} @Override - public void onDismissMoreKeysPanel(final MoreKeysPanel panel) {} + public void onDismissMoreKeysPanel() {} @Override - public void onCancelMoreKeysPanel(final MoreKeysPanel panel) {} + public void onCancelMoreKeysPanel() {} }; /** @@ -119,9 +118,16 @@ public interface MoreKeysPanel { public int translateY(int y); /** - * Return the view containing the more keys panel. + * Show this {@link MoreKeysPanel} in the parent view. + * + * @param parentView the {@link ViewGroup} that hosts this {@link MoreKeysPanel}. + */ + public void showInParent(ViewGroup parentView); + + /** + * Remove this {@link MoreKeysPanel} from the parent view. */ - public View getContainerView(); + public void removeFromParent(); /** * Return whether the panel is currently being shown. diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 52f190e77..b6905bc1c 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -19,73 +19,40 @@ package com.android.inputmethod.keyboard; import android.content.res.Resources; import android.content.res.TypedArray; import android.os.SystemClock; -import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; -import com.android.inputmethod.accessibility.AccessibilityUtils; -import com.android.inputmethod.keyboard.internal.GestureStroke; -import com.android.inputmethod.keyboard.internal.GestureStroke.GestureStrokeParams; -import com.android.inputmethod.keyboard.internal.GestureStrokeWithPreviewPoints; -import com.android.inputmethod.keyboard.internal.GestureStrokeWithPreviewPoints.GestureStrokePreviewParams; +import com.android.inputmethod.keyboard.internal.BatchInputArbiter; +import com.android.inputmethod.keyboard.internal.BatchInputArbiter.BatchInputArbiterListener; +import com.android.inputmethod.keyboard.internal.BogusMoveEventDetector; +import com.android.inputmethod.keyboard.internal.GestureEnabler; +import com.android.inputmethod.keyboard.internal.GestureStrokeDrawingParams; +import com.android.inputmethod.keyboard.internal.GestureStrokeDrawingPoints; +import com.android.inputmethod.keyboard.internal.GestureStrokeRecognitionParams; import com.android.inputmethod.keyboard.internal.PointerTrackerQueue; +import com.android.inputmethod.keyboard.internal.TypingTimeRecorder; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.InputPointers; import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.settings.Settings; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.ResourceUtils; -import com.android.inputmethod.research.ResearchLogger; import java.util.ArrayList; -public final class PointerTracker implements PointerTrackerQueue.Element { +public final class PointerTracker implements PointerTrackerQueue.Element, + BatchInputArbiterListener { private static final String TAG = PointerTracker.class.getSimpleName(); private static final boolean DEBUG_EVENT = false; private static final boolean DEBUG_MOVE_EVENT = false; private static final boolean DEBUG_LISTENER = false; private static boolean DEBUG_MODE = LatinImeLogger.sDBG || DEBUG_EVENT; - /** True if {@link PointerTracker}s should handle gesture events. */ - private static boolean sShouldHandleGesture = false; - private static boolean sMainDictionaryAvailable = false; - private static boolean sGestureHandlingEnabledByInputField = false; - private static boolean sGestureHandlingEnabledByUser = false; - - public interface KeyEventHandler { - /** - * Get KeyDetector object that is used for this PointerTracker. - * @return the KeyDetector object that is used for this PointerTracker - */ - public KeyDetector getKeyDetector(); - - /** - * Get KeyboardActionListener object that is used to register key code and so on. - * @return the KeyboardActionListner for this PointerTracke - */ - public KeyboardActionListener getKeyboardActionListener(); - - /** - * Get DrawingProxy object that is used for this PointerTracker. - * @return the DrawingProxy object that is used for this PointerTracker - */ - public DrawingProxy getDrawingProxy(); - - /** - * Get TimerProxy object that handles key repeat and long press timer event for this - * PointerTracker. - * @return the TimerProxy object that handles key repeat and long press timer event. - */ - public TimerProxy getTimerProxy(); - } - public interface DrawingProxy { public void invalidateKey(Key key); - public void showKeyPreview(PointerTracker tracker); - public void dismissKeyPreview(PointerTracker tracker); + public void showKeyPreview(Key key); + public void dismissKeyPreview(Key key); public void showSlidingKeyInputPreview(PointerTracker tracker); public void dismissSlidingKeyInputPreview(); public void showGestureTrail(PointerTracker tracker, boolean showsFloatingPreviewText); @@ -94,13 +61,14 @@ public final class PointerTracker implements PointerTrackerQueue.Element { public interface TimerProxy { public void startTypingStateTimer(Key typedKey); public boolean isTypingState(); - public void startKeyRepeatTimer(PointerTracker tracker, int repeatCount, int delay); - public void startLongPressTimer(PointerTracker tracker, int delay); - public void cancelLongPressTimer(); + public void startKeyRepeatTimerOf(PointerTracker tracker, int repeatCount, int delay); + public void startLongPressTimerOf(PointerTracker tracker, int delay); + public void cancelLongPressTimerOf(PointerTracker tracker); + public void cancelLongPressShiftKeyTimers(); + public void cancelKeyTimersOf(PointerTracker tracker); public void startDoubleTapShiftKeyTimer(); public void cancelDoubleTapShiftKeyTimer(); public boolean isInDoubleTapShiftKeyTimeout(); - public void cancelKeyTimers(); public void startUpdateBatchInputTimer(PointerTracker tracker); public void cancelUpdateBatchInputTimer(PointerTracker tracker); public void cancelAllUpdateBatchInputTimers(); @@ -111,11 +79,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element { @Override public boolean isTypingState() { return false; } @Override - public void startKeyRepeatTimer(PointerTracker tracker, int repeatCount, int delay) {} + public void startKeyRepeatTimerOf(PointerTracker tracker, int repeatCount, int delay) {} + @Override + public void startLongPressTimerOf(PointerTracker tracker, int delay) {} @Override - public void startLongPressTimer(PointerTracker tracker, int delay) {} + public void cancelLongPressTimerOf(PointerTracker tracker) {} @Override - public void cancelLongPressTimer() {} + public void cancelLongPressShiftKeyTimers() {} + @Override + public void cancelKeyTimersOf(PointerTracker tracker) {} @Override public void startDoubleTapShiftKeyTimer() {} @Override @@ -123,8 +95,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element { @Override public boolean isInDoubleTapShiftKeyTimeout() { return false; } @Override - public void cancelKeyTimers() {} - @Override public void startUpdateBatchInputTimer(PointerTracker tracker) {} @Override public void cancelUpdateBatchInputTimer(PointerTracker tracker) {} @@ -134,7 +104,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } static final class PointerTrackerParams { - public final boolean mSlidingKeyInputEnabled; + public final boolean mKeySelectionByDraggingFinger; public final int mTouchNoiseThresholdTime; public final int mTouchNoiseThresholdDistance; public final int mSuppressKeyPreviewAfterBatchInputDuration; @@ -142,21 +112,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element { public final int mKeyRepeatInterval; public final int mLongPressShiftLockTimeout; - public static final PointerTrackerParams DEFAULT = new PointerTrackerParams(); - - private PointerTrackerParams() { - mSlidingKeyInputEnabled = false; - mTouchNoiseThresholdTime = 0; - mTouchNoiseThresholdDistance = 0; - mSuppressKeyPreviewAfterBatchInputDuration = 0; - mKeyRepeatStartTimeout = 0; - mKeyRepeatInterval = 0; - mLongPressShiftLockTimeout = 0; - } - public PointerTrackerParams(final TypedArray mainKeyboardViewAttr) { - mSlidingKeyInputEnabled = mainKeyboardViewAttr.getBoolean( - R.styleable.MainKeyboardView_slidingKeyInputEnable, false); + mKeySelectionByDraggingFinger = mainKeyboardViewAttr.getBoolean( + R.styleable.MainKeyboardView_keySelectionByDraggingFinger, false); mTouchNoiseThresholdTime = mainKeyboardViewAttr.getInt( R.styleable.MainKeyboardView_touchNoiseThresholdTime, 0); mTouchNoiseThresholdDistance = mainKeyboardViewAttr.getDimensionPixelSize( @@ -172,149 +130,36 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } + private static GestureEnabler sGestureEnabler = new GestureEnabler(); + // Parameters for pointer handling. private static PointerTrackerParams sParams; - private static GestureStrokeParams sGestureStrokeParams; - private static GestureStrokePreviewParams sGesturePreviewParams; + private static GestureStrokeRecognitionParams sGestureStrokeRecognitionParams; + private static GestureStrokeDrawingParams sGestureStrokeDrawingParams; private static boolean sNeedsPhantomSuddenMoveEventHack; // Move this threshold to resource. // TODO: Device specific parameter would be better for device specific hack? private static final float PHANTOM_SUDDEN_MOVE_THRESHOLD = 0.25f; // in keyWidth - // This hack is applied to certain classes of tablets. - // See {@link #needsProximateBogusDownMoveUpEventHack(Resources)}. - private static boolean sNeedsProximateBogusDownMoveUpEventHack; - private static final ArrayList<PointerTracker> sTrackers = CollectionUtils.newArrayList(); + private static final ArrayList<PointerTracker> sTrackers = new ArrayList<>(); private static final PointerTrackerQueue sPointerTrackerQueue = new PointerTrackerQueue(); public final int mPointerId; - private DrawingProxy mDrawingProxy; - private TimerProxy mTimerProxy; - private KeyDetector mKeyDetector; - private KeyboardActionListener mListener = KeyboardActionListener.EMPTY_LISTENER; + private static DrawingProxy sDrawingProxy; + private static TimerProxy sTimerProxy; + private static KeyboardActionListener sListener = KeyboardActionListener.EMPTY_LISTENER; + // The {@link KeyDetector} is set whenever the down event is processed. Also this is updated + // when new {@link Keyboard} is set by {@link #setKeyDetector(KeyDetector)}. + private KeyDetector mKeyDetector = new KeyDetector(); private Keyboard mKeyboard; - private int mPhantonSuddenMoveThreshold; + private int mPhantomSuddenMoveThreshold; private final BogusMoveEventDetector mBogusMoveEventDetector = new BogusMoveEventDetector(); private boolean mIsDetectingGesture = false; // per PointerTracker. private static boolean sInGesture = false; - private static long sGestureFirstDownTime; - private static TimeRecorder sTimeRecorder; - private static final InputPointers sAggregratedPointers = new InputPointers( - GestureStroke.DEFAULT_CAPACITY); - private static int sLastRecognitionPointSize = 0; // synchronized using sAggregratedPointers - private static long sLastRecognitionTime = 0; // synchronized using sAggregratedPointers - - static final class BogusMoveEventDetector { - // Move these thresholds to resource. - // These thresholds' unit is a diagonal length of a key. - private static final float BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD = 0.53f; - private static final float BOGUS_MOVE_RADIUS_THRESHOLD = 1.14f; - - private int mAccumulatedDistanceThreshold; - private int mRadiusThreshold; - - // Accumulated distance from actual and artificial down keys. - /* package */ int mAccumulatedDistanceFromDownKey; - private int mActualDownX; - private int mActualDownY; - - public void setKeyboardGeometry(final int keyWidth, final int keyHeight) { - final float keyDiagonal = (float)Math.hypot(keyWidth, keyHeight); - mAccumulatedDistanceThreshold = (int)( - keyDiagonal * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD); - mRadiusThreshold = (int)(keyDiagonal * BOGUS_MOVE_RADIUS_THRESHOLD); - } - - public void onActualDownEvent(final int x, final int y) { - mActualDownX = x; - mActualDownY = y; - } - - public void onDownKey() { - mAccumulatedDistanceFromDownKey = 0; - } - - public void onMoveKey(final int distance) { - mAccumulatedDistanceFromDownKey += distance; - } - - public boolean hasTraveledLongDistance(final int x, final int y) { - final int dx = Math.abs(x - mActualDownX); - final int dy = Math.abs(y - mActualDownY); - // A bogus move event should be a horizontal movement. A vertical movement might be - // a sloppy typing and should be ignored. - return dx >= dy && mAccumulatedDistanceFromDownKey >= mAccumulatedDistanceThreshold; - } - - /* package */ int getDistanceFromDownEvent(final int x, final int y) { - return getDistance(x, y, mActualDownX, mActualDownY); - } - - public boolean isCloseToActualDownEvent(final int x, final int y) { - return getDistanceFromDownEvent(x, y) < mRadiusThreshold; - } - } - - static final class TimeRecorder { - private final int mSuppressKeyPreviewAfterBatchInputDuration; - private final int mStaticTimeThresholdAfterFastTyping; // msec - private long mLastTypingTime; - private long mLastLetterTypingTime; - private long mLastBatchInputTime; - - public TimeRecorder(final PointerTrackerParams pointerTrackerParams, - final GestureStrokeParams gestureStrokeParams) { - mSuppressKeyPreviewAfterBatchInputDuration = - pointerTrackerParams.mSuppressKeyPreviewAfterBatchInputDuration; - mStaticTimeThresholdAfterFastTyping = - gestureStrokeParams.mStaticTimeThresholdAfterFastTyping; - } - - public boolean isInFastTyping(final long eventTime) { - final long elapsedTimeSinceLastLetterTyping = eventTime - mLastLetterTypingTime; - return elapsedTimeSinceLastLetterTyping < mStaticTimeThresholdAfterFastTyping; - } - - private boolean wasLastInputTyping() { - return mLastTypingTime >= mLastBatchInputTime; - } - - public void onCodeInput(final int code, final long eventTime) { - // Record the letter typing time when - // 1. Letter keys are typed successively without any batch input in between. - // 2. A letter key is typed within the threshold time since the last any key typing. - // 3. A non-letter key is typed within the threshold time since the last letter key - // typing. - if (Character.isLetter(code)) { - if (wasLastInputTyping() - || eventTime - mLastTypingTime < mStaticTimeThresholdAfterFastTyping) { - mLastLetterTypingTime = eventTime; - } - } else { - if (eventTime - mLastLetterTypingTime < mStaticTimeThresholdAfterFastTyping) { - // This non-letter typing should be treated as a part of fast typing. - mLastLetterTypingTime = eventTime; - } - } - mLastTypingTime = eventTime; - } - - public void onEndBatchInput(final long eventTime) { - mLastBatchInputTime = eventTime; - } - - public long getLastLetterTypingTime() { - return mLastLetterTypingTime; - } - - public boolean needsToSuppressKeyPreviewPopup(final long eventTime) { - return !wasLastInputTyping() - && eventTime - mLastBatchInputTime < mSuppressKeyPreviewAfterBatchInputDuration; - } - } + private static TypingTimeRecorder sTypingTimeRecorder; // The position and time at which first down event occurred. private long mDownTime; @@ -341,92 +186,63 @@ public final class PointerTracker implements PointerTrackerQueue.Element { private MoreKeysPanel mMoreKeysPanel; private static final int MULTIPLIER_FOR_LONG_PRESS_TIMEOUT_IN_SLIDING_INPUT = 3; - // true if this pointer is in a sliding key input. - boolean mIsInSlidingKeyInput; - // true if this pointer is in a sliding key input from a modifier key, + // true if this pointer is in the dragging finger mode. + boolean mIsInDraggingFinger; + // true if this pointer is sliding from a modifier key and in the sliding key input mode, // so that further modifier keys should be ignored. - boolean mIsInSlidingKeyInputFromModifier; + boolean mIsInSlidingKeyInput; // if not a NOT_A_CODE, the key of this code is repeating private int mCurrentRepeatingKeyCode = Constants.NOT_A_CODE; - // true if a sliding key input is allowed. - private boolean mIsAllowedSlidingKeyInput; - - private final GestureStrokeWithPreviewPoints mGestureStrokeWithPreviewPoints; - - private static final int SMALL_TABLET_SMALLEST_WIDTH = 600; // dp - private static final int LARGE_TABLET_SMALLEST_WIDTH = 768; // dp - - private static boolean needsProximateBogusDownMoveUpEventHack(final Resources res) { - // The proximate bogus down move up event hack is needed for a device such like, - // 1) is large tablet, or 2) is small tablet and the screen density is less than hdpi. - // Though it seems odd to use screen density as criteria of the quality of the touch - // screen, the small table that has a less density screen than hdpi most likely has been - // made with the touch screen that needs the hack. - final int sw = res.getConfiguration().smallestScreenWidthDp; - final boolean isLargeTablet = (sw >= LARGE_TABLET_SMALLEST_WIDTH); - final boolean isSmallTablet = - (sw >= SMALL_TABLET_SMALLEST_WIDTH && sw < LARGE_TABLET_SMALLEST_WIDTH); - final int densityDpi = res.getDisplayMetrics().densityDpi; - final boolean hasLowDensityScreen = (densityDpi < DisplayMetrics.DENSITY_HIGH); - final boolean needsTheHack = isLargeTablet || (isSmallTablet && hasLowDensityScreen); - if (DEBUG_MODE) { - Log.d(TAG, "needsProximateBogusDownMoveUpEventHack=" + needsTheHack - + " smallestScreenWidthDp=" + sw + " densityDpi=" + densityDpi); - } - return needsTheHack; - } + // true if dragging finger is allowed. + private boolean mIsAllowedDraggingFinger; - public static void init(final Resources res) { - sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean( - ResourceUtils.getDeviceOverrideValue( - res, R.array.phantom_sudden_move_event_device_list)); - sNeedsProximateBogusDownMoveUpEventHack = needsProximateBogusDownMoveUpEventHack(res); - sParams = PointerTrackerParams.DEFAULT; - sGestureStrokeParams = GestureStrokeParams.DEFAULT; - sGesturePreviewParams = GestureStrokePreviewParams.DEFAULT; - sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams); - } + private final BatchInputArbiter mBatchInputArbiter; + private final GestureStrokeDrawingPoints mGestureStrokeDrawingPoints; - public static void setParameters(final TypedArray mainKeyboardViewAttr) { + // TODO: Add PointerTrackerFactory singleton and move some class static methods into it. + public static void init(final TypedArray mainKeyboardViewAttr, final TimerProxy timerProxy, + final DrawingProxy drawingProxy) { sParams = new PointerTrackerParams(mainKeyboardViewAttr); - sGestureStrokeParams = new GestureStrokeParams(mainKeyboardViewAttr); - sGesturePreviewParams = new GestureStrokePreviewParams(mainKeyboardViewAttr); - sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams); - } + sGestureStrokeRecognitionParams = new GestureStrokeRecognitionParams(mainKeyboardViewAttr); + sGestureStrokeDrawingParams = new GestureStrokeDrawingParams(mainKeyboardViewAttr); + sTypingTimeRecorder = new TypingTimeRecorder( + sGestureStrokeRecognitionParams.mStaticTimeThresholdAfterFastTyping, + sParams.mSuppressKeyPreviewAfterBatchInputDuration); - private static void updateGestureHandlingMode() { - sShouldHandleGesture = sMainDictionaryAvailable - && sGestureHandlingEnabledByInputField - && sGestureHandlingEnabledByUser - && !AccessibilityUtils.getInstance().isTouchExplorationEnabled(); + final Resources res = mainKeyboardViewAttr.getResources(); + sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean( + ResourceUtils.getDeviceOverrideValue(res, + R.array.phantom_sudden_move_event_device_list, Boolean.FALSE.toString())); + BogusMoveEventDetector.init(res); + + sTimerProxy = timerProxy; + sDrawingProxy = drawingProxy; } // Note that this method is called from a non-UI thread. public static void setMainDictionaryAvailability(final boolean mainDictionaryAvailable) { - sMainDictionaryAvailable = mainDictionaryAvailable; - updateGestureHandlingMode(); + sGestureEnabler.setMainDictionaryAvailability(mainDictionaryAvailable); } public static void setGestureHandlingEnabledByUser(final boolean gestureHandlingEnabledByUser) { - sGestureHandlingEnabledByUser = gestureHandlingEnabledByUser; - updateGestureHandlingMode(); + sGestureEnabler.setGestureHandlingEnabledByUser(gestureHandlingEnabledByUser); } - public static PointerTracker getPointerTracker(final int id, final KeyEventHandler handler) { + public static PointerTracker getPointerTracker(final int id) { final ArrayList<PointerTracker> trackers = sTrackers; // Create pointer trackers until we can get 'id+1'-th tracker, if needed. for (int i = trackers.size(); i <= id; i++) { - final PointerTracker tracker = new PointerTracker(i, handler); + final PointerTracker tracker = new PointerTracker(i); trackers.add(tracker); } return trackers.get(id); } - public static boolean isAnyInSlidingKeyInput() { - return sPointerTrackerQueue.isAnyInSlidingKeyInput(); + public static boolean isAnyInDraggingFinger() { + return sPointerTrackerQueue.isAnyInDraggingFinger(); } public static void cancelAllPointerTrackers() { @@ -434,31 +250,27 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } public static void setKeyboardActionListener(final KeyboardActionListener listener) { - final int trackersSize = sTrackers.size(); - for (int i = 0; i < trackersSize; ++i) { - final PointerTracker tracker = sTrackers.get(i); - tracker.mListener = listener; - } + sListener = listener; } public static void setKeyDetector(final KeyDetector keyDetector) { + final Keyboard keyboard = keyDetector.getKeyboard(); + if (keyboard == null) { + return; + } final int trackersSize = sTrackers.size(); for (int i = 0; i < trackersSize; ++i) { final PointerTracker tracker = sTrackers.get(i); tracker.setKeyDetectorInner(keyDetector); - // Mark that keyboard layout has been changed. - tracker.mKeyboardLayoutHasBeenChanged = true; } - final Keyboard keyboard = keyDetector.getKeyboard(); - sGestureHandlingEnabledByInputField = !keyboard.mId.passwordInput(); - updateGestureHandlingMode(); + sGestureEnabler.setPasswordMode(keyboard.mId.passwordInput()); } public static void setReleasedKeyGraphicsToAllKeys() { final int trackersSize = sTrackers.size(); for (int i = 0; i < trackersSize; ++i) { final PointerTracker tracker = sTrackers.get(i); - tracker.setReleasedKeyGraphics(tracker.mCurrentKey); + tracker.setReleasedKeyGraphics(tracker.getKey()); } } @@ -466,28 +278,14 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final int trackersSize = sTrackers.size(); for (int i = 0; i < trackersSize; ++i) { final PointerTracker tracker = sTrackers.get(i); - if (tracker.isShowingMoreKeysPanel()) { - tracker.mMoreKeysPanel.dismissMoreKeysPanel(); - tracker.mMoreKeysPanel = null; - } + tracker.dismissMoreKeysPanel(); } } - private PointerTracker(final int id, final KeyEventHandler handler) { - if (handler == null) { - throw new NullPointerException(); - } + private PointerTracker(final int id) { mPointerId = id; - mGestureStrokeWithPreviewPoints = new GestureStrokeWithPreviewPoints( - id, sGestureStrokeParams, sGesturePreviewParams); - setKeyEventHandler(handler); - } - - private void setKeyEventHandler(final KeyEventHandler handler) { - setKeyDetectorInner(handler.getKeyDetector()); - mListener = handler.getKeyboardActionListener(); - mDrawingProxy = handler.getDrawingProxy(); - mTimerProxy = handler.getTimerProxy(); + mBatchInputArbiter = new BatchInputArbiter(id, sGestureStrokeRecognitionParams); + mGestureStrokeDrawingPoints = new GestureStrokeDrawingPoints(sGestureStrokeDrawingParams); } // Returns true if keyboard has been changed by this callback. @@ -500,10 +298,10 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (sInGesture || mIsDetectingGesture || mIsTrackingForActionDisabled) { return false; } - final boolean ignoreModifierKey = mIsInSlidingKeyInput && key.isModifier(); + final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier(); if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onPress : %s%s%s%s", mPointerId, - KeyDetector.printableCode(key), + (key == null ? "none" : Constants.printableCode(key.getCode())), ignoreModifierKey ? " ignoreModifier" : "", key.isEnabled() ? "" : " disabled", repeatCount > 0 ? " repeatCount=" + repeatCount : "")); @@ -512,21 +310,21 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return false; } if (key.isEnabled()) { - mListener.onPressKey(key.getCode(), repeatCount, getActivePointerTrackerCount() == 1); + sListener.onPressKey(key.getCode(), repeatCount, getActivePointerTrackerCount() == 1); final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged; mKeyboardLayoutHasBeenChanged = false; - mTimerProxy.startTypingStateTimer(key); + sTimerProxy.startTypingStateTimer(key); return keyboardLayoutHasBeenChanged; } return false; } // Note that we need primaryCode argument because the keyboard may in shifted state and the - // primaryCode is different from {@link Key#mCode}. + // primaryCode is different from {@link Key#mKeyCode}. private void callListenerOnCodeInput(final Key key, final int primaryCode, final int x, - final int y, final long eventTime) { - final boolean ignoreModifierKey = mIsInSlidingKeyInput && key.isModifier(); - final boolean altersCode = key.altCodeWhileTyping() && mTimerProxy.isTypingState(); + final int y, final long eventTime, final boolean isKeyRepeat) { + final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier(); + final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState(); final int code = altersCode ? key.getAltCode() : primaryCode; if (DEBUG_LISTENER) { final String output = code == Constants.CODE_OUTPUT_TEXT @@ -535,48 +333,45 @@ public final class PointerTracker implements PointerTrackerQueue.Element { output, ignoreModifierKey ? " ignoreModifier" : "", altersCode ? " altersCode" : "", key.isEnabled() ? "" : " disabled")); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_callListenerOnCodeInput(key, x, y, ignoreModifierKey, - altersCode, code); - } if (ignoreModifierKey) { return; } // Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state. if (key.isEnabled() || altersCode) { - sTimeRecorder.onCodeInput(code, eventTime); + sTypingTimeRecorder.onCodeInput(code, eventTime); if (code == Constants.CODE_OUTPUT_TEXT) { - mListener.onTextInput(key.getOutputText()); + sListener.onTextInput(key.getOutputText()); } else if (code != Constants.CODE_UNSPECIFIED) { - mListener.onCodeInput(code, x, y); + if (mKeyboard.hasProximityCharsCorrection(code)) { + sListener.onCodeInput(code, x, y, isKeyRepeat); + } else { + sListener.onCodeInput(code, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, isKeyRepeat); + } } } } // Note that we need primaryCode argument because the keyboard may be in shifted state and the - // primaryCode is different from {@link Key#mCode}. + // primaryCode is different from {@link Key#mKeyCode}. private void callListenerOnRelease(final Key key, final int primaryCode, final boolean withSliding) { // See the comment at {@link #callListenerOnPressAndCheckKeyboardLayoutChange(Key}}. if (sInGesture || mIsDetectingGesture || mIsTrackingForActionDisabled) { return; } - final boolean ignoreModifierKey = mIsInSlidingKeyInput && key.isModifier(); + final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier(); if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onRelease : %s%s%s%s", mPointerId, Constants.printableCode(primaryCode), withSliding ? " sliding" : "", ignoreModifierKey ? " ignoreModifier" : "", key.isEnabled() ? "": " disabled")); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_callListenerOnRelease(key, primaryCode, withSliding, - ignoreModifierKey); - } if (ignoreModifierKey) { return; } if (key.isEnabled()) { - mListener.onReleaseKey(primaryCode, withSliding); + sListener.onReleaseKey(primaryCode, withSliding); } } @@ -584,43 +379,41 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onFinishSlidingInput", mPointerId)); } - mListener.onFinishSlidingInput(); + sListener.onFinishSlidingInput(); } private void callListenerOnCancelInput() { if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onCancelInput", mPointerId)); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_callListenerOnCancelInput(); - } - mListener.onCancelInput(); + sListener.onCancelInput(); } private void setKeyDetectorInner(final KeyDetector keyDetector) { final Keyboard keyboard = keyDetector.getKeyboard(); + if (keyboard == null) { + return; + } if (keyDetector == mKeyDetector && keyboard == mKeyboard) { return; } mKeyDetector = keyDetector; - mKeyboard = keyDetector.getKeyboard(); + mKeyboard = keyboard; + // Mark that keyboard layout has been changed. + mKeyboardLayoutHasBeenChanged = true; final int keyWidth = mKeyboard.mMostCommonKeyWidth; final int keyHeight = mKeyboard.mMostCommonKeyHeight; - mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight); - final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY); - if (newKey != mCurrentKey) { - if (mDrawingProxy != null) { - setReleasedKeyGraphics(mCurrentKey); - } - // Keep {@link #mCurrentKey} that comes from previous keyboard. - } - mPhantonSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD); + mBatchInputArbiter.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight); + // Keep {@link #mCurrentKey} that comes from previous keyboard. The key preview of + // {@link #mCurrentKey} will be dismissed by {@setReleasedKeyGraphics(Key)} via + // {@link onMoveEventInternal(int,int,long)} or {@link #onUpEventInternal(int,int,long)}. + mPhantomSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD); mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight); } @Override - public boolean isInSlidingKeyInput() { - return mIsInSlidingKeyInput; + public boolean isInDraggingFinger() { + return mIsInDraggingFinger; } public Key getKey() { @@ -637,7 +430,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } private void setReleasedKeyGraphics(final Key key) { - mDrawingProxy.dismissKeyPreview(this); + sDrawingProxy.dismissKeyPreview(key); if (key == null) { return; } @@ -668,8 +461,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } private static boolean needsToSuppressKeyPreviewPopup(final long eventTime) { - if (!sShouldHandleGesture) return false; - return sTimeRecorder.needsToSuppressKeyPreviewPopup(eventTime); + if (!sGestureEnabler.shouldHandleGesture()) return false; + return sTypingTimeRecorder.needsToSuppressKeyPreviewPopup(eventTime); } private void setPressedKeyGraphics(final Key key, final long eventTime) { @@ -678,14 +471,14 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } // Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state. - final boolean altersCode = key.altCodeWhileTyping() && mTimerProxy.isTypingState(); + final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState(); final boolean needsToUpdateGraphics = key.isEnabled() || altersCode; if (!needsToUpdateGraphics) { return; } if (!key.noKeyPreview() && !sInGesture && !needsToSuppressKeyPreviewPopup(eventTime)) { - mDrawingProxy.showKeyPreview(this); + sDrawingProxy.showKeyPreview(key); } updatePressKeyGraphics(key); @@ -697,7 +490,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } - if (key.altCodeWhileTyping() && mTimerProxy.isTypingState()) { + if (altersCode) { final int altCode = key.getAltCode(); final Key altKey = mKeyboard.getKey(altCode); if (altKey != null) { @@ -711,18 +504,18 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } - private void updateReleaseKeyGraphics(final Key key) { + private static void updateReleaseKeyGraphics(final Key key) { key.onReleased(); - mDrawingProxy.invalidateKey(key); + sDrawingProxy.invalidateKey(key); } - private void updatePressKeyGraphics(final Key key) { + private static void updatePressKeyGraphics(final Key key) { key.onPressed(); - mDrawingProxy.invalidateKey(key); + sDrawingProxy.invalidateKey(key); } - public GestureStrokeWithPreviewPoints getGestureStrokeWithPreviewPoints() { - return mGestureStrokeWithPreviewPoints; + public GestureStrokeDrawingPoints getGestureStrokeDrawingPoints() { + return mGestureStrokeDrawingPoints; } public void getLastCoordinates(final int[] outCoords) { @@ -744,7 +537,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return onMoveToNewKey(onMoveKeyInternal(x, y), x, y); } - static int getDistance(final int x1, final int y1, final int x2, final int y2) { + private static int getDistance(final int x1, final int y1, final int x2, final int y2) { return (int)Math.hypot(x1 - x2, y1 - y2); } @@ -766,7 +559,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return newKey; } - private static int getActivePointerTrackerCount() { + /* package */ static int getActivePointerTrackerCount() { return sPointerTrackerQueue.size(); } @@ -774,91 +567,59 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return sPointerTrackerQueue.getOldestElement() == this; } - private void mayStartBatchInput(final Key key) { - if (sInGesture || !mGestureStrokeWithPreviewPoints.isStartOfAGesture()) { - return; - } - if (key == null || !Character.isLetter(key.getCode())) { - return; - } + // Implements {@link BatchInputArbiterListener}. + @Override + public void onStartBatchInput() { if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onStartBatchInput", mPointerId)); } - sInGesture = true; - synchronized (sAggregratedPointers) { - sAggregratedPointers.reset(); - sLastRecognitionPointSize = 0; - sLastRecognitionTime = 0; - mListener.onStartBatchInput(); - dismissAllMoreKeysPanels(); - } - mTimerProxy.cancelLongPressTimer(); - // A gesture floating preview text will be shown at the oldest pointer/finger on the screen. - mDrawingProxy.showGestureTrail( - this, isOldestTrackerInQueue() /* showsFloatingPreviewText */); + sListener.onStartBatchInput(); + dismissAllMoreKeysPanels(); + sTimerProxy.cancelLongPressTimerOf(this); } - public void updateBatchInputByTimer(final long eventTime) { - final int gestureTime = (int)(eventTime - sGestureFirstDownTime); - mGestureStrokeWithPreviewPoints.duplicateLastPointWith(gestureTime); - updateBatchInput(eventTime); - } - - private void mayUpdateBatchInput(final long eventTime, final Key key) { - if (key != null) { - updateBatchInput(eventTime); - } + private void showGestureTrail() { if (mIsTrackingForActionDisabled) { return; } // A gesture floating preview text will be shown at the oldest pointer/finger on the screen. - mDrawingProxy.showGestureTrail( + sDrawingProxy.showGestureTrail( this, isOldestTrackerInQueue() /* showsFloatingPreviewText */); } - private void updateBatchInput(final long eventTime) { - synchronized (sAggregratedPointers) { - final GestureStroke stroke = mGestureStrokeWithPreviewPoints; - stroke.appendIncrementalBatchPoints(sAggregratedPointers); - final int size = sAggregratedPointers.getPointerSize(); - if (size > sLastRecognitionPointSize - && stroke.hasRecognitionTimePast(eventTime, sLastRecognitionTime)) { - if (DEBUG_LISTENER) { - Log.d(TAG, String.format("[%d] onUpdateBatchInput: batchPoints=%d", mPointerId, - size)); - } - mTimerProxy.startUpdateBatchInputTimer(this); - mListener.onUpdateBatchInput(sAggregratedPointers); - // The listener may change the size of the pointers (when auto-committing - // for example), so we need to get the size from the pointers again. - sLastRecognitionPointSize = sAggregratedPointers.getPointerSize(); - sLastRecognitionTime = eventTime; - } - } + public void updateBatchInputByTimer(final long syntheticMoveEventTime) { + mBatchInputArbiter.updateBatchInputByTimer(syntheticMoveEventTime, this); } - private void mayEndBatchInput(final long eventTime) { - synchronized (sAggregratedPointers) { - mGestureStrokeWithPreviewPoints.appendAllBatchPoints(sAggregratedPointers); - if (getActivePointerTrackerCount() == 1) { - sInGesture = false; - sTimeRecorder.onEndBatchInput(eventTime); - mTimerProxy.cancelAllUpdateBatchInputTimers(); - if (!mIsTrackingForActionDisabled) { - if (DEBUG_LISTENER) { - Log.d(TAG, String.format("[%d] onEndBatchInput : batchPoints=%d", - mPointerId, sAggregratedPointers.getPointerSize())); - } - mListener.onEndBatchInput(sAggregratedPointers); - } - } + // Implements {@link BatchInputArbiterListener}. + @Override + public void onUpdateBatchInput(final InputPointers aggregatedPointers, final long eventTime) { + if (DEBUG_LISTENER) { + Log.d(TAG, String.format("[%d] onUpdateBatchInput: batchPoints=%d", mPointerId, + aggregatedPointers.getPointerSize())); } + sListener.onUpdateBatchInput(aggregatedPointers); + } + + // Implements {@link BatchInputArbiterListener}. + @Override + public void onStartUpdateBatchInputTimer() { + sTimerProxy.startUpdateBatchInputTimer(this); + } + + // Implements {@link BatchInputArbiterListener}. + @Override + public void onEndBatchInput(final InputPointers aggregatedPointers, final long eventTime) { + sTypingTimeRecorder.onEndBatchInput(eventTime); + sTimerProxy.cancelAllUpdateBatchInputTimers(); if (mIsTrackingForActionDisabled) { return; } - // A gesture floating preview text will be shown at the oldest pointer/finger on the screen. - mDrawingProxy.showGestureTrail( - this, isOldestTrackerInQueue() /* showsFloatingPreviewText */); + if (DEBUG_LISTENER) { + Log.d(TAG, String.format("[%d] onEndBatchInput : batchPoints=%d", + mPointerId, aggregatedPointers.getPointerSize())); + } + sListener.onEndBatchInput(aggregatedPointers); } private void cancelBatchInput() { @@ -871,19 +632,26 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onCancelBatchInput", mPointerId)); } - mListener.onCancelBatchInput(); + sListener.onCancelBatchInput(); } - public void processMotionEvent(final MotionEvent me, final KeyEventHandler handler) { + public void processMotionEvent(final MotionEvent me, final KeyDetector keyDetector) { final int action = me.getActionMasked(); final long eventTime = me.getEventTime(); if (action == MotionEvent.ACTION_MOVE) { + // When this pointer is the only active pointer and is showing a more keys panel, + // we should ignore other pointers' motion event. + final boolean shouldIgnoreOtherPointers = + isShowingMoreKeysPanel() && getActivePointerTrackerCount() == 1; final int pointerCount = me.getPointerCount(); for (int index = 0; index < pointerCount; index++) { final int id = me.getPointerId(index); - final PointerTracker tracker = getPointerTracker(id, handler); + if (shouldIgnoreOtherPointers && id != mPointerId) { + continue; + } final int x = (int)me.getX(index); final int y = (int)me.getY(index); + final PointerTracker tracker = getPointerTracker(id); tracker.onMoveEvent(x, y, eventTime, me); } return; @@ -894,7 +662,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(x, y, eventTime, handler); + onDownEvent(x, y, eventTime, keyDetector); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: @@ -907,11 +675,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } private void onDownEvent(final int x, final int y, final long eventTime, - final KeyEventHandler handler) { + final KeyDetector keyDetector) { + setKeyDetectorInner(keyDetector); if (DEBUG_EVENT) { printTouchEvent("onDownEvent:", x, y, eventTime); } - setKeyEventHandler(handler); // Naive up-to-down noise filter. final long deltaT = eventTime - mUpTime; if (deltaT < sParams.mTouchNoiseThresholdTime) { @@ -921,9 +689,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element { Log.w(TAG, String.format("[%d] onDownEvent:" + " ignore potential noise: time=%d distance=%d", mPointerId, deltaT, distance)); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_onDownEvent(deltaT, distance * distance); - } cancelTrackingForAction(); return; } @@ -938,7 +703,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } sPointerTrackerQueue.add(this); onDownEventInternal(x, y, eventTime); - if (!sShouldHandleGesture) { + if (!sGestureEnabler.shouldHandleGesture()) { return; } // A gesture should start only from a non-modifier key. Note that the gesture detection is @@ -946,28 +711,36 @@ public final class PointerTracker implements PointerTrackerQueue.Element { mIsDetectingGesture = (mKeyboard != null) && mKeyboard.mId.isAlphabetKeyboard() && key != null && !key.isModifier(); if (mIsDetectingGesture) { - if (getActivePointerTrackerCount() == 1) { - sGestureFirstDownTime = eventTime; - } - mGestureStrokeWithPreviewPoints.onDownEvent(x, y, eventTime, sGestureFirstDownTime, - sTimeRecorder.getLastLetterTypingTime()); + mBatchInputArbiter.addDownEventPoint(x, y, eventTime, + sTypingTimeRecorder.getLastLetterTypingTime(), getActivePointerTrackerCount()); + mGestureStrokeDrawingPoints.onDownEvent( + x, y, mBatchInputArbiter.getElapsedTimeSinceFirstDown(eventTime)); } } - private boolean isShowingMoreKeysPanel() { + /* package */ boolean isShowingMoreKeysPanel() { return (mMoreKeysPanel != null); } + private void dismissMoreKeysPanel() { + if (isShowingMoreKeysPanel()) { + mMoreKeysPanel.dismissMoreKeysPanel(); + mMoreKeysPanel = null; + } + } + private void onDownEventInternal(final int x, final int y, final long eventTime) { Key key = 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's KeyDetector always allows sliding input. - mIsAllowedSlidingKeyInput = sParams.mSlidingKeyInputEnabled + // Key selection by dragging finger is allowed when 1) key selection by dragging finger is + // enabled by configuration, 2) this pointer starts dragging from modifier key, or 3) this + // pointer's KeyDetector always allows key selection by dragging finger, such as + // {@link MoreKeysKeyboard}. + mIsAllowedDraggingFinger = sParams.mKeySelectionByDraggingFinger || (key != null && key.isModifier()) - || mKeyDetector.alwaysAllowsSlidingInput(); + || mKeyDetector.alwaysAllowsKeySelectionByDraggingFinger(); mKeyboardLayoutHasBeenChanged = false; mIsTrackingForActionDisabled = false; - resetSlidingKeyInput(); + resetKeySelectionByDraggingFinger(); if (key != null) { // This onPress call may have changed keyboard layout. Those cases are detected at // {@link #setKeyboard}. In those cases, we should update key according to the new @@ -982,43 +755,47 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } - private void startSlidingKeyInput(final Key key) { - if (!mIsInSlidingKeyInput) { - mIsInSlidingKeyInputFromModifier = key.isModifier(); + private void startKeySelectionByDraggingFinger(final Key key) { + if (!mIsInDraggingFinger) { + mIsInSlidingKeyInput = key.isModifier(); } - mIsInSlidingKeyInput = true; + mIsInDraggingFinger = true; } - private void resetSlidingKeyInput() { + private void resetKeySelectionByDraggingFinger() { + mIsInDraggingFinger = false; mIsInSlidingKeyInput = false; - mIsInSlidingKeyInputFromModifier = false; - mDrawingProxy.dismissSlidingKeyInputPreview(); + sDrawingProxy.dismissSlidingKeyInputPreview(); } private void onGestureMoveEvent(final int x, final int y, final long eventTime, final boolean isMajorEvent, final Key key) { - final int gestureTime = (int)(eventTime - sGestureFirstDownTime); - if (mIsDetectingGesture) { - final int beforeLength = mGestureStrokeWithPreviewPoints.getLength(); - final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard( - x, y, gestureTime, isMajorEvent); - if (mGestureStrokeWithPreviewPoints.getLength() > beforeLength) { - mTimerProxy.startUpdateBatchInputTimer(this); - } - // If the move event goes out from valid batch input area, cancel batch input. - if (!onValidArea) { - cancelBatchInput(); - return; - } - // If the MoreKeysPanel is showing then do not attempt to enter gesture mode. However, - // the gestured touch points are still being recorded in case the panel is dismissed. - if (isShowingMoreKeysPanel()) { - return; - } - mayStartBatchInput(key); - if (sInGesture) { - mayUpdateBatchInput(eventTime, key); + if (!mIsDetectingGesture) { + return; + } + final boolean onValidArea = mBatchInputArbiter.addMoveEventPoint( + x, y, eventTime, isMajorEvent, this); + // If the move event goes out from valid batch input area, cancel batch input. + if (!onValidArea) { + cancelBatchInput(); + return; + } + mGestureStrokeDrawingPoints.onMoveEvent( + x, y, mBatchInputArbiter.getElapsedTimeSinceFirstDown(eventTime)); + // If the MoreKeysPanel is showing then do not attempt to enter gesture mode. However, + // the gestured touch points are still being recorded in case the panel is dismissed. + if (isShowingMoreKeysPanel()) { + return; + } + if (!sInGesture && key != null && Character.isLetter(key.getCode()) + && mBatchInputArbiter.mayStartBatchInput(this)) { + sInGesture = true; + } + if (sInGesture) { + if (key != null) { + mBatchInputArbiter.updateBatchInput(eventTime, this); } + showGestureTrail(); } } @@ -1030,7 +807,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return; } - if (sShouldHandleGesture && me != null) { + if (sGestureEnabler.shouldHandleGesture() && me != null) { // Add historical points to gesture path. final int pointerIndex = me.findPointerIndex(mPointerId); final int historicalSize = me.getHistorySize(); @@ -1048,15 +825,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final int translatedY = mMoreKeysPanel.translateY(y); mMoreKeysPanel.onMoveEvent(translatedX, translatedY, mPointerId, eventTime); onMoveKey(x, y); - if (mIsInSlidingKeyInputFromModifier) { - mDrawingProxy.showSlidingKeyInputPreview(this); + if (mIsInSlidingKeyInput) { + sDrawingProxy.showSlidingKeyInputPreview(this); } return; } onMoveEventInternal(x, y, eventTime); } - private void processSlidingKeyInput(final Key newKey, final int x, final int y, + private void processDraggingFingerInToNewKey(final Key newKey, final int x, final int y, final long eventTime) { // This onPress call may have changed keyboard layout. Those cases are detected // at {@link #setKeyboard}. In those cases, we should update key according @@ -1083,10 +860,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element { lastX, lastY, Constants.printableCode(oldKey.getCode()), x, y, Constants.printableCode(key.getCode()))); } - // TODO: This should be moved to outside of this nested if-clause? - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_onMoveEvent(x, y, lastX, lastY); - } onUpEventInternal(x, y, eventTime); onDownEventInternal(x, y, eventTime); } @@ -1110,35 +883,35 @@ public final class PointerTracker implements PointerTrackerQueue.Element { onDownEventInternal(x, y, eventTime); } - private void processSildeOutFromOldKey(final Key oldKey) { + private void processDraggingFingerOutFromOldKey(final Key oldKey) { setReleasedKeyGraphics(oldKey); callListenerOnRelease(oldKey, oldKey.getCode(), true /* withSliding */); - startSlidingKeyInput(oldKey); - mTimerProxy.cancelKeyTimers(); + startKeySelectionByDraggingFinger(oldKey); + sTimerProxy.cancelKeyTimersOf(this); } - private void slideFromOldKeyToNewKey(final Key key, final int x, final int y, + private void dragFingerFromOldKeyToNewKey(final Key key, final int x, final int y, final long eventTime, final Key oldKey, final int lastX, final int lastY) { // 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. - processSildeOutFromOldKey(oldKey); + processDraggingFingerOutFromOldKey(oldKey); startRepeatKey(key); - if (mIsAllowedSlidingKeyInput) { - processSlidingKeyInput(key, x, y, eventTime); + if (mIsAllowedDraggingFinger) { + processDraggingFingerInToNewKey(key, x, y, eventTime); } // HACK: On some devices, quick successive touches may be reported as a sudden move by // touch panel firmware. This hack detects such cases and translates the move event to // successive up and down events. // TODO: Should find a way to balance gesture detection and this hack. else if (sNeedsPhantomSuddenMoveEventHack - && getDistance(x, y, lastX, lastY) >= mPhantonSuddenMoveThreshold) { + && getDistance(x, y, lastX, lastY) >= mPhantomSuddenMoveThreshold) { processPhantomSuddenMoveHack(key, x, y, eventTime, oldKey, lastX, lastY); } // HACK: On some devices, quick successive proximate touches may be reported as a bogus // down-move-up event by touch panel firmware. This hack detects such cases and breaks // these events into separate up and down events. - else if (sNeedsProximateBogusDownMoveUpEventHack && sTimeRecorder.isInFastTyping(eventTime) + else if (sTypingTimeRecorder.isInFastTyping(eventTime) && mBogusMoveEventDetector.isCloseToActualDownEvent(x, y)) { processProximateBogusDownMoveUpEventHack(key, x, y, eventTime, oldKey, lastX, lastY); } @@ -1163,11 +936,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } - private void slideOutFromOldKey(final Key oldKey, final int x, final int y) { + private void dragFingerOutFromOldKey(final Key oldKey, final int x, final int y) { // The pointer has been slid out from the previous key, we must call onRelease() to // notify that the previous key has been released. - processSildeOutFromOldKey(oldKey); - if (mIsAllowedSlidingKeyInput) { + processDraggingFingerOutFromOldKey(oldKey); + if (mIsAllowedDraggingFinger) { onMoveToNewKey(null, x, y); } else { if (!mIsDetectingGesture) { @@ -1182,7 +955,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final Key oldKey = mCurrentKey; final Key newKey = onMoveKey(x, y); - if (sShouldHandleGesture) { + if (sGestureEnabler.shouldHandleGesture()) { // Register move event on gesture tracker. onGestureMoveEvent(x, y, eventTime, true /* isMajorEvent */, newKey); if (sInGesture) { @@ -1194,19 +967,19 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (newKey != null) { if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, eventTime, newKey)) { - slideFromOldKeyToNewKey(newKey, x, y, eventTime, oldKey, lastX, lastY); + dragFingerFromOldKeyToNewKey(newKey, x, y, eventTime, oldKey, lastX, lastY); } else 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. - processSlidingKeyInput(newKey, x, y, eventTime); + processDraggingFingerInToNewKey(newKey, x, y, eventTime); } } else { // newKey == null if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, eventTime, newKey)) { - slideOutFromOldKey(oldKey, x, y); + dragFingerOutFromOldKey(oldKey, x, y); } } - if (mIsInSlidingKeyInputFromModifier) { - mDrawingProxy.showSlidingKeyInputPreview(this); + if (mIsInSlidingKeyInput) { + sDrawingProxy.showSlidingKeyInputPreview(this); } } @@ -1215,7 +988,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { printTouchEvent("onUpEvent :", x, y, eventTime); } - mTimerProxy.cancelUpdateBatchInputTimer(this); + sTimerProxy.cancelUpdateBatchInputTimer(this); if (!sInGesture) { if (mCurrentKey != null && mCurrentKey.isModifier()) { // Before processing an up event of modifier key, all pointers already being @@ -1237,18 +1010,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (DEBUG_EVENT) { printTouchEvent("onPhntEvent:", mLastX, mLastY, eventTime); } - if (isShowingMoreKeysPanel()) { - return; - } onUpEventInternal(mLastX, mLastY, eventTime); cancelTrackingForAction(); } private void onUpEventInternal(final int x, final int y, final long eventTime) { - mTimerProxy.cancelKeyTimers(); + sTimerProxy.cancelKeyTimersOf(this); + final boolean isInDraggingFinger = mIsInDraggingFinger; final boolean isInSlidingKeyInput = mIsInSlidingKeyInput; - final boolean isInSlidingKeyInputFromModifier = mIsInSlidingKeyInputFromModifier; - resetSlidingKeyInput(); + resetKeySelectionByDraggingFinger(); mIsDetectingGesture = false; final Key currentKey = mCurrentKey; mCurrentKey = null; @@ -1263,8 +1033,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final int translatedY = mMoreKeysPanel.translateY(y); mMoreKeysPanel.onUpEvent(translatedX, translatedY, mPointerId, eventTime); } - mMoreKeysPanel.dismissMoreKeysPanel(); - mMoreKeysPanel = null; + dismissMoreKeysPanel(); return; } @@ -1272,7 +1041,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (currentKey != null) { callListenerOnRelease(currentKey, currentKey.getCode(), true /* withSliding */); } - mayEndBatchInput(eventTime); + if (mBatchInputArbiter.mayEndBatchInput( + eventTime, getActivePointerTrackerCount(), this)) { + sInGesture = false; + } + showGestureTrail(); return; } @@ -1280,11 +1053,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return; } if (currentKey != null && currentKey.isRepeatable() - && (currentKey.getCode() == currentRepeatingKeyCode) && !isInSlidingKeyInput) { + && (currentKey.getCode() == currentRepeatingKeyCode) && !isInDraggingFinger) { return; } detectAndSendKey(currentKey, mKeyX, mKeyY, eventTime); - if (isInSlidingKeyInputFromModifier) { + if (isInSlidingKeyInput) { callListenerOnFinishSlidingInput(); } } @@ -1305,8 +1078,16 @@ public final class PointerTracker implements PointerTrackerQueue.Element { mIsTrackingForActionDisabled = true; } + public boolean isInOperation() { + return !mIsTrackingForActionDisabled; + } + + public void cancelLongPressTimer() { + sTimerProxy.cancelLongPressTimerOf(this); + } + public void onLongPressed() { - resetSlidingKeyInput(); + resetKeySelectionByDraggingFinger(); cancelTrackingForAction(); setReleasedKeyGraphics(mCurrentKey); sPointerTrackerQueue.remove(this); @@ -1324,20 +1105,14 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } private void onCancelEventInternal() { - mTimerProxy.cancelKeyTimers(); + sTimerProxy.cancelKeyTimersOf(this); setReleasedKeyGraphics(mCurrentKey); - resetSlidingKeyInput(); - if (isShowingMoreKeysPanel()) { - mMoreKeysPanel.dismissMoreKeysPanel(); - mMoreKeysPanel = null; - } + resetKeySelectionByDraggingFinger(); + dismissMoreKeysPanel(); } private boolean isMajorEnoughMoveToBeOnNewKey(final int x, final int y, final long eventTime, final Key newKey) { - if (mKeyDetector == null) { - throw new NullPointerException("keyboard and/or key detector not set"); - } final Key curKey = mCurrentKey; if (newKey == curKey) { return false; @@ -1347,7 +1122,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } // Here curKey points to the different key from newKey. final int keyHysteresisDistanceSquared = mKeyDetector.getKeyHysteresisDistanceSquared( - mIsInSlidingKeyInputFromModifier); + mIsInSlidingKeyInput); final int distanceFromKeyEdgeSquared = curKey.squaredDistanceToEdge(x, y); if (distanceFromKeyEdgeSquared >= keyHysteresisDistanceSquared) { if (DEBUG_MODE) { @@ -1358,14 +1133,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } return true; } - if (sNeedsProximateBogusDownMoveUpEventHack && !mIsAllowedSlidingKeyInput - && sTimeRecorder.isInFastTyping(eventTime) + if (!mIsAllowedDraggingFinger && sTypingTimeRecorder.isInFastTyping(eventTime) && mBogusMoveEventDetector.hasTraveledLongDistance(x, y)) { if (DEBUG_MODE) { final float keyDiagonal = (float)Math.hypot( mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight); final float lengthFromDownRatio = - mBogusMoveEventDetector.mAccumulatedDistanceFromDownKey / keyDiagonal; + mBogusMoveEventDetector.getAccumulatedDistanceFromDownKey() / keyDiagonal; Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:" + " %.2f key diagonal from virtual down point", mPointerId, lengthFromDownRatio)); @@ -1376,30 +1150,34 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } private void startLongPressTimer(final Key key) { + // Note that we need to cancel all active long press shift key timers if any whenever we + // start a new long press timer for both non-shift and shift keys. + sTimerProxy.cancelLongPressShiftKeyTimers(); if (sInGesture) return; if (key == null) return; if (!key.isLongPressEnabled()) return; // Caveat: Please note that isLongPressEnabled() can be true even if the current key - // doesn't have its more keys. (e.g. spacebar, globe key) + // doesn't have its more keys. (e.g. spacebar, globe key) If we are in the dragging finger + // mode, we will disable long press timer of such key. // We always need to start the long press timer if the key has its more keys regardless of - // whether or not we are in the sliding input mode. - if (mIsInSlidingKeyInput && key.getMoreKeys() == null) return; - final int delay; - switch (key.getCode()) { - case Constants.CODE_SHIFT: - delay = sParams.mLongPressShiftLockTimeout; - break; - default: - final int longpressTimeout = Settings.getInstance().getCurrent().mKeyLongpressTimeout; - if (mIsInSlidingKeyInputFromModifier) { - // We use longer timeout for sliding finger input started from the modifier key. - delay = longpressTimeout * MULTIPLIER_FOR_LONG_PRESS_TIMEOUT_IN_SLIDING_INPUT; - } else { - delay = longpressTimeout; - } - break; + // whether or not we are in the dragging finger mode. + if (mIsInDraggingFinger && key.getMoreKeys() == null) return; + + final int delay = getLongPressTimeout(key.getCode()); + if (delay <= 0) return; + sTimerProxy.startLongPressTimerOf(this, delay); + } + + private int getLongPressTimeout(final int code) { + if (code == Constants.CODE_SHIFT) { + return sParams.mLongPressShiftLockTimeout; + } + final int longpressTimeout = Settings.getInstance().getCurrent().mKeyLongpressTimeout; + if (mIsInSlidingKeyInput) { + // We use longer timeout for sliding finger input started from the modifier key. + return longpressTimeout * MULTIPLIER_FOR_LONG_PRESS_TIMEOUT_IN_SLIDING_INPUT; } - mTimerProxy.startLongPressTimer(this, delay); + return longpressTimeout; } private void detectAndSendKey(final Key key, final int x, final int y, final long eventTime) { @@ -1409,7 +1187,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } final int code = key.getCode(); - callListenerOnCodeInput(key, code, x, y, eventTime); + callListenerOnCodeInput(key, code, x, y, eventTime, false /* isKeyRepeat */); callListenerOnRelease(key, code, false /* withSliding */); } @@ -1417,10 +1195,10 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (sInGesture) return; if (key == null) return; if (!key.isRepeatable()) return; - // Don't start key repeat when we are in sliding input mode. - if (mIsInSlidingKeyInput) return; + // Don't start key repeat when we are in the dragging finger mode. + if (mIsInDraggingFinger) return; final int startRepeatCount = 1; - mTimerProxy.startKeyRepeatTimer(this, startRepeatCount, sParams.mKeyRepeatStartTimeout); + startKeyRepeatTimer(startRepeatCount); } public void onKeyRepeat(final int code, final int repeatCount) { @@ -1432,15 +1210,22 @@ public final class PointerTracker implements PointerTrackerQueue.Element { mCurrentRepeatingKeyCode = code; mIsDetectingGesture = false; final int nextRepeatCount = repeatCount + 1; - mTimerProxy.startKeyRepeatTimer(this, nextRepeatCount, sParams.mKeyRepeatInterval); + startKeyRepeatTimer(nextRepeatCount); callListenerOnPressAndCheckKeyboardLayoutChange(key, repeatCount); - callListenerOnCodeInput(key, code, mKeyX, mKeyY, SystemClock.uptimeMillis()); + callListenerOnCodeInput(key, code, mKeyX, mKeyY, SystemClock.uptimeMillis(), + true /* isKeyRepeat */); + } + + private void startKeyRepeatTimer(final int repeatCount) { + final int delay = + (repeatCount == 1) ? sParams.mKeyRepeatStartTimeout : sParams.mKeyRepeatInterval; + sTimerProxy.startKeyRepeatTimerOf(this, repeatCount, delay); } private void printTouchEvent(final String title, final int x, final int y, final long eventTime) { final Key key = mKeyDetector.detectHitKey(x, y); - final String code = KeyDetector.printableCode(key); + final String code = (key == null ? "none" : Constants.printableCode(key.getCode())); Log.d(TAG, String.format("[%d]%s%s %4d %4d %5d %s", mPointerId, (mIsTrackingForActionDisabled ? "-" : " "), title, x, y, eventTime, code)); } diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java index a0316696c..c19cd671a 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -24,7 +24,10 @@ import com.android.inputmethod.keyboard.internal.TouchPositionCorrection; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.utils.JniUtils; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class ProximityInfo { private static final String TAG = ProximityInfo.class.getSimpleName(); @@ -34,7 +37,7 @@ public class ProximityInfo { public static final int MAX_PROXIMITY_CHARS_SIZE = 16; /** Number of key widths from current touch point to search for nearest keys. */ private static final float SEARCH_DISTANCE = 1.2f; - private static final Key[] EMPTY_KEY_ARRAY = new Key[0]; + private static final List<Key> EMPTY_KEY_LIST = Collections.emptyList(); private static final float DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS = 0.15f; private final int mGridWidth; @@ -47,13 +50,14 @@ public class ProximityInfo { private final int mKeyboardHeight; private final int mMostCommonKeyWidth; private final int mMostCommonKeyHeight; - private final Key[] mKeys; - private final Key[][] mGridNeighbors; + private final List<Key> mSortedKeys; + private final List<Key>[] mGridNeighbors; private final String mLocaleStr; + @SuppressWarnings("unchecked") ProximityInfo(final String localeStr, final int gridWidth, final int gridHeight, final int minWidth, final int height, final int mostCommonKeyWidth, - final int mostCommonKeyHeight, final Key[] keys, + final int mostCommonKeyHeight, final List<Key> sortedKeys, final TouchPositionCorrection touchPositionCorrection) { if (TextUtils.isEmpty(localeStr)) { mLocaleStr = ""; @@ -69,8 +73,8 @@ public class ProximityInfo { mKeyboardHeight = height; mMostCommonKeyHeight = mostCommonKeyHeight; mMostCommonKeyWidth = mostCommonKeyWidth; - mKeys = keys; - mGridNeighbors = new Key[mGridSize][]; + mSortedKeys = sortedKeys; + mGridNeighbors = new List[mGridSize]; if (minWidth == 0 || height == 0) { // No proximity required. Keyboard might be more keys keyboard. return; @@ -99,7 +103,7 @@ public class ProximityInfo { return key.getCode() >= Constants.CODE_SPACE; } - private static int getProximityInfoKeysCount(final Key[] keys) { + private static int getProximityInfoKeysCount(final List<Key> keys) { int count = 0; for (final Key key : keys) { if (needsProximityInfo(key)) { @@ -110,14 +114,15 @@ public class ProximityInfo { } private long createNativeProximityInfo(final TouchPositionCorrection touchPositionCorrection) { - final Key[][] gridNeighborKeys = mGridNeighbors; + final List<Key>[] gridNeighborKeys = mGridNeighbors; final int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE]; Arrays.fill(proximityCharsArray, Constants.NOT_A_CODE); for (int i = 0; i < mGridSize; ++i) { - final int proximityCharsLength = gridNeighborKeys[i].length; + final List<Key> neighborKeys = gridNeighborKeys[i]; + final int proximityCharsLength = neighborKeys.size(); int infoIndex = i * MAX_PROXIMITY_CHARS_SIZE; for (int j = 0; j < proximityCharsLength; ++j) { - final Key neighborKey = gridNeighborKeys[i][j]; + final Key neighborKey = neighborKeys.get(j); // Excluding from proximityCharsArray if (!needsProximityInfo(neighborKey)) { continue; @@ -142,8 +147,8 @@ public class ProximityInfo { } } - final Key[] keys = mKeys; - final int keyCount = getProximityInfoKeysCount(keys); + final List<Key> sortedKeys = mSortedKeys; + final int keyCount = getProximityInfoKeysCount(sortedKeys); final int[] keyXCoordinates = new int[keyCount]; final int[] keyYCoordinates = new int[keyCount]; final int[] keyWidths = new int[keyCount]; @@ -153,8 +158,8 @@ public class ProximityInfo { final float[] sweetSpotCenterYs; final float[] sweetSpotRadii; - for (int infoIndex = 0, keyIndex = 0; keyIndex < keys.length; keyIndex++) { - final Key key = keys[keyIndex]; + for (int infoIndex = 0, keyIndex = 0; keyIndex < sortedKeys.size(); keyIndex++) { + final Key key = sortedKeys.get(keyIndex); // Excluding from key coordinate arrays if (!needsProximityInfo(key)) { continue; @@ -177,8 +182,8 @@ public class ProximityInfo { final int rows = touchPositionCorrection.getRows(); final float defaultRadius = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS * (float)Math.hypot(mMostCommonKeyWidth, mMostCommonKeyHeight); - for (int infoIndex = 0, keyIndex = 0; keyIndex < keys.length; keyIndex++) { - final Key key = keys[keyIndex]; + for (int infoIndex = 0, keyIndex = 0; keyIndex < sortedKeys.size(); keyIndex++) { + final Key key = sortedKeys.get(keyIndex); // Excluding from touch position correction arrays if (!needsProximityInfo(key)) { continue; @@ -240,7 +245,7 @@ public class ProximityInfo { private void computeNearestNeighbors() { final int defaultWidth = mMostCommonKeyWidth; - final int keyCount = mKeys.length; + final int keyCount = mSortedKeys.size(); final int gridSize = mGridNeighbors.length; final int threshold = (int) (defaultWidth * SEARCH_DISTANCE); final int thresholdSquared = threshold * threshold; @@ -259,7 +264,7 @@ public class ProximityInfo { final int[] neighborCountPerCell = new int[gridSize]; final int halfCellWidth = mCellWidth / 2; final int halfCellHeight = mCellHeight / 2; - for (final Key key : mKeys) { + for (final Key key : mSortedKeys) { if (key.isSpacer()) continue; /* HOW WE PRE-SELECT THE CELLS (iterate over only the relevant cells, instead of all of them) @@ -353,9 +358,13 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get } for (int i = 0; i < gridSize; ++i) { - final int base = i * keyCount; - mGridNeighbors[i] = - Arrays.copyOfRange(neighborsFlatBuffer, base, base + neighborCountPerCell[i]); + final int indexStart = i * keyCount; + final int indexEnd = indexStart + neighborCountPerCell[i]; + final ArrayList<Key> neighbors = new ArrayList<>(indexEnd - indexStart); + for (int index = indexStart; index < indexEnd; index++) { + neighbors.add(neighborsFlatBuffer[index]); + } + mGridNeighbors[i] = Collections.unmodifiableList(neighbors); } } @@ -369,7 +378,7 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get if (primaryKeyCode > Constants.CODE_SPACE) { dest[index++] = primaryKeyCode; } - final Key[] nearestKeys = getNearestKeys(x, y); + final List<Key> nearestKeys = getNearestKeys(x, y); for (Key key : nearestKeys) { if (index >= destLength) { break; @@ -385,9 +394,9 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get } } - public Key[] getNearestKeys(final int x, final int y) { + public List<Key> getNearestKeys(final int x, final int y) { if (mGridNeighbors == null) { - return EMPTY_KEY_ARRAY; + return EMPTY_KEY_LIST; } if (x >= 0 && x < mKeyboardMinWidth && y >= 0 && y < mKeyboardHeight) { int index = (y / mCellHeight) * mGridWidth + (x / mCellWidth); @@ -395,6 +404,6 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get return mGridNeighbors[index]; } } - return EMPTY_KEY_ARRAY; + return EMPTY_KEY_LIST; } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/DynamicGridKeyboard.java b/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java index 3133e54be..daeb1f928 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/DynamicGridKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java @@ -14,28 +14,27 @@ * limitations under the License. */ -package com.android.inputmethod.keyboard.internal; +package com.android.inputmethod.keyboard.emoji; import android.content.SharedPreferences; import android.text.TextUtils; import android.util.Log; -import com.android.inputmethod.keyboard.EmojiPalettesView; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.settings.Settings; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.StringUtils; +import com.android.inputmethod.latin.utils.JsonUtils; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** * This is a Keyboard class where you can add keys dynamically shown in a grid layout */ -public class DynamicGridKeyboard extends Keyboard { +final class DynamicGridKeyboard extends Keyboard { private static final String TAG = DynamicGridKeyboard.class.getSimpleName(); private static final int TEMPLATE_KEY_CODE_0 = 0x30; private static final int TEMPLATE_KEY_CODE_1 = 0x31; @@ -47,13 +46,13 @@ public class DynamicGridKeyboard extends Keyboard { private final int mColumnsNum; private final int mMaxKeyCount; private final boolean mIsRecents; - private final ArrayDeque<GridKey> mGridKeys = CollectionUtils.newArrayDeque(); - private final ArrayDeque<Key> mPendingKeys = CollectionUtils.newArrayDeque(); + private final ArrayDeque<GridKey> mGridKeys = new ArrayDeque<>(); + private final ArrayDeque<Key> mPendingKeys = new ArrayDeque<>(); - private Key[] mCachedGridKeys; + private List<Key> mCachedGridKeys; public DynamicGridKeyboard(final SharedPreferences prefs, final Keyboard templateKeyboard, - final int maxKeyCount, final int categoryId, final int categoryPageId) { + final int maxKeyCount, final int categoryId) { super(templateKeyboard); final Key key0 = getTemplateKey(TEMPLATE_KEY_CODE_0); final Key key1 = getTemplateKey(TEMPLATE_KEY_CODE_1); @@ -61,12 +60,12 @@ public class DynamicGridKeyboard extends Keyboard { mVerticalStep = key0.getHeight() + mVerticalGap; mColumnsNum = mBaseWidth / mHorizontalStep; mMaxKeyCount = maxKeyCount; - mIsRecents = categoryId == EmojiPalettesView.CATEGORY_ID_RECENTS; + mIsRecents = categoryId == EmojiCategory.ID_RECENTS; mPrefs = prefs; } private Key getTemplateKey(final int code) { - for (final Key key : super.getKeys()) { + for (final Key key : super.getSortedKeys()) { if (key.getCode() == code) { return key; } @@ -124,14 +123,14 @@ public class DynamicGridKeyboard extends Keyboard { final int keyY0 = getKeyY0(index); final int keyX1 = getKeyX1(index); final int keyY1 = getKeyY1(index); - gridKey.updateCorrdinates(keyX0, keyY0, keyX1, keyY1); + gridKey.updateCoordinates(keyX0, keyY0, keyX1, keyY1); index++; } } } private void saveRecentKeys() { - final ArrayList<Object> keys = CollectionUtils.newArrayList(); + final ArrayList<Object> keys = new ArrayList<>(); for (final Key key : mGridKeys) { if (key.getOutputText() != null) { keys.add(key.getOutputText()); @@ -139,36 +138,50 @@ public class DynamicGridKeyboard extends Keyboard { keys.add(key.getCode()); } } - final String jsonStr = StringUtils.listToJsonStr(keys); + final String jsonStr = JsonUtils.listToJsonStr(keys); Settings.writeEmojiRecentKeys(mPrefs, jsonStr); } - private static Key getKey(final Collection<DynamicGridKeyboard> keyboards, final Object o) { - for (final DynamicGridKeyboard kbd : keyboards) { - if (o instanceof Integer) { - final int code = (Integer) o; - final Key key = kbd.getKey(code); - if (key != null) { + private static Key getKeyByCode(final Collection<DynamicGridKeyboard> keyboards, + final int code) { + for (final DynamicGridKeyboard keyboard : keyboards) { + for (final Key key : keyboard.getSortedKeys()) { + if (key.getCode() == code) { return key; } - } else if (o instanceof String) { - final String outputText = (String) o; - final Key key = kbd.getKeyFromOutputText(outputText); - if (key != null) { + } + } + return null; + } + + private static Key getKeyByOutputText(final Collection<DynamicGridKeyboard> keyboards, + final String outputText) { + for (final DynamicGridKeyboard keyboard : keyboards) { + for (final Key key : keyboard.getSortedKeys()) { + if (outputText.equals(key.getOutputText())) { return key; } - } else { - Log.w(TAG, "Invalid object: " + o); } } return null; } - public void loadRecentKeys(Collection<DynamicGridKeyboard> keyboards) { + public void loadRecentKeys(final Collection<DynamicGridKeyboard> keyboards) { final String str = Settings.readEmojiRecentKeys(mPrefs); - final List<Object> keys = StringUtils.jsonStrToList(str); + final List<Object> keys = JsonUtils.jsonStrToList(str); for (final Object o : keys) { - addKeyLast(getKey(keyboards, o)); + final Key key; + if (o instanceof Integer) { + final int code = (Integer)o; + key = getKeyByCode(keyboards, code); + } else if (o instanceof String) { + final String outputText = (String)o; + key = getKeyByOutputText(keyboards, outputText); + } else { + Log.w(TAG, "Invalid object: " + o); + continue; + } + addKeyLast(key); } } @@ -193,20 +206,21 @@ public class DynamicGridKeyboard extends Keyboard { } @Override - public Key[] getKeys() { + public List<Key> getSortedKeys() { synchronized (mLock) { if (mCachedGridKeys != null) { return mCachedGridKeys; } - mCachedGridKeys = mGridKeys.toArray(new Key[mGridKeys.size()]); + final ArrayList<Key> cachedKeys = new ArrayList<Key>(mGridKeys); + mCachedGridKeys = Collections.unmodifiableList(cachedKeys); return mCachedGridKeys; } } @Override - public Key[] getNearestKeys(final int x, final int y) { + public List<Key> getNearestKeys(final int x, final int y) { // TODO: Calculate the nearest key index in mGridKeys from x and y. - return getKeys(); + return getSortedKeys(); } static final class GridKey extends Key { @@ -217,7 +231,7 @@ public class DynamicGridKeyboard extends Keyboard { super(originalKey); } - public void updateCorrdinates(final int x0, final int y0, final int x1, final int y1) { + public void updateCoordinates(final int x0, final int y0, final int x1, final int y1) { mCurrentX = x0; mCurrentY = y0; getHitBox().set(x0, y0, x1, y1); diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java new file mode 100644 index 000000000..512d4615d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java @@ -0,0 +1,353 @@ +/* + * Copyright (C) 2014 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.emoji; + +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.os.Build; +import android.util.Log; +import android.util.Pair; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardId; +import com.android.inputmethod.keyboard.KeyboardLayoutSet; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.settings.Settings; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +final class EmojiCategory { + private final String TAG = EmojiCategory.class.getSimpleName(); + + private static final int ID_UNSPECIFIED = -1; + public static final int ID_RECENTS = 0; + private static final int ID_PEOPLE = 1; + private static final int ID_OBJECTS = 2; + private static final int ID_NATURE = 3; + private static final int ID_PLACES = 4; + private static final int ID_SYMBOLS = 5; + private static final int ID_EMOTICONS = 6; + + public final class CategoryProperties { + public final int mCategoryId; + public final int mPageCount; + public CategoryProperties(final int categoryId, final int pageCount) { + mCategoryId = categoryId; + mPageCount = pageCount; + } + } + + private static final String[] sCategoryName = { + "recents", + "people", + "objects", + "nature", + "places", + "symbols", + "emoticons" }; + + private static final int[] sCategoryTabIconAttr = { + R.styleable.EmojiPalettesView_iconEmojiRecentsTab, + R.styleable.EmojiPalettesView_iconEmojiCategory1Tab, + R.styleable.EmojiPalettesView_iconEmojiCategory2Tab, + R.styleable.EmojiPalettesView_iconEmojiCategory3Tab, + R.styleable.EmojiPalettesView_iconEmojiCategory4Tab, + R.styleable.EmojiPalettesView_iconEmojiCategory5Tab, + R.styleable.EmojiPalettesView_iconEmojiCategory6Tab }; + + private static final int[] sAccessibilityDescriptionResourceIdsForCategories = { + R.string.spoken_descrption_emoji_category_recents, + R.string.spoken_descrption_emoji_category_people, + R.string.spoken_descrption_emoji_category_objects, + R.string.spoken_descrption_emoji_category_nature, + R.string.spoken_descrption_emoji_category_places, + R.string.spoken_descrption_emoji_category_symbols, + R.string.spoken_descrption_emoji_category_emoticons }; + + private static final int[] sCategoryElementId = { + KeyboardId.ELEMENT_EMOJI_RECENTS, + KeyboardId.ELEMENT_EMOJI_CATEGORY1, + KeyboardId.ELEMENT_EMOJI_CATEGORY2, + KeyboardId.ELEMENT_EMOJI_CATEGORY3, + KeyboardId.ELEMENT_EMOJI_CATEGORY4, + KeyboardId.ELEMENT_EMOJI_CATEGORY5, + KeyboardId.ELEMENT_EMOJI_CATEGORY6 }; + + private final SharedPreferences mPrefs; + private final Resources mRes; + private final int mMaxPageKeyCount; + private final KeyboardLayoutSet mLayoutSet; + private final HashMap<String, Integer> mCategoryNameToIdMap = new HashMap<>(); + private final int[] mCategoryTabIconId = new int[sCategoryName.length]; + private final ArrayList<CategoryProperties> mShownCategories = new ArrayList<>(); + private final ConcurrentHashMap<Long, DynamicGridKeyboard> mCategoryKeyboardMap = + new ConcurrentHashMap<>(); + + private int mCurrentCategoryId = EmojiCategory.ID_UNSPECIFIED; + private int mCurrentCategoryPageId = 0; + + public EmojiCategory(final SharedPreferences prefs, final Resources res, + final KeyboardLayoutSet layoutSet, final TypedArray emojiPaletteViewAttr) { + mPrefs = prefs; + mRes = res; + mMaxPageKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_page_key_count); + mLayoutSet = layoutSet; + for (int i = 0; i < sCategoryName.length; ++i) { + mCategoryNameToIdMap.put(sCategoryName[i], i); + mCategoryTabIconId[i] = emojiPaletteViewAttr.getResourceId( + sCategoryTabIconAttr[i], 0); + } + addShownCategoryId(EmojiCategory.ID_RECENTS); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2 + || android.os.Build.VERSION.CODENAME.equalsIgnoreCase("KeyLimePie") + || android.os.Build.VERSION.CODENAME.equalsIgnoreCase("KitKat")) { + addShownCategoryId(EmojiCategory.ID_PEOPLE); + addShownCategoryId(EmojiCategory.ID_OBJECTS); + addShownCategoryId(EmojiCategory.ID_NATURE); + addShownCategoryId(EmojiCategory.ID_PLACES); + mCurrentCategoryId = + Settings.readLastShownEmojiCategoryId(mPrefs, EmojiCategory.ID_PEOPLE); + } else { + mCurrentCategoryId = + Settings.readLastShownEmojiCategoryId(mPrefs, EmojiCategory.ID_SYMBOLS); + } + addShownCategoryId(EmojiCategory.ID_SYMBOLS); + addShownCategoryId(EmojiCategory.ID_EMOTICONS); + getKeyboard(EmojiCategory.ID_RECENTS, 0 /* cagetoryPageId */) + .loadRecentKeys(mCategoryKeyboardMap.values()); + } + + private void addShownCategoryId(final int categoryId) { + // Load a keyboard of categoryId + getKeyboard(categoryId, 0 /* cagetoryPageId */); + final CategoryProperties properties = + new CategoryProperties(categoryId, getCategoryPageCount(categoryId)); + mShownCategories.add(properties); + } + + public String getCategoryName(final int categoryId, final int categoryPageId) { + return sCategoryName[categoryId] + "-" + categoryPageId; + } + + public int getCategoryId(final String name) { + final String[] strings = name.split("-"); + return mCategoryNameToIdMap.get(strings[0]); + } + + public int getCategoryTabIcon(final int categoryId) { + return mCategoryTabIconId[categoryId]; + } + + public String getAccessibilityDescription(final int categoryId) { + return mRes.getString(sAccessibilityDescriptionResourceIdsForCategories[categoryId]); + } + + public ArrayList<CategoryProperties> getShownCategories() { + return mShownCategories; + } + + public int getCurrentCategoryId() { + return mCurrentCategoryId; + } + + public int getCurrentCategoryPageSize() { + return getCategoryPageSize(mCurrentCategoryId); + } + + public int getCategoryPageSize(final int categoryId) { + for (final CategoryProperties prop : mShownCategories) { + if (prop.mCategoryId == categoryId) { + return prop.mPageCount; + } + } + Log.w(TAG, "Invalid category id: " + categoryId); + // Should not reach here. + return 0; + } + + public void setCurrentCategoryId(final int categoryId) { + mCurrentCategoryId = categoryId; + Settings.writeLastShownEmojiCategoryId(mPrefs, categoryId); + } + + public void setCurrentCategoryPageId(final int id) { + mCurrentCategoryPageId = id; + } + + public int getCurrentCategoryPageId() { + return mCurrentCategoryPageId; + } + + public void saveLastTypedCategoryPage() { + Settings.writeLastTypedEmojiCategoryPageId( + mPrefs, mCurrentCategoryId, mCurrentCategoryPageId); + } + + public boolean isInRecentTab() { + return mCurrentCategoryId == EmojiCategory.ID_RECENTS; + } + + public int getTabIdFromCategoryId(final int categoryId) { + for (int i = 0; i < mShownCategories.size(); ++i) { + if (mShownCategories.get(i).mCategoryId == categoryId) { + return i; + } + } + Log.w(TAG, "categoryId not found: " + categoryId); + return 0; + } + + // Returns the view pager's page position for the categoryId + public int getPageIdFromCategoryId(final int categoryId) { + final int lastSavedCategoryPageId = + Settings.readLastTypedEmojiCategoryPageId(mPrefs, categoryId); + int sum = 0; + for (int i = 0; i < mShownCategories.size(); ++i) { + final CategoryProperties props = mShownCategories.get(i); + if (props.mCategoryId == categoryId) { + return sum + lastSavedCategoryPageId; + } + sum += props.mPageCount; + } + Log.w(TAG, "categoryId not found: " + categoryId); + return 0; + } + + public int getRecentTabId() { + return getTabIdFromCategoryId(EmojiCategory.ID_RECENTS); + } + + private int getCategoryPageCount(final int categoryId) { + final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]); + return (keyboard.getSortedKeys().size() - 1) / mMaxPageKeyCount + 1; + } + + // Returns a pair of the category id and the category page id from the view pager's page + // position. The category page id is numbered in each category. And the view page position + // is the position of the current shown page in the view pager which contains all pages of + // all categories. + public Pair<Integer, Integer> getCategoryIdAndPageIdFromPagePosition(final int position) { + int sum = 0; + for (final CategoryProperties properties : mShownCategories) { + final int temp = sum; + sum += properties.mPageCount; + if (sum > position) { + return new Pair<>(properties.mCategoryId, position - temp); + } + } + return null; + } + + // Returns a keyboard from the view pager's page position. + public DynamicGridKeyboard getKeyboardFromPagePosition(final int position) { + final Pair<Integer, Integer> categoryAndId = + getCategoryIdAndPageIdFromPagePosition(position); + if (categoryAndId != null) { + return getKeyboard(categoryAndId.first, categoryAndId.second); + } + return null; + } + + private static final Long getCategoryKeyboardMapKey(final int categoryId, final int id) { + return (((long) categoryId) << Constants.MAX_INT_BIT_COUNT) | id; + } + + public DynamicGridKeyboard getKeyboard(final int categoryId, final int id) { + synchronized (mCategoryKeyboardMap) { + final Long categotyKeyboardMapKey = getCategoryKeyboardMapKey(categoryId, id); + if (mCategoryKeyboardMap.containsKey(categotyKeyboardMapKey)) { + return mCategoryKeyboardMap.get(categotyKeyboardMapKey); + } + + if (categoryId == EmojiCategory.ID_RECENTS) { + final DynamicGridKeyboard kbd = new DynamicGridKeyboard(mPrefs, + mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS), + mMaxPageKeyCount, categoryId); + mCategoryKeyboardMap.put(categotyKeyboardMapKey, kbd); + return kbd; + } + + final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]); + final Key[][] sortedKeys = sortKeysIntoPages( + keyboard.getSortedKeys(), mMaxPageKeyCount); + for (int pageId = 0; pageId < sortedKeys.length; ++pageId) { + final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs, + mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS), + mMaxPageKeyCount, categoryId); + for (final Key emojiKey : sortedKeys[pageId]) { + if (emojiKey == null) { + break; + } + tempKeyboard.addKeyLast(emojiKey); + } + mCategoryKeyboardMap.put( + getCategoryKeyboardMapKey(categoryId, pageId), tempKeyboard); + } + return mCategoryKeyboardMap.get(categotyKeyboardMapKey); + } + } + + public int getTotalPageCountOfAllCategories() { + int sum = 0; + for (CategoryProperties properties : mShownCategories) { + sum += properties.mPageCount; + } + return sum; + } + + private static Comparator<Key> EMOJI_KEY_COMPARATOR = new Comparator<Key>() { + @Override + public int compare(final Key lhs, final Key rhs) { + final Rect lHitBox = lhs.getHitBox(); + final Rect rHitBox = rhs.getHitBox(); + if (lHitBox.top < rHitBox.top) { + return -1; + } else if (lHitBox.top > rHitBox.top) { + return 1; + } + if (lHitBox.left < rHitBox.left) { + return -1; + } else if (lHitBox.left > rHitBox.left) { + return 1; + } + if (lhs.getCode() == rhs.getCode()) { + return 0; + } + return lhs.getCode() < rhs.getCode() ? -1 : 1; + } + }; + + private static Key[][] sortKeysIntoPages(final List<Key> inKeys, final int maxPageCount) { + final ArrayList<Key> keys = new ArrayList<>(inKeys); + Collections.sort(keys, EMOJI_KEY_COMPARATOR); + final int pageCount = (keys.size() - 1) / maxPageCount + 1; + final Key[][] retval = new Key[pageCount][maxPageCount]; + for (int i = 0; i < keys.size(); ++i) { + retval[i / maxPageCount][i % maxPageCount] = keys.get(i); + } + return retval; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java index e23131a30..43d62c71a 100644 --- a/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java @@ -14,34 +14,36 @@ * limitations under the License. */ -package com.android.inputmethod.keyboard; - -import com.android.inputmethod.latin.R; +package com.android.inputmethod.keyboard.emoji; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; -import android.widget.LinearLayout; +import android.view.View; -public class EmojiCategoryPageIndicatorView extends LinearLayout { - private static final float BOTTOM_MARGIN_RATIO = 0.66f; +public final class EmojiCategoryPageIndicatorView extends View { + private static final float BOTTOM_MARGIN_RATIO = 1.0f; private final Paint mPaint = new Paint(); private int mCategoryPageSize = 0; private int mCurrentCategoryPageId = 0; private float mOffset = 0.0f; - public EmojiCategoryPageIndicatorView(Context context) { - this(context, null /* attrs */); + public EmojiCategoryPageIndicatorView(final Context context, final AttributeSet attrs) { + this(context, attrs, 0); + } + + public EmojiCategoryPageIndicatorView(final Context context, final AttributeSet attrs, + final int defStyle) { + super(context, attrs, defStyle); } - public EmojiCategoryPageIndicatorView(Context context, AttributeSet attrs) { - super(context, attrs); - mPaint.setColor(context.getResources().getColor( - R.color.emoji_category_page_id_view_foreground)); + public void setColors(final int foregroundColor, final int backgroundColor) { + mPaint.setColor(foregroundColor); + setBackgroundColor(backgroundColor); } - public void setCategoryPageId(int size, int id, float offset) { + public void setCategoryPageId(final int size, final int id, final float offset) { mCategoryPageSize = size; mCurrentCategoryPageId = id; mOffset = offset; @@ -49,7 +51,7 @@ public class EmojiCategoryPageIndicatorView extends LinearLayout { } @Override - protected void onDraw(Canvas canvas) { + protected void onDraw(final Canvas canvas) { if (mCategoryPageSize <= 1) { // If the category is not set yet or contains only one category, // just clear and return. diff --git a/java/src/com/android/inputmethod/keyboard/EmojiLayoutParams.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java index 967448c28..582e09124 100644 --- a/java/src/com/android/inputmethod/keyboard/EmojiLayoutParams.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiLayoutParams.java @@ -14,17 +14,17 @@ * limitations under the License. */ -package com.android.inputmethod.keyboard; - -import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.ResourceUtils; +package com.android.inputmethod.keyboard.emoji; import android.content.res.Resources; import android.support.v4.view.ViewPager; -import android.widget.ImageView; +import android.view.View; import android.widget.LinearLayout; -public class EmojiLayoutParams { +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.utils.ResourceUtils; + +final class EmojiLayoutParams { private static final int DEFAULT_KEYBOARD_ROWS = 4; public final int mEmojiPagerHeight; @@ -37,22 +37,22 @@ public class EmojiLayoutParams { private final int mBottomPadding; private final int mTopPadding; - public EmojiLayoutParams(Resources res) { + public EmojiLayoutParams(final Resources res) { final int defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res); final int defaultKeyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res); - mKeyVerticalGap = (int) res.getFraction(R.fraction.key_bottom_gap_holo, - (int) defaultKeyboardHeight, (int) defaultKeyboardHeight); - mBottomPadding = (int) res.getFraction(R.fraction.keyboard_bottom_padding_holo, - (int) defaultKeyboardHeight, (int) defaultKeyboardHeight); - mTopPadding = (int) res.getFraction(R.fraction.keyboard_top_padding_holo, - (int) defaultKeyboardHeight, (int) defaultKeyboardHeight); - mKeyHorizontalGap = (int) (res.getFraction(R.fraction.key_horizontal_gap_holo, + mKeyVerticalGap = (int) res.getFraction(R.fraction.config_key_vertical_gap_holo, + defaultKeyboardHeight, defaultKeyboardHeight); + mBottomPadding = (int) res.getFraction(R.fraction.config_keyboard_bottom_padding_holo, + defaultKeyboardHeight, defaultKeyboardHeight); + mTopPadding = (int) res.getFraction(R.fraction.config_keyboard_top_padding_holo, + defaultKeyboardHeight, defaultKeyboardHeight); + mKeyHorizontalGap = (int) (res.getFraction(R.fraction.config_key_horizontal_gap_holo, defaultKeyboardWidth, defaultKeyboardWidth)); mEmojiCategoryPageIdViewHeight = - (int) (res.getDimension(R.dimen.emoji_category_page_id_height)); + (int) (res.getDimension(R.dimen.config_emoji_category_page_id_height)); final int baseheight = defaultKeyboardHeight - mBottomPadding - mTopPadding + mKeyVerticalGap; - mEmojiActionBarHeight = ((int) baseheight) / DEFAULT_KEYBOARD_ROWS + mEmojiActionBarHeight = baseheight / DEFAULT_KEYBOARD_ROWS - (mKeyVerticalGap - mBottomPadding) / 2; mEmojiPagerHeight = defaultKeyboardHeight - mEmojiActionBarHeight - mEmojiCategoryPageIdViewHeight; @@ -60,29 +60,33 @@ public class EmojiLayoutParams { mEmojiKeyboardHeight = mEmojiPagerHeight - mEmojiPagerBottomMargin - 1; } - public void setPagerProperties(ViewPager vp) { + public void setPagerProperties(final ViewPager vp) { final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vp.getLayoutParams(); lp.height = mEmojiKeyboardHeight; lp.bottomMargin = mEmojiPagerBottomMargin; vp.setLayoutParams(lp); } - public void setCategoryPageIdViewProperties(LinearLayout ll) { - final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) ll.getLayoutParams(); + public void setCategoryPageIdViewProperties(final View v) { + final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams(); lp.height = mEmojiCategoryPageIdViewHeight; - ll.setLayoutParams(lp); + v.setLayoutParams(lp); + } + + public int getActionBarHeight() { + return mEmojiActionBarHeight - mBottomPadding; } - public void setActionBarProperties(LinearLayout ll) { + public void setActionBarProperties(final LinearLayout ll) { final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) ll.getLayoutParams(); - lp.height = mEmojiActionBarHeight - mBottomPadding; + lp.height = getActionBarHeight(); ll.setLayoutParams(lp); } - public void setKeyProperties(ImageView ib) { - final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) ib.getLayoutParams(); + public void setKeyProperties(final View v) { + final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams(); lp.leftMargin = mKeyHorizontalGap / 2; lp.rightMargin = mKeyHorizontalGap / 2; - ib.setLayoutParams(lp); + v.setLayoutParams(lp); } } diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java new file mode 100644 index 000000000..17dfc9cce --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2013 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.emoji; + +import android.content.Context; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.accessibility.AccessibilityEvent; + +import com.android.inputmethod.accessibility.AccessibilityUtils; +import com.android.inputmethod.accessibility.KeyboardAccessibilityDelegate; +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.latin.R; + +/** + * This is an extended {@link KeyboardView} class that hosts an emoji page keyboard. + * Multi-touch unsupported. No gesture support. + */ +// TODO: Implement key popup preview. +final class EmojiPageKeyboardView extends KeyboardView implements + GestureDetector.OnGestureListener { + private static final long KEY_PRESS_DELAY_TIME = 250; // msec + private static final long KEY_RELEASE_DELAY_TIME = 30; // msec + + public interface OnKeyEventListener { + public void onPressKey(Key key); + public void onReleaseKey(Key key); + } + + private static final OnKeyEventListener EMPTY_LISTENER = new OnKeyEventListener() { + @Override + public void onPressKey(final Key key) {} + @Override + public void onReleaseKey(final Key key) {} + }; + + private OnKeyEventListener mListener = EMPTY_LISTENER; + private final KeyDetector mKeyDetector = new KeyDetector(); + private final GestureDetector mGestureDetector; + private KeyboardAccessibilityDelegate<EmojiPageKeyboardView> mAccessibilityDelegate; + + public EmojiPageKeyboardView(final Context context, final AttributeSet attrs) { + this(context, attrs, R.attr.keyboardViewStyle); + } + + public EmojiPageKeyboardView(final Context context, final AttributeSet attrs, + final int defStyle) { + super(context, attrs, defStyle); + mGestureDetector = new GestureDetector(context, this); + mGestureDetector.setIsLongpressEnabled(false /* isLongpressEnabled */); + mHandler = new Handler(); + } + + public void setOnKeyEventListener(final OnKeyEventListener listener) { + mListener = listener; + } + + /** + * {@inheritDoc} + */ + @Override + public void setKeyboard(final Keyboard keyboard) { + super.setKeyboard(keyboard); + mKeyDetector.setKeyboard(keyboard, 0 /* correctionX */, 0 /* correctionY */); + if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) { + if (mAccessibilityDelegate == null) { + mAccessibilityDelegate = new KeyboardAccessibilityDelegate<>(this, mKeyDetector); + } + mAccessibilityDelegate.setKeyboard(keyboard); + } else { + mAccessibilityDelegate = null; + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) { + // Don't populate accessibility event with all Emoji keys. + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onHoverEvent(final MotionEvent event) { + final KeyboardAccessibilityDelegate<EmojiPageKeyboardView> accessibilityDelegate = + mAccessibilityDelegate; + if (accessibilityDelegate != null) { + return accessibilityDelegate.onHoverEvent(event); + } + return super.onHoverEvent(event); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onTouchEvent(final MotionEvent e) { + if (mGestureDetector.onTouchEvent(e)) { + return true; + } + final Key key = getKey(e); + if (key != null && key != mCurrentKey) { + releaseCurrentKey(false /* withKeyRegistering */); + } + return true; + } + + // {@link GestureEnabler#OnGestureListener} methods. + private Key mCurrentKey; + private Runnable mPendingKeyDown; + private final Handler mHandler; + + private Key getKey(final MotionEvent e) { + final int index = e.getActionIndex(); + final int x = (int)e.getX(index); + final int y = (int)e.getY(index); + return mKeyDetector.detectHitKey(x, y); + } + + public void releaseCurrentKey(final boolean withKeyRegistering) { + mHandler.removeCallbacks(mPendingKeyDown); + mPendingKeyDown = null; + final Key currentKey = mCurrentKey; + if (currentKey == null) { + return; + } + currentKey.onReleased(); + invalidateKey(currentKey); + if (withKeyRegistering) { + mListener.onReleaseKey(currentKey); + } + mCurrentKey = null; + } + + @Override + public boolean onDown(final MotionEvent e) { + final Key key = getKey(e); + releaseCurrentKey(false /* withKeyRegistering */); + mCurrentKey = key; + if (key == null) { + return false; + } + // Do not trigger key-down effect right now in case this is actually a fling action. + mPendingKeyDown = new Runnable() { + @Override + public void run() { + mPendingKeyDown = null; + key.onPressed(); + invalidateKey(key); + mListener.onPressKey(key); + } + }; + mHandler.postDelayed(mPendingKeyDown, KEY_PRESS_DELAY_TIME); + return false; + } + + @Override + public void onShowPress(final MotionEvent e) { + // User feedback is done at {@link #onDown(MotionEvent)}. + } + + @Override + public boolean onSingleTapUp(final MotionEvent e) { + final Key key = getKey(e); + final Runnable pendingKeyDown = mPendingKeyDown; + final Key currentKey = mCurrentKey; + releaseCurrentKey(false /* withKeyRegistering */); + if (key == null) { + return false; + } + if (key == currentKey && pendingKeyDown != null) { + pendingKeyDown.run(); + // Trigger key-release event a little later so that a user can see visual feedback. + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + key.onReleased(); + invalidateKey(key); + mListener.onReleaseKey(key); + } + }, KEY_RELEASE_DELAY_TIME); + } else { + key.onReleased(); + invalidateKey(key); + mListener.onReleaseKey(key); + } + return true; + } + + @Override + public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, + final float distanceY) { + releaseCurrentKey(false /* withKeyRegistering */); + return false; + } + + @Override + public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, + final float velocityY) { + releaseCurrentKey(false /* withKeyRegistering */); + return false; + } + + @Override + public void onLongPress(final MotionEvent e) { + // Long press detection of {@link #mGestureDetector} is disabled and not used. + } +} diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java new file mode 100644 index 000000000..68056e0eb --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2014 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.emoji; + +import android.support.v4.view.PagerAdapter; +import android.util.Log; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.latin.R; + +final class EmojiPalettesAdapter extends PagerAdapter { + private static final String TAG = EmojiPalettesAdapter.class.getSimpleName(); + private static final boolean DEBUG_PAGER = false; + + private final EmojiPageKeyboardView.OnKeyEventListener mListener; + private final DynamicGridKeyboard mRecentsKeyboard; + private final SparseArray<EmojiPageKeyboardView> mActiveKeyboardViews = new SparseArray<>(); + private final EmojiCategory mEmojiCategory; + private int mActivePosition = 0; + + public EmojiPalettesAdapter(final EmojiCategory emojiCategory, + final EmojiPageKeyboardView.OnKeyEventListener listener) { + mEmojiCategory = emojiCategory; + mListener = listener; + mRecentsKeyboard = mEmojiCategory.getKeyboard(EmojiCategory.ID_RECENTS, 0); + } + + public void flushPendingRecentKeys() { + mRecentsKeyboard.flushPendingRecentKeys(); + final KeyboardView recentKeyboardView = + mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); + if (recentKeyboardView != null) { + recentKeyboardView.invalidateAllKeys(); + } + } + + public void addRecentKey(final Key key) { + if (mEmojiCategory.isInRecentTab()) { + mRecentsKeyboard.addPendingKey(key); + return; + } + mRecentsKeyboard.addKeyFirst(key); + final KeyboardView recentKeyboardView = + mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); + if (recentKeyboardView != null) { + recentKeyboardView.invalidateAllKeys(); + } + } + + public void onPageScrolled() { + releaseCurrentKey(false /* withKeyRegistering */); + } + + public void releaseCurrentKey(final boolean withKeyRegistering) { + // Make sure the delayed key-down event (highlight effect and haptic feedback) will be + // canceled. + final EmojiPageKeyboardView currentKeyboardView = + mActiveKeyboardViews.get(mActivePosition); + if (currentKeyboardView == null) { + return; + } + currentKeyboardView.releaseCurrentKey(withKeyRegistering); + } + + @Override + public int getCount() { + return mEmojiCategory.getTotalPageCountOfAllCategories(); + } + + @Override + public void setPrimaryItem(final ViewGroup container, final int position, + final Object object) { + if (mActivePosition == position) { + return; + } + final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition); + if (oldKeyboardView != null) { + oldKeyboardView.releaseCurrentKey(false /* withKeyRegistering */); + oldKeyboardView.deallocateMemory(); + } + mActivePosition = position; + } + + @Override + public Object instantiateItem(final ViewGroup container, final int position) { + if (DEBUG_PAGER) { + Log.d(TAG, "instantiate item: " + position); + } + final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(position); + if (oldKeyboardView != null) { + oldKeyboardView.deallocateMemory(); + // This may be redundant but wanted to be safer.. + mActiveKeyboardViews.remove(position); + } + final Keyboard keyboard = + mEmojiCategory.getKeyboardFromPagePosition(position); + final LayoutInflater inflater = LayoutInflater.from(container.getContext()); + final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView)inflater.inflate( + R.layout.emoji_keyboard_page, container, false /* attachToRoot */); + keyboardView.setKeyboard(keyboard); + keyboardView.setOnKeyEventListener(mListener); + container.addView(keyboardView); + mActiveKeyboardViews.put(position, keyboardView); + return keyboardView; + } + + @Override + public boolean isViewFromObject(final View view, final Object object) { + return view == object; + } + + @Override + public void destroyItem(final ViewGroup container, final int position, + final Object object) { + if (DEBUG_PAGER) { + Log.d(TAG, "destroy item: " + position + ", " + object.getClass().getSimpleName()); + } + final EmojiPageKeyboardView keyboardView = mActiveKeyboardViews.get(position); + if (keyboardView != null) { + keyboardView.deallocateMemory(); + mActiveKeyboardViews.remove(position); + } + if (object instanceof View) { + container.removeView((View)object); + } else { + Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java new file mode 100644 index 000000000..e37cd2369 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java @@ -0,0 +1,560 @@ +/* + * Copyright (C) 2013 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.emoji; + +import static com.android.inputmethod.latin.Constants.NOT_A_COORDINATE; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.os.CountDownTimer; +import android.preference.PreferenceManager; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.util.Pair; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TabHost; +import android.widget.TabHost.OnTabChangeListener; +import android.widget.TabWidget; +import android.widget.TextView; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyboardActionListener; +import com.android.inputmethod.keyboard.KeyboardLayoutSet; +import com.android.inputmethod.keyboard.KeyboardView; +import com.android.inputmethod.keyboard.internal.KeyDrawParams; +import com.android.inputmethod.keyboard.internal.KeyVisualAttributes; +import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; +import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.SubtypeSwitcher; +import com.android.inputmethod.latin.utils.ResourceUtils; + +import java.util.concurrent.TimeUnit; + +/** + * View class to implement Emoji palettes. + * The Emoji keyboard consists of group of views layout/emoji_palettes_view. + * <ol> + * <li> Emoji category tabs. + * <li> Delete button. + * <li> Emoji keyboard pages that can be scrolled by swiping horizontally or by selecting a tab. + * <li> Back to main keyboard button and enter button. + * </ol> + * Because of the above reasons, this class doesn't extend {@link KeyboardView}. + */ +public final class EmojiPalettesView extends LinearLayout implements OnTabChangeListener, + ViewPager.OnPageChangeListener, View.OnClickListener, View.OnTouchListener, + EmojiPageKeyboardView.OnKeyEventListener { + private final int mFunctionalKeyBackgroundId; + private final int mSpacebarBackgroundId; + private final boolean mCategoryIndicatorEnabled; + private final int mCategoryIndicatorDrawableResId; + private final int mCategoryIndicatorBackgroundResId; + private final int mCategoryPageIndicatorColor; + private final int mCategoryPageIndicatorBackground; + private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener; + private EmojiPalettesAdapter mEmojiPalettesAdapter; + private final EmojiLayoutParams mEmojiLayoutParams; + + private ImageButton mDeleteKey; + private TextView mAlphabetKeyLeft; + private TextView mAlphabetKeyRight; + private View mSpacebar; + // TODO: Remove this workaround. + private View mSpacebarIcon; + private TabHost mTabHost; + private ViewPager mEmojiPager; + private int mCurrentPagerPosition = 0; + private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView; + + private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; + + private final EmojiCategory mEmojiCategory; + + public EmojiPalettesView(final Context context, final AttributeSet attrs) { + this(context, attrs, R.attr.emojiPalettesViewStyle); + } + + public EmojiPalettesView(final Context context, final AttributeSet attrs, final int defStyle) { + super(context, attrs, defStyle); + final TypedArray keyboardViewAttr = context.obtainStyledAttributes(attrs, + R.styleable.KeyboardView, defStyle, R.style.KeyboardView); + final int keyBackgroundId = keyboardViewAttr.getResourceId( + R.styleable.KeyboardView_keyBackground, 0); + mFunctionalKeyBackgroundId = keyboardViewAttr.getResourceId( + R.styleable.KeyboardView_functionalKeyBackground, keyBackgroundId); + mSpacebarBackgroundId = keyboardViewAttr.getResourceId( + R.styleable.KeyboardView_spacebarBackground, keyBackgroundId); + keyboardViewAttr.recycle(); + final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( + context, null /* editorInfo */); + final Resources res = context.getResources(); + mEmojiLayoutParams = new EmojiLayoutParams(res); + builder.setSubtype(SubtypeSwitcher.getInstance().getEmojiSubtype()); + builder.setKeyboardGeometry(ResourceUtils.getDefaultKeyboardWidth(res), + mEmojiLayoutParams.mEmojiKeyboardHeight); + final KeyboardLayoutSet layoutSet = builder.build(); + final TypedArray emojiPalettesViewAttr = context.obtainStyledAttributes(attrs, + R.styleable.EmojiPalettesView, defStyle, R.style.EmojiPalettesView); + mEmojiCategory = new EmojiCategory(PreferenceManager.getDefaultSharedPreferences(context), + res, layoutSet, emojiPalettesViewAttr); + mCategoryIndicatorEnabled = emojiPalettesViewAttr.getBoolean( + R.styleable.EmojiPalettesView_categoryIndicatorEnabled, false); + mCategoryIndicatorDrawableResId = emojiPalettesViewAttr.getResourceId( + R.styleable.EmojiPalettesView_categoryIndicatorDrawable, 0); + mCategoryIndicatorBackgroundResId = emojiPalettesViewAttr.getResourceId( + R.styleable.EmojiPalettesView_categoryIndicatorBackground, 0); + mCategoryPageIndicatorColor = emojiPalettesViewAttr.getColor( + R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); + mCategoryPageIndicatorBackground = emojiPalettesViewAttr.getColor( + R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0); + emojiPalettesViewAttr.recycle(); + mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); + } + + @Override + protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final Resources res = getContext().getResources(); + // The main keyboard expands to the entire this {@link KeyboardView}. + final int width = ResourceUtils.getDefaultKeyboardWidth(res) + + getPaddingLeft() + getPaddingRight(); + final int height = ResourceUtils.getDefaultKeyboardHeight(res) + + res.getDimensionPixelSize(R.dimen.config_suggestions_strip_height) + + getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(width, height); + } + + private void addTab(final TabHost host, final int categoryId) { + final String tabId = mEmojiCategory.getCategoryName(categoryId, 0 /* categoryPageId */); + final TabHost.TabSpec tspec = host.newTabSpec(tabId); + tspec.setContent(R.id.emoji_keyboard_dummy); + final ImageView iconView = (ImageView)LayoutInflater.from(getContext()).inflate( + R.layout.emoji_keyboard_tab_icon, null); + iconView.setImageResource(mEmojiCategory.getCategoryTabIcon(categoryId)); + iconView.setContentDescription(mEmojiCategory.getAccessibilityDescription(categoryId)); + tspec.setIndicator(iconView); + host.addTab(tspec); + } + + @Override + protected void onFinishInflate() { + mTabHost = (TabHost)findViewById(R.id.emoji_category_tabhost); + mTabHost.setup(); + for (final EmojiCategory.CategoryProperties properties + : mEmojiCategory.getShownCategories()) { + addTab(mTabHost, properties.mCategoryId); + } + mTabHost.setOnTabChangedListener(this); + final TabWidget tabWidget = mTabHost.getTabWidget(); + tabWidget.setStripEnabled(mCategoryIndicatorEnabled); + if (mCategoryIndicatorEnabled) { + // On TabWidget's strip, what looks like an indicator is actually a background. + // And what looks like a background are actually left and right drawables. + tabWidget.setBackgroundResource(mCategoryIndicatorDrawableResId); + tabWidget.setLeftStripDrawable(mCategoryIndicatorBackgroundResId); + tabWidget.setRightStripDrawable(mCategoryIndicatorBackgroundResId); + } + + mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this); + + mEmojiPager = (ViewPager)findViewById(R.id.emoji_keyboard_pager); + mEmojiPager.setAdapter(mEmojiPalettesAdapter); + mEmojiPager.setOnPageChangeListener(this); + mEmojiPager.setOffscreenPageLimit(0); + mEmojiPager.setPersistentDrawingCache(PERSISTENT_NO_CACHE); + mEmojiLayoutParams.setPagerProperties(mEmojiPager); + + mEmojiCategoryPageIndicatorView = + (EmojiCategoryPageIndicatorView)findViewById(R.id.emoji_category_page_id_view); + mEmojiCategoryPageIndicatorView.setColors( + mCategoryPageIndicatorColor, mCategoryPageIndicatorBackground); + mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); + + setCurrentCategoryId(mEmojiCategory.getCurrentCategoryId(), true /* force */); + + final LinearLayout actionBar = (LinearLayout)findViewById(R.id.emoji_action_bar); + mEmojiLayoutParams.setActionBarProperties(actionBar); + + // deleteKey depends only on OnTouchListener. + mDeleteKey = (ImageButton)findViewById(R.id.emoji_keyboard_delete); + mDeleteKey.setBackgroundResource(mFunctionalKeyBackgroundId); + mDeleteKey.setTag(Constants.CODE_DELETE); + mDeleteKey.setOnTouchListener(mDeleteKeyOnTouchListener); + + // {@link #mAlphabetKeyLeft}, {@link #mAlphabetKeyRight, and spaceKey depend on + // {@link View.OnClickListener} as well as {@link View.OnTouchListener}. + // {@link View.OnTouchListener} is used as the trigger of key-press, while + // {@link View.OnClickListener} is used as the trigger of key-release which does not occur + // if the event is canceled by moving off the finger from the view. + // The text on alphabet keys are set at + // {@link #startEmojiPalettes(String,int,float,Typeface)}. + mAlphabetKeyLeft = (TextView)findViewById(R.id.emoji_keyboard_alphabet_left); + mAlphabetKeyLeft.setBackgroundResource(mFunctionalKeyBackgroundId); + mAlphabetKeyLeft.setTag(Constants.CODE_ALPHA_FROM_EMOJI); + mAlphabetKeyLeft.setOnTouchListener(this); + mAlphabetKeyLeft.setOnClickListener(this); + mAlphabetKeyRight = (TextView)findViewById(R.id.emoji_keyboard_alphabet_right); + mAlphabetKeyRight.setBackgroundResource(mFunctionalKeyBackgroundId); + mAlphabetKeyRight.setTag(Constants.CODE_ALPHA_FROM_EMOJI); + mAlphabetKeyRight.setOnTouchListener(this); + mAlphabetKeyRight.setOnClickListener(this); + mSpacebar = findViewById(R.id.emoji_keyboard_space); + mSpacebar.setBackgroundResource(mSpacebarBackgroundId); + mSpacebar.setTag(Constants.CODE_SPACE); + mSpacebar.setOnTouchListener(this); + mSpacebar.setOnClickListener(this); + mEmojiLayoutParams.setKeyProperties(mSpacebar); + mSpacebarIcon = findViewById(R.id.emoji_keyboard_space_icon); + } + + @Override + public boolean dispatchTouchEvent(final MotionEvent ev) { + // Add here to the stack trace to nail down the {@link IllegalArgumentException} exception + // in MotionEvent that sporadically happens. + // TODO: Remove this override method once the issue has been addressed. + return super.dispatchTouchEvent(ev); + } + + @Override + public void onTabChanged(final String tabId) { + AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback( + Constants.CODE_UNSPECIFIED, this); + final int categoryId = mEmojiCategory.getCategoryId(tabId); + setCurrentCategoryId(categoryId, false /* force */); + updateEmojiCategoryPageIdView(); + } + + @Override + public void onPageSelected(final int position) { + final Pair<Integer, Integer> newPos = + mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position); + setCurrentCategoryId(newPos.first /* categoryId */, false /* force */); + mEmojiCategory.setCurrentCategoryPageId(newPos.second /* categoryPageId */); + updateEmojiCategoryPageIdView(); + mCurrentPagerPosition = position; + } + + @Override + public void onPageScrollStateChanged(final int state) { + // Ignore this message. Only want the actual page selected. + } + + @Override + public void onPageScrolled(final int position, final float positionOffset, + final int positionOffsetPixels) { + mEmojiPalettesAdapter.onPageScrolled(); + final Pair<Integer, Integer> newPos = + mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position); + final int newCategoryId = newPos.first; + final int newCategorySize = mEmojiCategory.getCategoryPageSize(newCategoryId); + final int currentCategoryId = mEmojiCategory.getCurrentCategoryId(); + final int currentCategoryPageId = mEmojiCategory.getCurrentCategoryPageId(); + final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageSize(); + if (newCategoryId == currentCategoryId) { + mEmojiCategoryPageIndicatorView.setCategoryPageId( + newCategorySize, newPos.second, positionOffset); + } else if (newCategoryId > currentCategoryId) { + mEmojiCategoryPageIndicatorView.setCategoryPageId( + currentCategorySize, currentCategoryPageId, positionOffset); + } else if (newCategoryId < currentCategoryId) { + mEmojiCategoryPageIndicatorView.setCategoryPageId( + currentCategorySize, currentCategoryPageId, positionOffset - 1); + } + } + + /** + * Called from {@link EmojiPageKeyboardView} through {@link android.view.View.OnTouchListener} + * interface to handle touch events from View-based elements such as the space bar. + * Note that this method is used only for observing {@link MotionEvent#ACTION_DOWN} to trigger + * {@link KeyboardActionListener#onPressKey}. {@link KeyboardActionListener#onReleaseKey} will + * be covered by {@link #onClick} as long as the event is not canceled. + */ + @Override + public boolean onTouch(final View v, final MotionEvent event) { + if (event.getActionMasked() != MotionEvent.ACTION_DOWN) { + return false; + } + final Object tag = v.getTag(); + if (!(tag instanceof Integer)) { + return false; + } + final int code = (Integer) tag; + mKeyboardActionListener.onPressKey( + code, 0 /* repeatCount */, true /* isSinglePointer */); + // It's important to return false here. Otherwise, {@link #onClick} and touch-down visual + // feedback stop working. + return false; + } + + /** + * Called from {@link EmojiPageKeyboardView} through {@link android.view.View.OnClickListener} + * interface to handle non-canceled touch-up events from View-based elements such as the space + * bar. + */ + @Override + public void onClick(View v) { + final Object tag = v.getTag(); + if (!(tag instanceof Integer)) { + return; + } + final int code = (Integer) tag; + mKeyboardActionListener.onCodeInput(code, NOT_A_COORDINATE, NOT_A_COORDINATE, + false /* isKeyRepeat */); + mKeyboardActionListener.onReleaseKey(code, false /* withSliding */); + } + + /** + * Called from {@link EmojiPageKeyboardView} through + * {@link com.android.inputmethod.keyboard.emoji.EmojiPageKeyboardView.OnKeyEventListener} + * interface to handle touch events from non-View-based elements such as Emoji buttons. + */ + @Override + public void onPressKey(final Key key) { + final int code = key.getCode(); + mKeyboardActionListener.onPressKey(code, 0 /* repeatCount */, true /* isSinglePointer */); + } + + /** + * Called from {@link EmojiPageKeyboardView} through + * {@link com.android.inputmethod.keyboard.emoji.EmojiPageKeyboardView.OnKeyEventListener} + * interface to handle touch events from non-View-based elements such as Emoji buttons. + */ + @Override + public void onReleaseKey(final Key key) { + mEmojiPalettesAdapter.addRecentKey(key); + mEmojiCategory.saveLastTypedCategoryPage(); + final int code = key.getCode(); + if (code == Constants.CODE_OUTPUT_TEXT) { + mKeyboardActionListener.onTextInput(key.getOutputText()); + } else { + mKeyboardActionListener.onCodeInput(code, NOT_A_COORDINATE, NOT_A_COORDINATE, + false /* isKeyRepeat */); + } + mKeyboardActionListener.onReleaseKey(code, false /* withSliding */); + } + + public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) { + if (!enabled) return; + // TODO: Should use LAYER_TYPE_SOFTWARE when hardware acceleration is off? + setLayerType(LAYER_TYPE_HARDWARE, null); + } + + private static void setupAlphabetKey(final TextView alphabetKey, final String label, + final KeyDrawParams params) { + alphabetKey.setText(label); + alphabetKey.setTextColor(params.mFunctionalTextColor); + alphabetKey.setTextSize(TypedValue.COMPLEX_UNIT_PX, params.mLabelSize); + alphabetKey.setTypeface(params.mTypeface); + } + + public void startEmojiPalettes(final String switchToAlphaLabel, + final KeyVisualAttributes keyVisualAttr, final KeyboardIconsSet iconSet) { + final int deleteIconResId = iconSet.getIconResourceId(KeyboardIconsSet.NAME_DELETE_KEY); + if (deleteIconResId != 0) { + mDeleteKey.setImageResource(deleteIconResId); + } + final int spacebarResId = iconSet.getIconResourceId(KeyboardIconsSet.NAME_SPACE_KEY); + if (spacebarResId != 0) { + // TODO: Remove this workaround to place the spacebar icon. + mSpacebarIcon.setBackgroundResource(spacebarResId); + } + final KeyDrawParams params = new KeyDrawParams(); + params.updateParams(mEmojiLayoutParams.getActionBarHeight(), keyVisualAttr); + setupAlphabetKey(mAlphabetKeyLeft, switchToAlphaLabel, params); + setupAlphabetKey(mAlphabetKeyRight, switchToAlphaLabel, params); + mEmojiPager.setAdapter(mEmojiPalettesAdapter); + mEmojiPager.setCurrentItem(mCurrentPagerPosition); + } + + public void stopEmojiPalettes() { + mEmojiPalettesAdapter.releaseCurrentKey(true /* withKeyRegistering */); + mEmojiPalettesAdapter.flushPendingRecentKeys(); + mEmojiPager.setAdapter(null); + } + + public void setKeyboardActionListener(final KeyboardActionListener listener) { + mKeyboardActionListener = listener; + mDeleteKeyOnTouchListener.setKeyboardActionListener(mKeyboardActionListener); + } + + private void updateEmojiCategoryPageIdView() { + if (mEmojiCategoryPageIndicatorView == null) { + return; + } + mEmojiCategoryPageIndicatorView.setCategoryPageId( + mEmojiCategory.getCurrentCategoryPageSize(), + mEmojiCategory.getCurrentCategoryPageId(), 0.0f /* offset */); + } + + private void setCurrentCategoryId(final int categoryId, final boolean force) { + final int oldCategoryId = mEmojiCategory.getCurrentCategoryId(); + if (oldCategoryId == categoryId && !force) { + return; + } + + if (oldCategoryId == EmojiCategory.ID_RECENTS) { + // Needs to save pending updates for recent keys when we get out of the recents + // category because we don't want to move the recent emojis around while the user + // is in the recents category. + mEmojiPalettesAdapter.flushPendingRecentKeys(); + } + + mEmojiCategory.setCurrentCategoryId(categoryId); + final int newTabId = mEmojiCategory.getTabIdFromCategoryId(categoryId); + final int newCategoryPageId = mEmojiCategory.getPageIdFromCategoryId(categoryId); + if (force || mEmojiCategory.getCategoryIdAndPageIdFromPagePosition( + mEmojiPager.getCurrentItem()).first != categoryId) { + mEmojiPager.setCurrentItem(newCategoryPageId, false /* smoothScroll */); + } + if (force || mTabHost.getCurrentTab() != newTabId) { + mTabHost.setCurrentTab(newTabId); + } + } + + private static class DeleteKeyOnTouchListener implements OnTouchListener { + static final long MAX_REPEAT_COUNT_TIME = TimeUnit.SECONDS.toMillis(30); + final long mKeyRepeatStartTimeout; + final long mKeyRepeatInterval; + + public DeleteKeyOnTouchListener(Context context) { + final Resources res = context.getResources(); + mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); + mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); + mTimer = new CountDownTimer(MAX_REPEAT_COUNT_TIME, mKeyRepeatInterval) { + @Override + public void onTick(long millisUntilFinished) { + final long elapsed = MAX_REPEAT_COUNT_TIME - millisUntilFinished; + if (elapsed < mKeyRepeatStartTimeout) { + return; + } + onKeyRepeat(); + } + @Override + public void onFinish() { + onKeyRepeat(); + } + }; + } + + /** Key-repeat state. */ + private static final int KEY_REPEAT_STATE_INITIALIZED = 0; + // The key is touched but auto key-repeat is not started yet. + private static final int KEY_REPEAT_STATE_KEY_DOWN = 1; + // At least one key-repeat event has already been triggered and the key is not released. + private static final int KEY_REPEAT_STATE_KEY_REPEAT = 2; + + private KeyboardActionListener mKeyboardActionListener = + KeyboardActionListener.EMPTY_LISTENER; + + // TODO: Do the same things done in PointerTracker + private final CountDownTimer mTimer; + private int mState = KEY_REPEAT_STATE_INITIALIZED; + private int mRepeatCount = 0; + + public void setKeyboardActionListener(final KeyboardActionListener listener) { + mKeyboardActionListener = listener; + } + + @Override + public boolean onTouch(final View v, final MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + onTouchDown(v); + return true; + case MotionEvent.ACTION_MOVE: + final float x = event.getX(); + final float y = event.getY(); + if (x < 0.0f || v.getWidth() < x || y < 0.0f || v.getHeight() < y) { + // Stop generating key events once the finger moves away from the view area. + onTouchCanceled(v); + } + return true; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + onTouchUp(v); + return true; + } + return false; + } + + private void handleKeyDown() { + mKeyboardActionListener.onPressKey( + Constants.CODE_DELETE, mRepeatCount, true /* isSinglePointer */); + } + + private void handleKeyUp() { + mKeyboardActionListener.onCodeInput(Constants.CODE_DELETE, + NOT_A_COORDINATE, NOT_A_COORDINATE, false /* isKeyRepeat */); + mKeyboardActionListener.onReleaseKey( + Constants.CODE_DELETE, false /* withSliding */); + ++mRepeatCount; + } + + private void onTouchDown(final View v) { + mTimer.cancel(); + mRepeatCount = 0; + handleKeyDown(); + v.setPressed(true /* pressed */); + mState = KEY_REPEAT_STATE_KEY_DOWN; + mTimer.start(); + } + + private void onTouchUp(final View v) { + mTimer.cancel(); + if (mState == KEY_REPEAT_STATE_KEY_DOWN) { + handleKeyUp(); + } + v.setPressed(false /* pressed */); + mState = KEY_REPEAT_STATE_INITIALIZED; + } + + private void onTouchCanceled(final View v) { + mTimer.cancel(); + v.setBackgroundColor(Color.TRANSPARENT); + mState = KEY_REPEAT_STATE_INITIALIZED; + } + + // Called by {@link #mTimer} in the UI thread as an auto key-repeat signal. + void onKeyRepeat() { + switch (mState) { + case KEY_REPEAT_STATE_INITIALIZED: + // Basically this should not happen. + break; + case KEY_REPEAT_STATE_KEY_DOWN: + // Do not call {@link #handleKeyDown} here because it has already been called + // in {@link #onTouchDown}. + handleKeyUp(); + mState = KEY_REPEAT_STATE_KEY_REPEAT; + break; + case KEY_REPEAT_STATE_KEY_REPEAT: + handleKeyDown(); + handleKeyUp(); + break; + } + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java index b814fc162..a194f3dfd 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java +++ b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java @@ -22,36 +22,50 @@ import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; /** - * Abstract base class for previews that are drawn on PreviewPlacerView, e.g., - * GestureFloatingPrevewText, GestureTrail, and SlidingKeyInputPreview. + * Abstract base class for previews that are drawn on DrawingPreviewPlacerView, e.g., + * GestureFloatingTextDrawingPreview, GestureTrailsDrawingPreview, and + * SlidingKeyInputDrawingPreview. */ public abstract class AbstractDrawingPreview { - private final View mDrawingView; + private View mDrawingView; private boolean mPreviewEnabled; + private boolean mHasValidGeometry; - protected AbstractDrawingPreview(final View drawingView) { + public void setDrawingView(final DrawingPreviewPlacerView drawingView) { mDrawingView = drawingView; + drawingView.addPreview(this); } - public final View getDrawingView() { - return mDrawingView; + protected void invalidateDrawingView() { + if (mDrawingView != null) { + mDrawingView.invalidate(); + } } - public final void setPreviewEnabled(final boolean enabled) { - mPreviewEnabled = enabled; + protected final boolean isPreviewEnabled() { + return mPreviewEnabled && mHasValidGeometry; } - public boolean isPreviewEnabled() { - return mPreviewEnabled; + public final void setPreviewEnabled(final boolean enabled) { + mPreviewEnabled = enabled; } - public void setKeyboardGeometry(final int[] originCoords, final int width, final int height) { - // Default implementation is empty. + /** + * Set {@link MainKeyboardView} geometry and position in the {@link SoftInputWindow}. + * The class that is overriding this method must call this super implementation. + * + * @param originCoords the top-left coordinates of the {@link MainKeyboardView} in + * {@link SoftInputWindow} coordinate-system. This is unused but has a point in an + * extended class, such as {@link GestureTrailsDrawingPreview}. + * @param width the width of {@link MainKeyboardView}. + * @param height the height of {@link MainKeyboardView}. + */ + public void setKeyboardViewGeometry(final int[] originCoords, final int width, + final int height) { + mHasValidGeometry = (width > 0 && height > 0); } - public void onDetachFromWindow() { - // Default implementation is empty. - } + public abstract void onDeallocateMemory(); /** * Draws the preview diff --git a/java/src/com/android/inputmethod/keyboard/internal/BatchInputArbiter.java b/java/src/com/android/inputmethod/keyboard/internal/BatchInputArbiter.java new file mode 100644 index 000000000..cd9875955 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/BatchInputArbiter.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.InputPointers; + +/** + * This class arbitrates batch input. + * An instance of this class holds a {@link GestureStrokeRecognitionPoints}. + * And it arbitrates multiple strokes gestured by multiple fingers and aggregates those gesture + * points into one batch input. + */ +public class BatchInputArbiter { + public interface BatchInputArbiterListener { + public void onStartBatchInput(); + public void onUpdateBatchInput( + final InputPointers aggregatedPointers, final long moveEventTime); + public void onStartUpdateBatchInputTimer(); + public void onEndBatchInput(final InputPointers aggregatedPointers, final long upEventTime); + } + + // The starting time of the first stroke of a gesture input. + private static long sGestureFirstDownTime; + // The {@link InputPointers} that includes all events of a gesture input. + private static final InputPointers sAggregatedPointers = new InputPointers( + Constants.DEFAULT_GESTURE_POINTS_CAPACITY); + private static int sLastRecognitionPointSize = 0; // synchronized using sAggregatedPointers + private static long sLastRecognitionTime = 0; // synchronized using sAggregatedPointers + + private final GestureStrokeRecognitionPoints mRecognitionPoints; + + public BatchInputArbiter(final int pointerId, final GestureStrokeRecognitionParams params) { + mRecognitionPoints = new GestureStrokeRecognitionPoints(pointerId, params); + } + + public void setKeyboardGeometry(final int keyWidth, final int keyboardHeight) { + mRecognitionPoints.setKeyboardGeometry(keyWidth, keyboardHeight); + } + + /** + * Calculate elapsed time since the first gesture down. + * @param eventTime the time of this event. + * @return the elapsed time in millisecond from the first gesture down. + */ + public int getElapsedTimeSinceFirstDown(final long eventTime) { + return (int)(eventTime - sGestureFirstDownTime); + } + + /** + * Add a down event point. + * @param x the x-coordinate of this down event. + * @param y the y-coordinate of this down event. + * @param downEventTime the time of this down event. + * @param lastLetterTypingTime the last typing input time. + * @param activePointerCount the number of active pointers when this pointer down event occurs. + */ + public void addDownEventPoint(final int x, final int y, final long downEventTime, + final long lastLetterTypingTime, final int activePointerCount) { + if (activePointerCount == 1) { + sGestureFirstDownTime = downEventTime; + } + final int elapsedTimeSinceFirstDown = getElapsedTimeSinceFirstDown(downEventTime); + final int elapsedTimeSinceLastTyping = (int)(downEventTime - lastLetterTypingTime); + mRecognitionPoints.addDownEventPoint( + x, y, elapsedTimeSinceFirstDown, elapsedTimeSinceLastTyping); + } + + /** + * Add a move event point. + * @param x the x-coordinate of this move event. + * @param y the y-coordinate of this move event. + * @param moveEventTime the time of this move event. + * @param isMajorEvent false if this is a historical move event. + * @param listener {@link BatchInputArbiterListener#onStartUpdateBatchInputTimer()} of this + * <code>listener</code> may be called if enough move points have been added. + * @return true if this move event occurs on the valid gesture area. + */ + public boolean addMoveEventPoint(final int x, final int y, final long moveEventTime, + final boolean isMajorEvent, final BatchInputArbiterListener listener) { + final int beforeLength = mRecognitionPoints.getLength(); + final boolean onValidArea = mRecognitionPoints.addEventPoint( + x, y, getElapsedTimeSinceFirstDown(moveEventTime), isMajorEvent); + if (mRecognitionPoints.getLength() > beforeLength) { + listener.onStartUpdateBatchInputTimer(); + } + return onValidArea; + } + + /** + * Determine whether the batch input has started or not. + * @param listener {@link BatchInputArbiterListener#onStartBatchInput()} of this + * <code>listener</code> will be called when the batch input has started successfully. + * @return true if the batch input has started successfully. + */ + public boolean mayStartBatchInput(final BatchInputArbiterListener listener) { + if (!mRecognitionPoints.isStartOfAGesture()) { + return false; + } + synchronized (sAggregatedPointers) { + sAggregatedPointers.reset(); + sLastRecognitionPointSize = 0; + sLastRecognitionTime = 0; + listener.onStartBatchInput(); + } + return true; + } + + /** + * Add synthetic move event point. After adding the point, + * {@link #updateBatchInput(long,BatchInputArbiterListener)} will be called internally. + * @param syntheticMoveEventTime the synthetic move event time. + * @param listener the listener to be passed to + * {@link #updateBatchInput(long,BatchInputArbiterListener)}. + */ + public void updateBatchInputByTimer(final long syntheticMoveEventTime, + final BatchInputArbiterListener listener) { + mRecognitionPoints.duplicateLastPointWith( + getElapsedTimeSinceFirstDown(syntheticMoveEventTime)); + updateBatchInput(syntheticMoveEventTime, listener); + } + + /** + * Determine whether we have enough gesture points to lookup dictionary. + * @param moveEventTime the time of this move event. + * @param listener {@link BatchInputArbiterListener#onUpdateBatchInput(InputPointers,long)} of + * this <code>listener</code> will be called when enough event points we have. Also + * {@link BatchInputArbiterListener#onStartUpdateBatchInputTimer()} will be called to have + * possible future synthetic move event. + */ + public void updateBatchInput(final long moveEventTime, + final BatchInputArbiterListener listener) { + synchronized (sAggregatedPointers) { + mRecognitionPoints.appendIncrementalBatchPoints(sAggregatedPointers); + final int size = sAggregatedPointers.getPointerSize(); + if (size > sLastRecognitionPointSize && mRecognitionPoints.hasRecognitionTimePast( + moveEventTime, sLastRecognitionTime)) { + listener.onUpdateBatchInput(sAggregatedPointers, moveEventTime); + listener.onStartUpdateBatchInputTimer(); + // The listener may change the size of the pointers (when auto-committing + // for example), so we need to get the size from the pointers again. + sLastRecognitionPointSize = sAggregatedPointers.getPointerSize(); + sLastRecognitionTime = moveEventTime; + } + } + } + + /** + * Determine whether the batch input has ended successfully or continues. + * @param upEventTime the time of this up event. + * @param activePointerCount the number of active pointers when this pointer up event occurs. + * @param listener {@link BatchInputArbiterListener#onEndBatchInput(InputPointers,long)} of this + * <code>listener</code> will be called when the batch input has started successfully. + * @return true if the batch input has ended successfully. + */ + public boolean mayEndBatchInput(final long upEventTime, final int activePointerCount, + final BatchInputArbiterListener listener) { + synchronized (sAggregatedPointers) { + mRecognitionPoints.appendAllBatchPoints(sAggregatedPointers); + if (activePointerCount == 1) { + listener.onEndBatchInput(sAggregatedPointers, upEventTime); + return true; + } + } + return false; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/BogusMoveEventDetector.java b/java/src/com/android/inputmethod/keyboard/internal/BogusMoveEventDetector.java new file mode 100644 index 000000000..e0589fc97 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/BogusMoveEventDetector.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.Log; + +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.R; + +// This hack is applied to certain classes of tablets. +public final class BogusMoveEventDetector { + private static final String TAG = BogusMoveEventDetector.class.getSimpleName(); + private static final boolean DEBUG_MODE = LatinImeLogger.sDBG; + + // Move these thresholds to resource. + // These thresholds' unit is a diagonal length of a key. + private static final float BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD = 0.53f; + private static final float BOGUS_MOVE_RADIUS_THRESHOLD = 1.14f; + + private static boolean sNeedsProximateBogusDownMoveUpEventHack; + + public static void init(final Resources res) { + // The proximate bogus down move up event hack is needed for a device such like, + // 1) is large tablet, or 2) is small tablet and the screen density is less than hdpi. + // Though it seems odd to use screen density as criteria of the quality of the touch + // screen, the small table that has a less density screen than hdpi most likely has been + // made with the touch screen that needs the hack. + final int screenMetrics = res.getInteger(R.integer.config_screen_metrics); + final boolean isLargeTablet = (screenMetrics == Constants.SCREEN_METRICS_LARGE_TABLET); + final boolean isSmallTablet = (screenMetrics == Constants.SCREEN_METRICS_SMALL_TABLET); + final int densityDpi = res.getDisplayMetrics().densityDpi; + final boolean hasLowDensityScreen = (densityDpi < DisplayMetrics.DENSITY_HIGH); + final boolean needsTheHack = isLargeTablet || (isSmallTablet && hasLowDensityScreen); + if (DEBUG_MODE) { + final int sw = res.getConfiguration().smallestScreenWidthDp; + Log.d(TAG, "needsProximateBogusDownMoveUpEventHack=" + needsTheHack + + " smallestScreenWidthDp=" + sw + " densityDpi=" + densityDpi + + " screenMetrics=" + screenMetrics); + } + sNeedsProximateBogusDownMoveUpEventHack = needsTheHack; + } + + private int mAccumulatedDistanceThreshold; + private int mRadiusThreshold; + + // Accumulated distance from actual and artificial down keys. + /* package */ int mAccumulatedDistanceFromDownKey; + private int mActualDownX; + private int mActualDownY; + + public void setKeyboardGeometry(final int keyWidth, final int keyHeight) { + final float keyDiagonal = (float)Math.hypot(keyWidth, keyHeight); + mAccumulatedDistanceThreshold = (int)( + keyDiagonal * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD); + mRadiusThreshold = (int)(keyDiagonal * BOGUS_MOVE_RADIUS_THRESHOLD); + } + + public void onActualDownEvent(final int x, final int y) { + mActualDownX = x; + mActualDownY = y; + } + + public void onDownKey() { + mAccumulatedDistanceFromDownKey = 0; + } + + public void onMoveKey(final int distance) { + mAccumulatedDistanceFromDownKey += distance; + } + + public boolean hasTraveledLongDistance(final int x, final int y) { + if (!sNeedsProximateBogusDownMoveUpEventHack) { + return false; + } + final int dx = Math.abs(x - mActualDownX); + final int dy = Math.abs(y - mActualDownY); + // A bogus move event should be a horizontal movement. A vertical movement might be + // a sloppy typing and should be ignored. + return dx >= dy && mAccumulatedDistanceFromDownKey >= mAccumulatedDistanceThreshold; + } + + public int getAccumulatedDistanceFromDownKey() { + return mAccumulatedDistanceFromDownKey; + } + + public int getDistanceFromDownEvent(final int x, final int y) { + return getDistance(x, y, mActualDownX, mActualDownY); + } + + private static int getDistance(final int x1, final int y1, final int x2, final int y2) { + return (int)Math.hypot(x1 - x2, y1 - y2); + } + + public boolean isCloseToActualDownEvent(final int x, final int y) { + return sNeedsProximateBogusDownMoveUpEventHack + && getDistanceFromDownEvent(x, y) < mRadiusThreshold; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/CodesArrayParser.java b/java/src/com/android/inputmethod/keyboard/internal/CodesArrayParser.java index 4ccecb2f0..dce7fc57e 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/CodesArrayParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/CodesArrayParser.java @@ -17,6 +17,7 @@ package com.android.inputmethod.keyboard.internal; import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.utils.StringUtils; import android.text.TextUtils; @@ -29,15 +30,16 @@ import android.text.TextUtils; * marker. An output text may consist of multiple code points separated by comma. * The format of the codesArray element should be: * <pre> - * codePointInHex[,codePoint2InHex]*(|outputTextCodePointInHex[,outputTextCodePoint2InHex]*)? + * label1[,label2]*(|outputText1[,outputText2]*(|minSupportSdkVersion)?)? * </pre> */ // TODO: Write unit tests for this class. public final class CodesArrayParser { // Constants for parsing. - private static final char COMMA = ','; - private static final String VERTICAL_BAR_STRING = "\\|"; - private static final String COMMA_STRING = ","; + private static final char COMMA = Constants.CODE_COMMA; + private static final String COMMA_REGEX = StringUtils.newSingleCodePointString(COMMA); + private static final String VERTICAL_BAR_REGEX = // "\\|" + new String(new char[] { Constants.CODE_BACKSLASH, Constants.CODE_VERTICAL_BAR }); private static final int BASE_HEX = 16; private CodesArrayParser() { @@ -45,7 +47,7 @@ public final class CodesArrayParser { } private static String getLabelSpec(final String codesArraySpec) { - final String[] strs = codesArraySpec.split(VERTICAL_BAR_STRING, -1); + final String[] strs = codesArraySpec.split(VERTICAL_BAR_REGEX, -1); if (strs.length <= 1) { return codesArraySpec; } @@ -55,7 +57,7 @@ public final class CodesArrayParser { public static String parseLabel(final String codesArraySpec) { final String labelSpec = getLabelSpec(codesArraySpec); final StringBuilder sb = new StringBuilder(); - for (final String codeInHex : labelSpec.split(COMMA_STRING)) { + for (final String codeInHex : labelSpec.split(COMMA_REGEX)) { final int codePoint = Integer.parseInt(codeInHex, BASE_HEX); sb.appendCodePoint(codePoint); } @@ -63,17 +65,15 @@ public final class CodesArrayParser { } private static String getCodeSpec(final String codesArraySpec) { - final String[] strs = codesArraySpec.split(VERTICAL_BAR_STRING, -1); + final String[] strs = codesArraySpec.split(VERTICAL_BAR_REGEX, -1); if (strs.length <= 1) { return codesArraySpec; } return TextUtils.isEmpty(strs[1]) ? strs[0] : strs[1]; } - // codesArraySpec consists of: - // <label>|<code0>,<code1>,...|<minSupportSdkVersion> public static int getMinSupportSdkVersion(final String codesArraySpec) { - final String[] strs = codesArraySpec.split(VERTICAL_BAR_STRING, -1); + final String[] strs = codesArraySpec.split(VERTICAL_BAR_REGEX, -1); if (strs.length <= 2) { return 0; } @@ -98,7 +98,7 @@ public final class CodesArrayParser { return null; } final StringBuilder sb = new StringBuilder(); - for (final String codeInHex : codeSpec.split(COMMA_STRING)) { + for (final String codeInHex : codeSpec.split(COMMA_REGEX)) { final int codePoint = Integer.parseInt(codeInHex, BASE_HEX); sb.appendCodePoint(codePoint); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/DrawingHandler.java b/java/src/com/android/inputmethod/keyboard/internal/DrawingHandler.java new file mode 100644 index 000000000..df82becae --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/DrawingHandler.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.os.Message; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.internal.DrawingHandler.Callbacks; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; + +// TODO: Separate this class into KeyPreviewHandler and BatchInputPreviewHandler or so. +public class DrawingHandler extends LeakGuardHandlerWrapper<Callbacks> { + public interface Callbacks { + public void dismissKeyPreviewWithoutDelay(Key key); + public void dismissAllKeyPreviews(); + public void showGestureFloatingPreviewText(SuggestedWords suggestedWords); + } + + private static final int MSG_DISMISS_KEY_PREVIEW = 0; + private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1; + + public DrawingHandler(final Callbacks ownerInstance) { + super(ownerInstance); + } + + @Override + public void handleMessage(final Message msg) { + final Callbacks callbacks = getOwnerInstance(); + if (callbacks == null) { + return; + } + switch (msg.what) { + case MSG_DISMISS_KEY_PREVIEW: + callbacks.dismissKeyPreviewWithoutDelay((Key)msg.obj); + break; + case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT: + callbacks.showGestureFloatingPreviewText(SuggestedWords.EMPTY); + break; + } + } + + public void dismissKeyPreview(final long delay, final Key key) { + sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, key), delay); + } + + private void cancelAllDismissKeyPreviews() { + removeMessages(MSG_DISMISS_KEY_PREVIEW); + final Callbacks callbacks = getOwnerInstance(); + if (callbacks == null) { + return; + } + callbacks.dismissAllKeyPreviews(); + } + + public void dismissGestureFloatingPreviewText(final long delay) { + sendMessageDelayed(obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT), delay); + } + + public void cancelAllMessages() { + cancelAllDismissKeyPreviews(); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java index 4c8607da8..a5d47adb3 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java +++ b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java @@ -24,17 +24,16 @@ import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; import android.widget.RelativeLayout; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; import java.util.ArrayList; -public final class PreviewPlacerView extends RelativeLayout { +public final class DrawingPreviewPlacerView extends RelativeLayout { private final int[] mKeyboardViewOrigin = CoordinateUtils.newInstance(); - private final ArrayList<AbstractDrawingPreview> mPreviews = CollectionUtils.newArrayList(); + private final ArrayList<AbstractDrawingPreview> mPreviews = new ArrayList<>(); - public PreviewPlacerView(final Context context, final AttributeSet attrs) { + public DrawingPreviewPlacerView(final Context context, final AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); } @@ -47,7 +46,9 @@ public final class PreviewPlacerView extends RelativeLayout { } public void addPreview(final AbstractDrawingPreview preview) { - mPreviews.add(preview); + if (mPreviews.indexOf(preview) < 0) { + mPreviews.add(preview); + } } public void setKeyboardViewGeometry(final int[] originCoords, final int width, @@ -55,20 +56,24 @@ public final class PreviewPlacerView extends RelativeLayout { CoordinateUtils.copy(mKeyboardViewOrigin, originCoords); final int count = mPreviews.size(); for (int i = 0; i < count; i++) { - mPreviews.get(i).setKeyboardGeometry(originCoords, width, height); + mPreviews.get(i).setKeyboardViewGeometry(originCoords, width, height); } } - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); + public void deallocateMemory() { final int count = mPreviews.size(); for (int i = 0; i < count; i++) { - mPreviews.get(i).onDetachFromWindow(); + mPreviews.get(i).onDeallocateMemory(); } } @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + deallocateMemory(); + } + + @Override public void onDraw(final Canvas canvas) { super.onDraw(canvas); final int originX = CoordinateUtils.x(mKeyboardViewOrigin); diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureEnabler.java b/java/src/com/android/inputmethod/keyboard/internal/GestureEnabler.java new file mode 100644 index 000000000..7d14ae924 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureEnabler.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import com.android.inputmethod.accessibility.AccessibilityUtils; + +public final class GestureEnabler { + /** True if we should handle gesture events. */ + private boolean mShouldHandleGesture; + private boolean mMainDictionaryAvailable; + private boolean mGestureHandlingEnabledByInputField; + private boolean mGestureHandlingEnabledByUser; + + private void updateGestureHandlingMode() { + mShouldHandleGesture = mMainDictionaryAvailable + && mGestureHandlingEnabledByInputField + && mGestureHandlingEnabledByUser + && !AccessibilityUtils.getInstance().isTouchExplorationEnabled(); + } + + // Note that this method is called from a non-UI thread. + public void setMainDictionaryAvailability(final boolean mainDictionaryAvailable) { + mMainDictionaryAvailable = mainDictionaryAvailable; + updateGestureHandlingMode(); + } + + public void setGestureHandlingEnabledByUser(final boolean gestureHandlingEnabledByUser) { + mGestureHandlingEnabledByUser = gestureHandlingEnabledByUser; + updateGestureHandlingMode(); + } + + public void setPasswordMode(final boolean passwordMode) { + mGestureHandlingEnabledByInputField = !passwordMode; + updateGestureHandlingMode(); + } + + public boolean shouldHandleGesture() { + return mShouldHandleGesture; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java index c6dd9e100..fd84856b7 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java @@ -23,7 +23,6 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.RectF; import android.text.TextUtils; -import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.latin.R; @@ -42,13 +41,14 @@ import com.android.inputmethod.latin.utils.CoordinateUtils; * @attr ref R.styleable#KeyboardView_gestureFloatingPreviewVerticalPadding * @attr ref R.styleable#KeyboardView_gestureFloatingPreviewRoundRadius */ -public class GestureFloatingPreviewText extends AbstractDrawingPreview { +public class GestureFloatingTextDrawingPreview extends AbstractDrawingPreview { protected static final class GesturePreviewTextParams { public final int mGesturePreviewTextOffset; public final int mGesturePreviewTextHeight; public final float mGesturePreviewHorizontalPadding; public final float mGesturePreviewVerticalPadding; public final float mGesturePreviewRoundRadius; + public final int mDisplayWidth; private final int mGesturePreviewTextSize; private final int mGesturePreviewTextColor; @@ -72,6 +72,7 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { R.styleable.MainKeyboardView_gestureFloatingPreviewVerticalPadding, 0.0f); mGesturePreviewRoundRadius = mainKeyboardViewAttr.getDimension( R.styleable.MainKeyboardView_gestureFloatingPreviewRoundRadius, 0.0f); + mDisplayWidth = mainKeyboardViewAttr.getResources().getDisplayMetrics().widthPixels; final Paint textPaint = getTextPaint(); final Rect textRect = new Rect(); @@ -100,9 +101,13 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; private final int[] mLastPointerCoords = CoordinateUtils.newInstance(); - public GestureFloatingPreviewText(final View drawingView, final TypedArray typedArray) { - super(drawingView); - mParams = new GesturePreviewTextParams(typedArray); + public GestureFloatingTextDrawingPreview(final TypedArray mainKeyboardViewAttr) { + mParams = new GesturePreviewTextParams(mainKeyboardViewAttr); + } + + @Override + public void onDeallocateMemory() { + // Nothing to do here. } public void setSuggetedWords(final SuggestedWords suggestedWords) { @@ -144,7 +149,7 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { */ protected void updatePreviewPosition() { if (mSuggestedWords.isEmpty() || TextUtils.isEmpty(mSuggestedWords.getWord(0))) { - getDrawingView().invalidate(); + invalidateDrawingView(); return; } final String text = mSuggestedWords.getWord(0); @@ -158,10 +163,9 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { final float rectWidth = textWidth + hPad * 2.0f; final float rectHeight = textHeight + vPad * 2.0f; - final int displayWidth = getDrawingView().getResources().getDisplayMetrics().widthPixels; final float rectX = Math.min( Math.max(CoordinateUtils.x(mLastPointerCoords) - rectWidth / 2.0f, 0.0f), - displayWidth - rectWidth); + mParams.mDisplayWidth - rectWidth); final float rectY = CoordinateUtils.y(mLastPointerCoords) - mParams.mGesturePreviewTextOffset - rectHeight; rectangle.set(rectX, rectY, rectX + rectWidth, rectY + rectHeight); @@ -169,6 +173,6 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { mPreviewTextX = (int)(rectX + hPad + textWidth / 2.0f); mPreviewTextY = (int)(rectY + vPad) + textHeight; // TODO: Should narrow the invalidate region. - getDrawingView().invalidate(); + invalidateDrawingView(); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeDrawingParams.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeDrawingParams.java new file mode 100644 index 000000000..478639d2d --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeDrawingParams.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.TypedArray; + +import com.android.inputmethod.latin.R; + +/** + * This class holds parameters to control how a gesture stroke is sampled and drawn on the screen. + * + * @attr ref R.styleable#MainKeyboardView_gestureTrailMinSamplingDistance + * @attr ref R.styleable#MainKeyboardView_gestureTrailMaxInterpolationAngularThreshold + * @attr ref R.styleable#MainKeyboardView_gestureTrailMaxInterpolationDistanceThreshold + * @attr ref R.styleable#MainKeyboardView_gestureTrailMaxInterpolationSegments + */ +public final class GestureStrokeDrawingParams { + public final double mMinSamplingDistance; // in pixel + public final double mMaxInterpolationAngularThreshold; // in radian + public final double mMaxInterpolationDistanceThreshold; // in pixel + public final int mMaxInterpolationSegments; + + private static final float DEFAULT_MIN_SAMPLING_DISTANCE = 0.0f; // dp + private static final int DEFAULT_MAX_INTERPOLATION_ANGULAR_THRESHOLD = 15; // in degree + private static final float DEFAULT_MAX_INTERPOLATION_DISTANCE_THRESHOLD = 0.0f; // dp + private static final int DEFAULT_MAX_INTERPOLATION_SEGMENTS = 4; + + public GestureStrokeDrawingParams(final TypedArray mainKeyboardViewAttr) { + mMinSamplingDistance = mainKeyboardViewAttr.getDimension( + R.styleable.MainKeyboardView_gestureTrailMinSamplingDistance, + DEFAULT_MIN_SAMPLING_DISTANCE); + final int interpolationAngularDegree = mainKeyboardViewAttr.getInteger(R.styleable + .MainKeyboardView_gestureTrailMaxInterpolationAngularThreshold, 0); + mMaxInterpolationAngularThreshold = (interpolationAngularDegree <= 0) + ? Math.toRadians(DEFAULT_MAX_INTERPOLATION_ANGULAR_THRESHOLD) + : Math.toRadians(interpolationAngularDegree); + mMaxInterpolationDistanceThreshold = mainKeyboardViewAttr.getDimension(R.styleable + .MainKeyboardView_gestureTrailMaxInterpolationDistanceThreshold, + DEFAULT_MAX_INTERPOLATION_DISTANCE_THRESHOLD); + mMaxInterpolationSegments = mainKeyboardViewAttr.getInteger( + R.styleable.MainKeyboardView_gestureTrailMaxInterpolationSegments, + DEFAULT_MAX_INTERPOLATION_SEGMENTS); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeDrawingPoints.java index ecc67dd44..7d09e9d2f 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeDrawingPoints.java @@ -16,19 +16,19 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.TypedArray; - -import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.ResizableIntArray; -public final class GestureStrokeWithPreviewPoints extends GestureStroke { +/** + * This class holds drawing points to represent a gesture stroke on the screen. + */ +public final class GestureStrokeDrawingPoints { public static final int PREVIEW_CAPACITY = 256; private final ResizableIntArray mPreviewEventTimes = new ResizableIntArray(PREVIEW_CAPACITY); private final ResizableIntArray mPreviewXCoordinates = new ResizableIntArray(PREVIEW_CAPACITY); private final ResizableIntArray mPreviewYCoordinates = new ResizableIntArray(PREVIEW_CAPACITY); - private final GestureStrokePreviewParams mPreviewParams; + private final GestureStrokeDrawingParams mDrawingParams; private int mStrokeId; private int mLastPreviewSize; @@ -39,56 +39,11 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { private int mLastY; private double mDistanceFromLastSample; - public static final class GestureStrokePreviewParams { - public final double mMinSamplingDistance; // in pixel - public final double mMaxInterpolationAngularThreshold; // in radian - public final double mMaxInterpolationDistanceThreshold; // in pixel - public final int mMaxInterpolationSegments; - - public static final GestureStrokePreviewParams DEFAULT = new GestureStrokePreviewParams(); - - private static final int DEFAULT_MAX_INTERPOLATION_ANGULAR_THRESHOLD = 15; // in degree - - private GestureStrokePreviewParams() { - mMinSamplingDistance = 0.0d; - mMaxInterpolationAngularThreshold = - degreeToRadian(DEFAULT_MAX_INTERPOLATION_ANGULAR_THRESHOLD); - mMaxInterpolationDistanceThreshold = mMinSamplingDistance; - mMaxInterpolationSegments = 4; - } - - private static double degreeToRadian(final int degree) { - return degree / 180.0d * Math.PI; - } - - public GestureStrokePreviewParams(final TypedArray mainKeyboardViewAttr) { - mMinSamplingDistance = mainKeyboardViewAttr.getDimension( - R.styleable.MainKeyboardView_gestureTrailMinSamplingDistance, - (float)DEFAULT.mMinSamplingDistance); - final int interpolationAngularDegree = mainKeyboardViewAttr.getInteger(R.styleable - .MainKeyboardView_gestureTrailMaxInterpolationAngularThreshold, 0); - mMaxInterpolationAngularThreshold = (interpolationAngularDegree <= 0) - ? DEFAULT.mMaxInterpolationAngularThreshold - : degreeToRadian(interpolationAngularDegree); - mMaxInterpolationDistanceThreshold = mainKeyboardViewAttr.getDimension(R.styleable - .MainKeyboardView_gestureTrailMaxInterpolationDistanceThreshold, - (float)DEFAULT.mMaxInterpolationDistanceThreshold); - mMaxInterpolationSegments = mainKeyboardViewAttr.getInteger( - R.styleable.MainKeyboardView_gestureTrailMaxInterpolationSegments, - DEFAULT.mMaxInterpolationSegments); - } - } - - public GestureStrokeWithPreviewPoints(final int pointerId, - final GestureStrokeParams strokeParams, - final GestureStrokePreviewParams previewParams) { - super(pointerId, strokeParams); - mPreviewParams = previewParams; + public GestureStrokeDrawingPoints(final GestureStrokeDrawingParams drawingParams) { + mDrawingParams = drawingParams; } - @Override - protected void reset() { - super.reset(); + private void reset() { mStrokeId++; mLastPreviewSize = 0; mLastInterpolatedPreviewIndex = 0; @@ -101,28 +56,29 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { return mStrokeId; } + public void onDownEvent(final int x, final int y, final int elapsedTimeSinceFirstDown) { + reset(); + onMoveEvent(x, y, elapsedTimeSinceFirstDown); + } + private boolean needsSampling(final int x, final int y) { mDistanceFromLastSample += Math.hypot(x - mLastX, y - mLastY); mLastX = x; mLastY = y; final boolean isDownEvent = (mPreviewEventTimes.getLength() == 0); - if (mDistanceFromLastSample >= mPreviewParams.mMinSamplingDistance || isDownEvent) { + if (mDistanceFromLastSample >= mDrawingParams.mMinSamplingDistance || isDownEvent) { mDistanceFromLastSample = 0.0d; return true; } return false; } - @Override - public boolean addPointOnKeyboard(final int x, final int y, final int time, - final boolean isMajorEvent) { + public void onMoveEvent(final int x, final int y, final int elapsedTimeSinceFirstDown) { if (needsSampling(x, y)) { - mPreviewEventTimes.add(time); + mPreviewEventTimes.add(elapsedTimeSinceFirstDown); mPreviewXCoordinates.add(x); mPreviewYCoordinates.add(y); } - return super.addPointOnKeyboard(x, y, time, isMajorEvent); - } /** @@ -132,7 +88,7 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { * @param xCoords the x-coordinates array of gesture trail to be drawn. * @param yCoords the y-coordinates array of gesture trail to be drawn. * @param types the point types array of gesture trail. This is valid only when - * {@link GestureTrail#DEBUG_SHOW_POINTS} is true. + * {@link GestureTrailDrawingPoints#DEBUG_SHOW_POINTS} is true. */ public void appendPreviewStroke(final ResizableIntArray eventTimes, final ResizableIntArray xCoords, final ResizableIntArray yCoords, @@ -144,8 +100,8 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { eventTimes.append(mPreviewEventTimes, mLastPreviewSize, length); xCoords.append(mPreviewXCoordinates, mLastPreviewSize, length); yCoords.append(mPreviewYCoordinates, mLastPreviewSize, length); - if (GestureTrail.DEBUG_SHOW_POINTS) { - types.fill(GestureTrail.POINT_TYPE_SAMPLED, types.getLength(), length); + if (GestureTrailDrawingPoints.DEBUG_SHOW_POINTS) { + types.fill(GestureTrailDrawingPoints.POINT_TYPE_SAMPLED, types.getLength(), length); } mLastPreviewSize = mPreviewEventTimes.getLength(); } @@ -162,7 +118,7 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { * @param xCoords the x-coordinates array of gesture trail to be drawn. * @param yCoords the y-coordinates array of gesture trail to be drawn. * @param types the point types array of gesture trail. This is valid only when - * {@link GestureTrail#DEBUG_SHOW_POINTS} is true. + * {@link GestureTrailDrawingPoints#DEBUG_SHOW_POINTS} is true. * @return the start index of the last interpolated segment of input arrays. */ public int interpolateStrokeAndReturnStartIndexOfLastSegment(final int lastInterpolatedIndex, @@ -188,12 +144,12 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { final double m2 = Math.atan2(mInterpolator.mSlope2Y, mInterpolator.mSlope2X); final double deltaAngle = Math.abs(angularDiff(m2, m1)); final int segmentsByAngle = (int)Math.ceil( - deltaAngle / mPreviewParams.mMaxInterpolationAngularThreshold); + deltaAngle / mDrawingParams.mMaxInterpolationAngularThreshold); final double deltaDistance = Math.hypot(mInterpolator.mP1X - mInterpolator.mP2X, mInterpolator.mP1Y - mInterpolator.mP2Y); final int segmentsByDistance = (int)Math.ceil(deltaDistance - / mPreviewParams.mMaxInterpolationDistanceThreshold); - final int segments = Math.min(mPreviewParams.mMaxInterpolationSegments, + / mDrawingParams.mMaxInterpolationDistanceThreshold); + final int segments = Math.min(mDrawingParams.mMaxInterpolationSegments, Math.max(segmentsByAngle, segmentsByDistance)); final int t1 = eventTimes.get(d1); final int dt = pt[p2] - pt[p1]; @@ -201,19 +157,19 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { for (int i = 1; i < segments; i++) { final float t = i / (float)segments; mInterpolator.interpolate(t); - eventTimes.add(d1, (int)(dt * t) + t1); - xCoords.add(d1, (int)mInterpolator.mInterpolatedX); - yCoords.add(d1, (int)mInterpolator.mInterpolatedY); - if (GestureTrail.DEBUG_SHOW_POINTS) { - types.add(d1, GestureTrail.POINT_TYPE_INTERPOLATED); + eventTimes.addAt(d1, (int)(dt * t) + t1); + xCoords.addAt(d1, (int)mInterpolator.mInterpolatedX); + yCoords.addAt(d1, (int)mInterpolator.mInterpolatedY); + if (GestureTrailDrawingPoints.DEBUG_SHOW_POINTS) { + types.addAt(d1, GestureTrailDrawingPoints.POINT_TYPE_INTERPOLATED); } d1++; } - eventTimes.add(d1, pt[p2]); - xCoords.add(d1, px[p2]); - yCoords.add(d1, py[p2]); - if (GestureTrail.DEBUG_SHOW_POINTS) { - types.add(d1, GestureTrail.POINT_TYPE_SAMPLED); + eventTimes.addAt(d1, pt[p2]); + xCoords.addAt(d1, px[p2]); + yCoords.addAt(d1, py[p2]); + if (GestureTrailDrawingPoints.DEBUG_SHOW_POINTS) { + types.addAt(d1, GestureTrailDrawingPoints.POINT_TYPE_SAMPLED); } } return lastInterpolatedDrawIndex; diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeRecognitionParams.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeRecognitionParams.java new file mode 100644 index 000000000..07b14514c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeRecognitionParams.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.TypedArray; + +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.utils.ResourceUtils; + +/** + * This class holds parameters to control how a gesture stroke is sampled and recognized. + * This class also has parameters to distinguish gesture input events from fast typing events. + * + * @attr ref R.styleable#MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping + * @attr ref R.styleable#MainKeyboardView_gestureDetectFastMoveSpeedThreshold + * @attr ref R.styleable#MainKeyboardView_gestureDynamicThresholdDecayDuration + * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdFrom + * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdTo + * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdFrom + * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdTo + * @attr ref R.styleable#MainKeyboardView_gestureSamplingMinimumDistance + * @attr ref R.styleable#MainKeyboardView_gestureRecognitionMinimumTime + * @attr ref R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold + */ +public final class GestureStrokeRecognitionParams { + // Static threshold for gesture after fast typing + public final int mStaticTimeThresholdAfterFastTyping; // msec + // Static threshold for starting gesture detection + public final float mDetectFastMoveSpeedThreshold; // keyWidth/sec + // Dynamic threshold for gesture after fast typing + public final int mDynamicThresholdDecayDuration; // msec + // Time based threshold values + public final int mDynamicTimeThresholdFrom; // msec + public final int mDynamicTimeThresholdTo; // msec + // Distance based threshold values + public final float mDynamicDistanceThresholdFrom; // keyWidth + public final float mDynamicDistanceThresholdTo; // keyWidth + // Parameters for gesture sampling + public final float mSamplingMinimumDistance; // keyWidth + // Parameters for gesture recognition + public final int mRecognitionMinimumTime; // msec + public final float mRecognitionSpeedThreshold; // keyWidth/sec + + // Default GestureStrokeRecognitionPoints parameters. + public static final GestureStrokeRecognitionParams DEFAULT = + new GestureStrokeRecognitionParams(); + + private GestureStrokeRecognitionParams() { + // These parameter values are default and intended for testing. + mStaticTimeThresholdAfterFastTyping = 350; // msec + mDetectFastMoveSpeedThreshold = 1.5f; // keyWidth/sec + mDynamicThresholdDecayDuration = 450; // msec + mDynamicTimeThresholdFrom = 300; // msec + mDynamicTimeThresholdTo = 20; // msec + mDynamicDistanceThresholdFrom = 6.0f; // keyWidth + mDynamicDistanceThresholdTo = 0.35f; // keyWidth + // The following parameters' change will affect the result of regression test. + mSamplingMinimumDistance = 1.0f / 6.0f; // keyWidth + mRecognitionMinimumTime = 100; // msec + mRecognitionSpeedThreshold = 5.5f; // keyWidth/sec + } + + public GestureStrokeRecognitionParams(final TypedArray mainKeyboardViewAttr) { + mStaticTimeThresholdAfterFastTyping = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping, + DEFAULT.mStaticTimeThresholdAfterFastTyping); + mDetectFastMoveSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, + R.styleable.MainKeyboardView_gestureDetectFastMoveSpeedThreshold, + DEFAULT.mDetectFastMoveSpeedThreshold); + mDynamicThresholdDecayDuration = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureDynamicThresholdDecayDuration, + DEFAULT.mDynamicThresholdDecayDuration); + mDynamicTimeThresholdFrom = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureDynamicTimeThresholdFrom, + DEFAULT.mDynamicTimeThresholdFrom); + mDynamicTimeThresholdTo = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureDynamicTimeThresholdTo, + DEFAULT.mDynamicTimeThresholdTo); + mDynamicDistanceThresholdFrom = ResourceUtils.getFraction(mainKeyboardViewAttr, + R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdFrom, + DEFAULT.mDynamicDistanceThresholdFrom); + mDynamicDistanceThresholdTo = ResourceUtils.getFraction(mainKeyboardViewAttr, + R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdTo, + DEFAULT.mDynamicDistanceThresholdTo); + mSamplingMinimumDistance = ResourceUtils.getFraction(mainKeyboardViewAttr, + R.styleable.MainKeyboardView_gestureSamplingMinimumDistance, + DEFAULT.mSamplingMinimumDistance); + mRecognitionMinimumTime = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureRecognitionMinimumTime, + DEFAULT.mRecognitionMinimumTime); + mRecognitionSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, + R.styleable.MainKeyboardView_gestureRecognitionSpeedThreshold, + DEFAULT.mRecognitionSpeedThreshold); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeRecognitionPoints.java index f29ade861..e49e538aa 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeRecognitionPoints.java @@ -16,16 +16,18 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.TypedArray; import android.util.Log; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.InputPointers; -import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.ResizableIntArray; -import com.android.inputmethod.latin.utils.ResourceUtils; -public class GestureStroke { - private static final String TAG = GestureStroke.class.getSimpleName(); +/** + * This class holds event points to recognize a gesture stroke. + * TODO: Should be package private class. + */ +public final class GestureStrokeRecognitionPoints { + private static final String TAG = GestureStrokeRecognitionPoints.class.getSimpleName(); private static final boolean DEBUG = false; private static final boolean DEBUG_SPEED = false; @@ -33,14 +35,15 @@ public class GestureStroke { // Proportional to the keyboard height. public static final float EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO = 0.25f; - public static final int DEFAULT_CAPACITY = 128; - private final int mPointerId; - private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY); - private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY); - private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY); + private final ResizableIntArray mEventTimes = new ResizableIntArray( + Constants.DEFAULT_GESTURE_POINTS_CAPACITY); + private final ResizableIntArray mXCoordinates = new ResizableIntArray( + Constants.DEFAULT_GESTURE_POINTS_CAPACITY); + private final ResizableIntArray mYCoordinates = new ResizableIntArray( + Constants.DEFAULT_GESTURE_POINTS_CAPACITY); - private final GestureStrokeParams mParams; + private final GestureStrokeRecognitionParams mRecognitionParams; private int mKeyWidth; // pixel private int mMinYCoordinate; // pixel @@ -64,145 +67,85 @@ public class GestureStroke { private int mIncrementalRecognitionSize; private int mLastIncrementalBatchSize; - public static final class GestureStrokeParams { - // Static threshold for gesture after fast typing - public final int mStaticTimeThresholdAfterFastTyping; // msec - // Static threshold for starting gesture detection - public final float mDetectFastMoveSpeedThreshold; // keyWidth/sec - // Dynamic threshold for gesture after fast typing - public final int mDynamicThresholdDecayDuration; // msec - // Time based threshold values - public final int mDynamicTimeThresholdFrom; // msec - public final int mDynamicTimeThresholdTo; // msec - // Distance based threshold values - public final float mDynamicDistanceThresholdFrom; // keyWidth - public final float mDynamicDistanceThresholdTo; // keyWidth - // Parameters for gesture sampling - public final float mSamplingMinimumDistance; // keyWidth - // Parameters for gesture recognition - public final int mRecognitionMinimumTime; // msec - public final float mRecognitionSpeedThreshold; // keyWidth/sec - - // Default GestureStroke parameters. - public static final GestureStrokeParams DEFAULT = new GestureStrokeParams(); - - private GestureStrokeParams() { - // These parameter values are default and intended for testing. - mStaticTimeThresholdAfterFastTyping = 350; // msec - mDetectFastMoveSpeedThreshold = 1.5f; // keyWidth / sec - mDynamicThresholdDecayDuration = 450; // msec - mDynamicTimeThresholdFrom = 300; // msec - mDynamicTimeThresholdTo = 20; // msec - mDynamicDistanceThresholdFrom = 6.0f; // keyWidth - mDynamicDistanceThresholdTo = 0.35f; // keyWidth - // The following parameters' change will affect the result of regression test. - mSamplingMinimumDistance = 1.0f / 6.0f; // keyWidth - mRecognitionMinimumTime = 100; // msec - mRecognitionSpeedThreshold = 5.5f; // keyWidth / sec - } - - public GestureStrokeParams(final TypedArray mainKeyboardViewAttr) { - mStaticTimeThresholdAfterFastTyping = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping, - DEFAULT.mStaticTimeThresholdAfterFastTyping); - mDetectFastMoveSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, - R.styleable.MainKeyboardView_gestureDetectFastMoveSpeedThreshold, - DEFAULT.mDetectFastMoveSpeedThreshold); - mDynamicThresholdDecayDuration = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureDynamicThresholdDecayDuration, - DEFAULT.mDynamicThresholdDecayDuration); - mDynamicTimeThresholdFrom = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureDynamicTimeThresholdFrom, - DEFAULT.mDynamicTimeThresholdFrom); - mDynamicTimeThresholdTo = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureDynamicTimeThresholdTo, - DEFAULT.mDynamicTimeThresholdTo); - mDynamicDistanceThresholdFrom = ResourceUtils.getFraction(mainKeyboardViewAttr, - R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdFrom, - DEFAULT.mDynamicDistanceThresholdFrom); - mDynamicDistanceThresholdTo = ResourceUtils.getFraction(mainKeyboardViewAttr, - R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdTo, - DEFAULT.mDynamicDistanceThresholdTo); - mSamplingMinimumDistance = ResourceUtils.getFraction(mainKeyboardViewAttr, - R.styleable.MainKeyboardView_gestureSamplingMinimumDistance, - DEFAULT.mSamplingMinimumDistance); - mRecognitionMinimumTime = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureRecognitionMinimumTime, - DEFAULT.mRecognitionMinimumTime); - mRecognitionSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr, - R.styleable.MainKeyboardView_gestureRecognitionSpeedThreshold, - DEFAULT.mRecognitionSpeedThreshold); - } - } - private static final int MSEC_PER_SEC = 1000; - public GestureStroke(final int pointerId, final GestureStrokeParams params) { + // TODO: Make this package private + public GestureStrokeRecognitionPoints(final int pointerId, + final GestureStrokeRecognitionParams recognitionParams) { mPointerId = pointerId; - mParams = params; + mRecognitionParams = recognitionParams; } + // TODO: Make this package private public void setKeyboardGeometry(final int keyWidth, final int keyboardHeight) { mKeyWidth = keyWidth; mMinYCoordinate = -(int)(keyboardHeight * EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO); mMaxYCoordinate = keyboardHeight; // TODO: Find an appropriate base metric for these length. Maybe diagonal length of the key? - mDetectFastMoveSpeedThreshold = (int)(keyWidth * mParams.mDetectFastMoveSpeedThreshold); - mGestureDynamicDistanceThresholdFrom = - (int)(keyWidth * mParams.mDynamicDistanceThresholdFrom); - mGestureDynamicDistanceThresholdTo = (int)(keyWidth * mParams.mDynamicDistanceThresholdTo); - mGestureSamplingMinimumDistance = (int)(keyWidth * mParams.mSamplingMinimumDistance); - mGestureRecognitionSpeedThreshold = (int)(keyWidth * mParams.mRecognitionSpeedThreshold); + mDetectFastMoveSpeedThreshold = (int)( + keyWidth * mRecognitionParams.mDetectFastMoveSpeedThreshold); + mGestureDynamicDistanceThresholdFrom = (int)( + keyWidth * mRecognitionParams.mDynamicDistanceThresholdFrom); + mGestureDynamicDistanceThresholdTo = (int)( + keyWidth * mRecognitionParams.mDynamicDistanceThresholdTo); + mGestureSamplingMinimumDistance = (int)( + keyWidth * mRecognitionParams.mSamplingMinimumDistance); + mGestureRecognitionSpeedThreshold = (int)( + keyWidth * mRecognitionParams.mRecognitionSpeedThreshold); if (DEBUG) { Log.d(TAG, String.format( "[%d] setKeyboardGeometry: keyWidth=%3d tT=%3d >> %3d tD=%3d >> %3d", mPointerId, keyWidth, - mParams.mDynamicTimeThresholdFrom, - mParams.mDynamicTimeThresholdTo, + mRecognitionParams.mDynamicTimeThresholdFrom, + mRecognitionParams.mDynamicTimeThresholdTo, mGestureDynamicDistanceThresholdFrom, mGestureDynamicDistanceThresholdTo)); } } + // TODO: Make this package private public int getLength() { return mEventTimes.getLength(); } - public void onDownEvent(final int x, final int y, final long downTime, - final long gestureFirstDownTime, final long lastTypingTime) { + // TODO: Make this package private + public void addDownEventPoint(final int x, final int y, final int elapsedTimeSinceFirstDown, + final int elapsedTimeSinceLastTyping) { reset(); - final long elapsedTimeAfterTyping = downTime - lastTypingTime; - if (elapsedTimeAfterTyping < mParams.mStaticTimeThresholdAfterFastTyping) { + if (elapsedTimeSinceLastTyping < mRecognitionParams.mStaticTimeThresholdAfterFastTyping) { mAfterFastTyping = true; } if (DEBUG) { Log.d(TAG, String.format("[%d] onDownEvent: dT=%3d%s", mPointerId, - elapsedTimeAfterTyping, mAfterFastTyping ? " afterFastTyping" : "")); + elapsedTimeSinceLastTyping, mAfterFastTyping ? " afterFastTyping" : "")); } - final int elapsedTimeFromFirstDown = (int)(downTime - gestureFirstDownTime); - addPointOnKeyboard(x, y, elapsedTimeFromFirstDown, true /* isMajorEvent */); + // Call {@link #addEventPoint(int,int,int,boolean)} to record this down event point as a + // major event point. + addEventPoint(x, y, elapsedTimeSinceFirstDown, true /* isMajorEvent */); } private int getGestureDynamicDistanceThreshold(final int deltaTime) { - if (!mAfterFastTyping || deltaTime >= mParams.mDynamicThresholdDecayDuration) { + if (!mAfterFastTyping || deltaTime >= mRecognitionParams.mDynamicThresholdDecayDuration) { return mGestureDynamicDistanceThresholdTo; } final int decayedThreshold = (mGestureDynamicDistanceThresholdFrom - mGestureDynamicDistanceThresholdTo) - * deltaTime / mParams.mDynamicThresholdDecayDuration; + * deltaTime / mRecognitionParams.mDynamicThresholdDecayDuration; return mGestureDynamicDistanceThresholdFrom - decayedThreshold; } private int getGestureDynamicTimeThreshold(final int deltaTime) { - if (!mAfterFastTyping || deltaTime >= mParams.mDynamicThresholdDecayDuration) { - return mParams.mDynamicTimeThresholdTo; + if (!mAfterFastTyping || deltaTime >= mRecognitionParams.mDynamicThresholdDecayDuration) { + return mRecognitionParams.mDynamicTimeThresholdTo; } final int decayedThreshold = - (mParams.mDynamicTimeThresholdFrom - mParams.mDynamicTimeThresholdTo) - * deltaTime / mParams.mDynamicThresholdDecayDuration; - return mParams.mDynamicTimeThresholdFrom - decayedThreshold; + (mRecognitionParams.mDynamicTimeThresholdFrom + - mRecognitionParams.mDynamicTimeThresholdTo) + * deltaTime / mRecognitionParams.mDynamicThresholdDecayDuration; + return mRecognitionParams.mDynamicTimeThresholdFrom - decayedThreshold; } + // TODO: Make this package private public final boolean isStartOfAGesture() { if (!hasDetectedFastMove()) { return false; @@ -233,6 +176,7 @@ public class GestureStroke { return isStartOfAGesture; } + // TODO: Make this package private public void duplicateLastPointWith(final int time) { final int lastIndex = getLength() - 1; if (lastIndex >= 0) { @@ -248,7 +192,7 @@ public class GestureStroke { } } - protected void reset() { + private void reset() { mIncrementalRecognitionSize = 0; mLastIncrementalBatchSize = 0; mEventTimes.setLength(0); @@ -316,19 +260,20 @@ public class GestureStroke { } /** - * Add a touch event as a gesture point. Returns true if the touch event is on the valid - * gesture area. - * @param x the x-coordinate of the touch event - * @param y the y-coordinate of the touch event + * Add an event point to this gesture stroke recognition points. Returns true if the event + * point is on the valid gesture area. + * @param x the x-coordinate of the event point + * @param y the y-coordinate of the event point * @param time the elapsed time in millisecond from the first gesture down * @param isMajorEvent false if this is a historical move event - * @return true if the touch event is on the valid gesture area + * @return true if the event point is on the valid gesture area */ - public boolean addPointOnKeyboard(final int x, final int y, final int time, + // TODO: Make this package private + public boolean addEventPoint(final int x, final int y, final int time, final boolean isMajorEvent) { final int size = getLength(); if (size <= 0) { - // Down event + // The first event of this stroke (a.k.a. down event). appendPoint(x, y, time); updateMajorEvent(x, y, time); } else { @@ -357,15 +302,18 @@ public class GestureStroke { } } + // TODO: Make this package private public final boolean hasRecognitionTimePast( final long currentTime, final long lastRecognitionTime) { - return currentTime > lastRecognitionTime + mParams.mRecognitionMinimumTime; + return currentTime > lastRecognitionTime + mRecognitionParams.mRecognitionMinimumTime; } + // TODO: Make this package private public final void appendAllBatchPoints(final InputPointers out) { appendBatchPoints(out, getLength()); } + // TODO: Make this package private public final void appendIncrementalBatchPoints(final InputPointers out) { appendBatchPoints(out, mIncrementalRecognitionSize); } @@ -381,10 +329,6 @@ public class GestureStroke { } private static int getDistance(final int x1, final int y1, final int x2, final int y2) { - final int dx = x1 - x2; - final int dy = y1 - y2; - // Note that, in recent versions of Android, FloatMath is actually slower than - // java.lang.Math due to the way the JIT optimizes java.lang.Math. - return (int)Math.sqrt(dx * dx + dy * dy); + return (int)Math.hypot(x1 - x2, y1 - y2); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailDrawingParams.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailDrawingParams.java new file mode 100644 index 000000000..088f03aa6 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailDrawingParams.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.TypedArray; + +import com.android.inputmethod.latin.R; + +/** + * This class holds parameters to control how a gesture trail is drawn and animated on the screen. + * + * On the other hand, {@link GestureStrokeDrawingParams} class controls how each gesture stroke is + * sampled and interpolated. This class controls how those gesture strokes are displayed as a + * gesture trail and animated on the screen. + * + * @attr ref R.styleable#MainKeyboardView_gestureTrailFadeoutStartDelay + * @attr ref R.styleable#MainKeyboardView_gestureTrailFadeoutDuration + * @attr ref R.styleable#MainKeyboardView_gestureTrailUpdateInterval + * @attr ref R.styleable#MainKeyboardView_gestureTrailColor + * @attr ref R.styleable#MainKeyboardView_gestureTrailWidth + */ +final class GestureTrailDrawingParams { + private static final int FADEOUT_START_DELAY_FOR_DEBUG = 2000; // millisecond + private static final int FADEOUT_DURATION_FOR_DEBUG = 200; // millisecond + + public final int mTrailColor; + public final float mTrailStartWidth; + public final float mTrailEndWidth; + public final float mTrailBodyRatio; + public boolean mTrailShadowEnabled; + public final float mTrailShadowRatio; + public final int mFadeoutStartDelay; + public final int mFadeoutDuration; + public final int mUpdateInterval; + + public final int mTrailLingerDuration; + + public GestureTrailDrawingParams(final TypedArray mainKeyboardViewAttr) { + mTrailColor = mainKeyboardViewAttr.getColor( + R.styleable.MainKeyboardView_gestureTrailColor, 0); + mTrailStartWidth = mainKeyboardViewAttr.getDimension( + R.styleable.MainKeyboardView_gestureTrailStartWidth, 0.0f); + mTrailEndWidth = mainKeyboardViewAttr.getDimension( + R.styleable.MainKeyboardView_gestureTrailEndWidth, 0.0f); + final int PERCENTAGE_INT = 100; + mTrailBodyRatio = (float)mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureTrailBodyRatio, PERCENTAGE_INT) + / (float)PERCENTAGE_INT; + final int trailShadowRatioInt = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureTrailShadowRatio, 0); + mTrailShadowEnabled = (trailShadowRatioInt > 0); + mTrailShadowRatio = (float)trailShadowRatioInt / (float)PERCENTAGE_INT; + mFadeoutStartDelay = GestureTrailDrawingPoints.DEBUG_SHOW_POINTS + ? FADEOUT_START_DELAY_FOR_DEBUG + : mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureTrailFadeoutStartDelay, 0); + mFadeoutDuration = GestureTrailDrawingPoints.DEBUG_SHOW_POINTS + ? FADEOUT_DURATION_FOR_DEBUG + : mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureTrailFadeoutDuration, 0); + mTrailLingerDuration = mFadeoutStartDelay + mFadeoutDuration; + mUpdateInterval = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_gestureTrailUpdateInterval, 0); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailDrawingPoints.java index aca667919..bf4c4da10 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrail.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailDrawingPoints.java @@ -16,7 +16,6 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -25,24 +24,22 @@ import android.graphics.Rect; import android.os.SystemClock; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.ResizableIntArray; -/* - * @attr ref R.styleable#MainKeyboardView_gestureTrailFadeoutStartDelay - * @attr ref R.styleable#MainKeyboardView_gestureTrailFadeoutDuration - * @attr ref R.styleable#MainKeyboardView_gestureTrailUpdateInterval - * @attr ref R.styleable#MainKeyboardView_gestureTrailColor - * @attr ref R.styleable#MainKeyboardView_gestureTrailWidth +/** + * This class holds drawing points to represent a gesture trail. The gesture trail may contain + * multiple non-contiguous gesture strokes and will be animated asynchronously from gesture input. + * + * On the other hand, {@link GestureStrokeDrawingPoints} class holds drawing points of each gesture + * stroke. This class holds drawing points of those gesture strokes to draw as a gesture trail. + * Drawing points in this class will be asynchronously removed when fading out animation goes. */ -final class GestureTrail { +final class GestureTrailDrawingPoints { public static final boolean DEBUG_SHOW_POINTS = false; public static final int POINT_TYPE_SAMPLED = 1; public static final int POINT_TYPE_INTERPOLATED = 2; - private static final int FADEOUT_START_DELAY_FOR_DEBUG = 2000; // millisecond - private static final int FADEOUT_DURATION_FOR_DEBUG = 200; // millisecond - private static final int DEFAULT_CAPACITY = GestureStrokeWithPreviewPoints.PREVIEW_CAPACITY; + private static final int DEFAULT_CAPACITY = GestureStrokeDrawingPoints.PREVIEW_CAPACITY; // These three {@link ResizableIntArray}s should be synchronized by {@link #mEventTimes}. private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY); @@ -56,46 +53,6 @@ final class GestureTrail { private int mTrailStartIndex; private int mLastInterpolatedDrawIndex; - static final class Params { - public final int mTrailColor; - public final float mTrailStartWidth; - public final float mTrailEndWidth; - public final float mTrailBodyRatio; - public boolean mTrailShadowEnabled; - public final float mTrailShadowRatio; - public final int mFadeoutStartDelay; - public final int mFadeoutDuration; - public final int mUpdateInterval; - - public final int mTrailLingerDuration; - - public Params(final TypedArray mainKeyboardViewAttr) { - mTrailColor = mainKeyboardViewAttr.getColor( - R.styleable.MainKeyboardView_gestureTrailColor, 0); - mTrailStartWidth = mainKeyboardViewAttr.getDimension( - R.styleable.MainKeyboardView_gestureTrailStartWidth, 0.0f); - mTrailEndWidth = mainKeyboardViewAttr.getDimension( - R.styleable.MainKeyboardView_gestureTrailEndWidth, 0.0f); - final int PERCENTAGE_INT = 100; - mTrailBodyRatio = (float)mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureTrailBodyRatio, PERCENTAGE_INT) - / (float)PERCENTAGE_INT; - final int trailShadowRatioInt = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureTrailShadowRatio, 0); - mTrailShadowEnabled = (trailShadowRatioInt > 0); - mTrailShadowRatio = (float)trailShadowRatioInt / (float)PERCENTAGE_INT; - mFadeoutStartDelay = DEBUG_SHOW_POINTS ? FADEOUT_START_DELAY_FOR_DEBUG - : mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureTrailFadeoutStartDelay, 0); - mFadeoutDuration = DEBUG_SHOW_POINTS ? FADEOUT_DURATION_FOR_DEBUG - : mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureTrailFadeoutDuration, 0); - mTrailLingerDuration = mFadeoutStartDelay + mFadeoutDuration; - mUpdateInterval = mainKeyboardViewAttr.getInt( - R.styleable.MainKeyboardView_gestureTrailUpdateInterval, 0); - } - } - // Use this value as imaginary zero because x-coordinates may be zero. private static final int DOWN_EVENT_MARKER = -128; @@ -112,13 +69,13 @@ final class GestureTrail { ? DOWN_EVENT_MARKER - xCoordOrMark : xCoordOrMark; } - public void addStroke(final GestureStrokeWithPreviewPoints stroke, final long downTime) { + public void addStroke(final GestureStrokeDrawingPoints stroke, final long downTime) { synchronized (mEventTimes) { addStrokeLocked(stroke, downTime); } } - private void addStrokeLocked(final GestureStrokeWithPreviewPoints stroke, final long downTime) { + private void addStrokeLocked(final GestureStrokeDrawingPoints stroke, final long downTime) { final int trailSize = mEventTimes.getLength(); stroke.appendPreviewStroke(mEventTimes, mXCoordinates, mYCoordinates, mPointTypes); if (mEventTimes.getLength() == trailSize) { @@ -126,13 +83,14 @@ final class GestureTrail { } final int[] eventTimes = mEventTimes.getPrimitiveArray(); final int strokeId = stroke.getGestureStrokeId(); - // Because interpolation algorithm in {@link GestureStrokeWithPreviewPoints} can't determine + // Because interpolation algorithm in {@link GestureStrokeDrawingPoints} can't determine // the interpolated points in the last segment of gesture stroke, it may need recalculation // of interpolation when new segments are added to the stroke. // {@link #mLastInterpolatedDrawIndex} holds the start index of the last segment. It may // be updated by the interpolation - // {@link GestureStrokeWithPreviewPoints#interpolatePreviewStroke} - // or by animation {@link #drawGestureTrail(Canvas,Paint,Rect,Params)} below. + // {@link GestureStrokeDrawingPoints#interpolatePreviewStroke} + // or by animation {@link #drawGestureTrail(Canvas,Paint,Rect,GestureTrailDrawingParams)} + // below. final int lastInterpolatedIndex = (strokeId == mCurrentStrokeId) ? mLastInterpolatedDrawIndex : trailSize; mLastInterpolatedDrawIndex = stroke.interpolateStrokeAndReturnStartIndexOfLastSegment( @@ -161,7 +119,7 @@ final class GestureTrail { * @param params gesture trail display parameters * @return the width of a gesture trail */ - private static int getAlpha(final int elapsedTime, final Params params) { + private static int getAlpha(final int elapsedTime, final GestureTrailDrawingParams params) { if (elapsedTime < params.mFadeoutStartDelay) { return Constants.Color.ALPHA_OPAQUE; } @@ -180,7 +138,7 @@ final class GestureTrail { * @param params gesture trail display parameters * @return the width of a gesture trail */ - private static float getWidth(final int elapsedTime, final Params params) { + private static float getWidth(final int elapsedTime, final GestureTrailDrawingParams params) { final float deltaWidth = params.mTrailStartWidth - params.mTrailEndWidth; return params.mTrailStartWidth - (deltaWidth * elapsedTime) / params.mTrailLingerDuration; } @@ -197,14 +155,14 @@ final class GestureTrail { * @return true if some gesture trails remain to be drawn */ public boolean drawGestureTrail(final Canvas canvas, final Paint paint, - final Rect outBoundsRect, final Params params) { + final Rect outBoundsRect, final GestureTrailDrawingParams params) { synchronized (mEventTimes) { return drawGestureTrailLocked(canvas, paint, outBoundsRect, params); } } private boolean drawGestureTrailLocked(final Canvas canvas, final Paint paint, - final Rect outBoundsRect, final Params params) { + final Rect outBoundsRect, final GestureTrailDrawingParams params) { // Initialize bounds rectangle. outBoundsRect.setEmpty(); final int trailSize = mEventTimes.getLength(); diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsPreview.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java index 19e995548..f7bd7efe0 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsPreview.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java @@ -24,21 +24,17 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; -import android.os.Message; +import android.os.Handler; import android.util.SparseArray; -import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; -import com.android.inputmethod.keyboard.internal.GestureTrail.Params; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.StaticInnerHandlerWrapper; /** - * Draw gesture trail preview graphics during gesture. + * Draw preview graphics of multiple gesture trails during gesture input. */ -public final class GestureTrailsPreview extends AbstractDrawingPreview { - private final SparseArray<GestureTrail> mGestureTrails = CollectionUtils.newSparseArray(); - private final Params mGestureTrailParams; +public final class GestureTrailsDrawingPreview extends AbstractDrawingPreview implements Runnable { + private final SparseArray<GestureTrailDrawingPoints> mGestureTrails = new SparseArray<>(); + private final GestureTrailDrawingParams mDrawingParams; private final Paint mGesturePaint; private int mOffscreenWidth; private int mOffscreenHeight; @@ -49,42 +45,10 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { private final Rect mDirtyRect = new Rect(); private final Rect mGestureTrailBoundsRect = new Rect(); // per trail - private final DrawingHandler mDrawingHandler; + private final Handler mDrawingHandler = new Handler(); - private static final class DrawingHandler - extends StaticInnerHandlerWrapper<GestureTrailsPreview> { - private static final int MSG_UPDATE_GESTURE_TRAIL = 0; - - private final Params mGestureTrailParams; - - public DrawingHandler(final GestureTrailsPreview outerInstance, - final Params gestureTrailParams) { - super(outerInstance); - mGestureTrailParams = gestureTrailParams; - } - - @Override - public void handleMessage(final Message msg) { - final GestureTrailsPreview preview = getOuterInstance(); - if (preview == null) return; - switch (msg.what) { - case MSG_UPDATE_GESTURE_TRAIL: - preview.getDrawingView().invalidate(); - break; - } - } - - public void postUpdateGestureTrailPreview() { - removeMessages(MSG_UPDATE_GESTURE_TRAIL); - sendMessageDelayed(obtainMessage(MSG_UPDATE_GESTURE_TRAIL), - mGestureTrailParams.mUpdateInterval); - } - } - - public GestureTrailsPreview(final View drawingView, final TypedArray mainKeyboardViewAttr) { - super(drawingView); - mGestureTrailParams = new Params(mainKeyboardViewAttr); - mDrawingHandler = new DrawingHandler(this, mGestureTrailParams); + public GestureTrailsDrawingPreview(final TypedArray mainKeyboardViewAttr) { + mDrawingParams = new GestureTrailDrawingParams(mainKeyboardViewAttr); final Paint gesturePaint = new Paint(); gesturePaint.setAntiAlias(true); gesturePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); @@ -92,19 +56,17 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { } @Override - public void setKeyboardGeometry(final int[] originCoords, final int width, final int height) { - mOffscreenOffsetY = (int)( - height * GestureStroke.EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO); + public void setKeyboardViewGeometry(final int[] originCoords, final int width, + final int height) { + super.setKeyboardViewGeometry(originCoords, width, height); + mOffscreenOffsetY = (int)(height + * GestureStrokeRecognitionPoints.EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO); mOffscreenWidth = width; mOffscreenHeight = mOffscreenOffsetY + height; } @Override - public void onDetachFromWindow() { - freeOffscreenBuffer(); - } - - public void deallocateMemory() { + public void onDeallocateMemory() { freeOffscreenBuffer(); } @@ -144,9 +106,9 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { // Trails count == fingers count that have ever been active. final int trailsCount = mGestureTrails.size(); for (int index = 0; index < trailsCount; index++) { - final GestureTrail trail = mGestureTrails.valueAt(index); + final GestureTrailDrawingPoints trail = mGestureTrails.valueAt(index); needsUpdatingGestureTrail |= trail.drawGestureTrail(offscreenCanvas, paint, - mGestureTrailBoundsRect, mGestureTrailParams); + mGestureTrailBoundsRect, mDrawingParams); // {@link #mGestureTrailBoundsRect} has bounding box of the trail. dirtyRect.union(mGestureTrailBoundsRect); } @@ -154,6 +116,12 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { return needsUpdatingGestureTrail; } + @Override + public void run() { + // Update preview. + invalidateDrawingView(); + } + /** * Draws the preview * @param canvas The canvas where the preview is drawn. @@ -168,7 +136,8 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { final boolean needsUpdatingGestureTrail = drawGestureTrails( mOffscreenCanvas, mGesturePaint, mDirtyRect); if (needsUpdatingGestureTrail) { - mDrawingHandler.postUpdateGestureTrailPreview(); + mDrawingHandler.removeCallbacks(this); + mDrawingHandler.postDelayed(this, mDrawingParams.mUpdateInterval); } // Transfer offscreen buffer to screen. if (!mDirtyRect.isEmpty()) { @@ -189,17 +158,17 @@ public final class GestureTrailsPreview extends AbstractDrawingPreview { if (!isPreviewEnabled()) { return; } - GestureTrail trail; + GestureTrailDrawingPoints trail; synchronized (mGestureTrails) { trail = mGestureTrails.get(tracker.mPointerId); if (trail == null) { - trail = new GestureTrail(); + trail = new GestureTrailDrawingPoints(); mGestureTrails.put(tracker.mPointerId, trail); } } - trail.addStroke(tracker.getGestureStrokeWithPreviewPoints(), tracker.getDownTime()); + trail.addStroke(tracker.getGestureStrokeDrawingPoints(), tracker.getDownTime()); // TODO: Should narrow the invalidate region. - getDrawingView().invalidate(); + invalidateDrawingView(); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java index b528b692e..07ac06bab 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyDrawParams.java @@ -16,7 +16,6 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.ColorStateList; import android.graphics.Typeface; import com.android.inputmethod.latin.utils.ResourceUtils; @@ -33,9 +32,10 @@ public final class KeyDrawParams { public int mHintLabelSize; public int mPreviewTextSize; - public ColorStateList mTextColorStateList; + public int mTextColor; public int mTextInactivatedColor; public int mTextShadowColor; + public int mFunctionalTextColor; public int mHintLetterColor; public int mHintLabelColor; public int mShiftedLetterHintInactivatedColor; @@ -58,9 +58,10 @@ public final class KeyDrawParams { mHintLabelSize = copyFrom.mHintLabelSize; mPreviewTextSize = copyFrom.mPreviewTextSize; - mTextColorStateList = copyFrom.mTextColorStateList; + mTextColor = copyFrom.mTextColor; mTextInactivatedColor = copyFrom.mTextInactivatedColor; mTextShadowColor = copyFrom.mTextShadowColor; + mFunctionalTextColor = copyFrom.mFunctionalTextColor; mHintLetterColor = copyFrom.mHintLetterColor; mHintLabelColor = copyFrom.mHintLabelColor; mShiftedLetterHintInactivatedColor = copyFrom.mShiftedLetterHintInactivatedColor; @@ -90,10 +91,11 @@ public final class KeyDrawParams { attr.mShiftedLetterHintRatio, mShiftedLetterHintSize); mHintLabelSize = selectTextSize(keyHeight, attr.mHintLabelRatio, mHintLabelSize); mPreviewTextSize = selectTextSize(keyHeight, attr.mPreviewTextRatio, mPreviewTextSize); - mTextColorStateList = - attr.mTextColorStateList != null ? attr.mTextColorStateList : mTextColorStateList; + + mTextColor = selectColor(attr.mTextColor, mTextColor); mTextInactivatedColor = selectColor(attr.mTextInactivatedColor, mTextInactivatedColor); mTextShadowColor = selectColor(attr.mTextShadowColor, mTextShadowColor); + mFunctionalTextColor = selectColor(attr.mFunctionalTextColor, mFunctionalTextColor); mHintLetterColor = selectColor(attr.mHintLetterColor, mHintLetterColor); mHintLabelColor = selectColor(attr.mHintLabelColor, mHintLabelColor); mShiftedLetterHintInactivatedColor = selectColor( diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java new file mode 100644 index 000000000..cd29c8d17 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.latin.utils.CoordinateUtils; +import com.android.inputmethod.latin.utils.ViewLayoutUtils; + +import java.util.ArrayDeque; +import java.util.HashMap; +import java.util.HashSet; + +/** + * This class controls pop up key previews. This class decides: + * - what kind of key previews should be shown. + * - where key previews should be placed. + * - how key previews should be shown and dismissed. + */ +public final class KeyPreviewChoreographer { + // Free {@link KeyPreviewView} pool that can be used for key preview. + private final ArrayDeque<KeyPreviewView> mFreeKeyPreviewViews = new ArrayDeque<>(); + // Map from {@link Key} to {@link KeyPreviewView} that is currently being displayed as key + // preview. + private final HashMap<Key,KeyPreviewView> mShowingKeyPreviewViews = new HashMap<>(); + + private final KeyPreviewDrawParams mParams; + + public KeyPreviewChoreographer(final KeyPreviewDrawParams params) { + mParams = params; + } + + public KeyPreviewView getKeyPreviewView(final Key key, final ViewGroup placerView) { + KeyPreviewView keyPreviewView = mShowingKeyPreviewViews.remove(key); + if (keyPreviewView != null) { + return keyPreviewView; + } + keyPreviewView = mFreeKeyPreviewViews.poll(); + if (keyPreviewView != null) { + return keyPreviewView; + } + final Context context = placerView.getContext(); + keyPreviewView = new KeyPreviewView(context, null /* attrs */); + keyPreviewView.setBackgroundResource(mParams.mPreviewBackgroundResId); + placerView.addView(keyPreviewView, ViewLayoutUtils.newLayoutParam(placerView, 0, 0)); + return keyPreviewView; + } + + public boolean isShowingKeyPreview(final Key key) { + return mShowingKeyPreviewViews.containsKey(key); + } + + public void dismissAllKeyPreviews() { + for (final Key key : new HashSet<>(mShowingKeyPreviewViews.keySet())) { + dismissKeyPreview(key, false /* withAnimation */); + } + } + + public void dismissKeyPreview(final Key key, final boolean withAnimation) { + if (key == null) { + return; + } + final KeyPreviewView keyPreviewView = mShowingKeyPreviewViews.get(key); + if (keyPreviewView == null) { + return; + } + final Object tag = keyPreviewView.getTag(); + if (withAnimation) { + if (tag instanceof KeyPreviewAnimations) { + final KeyPreviewAnimations animation = (KeyPreviewAnimations)tag; + animation.startDismiss(); + return; + } + } + // Dismiss preview without animation. + mShowingKeyPreviewViews.remove(key); + if (tag instanceof Animator) { + ((Animator)tag).cancel(); + } + keyPreviewView.setTag(null); + keyPreviewView.setVisibility(View.INVISIBLE); + mFreeKeyPreviewViews.add(keyPreviewView); + } + + public void placeAndShowKeyPreview(final Key key, final KeyboardIconsSet iconsSet, + final KeyDrawParams drawParams, final int keyboardViewWidth, final int[] keyboardOrigin, + final ViewGroup placerView, final boolean withAnimation) { + final KeyPreviewView keyPreviewView = getKeyPreviewView(key, placerView); + placeKeyPreview( + key, keyPreviewView, iconsSet, drawParams, keyboardViewWidth, keyboardOrigin); + showKeyPreview(key, keyPreviewView, withAnimation); + } + + private void placeKeyPreview(final Key key, final KeyPreviewView keyPreviewView, + final KeyboardIconsSet iconsSet, final KeyDrawParams drawParams, + final int keyboardViewWidth, final int[] originCoords) { + keyPreviewView.setPreviewVisual(key, iconsSet, drawParams); + keyPreviewView.measure( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + mParams.setGeometry(keyPreviewView); + final int previewWidth = keyPreviewView.getMeasuredWidth(); + final int previewHeight = mParams.mPreviewHeight; + final int keyDrawWidth = key.getDrawWidth(); + // The key preview is horizontally aligned with the center of the visible part of the + // parent key. If it doesn't fit in this {@link KeyboardView}, it is moved inward to fit and + // the left/right background is used if such background is specified. + final int keyPreviewPosition; + int previewX = key.getDrawX() - (previewWidth - keyDrawWidth) / 2 + + CoordinateUtils.x(originCoords); + if (previewX < 0) { + previewX = 0; + keyPreviewPosition = KeyPreviewView.POSITION_LEFT; + } else if (previewX > keyboardViewWidth - previewWidth) { + previewX = keyboardViewWidth - previewWidth; + keyPreviewPosition = KeyPreviewView.POSITION_RIGHT; + } else { + keyPreviewPosition = KeyPreviewView.POSITION_MIDDLE; + } + final boolean hasMoreKeys = (key.getMoreKeys() != null); + keyPreviewView.setPreviewBackground(hasMoreKeys, keyPreviewPosition); + // The key preview is placed vertically above the top edge of the parent key with an + // arbitrary offset. + final int previewY = key.getY() - previewHeight + mParams.mPreviewOffset + + CoordinateUtils.y(originCoords); + + ViewLayoutUtils.placeViewAt( + keyPreviewView, previewX, previewY, previewWidth, previewHeight); + keyPreviewView.setPivotX(previewWidth / 2.0f); + keyPreviewView.setPivotY(previewHeight); + } + + private void showKeyPreview(final Key key, final KeyPreviewView keyPreviewView, + final boolean withAnimation) { + if (!withAnimation) { + keyPreviewView.setVisibility(View.VISIBLE); + mShowingKeyPreviewViews.put(key, keyPreviewView); + return; + } + + // Show preview with animation. + final Animator showUpAnimation = createShowUpAniation(key, keyPreviewView); + final Animator dismissAnimation = createDismissAnimation(key, keyPreviewView); + final KeyPreviewAnimations animation = new KeyPreviewAnimations( + showUpAnimation, dismissAnimation); + keyPreviewView.setTag(animation); + animation.startShowUp(); + } + + private static final float KEY_PREVIEW_SHOW_UP_END_SCALE = 1.0f; + private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = + new AccelerateInterpolator(); + private static final DecelerateInterpolator DECELERATE_INTERPOLATOR = + new DecelerateInterpolator(); + + private Animator createShowUpAniation(final Key key, final KeyPreviewView keyPreviewView) { + // TODO: Optimization for no scale animation and no duration. + final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat( + keyPreviewView, View.SCALE_X, mParams.getShowUpStartScale(), + KEY_PREVIEW_SHOW_UP_END_SCALE); + final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat( + keyPreviewView, View.SCALE_Y, mParams.getShowUpStartScale(), + KEY_PREVIEW_SHOW_UP_END_SCALE); + final AnimatorSet showUpAnimation = new AnimatorSet(); + showUpAnimation.play(scaleXAnimation).with(scaleYAnimation); + showUpAnimation.setDuration(mParams.getShowUpDuration()); + showUpAnimation.setInterpolator(DECELERATE_INTERPOLATOR); + showUpAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(final Animator animation) { + showKeyPreview(key, keyPreviewView, false /* withAnimation */); + } + }); + return showUpAnimation; + } + + private Animator createDismissAnimation(final Key key, final KeyPreviewView keyPreviewView) { + // TODO: Optimization for no scale animation and no duration. + final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat( + keyPreviewView, View.SCALE_X, mParams.getDismissEndScale()); + final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat( + keyPreviewView, View.SCALE_Y, mParams.getDismissEndScale()); + final AnimatorSet dismissAnimation = new AnimatorSet(); + dismissAnimation.play(scaleXAnimation).with(scaleYAnimation); + final int dismissDuration = Math.min( + mParams.getDismissDuration(), mParams.getLingerTimeout()); + dismissAnimation.setDuration(dismissDuration); + dismissAnimation.setInterpolator(ACCELERATE_INTERPOLATOR); + dismissAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(final Animator animation) { + dismissKeyPreview(key, false /* withAnimation */); + } + }); + return dismissAnimation; + } + + private static class KeyPreviewAnimations extends AnimatorListenerAdapter { + private final Animator mShowUpAnimation; + private final Animator mDismissAnimation; + + public KeyPreviewAnimations(final Animator showUpAnimation, + final Animator dismissAnimation) { + mShowUpAnimation = showUpAnimation; + mDismissAnimation = dismissAnimation; + } + + public void startShowUp() { + mShowUpAnimation.start(); + } + + public void startDismiss() { + if (mShowUpAnimation.isRunning()) { + mShowUpAnimation.addListener(this); + return; + } + mDismissAnimation.start(); + } + + @Override + public void onAnimationEnd(final Animator animation) { + mDismissAnimation.start(); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java index 609d1a57f..68c9831fa 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java @@ -16,7 +16,23 @@ package com.android.inputmethod.keyboard.internal; +import android.content.res.TypedArray; +import android.view.View; + +import com.android.inputmethod.latin.R; + public final class KeyPreviewDrawParams { + // XML attributes of {@link MainKeyboardView}. + public final int mPreviewOffset; + public final int mPreviewHeight; + public final int mPreviewBackgroundResId; + private int mShowUpDuration; + private int mDismissDuration; + private float mShowUpStartScale; + private float mDismissEndScale; + private int mLingerTimeout; + private boolean mShowPopup = true; + // The graphical geometry of the key preview. // <-width-> // +-------+ ^ @@ -34,11 +50,89 @@ public final class KeyPreviewDrawParams { // paddings. To align the more keys keyboard panel's visible part with the visible part of // the background, we need to record the width and height of key preview that don't include // invisible paddings. - public int mPreviewVisibleWidth; - public int mPreviewVisibleHeight; + private int mVisibleWidth; + private int mVisibleHeight; // The key preview may have an arbitrary offset and its background that may have a bottom // padding. To align the more keys keyboard and the key preview we also need to record the // offset between the top edge of parent key and the bottom of the visible part of key // preview background. - public int mPreviewVisibleOffset; + private int mVisibleOffset; + + public KeyPreviewDrawParams(final TypedArray mainKeyboardViewAttr) { + mPreviewOffset = mainKeyboardViewAttr.getDimensionPixelOffset( + R.styleable.MainKeyboardView_keyPreviewOffset, 0); + mPreviewHeight = mainKeyboardViewAttr.getDimensionPixelSize( + R.styleable.MainKeyboardView_keyPreviewHeight, 0); + mPreviewBackgroundResId = mainKeyboardViewAttr.getResourceId( + R.styleable.MainKeyboardView_keyPreviewBackground, 0); + mLingerTimeout = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_keyPreviewLingerTimeout, 0); + } + + public void setVisibleOffset(final int previewVisibleOffset) { + mVisibleOffset = previewVisibleOffset; + } + + public int getVisibleOffset() { + return mVisibleOffset; + } + + public void setGeometry(final View previewTextView) { + final int previewWidth = previewTextView.getMeasuredWidth(); + final int previewHeight = mPreviewHeight; + // The width and height of visible part of the key preview background. The content marker + // of the background 9-patch have to cover the visible part of the background. + mVisibleWidth = previewWidth - previewTextView.getPaddingLeft() + - previewTextView.getPaddingRight(); + mVisibleHeight = previewHeight - previewTextView.getPaddingTop() + - previewTextView.getPaddingBottom(); + // The distance between the top edge of the parent key and the bottom of the visible part + // of the key preview background. + setVisibleOffset(mPreviewOffset - previewTextView.getPaddingBottom()); + } + + public int getVisibleWidth() { + return mVisibleWidth; + } + + public int getVisibleHeight() { + return mVisibleHeight; + } + + public void setPopupEnabled(final boolean enabled, final int lingerTimeout) { + mShowPopup = enabled; + mLingerTimeout = lingerTimeout; + } + + public boolean isPopupEnabled() { + return mShowPopup; + } + + public int getLingerTimeout() { + return mLingerTimeout; + } + + public void setAnimationParams(final float showUpStartScale, final int showUpDuration, + final float dismissEndScale, final int dismissDuration) { + mShowUpStartScale = showUpStartScale; + mShowUpDuration = showUpDuration; + mDismissEndScale = dismissEndScale; + mDismissDuration = dismissDuration; + } + + public float getShowUpStartScale() { + return mShowUpStartScale; + } + + public int getShowUpDuration() { + return mShowUpDuration; + } + + public float getDismissEndScale() { + return mDismissEndScale; + } + + public int getDismissDuration() { + return mDismissDuration; + } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java new file mode 100644 index 000000000..360faf829 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.TextView; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.latin.R; + +/** + * The pop up key preview view. + */ +public class KeyPreviewView extends TextView { + public static final int POSITION_MIDDLE = 0; + public static final int POSITION_LEFT = 1; + public static final int POSITION_RIGHT = 2; + + public KeyPreviewView(final Context context, final AttributeSet attrs) { + this(context, attrs, 0); + } + + public KeyPreviewView(final Context context, final AttributeSet attrs, final int defStyleAttr) { + super(context, attrs, defStyleAttr); + setGravity(Gravity.CENTER); + } + + public void setPreviewVisual(final Key key, final KeyboardIconsSet iconsSet, + final KeyDrawParams drawParams) { + // What we show as preview should match what we show on a key top in onDraw(). + final int iconId = key.getIconId(); + if (iconId != KeyboardIconsSet.ICON_UNDEFINED) { + setCompoundDrawables(null, null, null, key.getPreviewIcon(iconsSet)); + setText(null); + return; + } + + setCompoundDrawables(null, null, null, null); + setTextColor(drawParams.mPreviewTextColor); + setTextSize(TypedValue.COMPLEX_UNIT_PX, key.selectPreviewTextSize(drawParams)); + setTypeface(key.selectPreviewTypeface(drawParams)); + // TODO Should take care of temporaryShiftLabel here. + setText(key.getPreviewLabel()); + } + + // Background state set + private static final int[][][] KEY_PREVIEW_BACKGROUND_STATE_TABLE = { + { // POSITION_MIDDLE + {}, + { R.attr.state_has_morekeys } + }, + { // POSITION_LEFT + { R.attr.state_left_edge }, + { R.attr.state_left_edge, R.attr.state_has_morekeys } + }, + { // POSITION_RIGHT + { R.attr.state_right_edge }, + { R.attr.state_right_edge, R.attr.state_has_morekeys } + } + }; + private static final int STATE_NORMAL = 0; + private static final int STATE_HAS_MOREKEYS = 1; + + public void setPreviewBackground(final boolean hasMoreKeys, final int position) { + final Drawable background = getBackground(); + if (background == null) { + return; + } + final int hasMoreKeysState = hasMoreKeys ? STATE_HAS_MOREKEYS : STATE_NORMAL; + background.setState(KEY_PREVIEW_BACKGROUND_STATE_TABLE[position][hasMoreKeysState]); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index 22f5b3dd1..48ba8e051 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -19,114 +19,54 @@ package com.android.inputmethod.keyboard.internal; import static com.android.inputmethod.latin.Constants.CODE_OUTPUT_TEXT; import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED; -import android.text.TextUtils; - import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.StringUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; - /** - * The string parser of more keys specification. - * The specification is comma separated texts each of which represents one "more key". - * The specification might have label or string resource reference in it. These references are - * expanded before parsing comma. - * - Label reference should be a string representation of label (!text/label_name) - * - String resource reference should be a string representation of resource (!text/resource_name) - * Each "more key" specification is one of the following: - * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText). - * - Icon followed by keyOutputText or code (!icon/icon_name|!code/code_name) - * - Icon should be a string representation of icon (!icon/icon_name). - * - Code should be a code point presented by hexadecimal string prefixed with "0x", or a string - * representation of code (!code/code_name). + * The string parser of the key specification. + * + * Each key specification is one of the following: + * - Label optionally followed by keyOutputText (keyLabel|keyOutputText). + * - Label optionally followed by code point (keyLabel|!code/code_name). + * - Icon followed by keyOutputText (!icon/icon_name|keyOutputText). + * - Icon followed by code point (!icon/icon_name|!code/code_name). + * Label and keyOutputText are one of the following: + * - Literal string. + * - Label reference represented by (!text/label_name), see {@link KeyboardTextsSet}. + * - String resource reference represented by (!text/resource_name), see {@link KeyboardTextsSet}. + * Icon is represented by (!icon/icon_name), see {@link KeyboardIconsSet}. + * Code is one of the following: + * - Code point presented by hexadecimal string prefixed with "0x" + * - Code reference represented by (!code/code_name), see {@link KeyboardCodesSet}. * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\' character. - * Note that the '\' is also parsed by XML parser and CSV parser as well. - * See {@link KeyboardIconsSet} about icon_name. + * Note that the '\' is also parsed by XML parser and {@link MoreKeySpec#splitKeySpecs(String)} + * as well. */ +// TODO: Rename to KeySpec and make this class to the key specification object. public final class KeySpecParser { - private static final boolean DEBUG = LatinImeLogger.sDBG; - - private static final int MAX_STRING_REFERENCE_INDIRECTION = 10; - // Constants for parsing. - private static final char COMMA = ','; - private static final char BACKSLASH = '\\'; - private static final char VERTICAL_BAR = '|'; - private static final String PREFIX_TEXT = "!text/"; - static final String PREFIX_ICON = "!icon/"; - private static final String PREFIX_CODE = "!code/"; + private static final char BACKSLASH = Constants.CODE_BACKSLASH; + private static final char VERTICAL_BAR = Constants.CODE_VERTICAL_BAR; private static final String PREFIX_HEX = "0x"; - private static final String ADDITIONAL_MORE_KEY_MARKER = "%"; private KeySpecParser() { // Intentional empty constructor for utility class. } - /** - * Split the text containing multiple key specifications separated by commas into an array of - * key specifications. - * A key specification can contain a character escaped by the backslash character, including a - * comma character. - * Note that an empty key specification will be eliminated from the result array. - * - * @param text the text containing multiple key specifications. - * @return an array of key specification text. Null if the specified <code>text</code> is empty - * or has no key specifications. - */ - public static String[] splitKeySpecs(final String text) { - final int size = text.length(); - if (size == 0) { - return null; - } - // Optimization for one-letter key specification. - if (size == 1) { - return text.charAt(0) == COMMA ? null : new String[] { text }; - } + private static boolean hasIcon(final String keySpec) { + return keySpec.startsWith(KeyboardIconsSet.PREFIX_ICON); + } - ArrayList<String> list = null; - int start = 0; - // The characters in question in this loop are COMMA and BACKSLASH. These characters never - // match any high or low surrogate character. So it is OK to iterate through with char - // index. - for (int pos = 0; pos < size; pos++) { - final char c = text.charAt(pos); - if (c == COMMA) { - // Skip empty entry. - if (pos - start > 0) { - if (list == null) { - list = CollectionUtils.newArrayList(); - } - list.add(text.substring(start, pos)); - } - // Skip comma - start = pos + 1; - } else if (c == BACKSLASH) { - // Skip escape character and escaped character. - pos++; - } - } - final String remain = (size - start > 0) ? text.substring(start) : null; - if (list == null) { - return remain != null ? new String[] { remain } : null; + private static boolean hasCode(final String keySpec, final int labelEnd) { + if (labelEnd <= 0 || labelEnd + 1 >= keySpec.length()) { + return false; } - if (remain != null) { - list.add(remain); + if (keySpec.startsWith(KeyboardCodesSet.PREFIX_CODE, labelEnd + 1)) { + return true; } - return list.toArray(new String[list.size()]); - } - - private static boolean hasIcon(final String moreKeySpec) { - return moreKeySpec.startsWith(PREFIX_ICON); - } - - private static boolean hasCode(final String moreKeySpec) { - final int end = indexOfLabelEnd(moreKeySpec, 0); - if (end > 0 && end + 1 < moreKeySpec.length() && moreKeySpec.startsWith( - PREFIX_CODE, end + 1)) { + // This is a workaround to have a key that has a supplementary code point. We can't put a + // string in resource as a XML entity of a supplementary code point or a surrogate pair. + if (keySpec.startsWith(PREFIX_HEX, labelEnd + 1)) { return true; } return false; @@ -151,17 +91,21 @@ public final class KeySpecParser { return sb.toString(); } - private static int indexOfLabelEnd(final String moreKeySpec, final int start) { - if (moreKeySpec.indexOf(BACKSLASH, start) < 0) { - final int end = moreKeySpec.indexOf(VERTICAL_BAR, start); - if (end == 0) { - throw new KeySpecParserError(VERTICAL_BAR + " at " + start + ": " + moreKeySpec); + private static int indexOfLabelEnd(final String keySpec) { + final int length = keySpec.length(); + if (keySpec.indexOf(BACKSLASH) < 0) { + final int labelEnd = keySpec.indexOf(VERTICAL_BAR); + if (labelEnd == 0) { + if (length == 1) { + // Treat a sole vertical bar as a special case of key label. + return -1; + } + throw new KeySpecParserError("Empty label"); } - return end; + return labelEnd; } - final int length = moreKeySpec.length(); - for (int pos = start; pos < length; pos++) { - final char c = moreKeySpec.charAt(pos); + for (int pos = 0; pos < length; pos++) { + final char c = keySpec.charAt(pos); if (c == BACKSLASH && pos + 1 < length) { // Skip escape char pos++; @@ -172,63 +116,85 @@ public final class KeySpecParser { return -1; } - public static String getLabel(final String moreKeySpec) { - if (hasIcon(moreKeySpec)) { + private static String getBeforeLabelEnd(final String keySpec, final int labelEnd) { + return (labelEnd < 0) ? keySpec : keySpec.substring(0, labelEnd); + } + + private static String getAfterLabelEnd(final String keySpec, final int labelEnd) { + return keySpec.substring(labelEnd + /* VERTICAL_BAR */1); + } + + private static void checkDoubleLabelEnd(final String keySpec, final int labelEnd) { + if (indexOfLabelEnd(getAfterLabelEnd(keySpec, labelEnd)) < 0) { + return; + } + throw new KeySpecParserError("Multiple " + VERTICAL_BAR + ": " + keySpec); + } + + public static String getLabel(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return null; + } + if (hasIcon(keySpec)) { return null; } - final int end = indexOfLabelEnd(moreKeySpec, 0); - final String label = (end > 0) ? parseEscape(moreKeySpec.substring(0, end)) - : parseEscape(moreKeySpec); - if (TextUtils.isEmpty(label)) { - throw new KeySpecParserError("Empty label: " + moreKeySpec); + final int labelEnd = indexOfLabelEnd(keySpec); + final String label = parseEscape(getBeforeLabelEnd(keySpec, labelEnd)); + if (label.isEmpty()) { + throw new KeySpecParserError("Empty label: " + keySpec); } return label; } - private static String getOutputTextInternal(final String moreKeySpec) { - final int end = indexOfLabelEnd(moreKeySpec, 0); - if (end <= 0) { + private static String getOutputTextInternal(final String keySpec, final int labelEnd) { + if (labelEnd <= 0) { return null; } - if (indexOfLabelEnd(moreKeySpec, end + 1) >= 0) { - throw new KeySpecParserError("Multiple " + VERTICAL_BAR + ": " + moreKeySpec); - } - return parseEscape(moreKeySpec.substring(end + /* VERTICAL_BAR */1)); + checkDoubleLabelEnd(keySpec, labelEnd); + return parseEscape(getAfterLabelEnd(keySpec, labelEnd)); } - static String getOutputText(final String moreKeySpec) { - if (hasCode(moreKeySpec)) { + public static String getOutputText(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return null; + } + final int labelEnd = indexOfLabelEnd(keySpec); + if (hasCode(keySpec, labelEnd)) { return null; } - final String outputText = getOutputTextInternal(moreKeySpec); + final String outputText = getOutputTextInternal(keySpec, labelEnd); if (outputText != null) { if (StringUtils.codePointCount(outputText) == 1) { // If output text is one code point, it should be treated as a code. // See {@link #getCode(Resources, String)}. return null; } - if (!TextUtils.isEmpty(outputText)) { - return outputText; + if (outputText.isEmpty()) { + throw new KeySpecParserError("Empty outputText: " + keySpec); } - throw new KeySpecParserError("Empty outputText: " + moreKeySpec); + return outputText; } - final String label = getLabel(moreKeySpec); + final String label = getLabel(keySpec); if (label == null) { - throw new KeySpecParserError("Empty label: " + moreKeySpec); + throw new KeySpecParserError("Empty label: " + keySpec); } // Code is automatically generated for one letter label. See {@link getCode()}. return (StringUtils.codePointCount(label) == 1) ? null : label; } - static int getCode(final String moreKeySpec, final KeyboardCodesSet codesSet) { - if (hasCode(moreKeySpec)) { - final int end = indexOfLabelEnd(moreKeySpec, 0); - if (indexOfLabelEnd(moreKeySpec, end + 1) >= 0) { - throw new KeySpecParserError("Multiple " + VERTICAL_BAR + ": " + moreKeySpec); - } - return parseCode(moreKeySpec.substring(end + 1), codesSet, CODE_UNSPECIFIED); + public static int getCode(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return CODE_UNSPECIFIED; + } + final int labelEnd = indexOfLabelEnd(keySpec); + if (hasCode(keySpec, labelEnd)) { + checkDoubleLabelEnd(keySpec, labelEnd); + return parseCode(getAfterLabelEnd(keySpec, labelEnd), CODE_UNSPECIFIED); } - final String outputText = getOutputTextInternal(moreKeySpec); + final String outputText = getOutputTextInternal(keySpec, labelEnd); if (outputText != null) { // If output text is one code point, it should be treated as a code. // See {@link #getOutputText(String)}. @@ -237,138 +203,41 @@ public final class KeySpecParser { } return CODE_OUTPUT_TEXT; } - final String label = getLabel(moreKeySpec); - // Code is automatically generated for one letter label. - if (StringUtils.codePointCount(label) == 1) { - return label.codePointAt(0); - } - return CODE_OUTPUT_TEXT; - } - - public static int parseCode(final String text, final KeyboardCodesSet codesSet, - final int defCode) { - if (text == null) return defCode; - if (text.startsWith(PREFIX_CODE)) { - return codesSet.getCode(text.substring(PREFIX_CODE.length())); - } else if (text.startsWith(PREFIX_HEX)) { - return Integer.parseInt(text.substring(PREFIX_HEX.length()), 16); - } else { - return Integer.parseInt(text); - } - } - - public static int getIconId(final String moreKeySpec) { - if (moreKeySpec != null && hasIcon(moreKeySpec)) { - final int end = moreKeySpec.indexOf(VERTICAL_BAR, PREFIX_ICON.length()); - final String name = (end < 0) ? moreKeySpec.substring(PREFIX_ICON.length()) - : moreKeySpec.substring(PREFIX_ICON.length(), end); - return KeyboardIconsSet.getIconId(name); - } - return KeyboardIconsSet.ICON_UNDEFINED; - } - - private static <T> ArrayList<T> arrayAsList(final T[] array, final int start, final int end) { - if (array == null) { - throw new NullPointerException(); - } - if (start < 0 || start > end || end > array.length) { - throw new IllegalArgumentException(); - } - - final ArrayList<T> list = CollectionUtils.newArrayList(end - start); - for (int i = start; i < end; i++) { - list.add(array[i]); + final String label = getLabel(keySpec); + if (label == null) { + throw new KeySpecParserError("Empty label: " + keySpec); } - return list; + // Code is automatically generated for one letter label. + return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT; } - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - - private static String[] filterOutEmptyString(final String[] array) { - if (array == null) { - return EMPTY_STRING_ARRAY; + public static int parseCode(final String text, final int defaultCode) { + if (text == null) { + return defaultCode; } - ArrayList<String> out = null; - for (int i = 0; i < array.length; i++) { - final String entry = array[i]; - if (TextUtils.isEmpty(entry)) { - if (out == null) { - out = arrayAsList(array, 0, i); - } - } else if (out != null) { - out.add(entry); - } + if (text.startsWith(KeyboardCodesSet.PREFIX_CODE)) { + return KeyboardCodesSet.getCode(text.substring(KeyboardCodesSet.PREFIX_CODE.length())); } - if (out == null) { - return array; + // This is a workaround to have a key that has a supplementary code point. We can't put a + // string in resource as a XML entity of a supplementary code point or a surrogate pair. + if (text.startsWith(PREFIX_HEX)) { + return Integer.parseInt(text.substring(PREFIX_HEX.length()), 16); } - return out.toArray(new String[out.size()]); + return defaultCode; } - public static String[] insertAdditionalMoreKeys(final String[] moreKeySpecs, - final String[] additionalMoreKeySpecs) { - final String[] moreKeys = filterOutEmptyString(moreKeySpecs); - final String[] additionalMoreKeys = filterOutEmptyString(additionalMoreKeySpecs); - final int moreKeysCount = moreKeys.length; - final int additionalCount = additionalMoreKeys.length; - ArrayList<String> out = null; - int additionalIndex = 0; - for (int moreKeyIndex = 0; moreKeyIndex < moreKeysCount; moreKeyIndex++) { - final String moreKeySpec = moreKeys[moreKeyIndex]; - if (moreKeySpec.equals(ADDITIONAL_MORE_KEY_MARKER)) { - if (additionalIndex < additionalCount) { - // Replace '%' marker with additional more key specification. - final String additionalMoreKey = additionalMoreKeys[additionalIndex]; - if (out != null) { - out.add(additionalMoreKey); - } else { - moreKeys[moreKeyIndex] = additionalMoreKey; - } - additionalIndex++; - } else { - // Filter out excessive '%' marker. - if (out == null) { - out = arrayAsList(moreKeys, 0, moreKeyIndex); - } - } - } else { - if (out != null) { - out.add(moreKeySpec); - } - } + public static int getIconId(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return KeyboardIconsSet.ICON_UNDEFINED; } - if (additionalCount > 0 && additionalIndex == 0) { - // No '%' marker is found in more keys. - // Insert all additional more keys to the head of more keys. - if (DEBUG && out != null) { - throw new RuntimeException("Internal logic error:" - + " moreKeys=" + Arrays.toString(moreKeys) - + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); - } - out = arrayAsList(additionalMoreKeys, additionalIndex, additionalCount); - for (int i = 0; i < moreKeysCount; i++) { - out.add(moreKeys[i]); - } - } else if (additionalIndex < additionalCount) { - // The number of '%' markers are less than additional more keys. - // Append remained additional more keys to the tail of more keys. - if (DEBUG && out != null) { - throw new RuntimeException("Internal logic error:" - + " moreKeys=" + Arrays.toString(moreKeys) - + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); - } - out = arrayAsList(moreKeys, 0, moreKeysCount); - for (int i = additionalIndex; i < additionalCount; i++) { - out.add(additionalMoreKeys[additionalIndex]); - } - } - if (out == null && moreKeysCount > 0) { - return moreKeys; - } else if (out != null && out.size() > 0) { - return out.toArray(new String[out.size()]); - } else { - return null; + if (!hasIcon(keySpec)) { + return KeyboardIconsSet.ICON_UNDEFINED; } + final int labelEnd = indexOfLabelEnd(keySpec); + final String iconName = getBeforeLabelEnd(keySpec, labelEnd) + .substring(KeyboardIconsSet.PREFIX_ICON.length()); + return KeyboardIconsSet.getIconId(iconName); } @SuppressWarnings("serial") @@ -377,122 +246,4 @@ public final class KeySpecParser { super(message); } } - - public static String resolveTextReference(final String rawText, - final KeyboardTextsSet textsSet) { - int level = 0; - String text = rawText; - StringBuilder sb; - do { - level++; - if (level >= MAX_STRING_REFERENCE_INDIRECTION) { - throw new RuntimeException("too many @string/resource indirection: " + text); - } - - final int prefixLen = PREFIX_TEXT.length(); - final int size = text.length(); - if (size < prefixLen) { - return text; - } - - sb = null; - for (int pos = 0; pos < size; pos++) { - final char c = text.charAt(pos); - if (text.startsWith(PREFIX_TEXT, pos) && textsSet != null) { - if (sb == null) { - sb = new StringBuilder(text.substring(0, pos)); - } - final int end = searchTextNameEnd(text, pos + prefixLen); - final String name = text.substring(pos + prefixLen, end); - sb.append(textsSet.getText(name)); - pos = end - 1; - } else if (c == BACKSLASH) { - if (sb != null) { - // Append both escape character and escaped character. - sb.append(text.substring(pos, Math.min(pos + 2, size))); - } - pos++; - } else if (sb != null) { - sb.append(c); - } - } - - if (sb != null) { - text = sb.toString(); - } - } while (sb != null); - return text; - } - - private static int searchTextNameEnd(final String text, final int start) { - final int size = text.length(); - for (int pos = start; pos < size; pos++) { - final char c = text.charAt(pos); - // Label name should be consisted of [a-zA-Z_0-9]. - if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')) { - continue; - } - return pos; - } - return size; - } - - public static int getIntValue(final String[] moreKeys, final String key, - final int defaultValue) { - if (moreKeys == null) { - return defaultValue; - } - final int keyLen = key.length(); - boolean foundValue = false; - int value = defaultValue; - for (int i = 0; i < moreKeys.length; i++) { - final String moreKeySpec = moreKeys[i]; - if (moreKeySpec == null || !moreKeySpec.startsWith(key)) { - continue; - } - moreKeys[i] = null; - try { - if (!foundValue) { - value = Integer.parseInt(moreKeySpec.substring(keyLen)); - foundValue = true; - } - } catch (NumberFormatException e) { - throw new RuntimeException( - "integer should follow after " + key + ": " + moreKeySpec); - } - } - return value; - } - - public static boolean getBooleanValue(final String[] moreKeys, final String key) { - if (moreKeys == null) { - return false; - } - boolean value = false; - for (int i = 0; i < moreKeys.length; i++) { - final String moreKeySpec = moreKeys[i]; - if (moreKeySpec == null || !moreKeySpec.equals(key)) { - continue; - } - moreKeys[i] = null; - value = true; - } - return value; - } - - public static int toUpperCaseOfCodeForLocale(final int code, final boolean needsToUpperCase, - final Locale locale) { - if (!Constants.isLetterCode(code) || !needsToUpperCase) return code; - final String text = new String(new int[] { code } , 0, 1); - final String casedText = KeySpecParser.toUpperCaseOfStringForLocale( - text, needsToUpperCase, locale); - return StringUtils.codePointCount(casedText) == 1 - ? casedText.codePointAt(0) : CODE_UNSPECIFIED; - } - - public static String toUpperCaseOfStringForLocale(final String text, - final boolean needsToUpperCase, final Locale locale) { - if (text == null || !needsToUpperCase) return text; - return text.toUpperCase(locale); - } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyle.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyle.java index e6a674334..7941ddd41 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyle.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyle.java @@ -32,15 +32,15 @@ public abstract class KeyStyle { protected String parseString(final TypedArray a, final int index) { if (a.hasValue(index)) { - return KeySpecParser.resolveTextReference(a.getString(index), mTextsSet); + return mTextsSet.resolveTextReference(a.getString(index)); } return null; } protected String[] parseStringArray(final TypedArray a, final int index) { if (a.hasValue(index)) { - final String text = KeySpecParser.resolveTextReference(a.getString(index), mTextsSet); - return KeySpecParser.splitKeySpecs(text); + final String text = mTextsSet.resolveTextReference(a.getString(index)); + return MoreKeySpec.splitKeySpecs(text); } return null; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java index 05d855e31..0b0e761d2 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java @@ -21,19 +21,19 @@ import android.util.Log; import android.util.SparseArray; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.XmlParseUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import java.util.Arrays; import java.util.HashMap; public final class KeyStylesSet { private static final String TAG = KeyStylesSet.class.getSimpleName(); private static final boolean DEBUG = false; - private final HashMap<String, KeyStyle> mStyles = CollectionUtils.newHashMap(); + private final HashMap<String, KeyStyle> mStyles = new HashMap<>(); private final KeyboardTextsSet mTextsSet; private final KeyStyle mEmptyKeyStyle; @@ -74,7 +74,7 @@ public final class KeyStylesSet { private static final class DeclaredKeyStyle extends KeyStyle { private final HashMap<String, KeyStyle> mStyles; private final String mParentStyleName; - private final SparseArray<Object> mStyleAttributes = CollectionUtils.newSparseArray(); + private final SparseArray<Object> mStyleAttributes = new SparseArray<>(); public DeclaredKeyStyle(final String parentStyleName, final KeyboardTextsSet textsSet, final HashMap<String, KeyStyle> styles) { @@ -90,7 +90,8 @@ public final class KeyStylesSet { } final Object value = mStyleAttributes.get(index); if (value != null) { - return (String[])value; + final String[] array = (String[])value; + return Arrays.copyOf(array, array.length); } final KeyStyle parentStyle = mStyles.get(mParentStyleName); return parentStyle.getStringArray(a, index); @@ -133,15 +134,12 @@ public final class KeyStylesSet { public void readKeyAttributes(final TypedArray keyAttr) { // TODO: Currently not all Key attributes can be declared as style. - readString(keyAttr, R.styleable.Keyboard_Key_code); readString(keyAttr, R.styleable.Keyboard_Key_altCode); - readString(keyAttr, R.styleable.Keyboard_Key_keyLabel); - readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText); + readString(keyAttr, R.styleable.Keyboard_Key_keySpec); readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys); readFlags(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags); - readString(keyAttr, R.styleable.Keyboard_Key_keyIcon); readString(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled); readString(keyAttr, R.styleable.Keyboard_Key_keyIconPreview); readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java b/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java index 8bdad364c..133462ac7 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyVisualAttributes.java @@ -16,7 +16,6 @@ package com.android.inputmethod.keyboard.internal; -import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.Typeface; import android.util.SparseIntArray; @@ -38,15 +37,18 @@ public final class KeyVisualAttributes { public final float mHintLabelRatio; public final float mPreviewTextRatio; - public final ColorStateList mTextColorStateList; + public final int mTextColor; public final int mTextInactivatedColor; public final int mTextShadowColor; + public final int mFunctionalTextColor; public final int mHintLetterColor; public final int mHintLabelColor; public final int mShiftedLetterHintInactivatedColor; public final int mShiftedLetterHintActivatedColor; public final int mPreviewTextColor; + public final float mHintLabelVerticalAdjustment; + private static final int[] VISUAL_ATTRIBUTE_IDS = { R.styleable.Keyboard_Key_keyTypeface, R.styleable.Keyboard_Key_keyLetterSize, @@ -60,11 +62,13 @@ public final class KeyVisualAttributes { R.styleable.Keyboard_Key_keyTextColor, R.styleable.Keyboard_Key_keyTextInactivatedColor, R.styleable.Keyboard_Key_keyTextShadowColor, + R.styleable.Keyboard_Key_functionalTextColor, R.styleable.Keyboard_Key_keyHintLetterColor, R.styleable.Keyboard_Key_keyHintLabelColor, R.styleable.Keyboard_Key_keyShiftedLetterHintInactivatedColor, R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, R.styleable.Keyboard_Key_keyPreviewTextColor, + R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, }; private static final SparseIntArray sVisualAttributeIds = new SparseIntArray(); private static final int ATTR_DEFINED = 1; @@ -116,10 +120,11 @@ public final class KeyVisualAttributes { mPreviewTextRatio = ResourceUtils.getFraction(keyAttr, R.styleable.Keyboard_Key_keyPreviewTextRatio); - mTextColorStateList = keyAttr.getColorStateList(R.styleable.Keyboard_Key_keyTextColor); + mTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextColor, 0); mTextInactivatedColor = keyAttr.getColor( R.styleable.Keyboard_Key_keyTextInactivatedColor, 0); mTextShadowColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyTextShadowColor, 0); + mFunctionalTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_functionalTextColor, 0); mHintLetterColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLetterColor, 0); mHintLabelColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyHintLabelColor, 0); mShiftedLetterHintInactivatedColor = keyAttr.getColor( @@ -127,5 +132,8 @@ public final class KeyVisualAttributes { mShiftedLetterHintActivatedColor = keyAttr.getColor( R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0); mPreviewTextColor = keyAttr.getColor(R.styleable.Keyboard_Key_keyPreviewTextColor, 0); + + mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr, + R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index c1ae65695..8bff27574 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -21,6 +21,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.os.Build; +import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; @@ -33,17 +34,16 @@ import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.ResourceUtils; -import com.android.inputmethod.latin.utils.RunInLocale; import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.XmlParseUtils; +import com.android.inputmethod.latin.utils.XmlParseUtils.ParseException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.Arrays; -import java.util.Locale; /** * Keyboard Building helper. @@ -276,20 +276,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0); params.mIconsSet.loadIcons(keyboardAttr); - final String language = params.mId.mLocale.getLanguage(); - params.mCodesSet.setLanguage(language); - params.mTextsSet.setLanguage(language); - final RunInLocale<Void> job = new RunInLocale<Void>() { - @Override - protected Void job(final Resources res) { - params.mTextsSet.loadStringResources(mContext); - return null; - } - }; - // Null means the current system locale. - final Locale locale = SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype) - ? null : params.mId.mLocale; - job.runInLocale(mResources, locale); + params.mTextsSet.setLocale(params.mId.mLocale, mContext); final int resourceId = keyboardAttr.getResourceId( R.styleable.Keyboard_touchPositionCorrectionData, 0); @@ -456,11 +443,16 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (Build.VERSION.SDK_INT < supportedMinSdkVersion) { continue; } + final int labelFlags = row.getDefaultKeyLabelFlags(); + // TODO: Should be able to assign default keyActionFlags as well. + final int backgroundType = row.getDefaultBackgroundType(); final int x = (int)row.getKeyX(null); final int y = row.getKeyY(); - final Key key = new Key(mParams, label, null /* hintLabel */, 0 /* iconId */, - code, outputText, x, y, (int)keyWidth, (int)row.getRowHeight(), - row.getDefaultKeyLabelFlags(), row.getDefaultBackgroundType()); + final int width = (int)keyWidth; + final int height = row.getRowHeight(); + final Key key = new Key(label, KeyboardIconsSet.ICON_UNDEFINED, code, outputText, + null /* hintLabel */, labelFlags, backgroundType, x, y, width, height, + mParams.mHorizontalGap, mParams.mVerticalGap); endKey(key); row.advanceXPos(keyWidth); } @@ -477,7 +469,15 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (DEBUG) startEndTag("<%s /> skipped", TAG_KEY); return; } - final Key key = new Key(mResources, mParams, row, parser); + final TypedArray keyAttr = mResources.obtainAttributes( + Xml.asAttributeSet(parser), R.styleable.Keyboard_Key); + final KeyStyle keyStyle = mParams.mKeyStyles.getKeyStyle(keyAttr, parser); + final String keySpec = keyStyle.getString(keyAttr, R.styleable.Keyboard_Key_keySpec); + if (TextUtils.isEmpty(keySpec)) { + throw new ParseException("Empty keySpec", parser); + } + final Key key = new Key(keySpec, keyAttr, keyStyle, mParams, row); + keyAttr.recycle(); if (DEBUG) { startEndTag("<%s%s %s moreKeys=%s />", TAG_KEY, (key.isEnabled() ? "" : " disabled"), key, Arrays.toString(key.getMoreKeys())); @@ -493,7 +493,11 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (DEBUG) startEndTag("<%s /> skipped", TAG_SPACER); return; } - final Key.Spacer spacer = new Key.Spacer(mResources, mParams, row, parser); + final TypedArray keyAttr = mResources.obtainAttributes( + Xml.asAttributeSet(parser), R.styleable.Keyboard_Key); + final KeyStyle keyStyle = mParams.mKeyStyles.getKeyStyle(keyAttr, parser); + final Key spacer = new Key.Spacer(keyAttr, keyStyle, mParams, row); + keyAttr.recycle(); if (DEBUG) startEndTag("<%s />", TAG_SPACER); XmlParseUtils.checkEndTag(TAG_SPACER, parser); endKey(spacer); @@ -649,10 +653,6 @@ public class KeyboardBuilder<KP extends KeyboardParams> { R.styleable.Keyboard_Case_passwordInput, id.passwordInput()); final boolean clobberSettingsKeyMatched = matchBoolean(caseAttr, R.styleable.Keyboard_Case_clobberSettingsKey, id.mClobberSettingsKey); - final boolean shortcutKeyEnabledMatched = matchBoolean(caseAttr, - R.styleable.Keyboard_Case_shortcutKeyEnabled, id.mShortcutKeyEnabled); - final boolean shortcutKeyOnSymbolsMatched = matchBoolean(caseAttr, - R.styleable.Keyboard_Case_shortcutKeyOnSymbols, id.mShortcutKeyOnSymbols); final boolean hasShortcutKeyMatched = matchBoolean(caseAttr, R.styleable.Keyboard_Case_hasShortcutKey, id.mHasShortcutKey); final boolean languageSwitchKeyEnabledMatched = matchBoolean(caseAttr, @@ -662,6 +662,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { R.styleable.Keyboard_Case_isMultiLine, id.isMultiLine()); final boolean imeActionMatched = matchInteger(caseAttr, R.styleable.Keyboard_Case_imeAction, id.imeAction()); + final boolean isIconDefinedMatched = isIconDefined(caseAttr, + R.styleable.Keyboard_Case_isIconDefined, mParams.mIconsSet); final boolean localeCodeMatched = matchString(caseAttr, R.styleable.Keyboard_Case_localeCode, id.mLocale.toString()); final boolean languageCodeMatched = matchString(caseAttr, @@ -670,14 +672,13 @@ public class KeyboardBuilder<KP extends KeyboardParams> { R.styleable.Keyboard_Case_countryCode, id.mLocale.getCountry()); final boolean selected = keyboardLayoutSetMatched && keyboardLayoutSetElementMatched && modeMatched && navigateNextMatched && navigatePreviousMatched - && passwordInputMatched && clobberSettingsKeyMatched - && shortcutKeyEnabledMatched && shortcutKeyOnSymbolsMatched - && hasShortcutKeyMatched && languageSwitchKeyEnabledMatched - && isMultiLineMatched && imeActionMatched && localeCodeMatched - && languageCodeMatched && countryCodeMatched; + && passwordInputMatched && clobberSettingsKeyMatched && hasShortcutKeyMatched + && languageSwitchKeyEnabledMatched && isMultiLineMatched && imeActionMatched + && isIconDefinedMatched && localeCodeMatched && languageCodeMatched + && countryCodeMatched; if (DEBUG) { - startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE, + startTag("<%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s>%s", TAG_CASE, textAttr(caseAttr.getString( R.styleable.Keyboard_Case_keyboardLayoutSet), "keyboardLayoutSet"), textAttr(caseAttr.getString( @@ -694,16 +695,14 @@ public class KeyboardBuilder<KP extends KeyboardParams> { "clobberSettingsKey"), booleanAttr(caseAttr, R.styleable.Keyboard_Case_passwordInput, "passwordInput"), - booleanAttr(caseAttr, R.styleable.Keyboard_Case_shortcutKeyEnabled, - "shortcutKeyEnabled"), - booleanAttr(caseAttr, R.styleable.Keyboard_Case_shortcutKeyOnSymbols, - "shortcutKeyOnSymbols"), booleanAttr(caseAttr, R.styleable.Keyboard_Case_hasShortcutKey, "hasShortcutKey"), booleanAttr(caseAttr, R.styleable.Keyboard_Case_languageSwitchKeyEnabled, "languageSwitchKeyEnabled"), booleanAttr(caseAttr, R.styleable.Keyboard_Case_isMultiLine, "isMultiLine"), + textAttr(caseAttr.getString(R.styleable.Keyboard_Case_isIconDefined), + "isIconDefined"), textAttr(caseAttr.getString(R.styleable.Keyboard_Case_localeCode), "localeCode"), textAttr(caseAttr.getString(R.styleable.Keyboard_Case_languageCode), @@ -755,6 +754,16 @@ public class KeyboardBuilder<KP extends KeyboardParams> { return false; } + private static boolean isIconDefined(final TypedArray a, final int index, + final KeyboardIconsSet iconsSet) { + if (!a.hasValue(index)) { + return true; + } + final String iconName = a.getString(index); + final int iconId = KeyboardIconsSet.getIconId(iconName); + return iconsSet.getIconDrawable(iconId) != null; + } + private boolean parseDefault(final XmlPullParser parser, final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException { if (DEBUG) startTag("<%s>", TAG_DEFAULT); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java index dc815e57d..62b69dcc9 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java @@ -17,25 +17,22 @@ package com.android.inputmethod.keyboard.internal; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.HashMap; public final class KeyboardCodesSet { - private static final HashMap<String, int[]> sLanguageToCodesMap = CollectionUtils.newHashMap(); - private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap(); + public static final String PREFIX_CODE = "!code/"; - private int[] mCodes = DEFAULT; + private static final HashMap<String, Integer> sNameToIdMap = new HashMap<>(); - public void setLanguage(final String language) { - final int[] codes = sLanguageToCodesMap.get(language); - mCodes = (codes != null) ? codes : DEFAULT; + private KeyboardCodesSet() { + // This utility class is not publicly instantiable. } - public int getCode(final String name) { + public static int getCode(final String name) { Integer id = sNameToIdMap.get(name); if (id == null) throw new RuntimeException("Unknown key code: " + name); - return mCodes[id]; + return DEFAULT[id]; } private static final String[] ID_TO_NAME = { @@ -54,27 +51,10 @@ public final class KeyboardCodesSet { "key_shift_enter", "key_language_switch", "key_emoji", + "key_alpha_from_emoji", "key_unspecified", - "key_left_parenthesis", - "key_right_parenthesis", - "key_less_than", - "key_greater_than", - "key_left_square_bracket", - "key_right_square_bracket", - "key_left_curly_bracket", - "key_right_curly_bracket", }; - private static final int CODE_LEFT_PARENTHESIS = '('; - private static final int CODE_RIGHT_PARENTHESIS = ')'; - private static final int CODE_LESS_THAN_SIGN = '<'; - private static final int CODE_GREATER_THAN_SIGN = '>'; - private static final int CODE_LEFT_SQUARE_BRACKET = '['; - private static final int CODE_RIGHT_SQUARE_BRACKET = ']'; - private static final int CODE_LEFT_CURLY_BRACKET = '{'; - private static final int CODE_RIGHT_CURLY_BRACKET = '}'; - - // This array should be aligned with the array RTL below. private static final int[] DEFAULT = { Constants.CODE_TAB, Constants.CODE_ENTER, @@ -91,68 +71,13 @@ public final class KeyboardCodesSet { Constants.CODE_SHIFT_ENTER, Constants.CODE_LANGUAGE_SWITCH, Constants.CODE_EMOJI, + Constants.CODE_ALPHA_FROM_EMOJI, Constants.CODE_UNSPECIFIED, - CODE_LEFT_PARENTHESIS, - CODE_RIGHT_PARENTHESIS, - CODE_LESS_THAN_SIGN, - CODE_GREATER_THAN_SIGN, - CODE_LEFT_SQUARE_BRACKET, - CODE_RIGHT_SQUARE_BRACKET, - CODE_LEFT_CURLY_BRACKET, - CODE_RIGHT_CURLY_BRACKET, - }; - - private static final int[] RTL = { - DEFAULT[0], - DEFAULT[1], - DEFAULT[2], - DEFAULT[3], - DEFAULT[4], - DEFAULT[5], - DEFAULT[6], - DEFAULT[7], - DEFAULT[8], - DEFAULT[9], - DEFAULT[10], - DEFAULT[11], - DEFAULT[12], - DEFAULT[13], - DEFAULT[14], - DEFAULT[15], - CODE_RIGHT_PARENTHESIS, - CODE_LEFT_PARENTHESIS, - CODE_GREATER_THAN_SIGN, - CODE_LESS_THAN_SIGN, - CODE_RIGHT_SQUARE_BRACKET, - CODE_LEFT_SQUARE_BRACKET, - CODE_RIGHT_CURLY_BRACKET, - CODE_LEFT_CURLY_BRACKET, - }; - - private static final String LANGUAGE_DEFAULT = "DEFAULT"; - private static final String LANGUAGE_ARABIC = "ar"; - private static final String LANGUAGE_PERSIAN = "fa"; - private static final String LANGUAGE_HEBREW = "iw"; - - private static final Object[] LANGUAGE_AND_CODES = { - LANGUAGE_DEFAULT, DEFAULT, - LANGUAGE_ARABIC, RTL, - LANGUAGE_PERSIAN, RTL, - LANGUAGE_HEBREW, RTL, }; static { - if (DEFAULT.length != RTL.length || DEFAULT.length != ID_TO_NAME.length) { - throw new RuntimeException("Internal inconsistency"); - } for (int i = 0; i < ID_TO_NAME.length; i++) { sNameToIdMap.put(ID_TO_NAME[i], i); } - - for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) { - final String language = (String)LANGUAGE_AND_CODES[i]; - final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1]; - sLanguageToCodesMap.put(language, codes); - } } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java index 336db186e..7146deb4b 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java @@ -23,45 +23,73 @@ import android.util.Log; import android.util.SparseIntArray; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.HashMap; public final class KeyboardIconsSet { private static final String TAG = KeyboardIconsSet.class.getSimpleName(); + public static final String PREFIX_ICON = "!icon/"; public static final int ICON_UNDEFINED = 0; private static final int ATTR_UNDEFINED = 0; + private static final String NAME_UNDEFINED = "undefined"; + public static final String NAME_SHIFT_KEY = "shift_key"; + public static final String NAME_SHIFT_KEY_SHIFTED = "shift_key_shifted"; + public static final String NAME_DELETE_KEY = "delete_key"; + public static final String NAME_SETTINGS_KEY = "settings_key"; + public static final String NAME_SPACE_KEY = "space_key"; + public static final String NAME_SPACE_KEY_FOR_NUMBER_LAYOUT = "space_key_for_number_layout"; + public static final String NAME_ENTER_KEY = "enter_key"; + public static final String NAME_GO_KEY = "go_key"; + public static final String NAME_SEARCH_KEY = "search_key"; + public static final String NAME_SEND_KEY = "send_key"; + public static final String NAME_NEXT_KEY = "next_key"; + public static final String NAME_DONE_KEY = "done_key"; + public static final String NAME_PREVIOUS_KEY = "previous_key"; + public static final String NAME_TAB_KEY = "tab_key"; + public static final String NANE_TAB_KEY_PREVIEW = "tab_key_preview"; + public static final String NAME_SHORTCUT_KEY = "shortcut_key"; + public static final String NAME_SHORTCUT_KEY_DISABLED = "shortcut_key_disabled"; + public static final String NAME_LANGUAGE_SWITCH_KEY = "language_switch_key"; + public static final String NAME_ZWNJ_KEY = "zwnj_key"; + public static final String NAME_ZWJ_KEY = "zwj_key"; + public static final String NAME_EMOJI_KEY = "emoji_key"; + private static final SparseIntArray ATTR_ID_TO_ICON_ID = new SparseIntArray(); // Icon name to icon id map. - private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap(); + private static final HashMap<String, Integer> sNameToIdsMap = new HashMap<>(); private static final Object[] NAMES_AND_ATTR_IDS = { - "undefined", ATTR_UNDEFINED, - "shift_key", R.styleable.Keyboard_iconShiftKey, - "delete_key", R.styleable.Keyboard_iconDeleteKey, - "settings_key", R.styleable.Keyboard_iconSettingsKey, - "space_key", R.styleable.Keyboard_iconSpaceKey, - "enter_key", R.styleable.Keyboard_iconEnterKey, - "search_key", R.styleable.Keyboard_iconSearchKey, - "tab_key", R.styleable.Keyboard_iconTabKey, - "shortcut_key", R.styleable.Keyboard_iconShortcutKey, - "shortcut_for_label", R.styleable.Keyboard_iconShortcutForLabel, - "space_key_for_number_layout", R.styleable.Keyboard_iconSpaceKeyForNumberLayout, - "shift_key_shifted", R.styleable.Keyboard_iconShiftKeyShifted, - "shortcut_key_disabled", R.styleable.Keyboard_iconShortcutKeyDisabled, - "tab_key_preview", R.styleable.Keyboard_iconTabKeyPreview, - "language_switch_key", R.styleable.Keyboard_iconLanguageSwitchKey, - "zwnj_key", R.styleable.Keyboard_iconZwnjKey, - "zwj_key", R.styleable.Keyboard_iconZwjKey, - "emoji_key", R.styleable.Keyboard_iconEmojiKey, + NAME_UNDEFINED, ATTR_UNDEFINED, + NAME_SHIFT_KEY, R.styleable.Keyboard_iconShiftKey, + NAME_DELETE_KEY, R.styleable.Keyboard_iconDeleteKey, + NAME_SETTINGS_KEY, R.styleable.Keyboard_iconSettingsKey, + NAME_SPACE_KEY, R.styleable.Keyboard_iconSpaceKey, + NAME_ENTER_KEY, R.styleable.Keyboard_iconEnterKey, + NAME_GO_KEY, R.styleable.Keyboard_iconGoKey, + NAME_SEARCH_KEY, R.styleable.Keyboard_iconSearchKey, + NAME_SEND_KEY, R.styleable.Keyboard_iconSendKey, + NAME_NEXT_KEY, R.styleable.Keyboard_iconNextKey, + NAME_DONE_KEY, R.styleable.Keyboard_iconDoneKey, + NAME_PREVIOUS_KEY, R.styleable.Keyboard_iconPreviousKey, + NAME_TAB_KEY, R.styleable.Keyboard_iconTabKey, + NAME_SHORTCUT_KEY, R.styleable.Keyboard_iconShortcutKey, + NAME_SPACE_KEY_FOR_NUMBER_LAYOUT, R.styleable.Keyboard_iconSpaceKeyForNumberLayout, + NAME_SHIFT_KEY_SHIFTED, R.styleable.Keyboard_iconShiftKeyShifted, + NAME_SHORTCUT_KEY_DISABLED, R.styleable.Keyboard_iconShortcutKeyDisabled, + NANE_TAB_KEY_PREVIEW, R.styleable.Keyboard_iconTabKeyPreview, + NAME_LANGUAGE_SWITCH_KEY, R.styleable.Keyboard_iconLanguageSwitchKey, + NAME_ZWNJ_KEY, R.styleable.Keyboard_iconZwnjKey, + NAME_ZWJ_KEY, R.styleable.Keyboard_iconZwjKey, + NAME_EMOJI_KEY, R.styleable.Keyboard_iconEmojiKey, }; private static int NUM_ICONS = NAMES_AND_ATTR_IDS.length / 2; private static final String[] ICON_NAMES = new String[NUM_ICONS]; private final Drawable[] mIcons = new Drawable[NUM_ICONS]; + private final int[] mIconResourceIds = new int[NUM_ICONS]; static { int iconId = ICON_UNDEFINED; @@ -69,7 +97,7 @@ public final class KeyboardIconsSet { final String name = (String)NAMES_AND_ATTR_IDS[i]; final Integer attrId = (Integer)NAMES_AND_ATTR_IDS[i + 1]; if (attrId != ATTR_UNDEFINED) { - ATTR_ID_TO_ICON_ID.put(attrId, iconId); + ATTR_ID_TO_ICON_ID.put(attrId, iconId); } sNameToIdsMap.put(name, iconId); ICON_NAMES[iconId] = name; @@ -86,6 +114,7 @@ public final class KeyboardIconsSet { setDefaultBounds(icon); final Integer iconId = ATTR_ID_TO_ICON_ID.get(attrId); mIcons[iconId] = icon; + mIconResourceIds[iconId] = keyboardAttrs.getResourceId(attrId, 0); } catch (Resources.NotFoundException e) { Log.w(TAG, "Drawable resource for icon #" + keyboardAttrs.getResources().getResourceEntryName(attrId) @@ -102,7 +131,7 @@ public final class KeyboardIconsSet { return isValidIconId(iconId) ? ICON_NAMES[iconId] : "unknown<" + iconId + ">"; } - static int getIconId(final String name) { + public static int getIconId(final String name) { Integer iconId = sNameToIdsMap.get(name); if (iconId != null) { return iconId; @@ -110,6 +139,14 @@ public final class KeyboardIconsSet { throw new RuntimeException("unknown icon name: " + name); } + public int getIconResourceId(final String name) { + final int iconId = getIconId(name); + if (isValidIconId(iconId)) { + return mIconResourceIds[iconId]; + } + throw new RuntimeException("unknown icon name: " + name); + } + public Drawable getIconDrawable(final int iconId) { if (isValidIconId(iconId)) { return mIcons[iconId]; diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java index d32bb7581..5df9d3ece 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java @@ -21,9 +21,10 @@ import android.util.SparseIntArray; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; +import java.util.Comparator; +import java.util.SortedSet; import java.util.TreeSet; public class KeyboardParams { @@ -58,11 +59,11 @@ public class KeyboardParams { public int GRID_WIDTH; public int GRID_HEIGHT; - public final TreeSet<Key> mKeys = CollectionUtils.newTreeSet(); // ordered set - public final ArrayList<Key> mShiftKeys = CollectionUtils.newArrayList(); - public final ArrayList<Key> mAltCodeKeysWhileTyping = CollectionUtils.newArrayList(); + // Keys are sorted from top-left to bottom-right order. + public final SortedSet<Key> mSortedKeys = new TreeSet<>(ROW_COLUMN_COMPARATOR); + public final ArrayList<Key> mShiftKeys = new ArrayList<>(); + public final ArrayList<Key> mAltCodeKeysWhileTyping = new ArrayList<>(); public final KeyboardIconsSet mIconsSet = new KeyboardIconsSet(); - public final KeyboardCodesSet mCodesSet = new KeyboardCodesSet(); public final KeyboardTextsSet mTextsSet = new KeyboardTextsSet(); public final KeyStylesSet mKeyStyles = new KeyStylesSet(mTextsSet); @@ -76,8 +77,20 @@ public class KeyboardParams { public final TouchPositionCorrection mTouchPositionCorrection = new TouchPositionCorrection(); + // Comparator to sort {@link Key}s from top-left to bottom-right order. + private static final Comparator<Key> ROW_COLUMN_COMPARATOR = new Comparator<Key>() { + @Override + public int compare(final Key lhs, final Key rhs) { + if (lhs.getY() < rhs.getY()) return -1; + if (lhs.getY() > rhs.getY()) return 1; + if (lhs.getX() < rhs.getX()) return -1; + if (lhs.getX() > rhs.getX()) return 1; + return 0; + } + }; + protected void clearKeys() { - mKeys.clear(); + mSortedKeys.clear(); mShiftKeys.clear(); clearHistogram(); } @@ -89,7 +102,7 @@ public class KeyboardParams { // Ignore zero width {@link Spacer}. return; } - mKeys.add(key); + mSortedKeys.add(key); if (isSpacer) { return; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java index 0f9497c27..92daf0742 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java @@ -23,7 +23,6 @@ import android.util.Xml; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.ResourceUtils; import org.xmlpull.v1.XmlPullParser; @@ -44,8 +43,9 @@ public final class KeyboardRow { /** The height of this row. */ private final int mRowHeight; - private final ArrayDeque<RowAttributes> mRowAttributesStack = CollectionUtils.newArrayDeque(); + private final ArrayDeque<RowAttributes> mRowAttributesStack = new ArrayDeque<>(); + // TODO: Add keyActionFlags. private static class RowAttributes { /** Default width of a key in this row. */ public final float mDefaultKeyWidth; diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java index dd98c1703..b98ced97c 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java @@ -27,10 +27,10 @@ import com.android.inputmethod.latin.utils.RecapitalizeStatus; * * This class contains all keyboard state transition logic. * - * The input events are {@link #onLoadKeyboard()}, {@link #onSaveKeyboardState()}, - * {@link #onPressKey(int,boolean,int)}, {@link #onReleaseKey(int,boolean)}, - * {@link #onCodeInput(int,int)}, {@link #onFinishSlidingInput()}, - * {@link #onUpdateShiftState(int,int)}, {@link #onResetKeyboardStateToAlphabet()}. + * The input events are {@link #onLoadKeyboard(int, int)}, {@link #onSaveKeyboardState()}, + * {@link #onPressKey(int,boolean,int,int)}, {@link #onReleaseKey(int,boolean,int,int)}, + * {@link #onCodeInput(int,int,int)}, {@link #onFinishSlidingInput(int,int)}, + * {@link #onUpdateShiftState(int,int)}, {@link #onResetKeyboardStateToAlphabet(int,int)}. * * The actions are {@link SwitchActions}'s methods. */ @@ -52,7 +52,8 @@ public final class KeyboardState { /** * Request to call back {@link KeyboardState#onUpdateShiftState(int, int)}. */ - public void requestUpdatingShiftState(); + public void requestUpdatingShiftState(final int currentAutoCapsState, + final int currentRecapitalizeState); public void startDoubleTapShiftKeyTimer(); public boolean isInDoubleTapShiftKeyTimeout(); @@ -117,7 +118,8 @@ public final class KeyboardState { mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; } - public void onLoadKeyboard() { + public void onLoadKeyboard(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_EVENT) { Log.d(TAG, "onLoadKeyboard: " + this); } @@ -127,7 +129,7 @@ public final class KeyboardState { mPrevSymbolsKeyboardWasShifted = false; mShiftKeyState.onRelease(); mSymbolKeyState.onRelease(); - onRestoreKeyboardState(); + onRestoreKeyboardState(currentAutoCapsState, currentRecapitalizeState); } private static final int UNSHIFT = 0; @@ -153,13 +155,14 @@ public final class KeyboardState { } } - private void onRestoreKeyboardState() { + private void onRestoreKeyboardState(final int currentAutoCapsState, + final int currentRecapitalizeState) { final SavedKeyboardState state = mSavedKeyboardState; if (DEBUG_EVENT) { Log.d(TAG, "onRestoreKeyboardState: saved=" + state + " " + this); } if (!state.mIsValid || state.mIsAlphabetMode) { - setAlphabetKeyboard(); + setAlphabetKeyboard(currentAutoCapsState, currentRecapitalizeState); } else if (state.mIsEmojiMode) { setEmojiKeyboard(); } else { @@ -237,7 +240,8 @@ public final class KeyboardState { mAlphabetShiftState.setShiftLocked(shiftLocked); } - private void toggleAlphabetAndSymbols() { + private void toggleAlphabetAndSymbols(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_ACTION) { Log.d(TAG, "toggleAlphabetAndSymbols: " + this); } @@ -251,7 +255,7 @@ public final class KeyboardState { mPrevSymbolsKeyboardWasShifted = false; } else { mPrevSymbolsKeyboardWasShifted = mIsSymbolShifted; - setAlphabetKeyboard(); + setAlphabetKeyboard(currentAutoCapsState, currentRecapitalizeState); if (mPrevMainKeyboardWasShiftLocked) { setShiftLocked(true); } @@ -261,14 +265,15 @@ public final class KeyboardState { // TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout // when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal(). - private void resetKeyboardStateToAlphabet() { + private void resetKeyboardStateToAlphabet(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_ACTION) { Log.d(TAG, "resetKeyboardStateToAlphabet: " + this); } if (mIsAlphabetMode) return; mPrevSymbolsKeyboardWasShifted = mIsSymbolShifted; - setAlphabetKeyboard(); + setAlphabetKeyboard(currentAutoCapsState, currentRecapitalizeState); if (mPrevMainKeyboardWasShiftLocked) { setShiftLocked(true); } @@ -283,7 +288,8 @@ public final class KeyboardState { } } - private void setAlphabetKeyboard() { + private void setAlphabetKeyboard(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_ACTION) { Log.d(TAG, "setAlphabetKeyboard"); } @@ -294,7 +300,7 @@ public final class KeyboardState { mIsSymbolShifted = false; mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; mSwitchState = SWITCH_STATE_ALPHA; - mSwitchActions.requestUpdatingShiftState(); + mSwitchActions.requestUpdatingShiftState(currentAutoCapsState, currentRecapitalizeState); } private void setSymbolsKeyboard() { @@ -304,6 +310,7 @@ public final class KeyboardState { mSwitchActions.setSymbolsKeyboard(); mIsAlphabetMode = false; mIsSymbolShifted = false; + mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; // Reset alphabet shift state. mAlphabetShiftState.setShiftLocked(false); mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; @@ -316,6 +323,7 @@ public final class KeyboardState { mSwitchActions.setSymbolsShiftedKeyboard(); mIsAlphabetMode = false; mIsSymbolShifted = true; + mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; // Reset alphabet shift state. mAlphabetShiftState.setShiftLocked(false); mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; @@ -327,16 +335,18 @@ public final class KeyboardState { } mIsAlphabetMode = false; mIsEmojiMode = true; + mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; // Remember caps lock mode and reset alphabet shift state. mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked(); mAlphabetShiftState.setShiftLocked(false); mSwitchActions.setEmojiKeyboard(); } - public void onPressKey(final int code, final boolean isSinglePointer, final int autoCaps) { + public void onPressKey(final int code, final boolean isSinglePointer, + final int currentAutoCapsState, final int currentRecapitalizeState) { if (DEBUG_EVENT) { - Log.d(TAG, "onPressKey: code=" + Constants.printableCode(code) - + " single=" + isSinglePointer + " autoCaps=" + autoCaps + " " + this); + Log.d(TAG, "onPressKey: code=" + Constants.printableCode(code) + " single=" + + isSinglePointer + " autoCaps=" + currentAutoCapsState + " " + this); } if (code != Constants.CODE_SHIFT) { // Because the double tap shift key timer is to detect two consecutive shift key press, @@ -348,7 +358,7 @@ public final class KeyboardState { } else if (code == Constants.CODE_CAPSLOCK) { // Nothing to do here. See {@link #onReleaseKey(int,boolean)}. } else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) { - onPressSymbol(); + onPressSymbol(currentAutoCapsState, currentRecapitalizeState); } else { mShiftKeyState.onOtherKeyPressed(); mSymbolKeyState.onOtherKeyPressed(); @@ -360,7 +370,8 @@ public final class KeyboardState { // As for #3, please note that it's required to check even when the auto caps mode is // off because, for example, we may be in the #1 state within the manual temporary // shifted mode. - if (!isSinglePointer && mIsAlphabetMode && autoCaps != TextUtils.CAP_MODE_CHARACTERS) { + if (!isSinglePointer && mIsAlphabetMode + && currentAutoCapsState != TextUtils.CAP_MODE_CHARACTERS) { final boolean needsToResetAutoCaps = mAlphabetShiftState.isAutomaticShifted() || (mAlphabetShiftState.isManualShifted() && mShiftKeyState.isReleasing()); if (needsToResetAutoCaps) { @@ -370,31 +381,34 @@ public final class KeyboardState { } } - public void onReleaseKey(final int code, final boolean withSliding) { + public void onReleaseKey(final int code, final boolean withSliding, + final int currentAutoCapsState, final int currentRecapitalizeState) { if (DEBUG_EVENT) { Log.d(TAG, "onReleaseKey: code=" + Constants.printableCode(code) + " sliding=" + withSliding + " " + this); } if (code == Constants.CODE_SHIFT) { - onReleaseShift(withSliding); + onReleaseShift(withSliding, currentAutoCapsState, currentRecapitalizeState); } else if (code == Constants.CODE_CAPSLOCK) { setShiftLocked(!mAlphabetShiftState.isShiftLocked()); } else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) { - onReleaseSymbol(withSliding); + onReleaseSymbol(withSliding, currentAutoCapsState, currentRecapitalizeState); } } - private void onPressSymbol() { - toggleAlphabetAndSymbols(); + private void onPressSymbol(final int currentAutoCapsState, + final int currentRecapitalizeState) { + toggleAlphabetAndSymbols(currentAutoCapsState, currentRecapitalizeState); mSymbolKeyState.onPress(); mSwitchState = SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL; } - private void onReleaseSymbol(final boolean withSliding) { + private void onReleaseSymbol(final boolean withSliding, final int currentAutoCapsState, + final int currentRecapitalizeState) { if (mSymbolKeyState.isChording()) { // Switch back to the previous keyboard mode if the user chords the mode change key and // another key, then releases the mode change key. - toggleAlphabetAndSymbols(); + toggleAlphabetAndSymbols(currentAutoCapsState, currentRecapitalizeState); } else if (!withSliding) { // If the mode change key is being released without sliding, we should forget the // previous symbols keyboard shift state and simply switch back to symbols layout @@ -415,11 +429,12 @@ public final class KeyboardState { // TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout // when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal(). - public void onResetKeyboardStateToAlphabet() { + public void onResetKeyboardStateToAlphabet(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_EVENT) { Log.d(TAG, "onResetKeyboardStateToAlphabet: " + this); } - resetKeyboardStateToAlphabet(); + resetKeyboardStateToAlphabet(currentAutoCapsState, currentRecapitalizeState); } private void updateShiftStateForRecapitalize(final int recapitalizeMode) { @@ -510,7 +525,8 @@ public final class KeyboardState { } } - private void onReleaseShift(final boolean withSliding) { + private void onReleaseShift(final boolean withSliding, final int currentAutoCapsState, + final int currentRecapitalizeState) { if (RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE != mRecapitalizeMode) { // We are recapitalizing. We should match the keyboard state to the recapitalize // state in priority. @@ -533,7 +549,8 @@ public final class KeyboardState { // After chording input, automatic shift state may have been changed depending on // what characters were input. mShiftKeyState.onRelease(); - mSwitchActions.requestUpdatingShiftState(); + mSwitchActions.requestUpdatingShiftState(currentAutoCapsState, + currentRecapitalizeState); return; } else if (mAlphabetShiftState.isShiftLockShifted() && withSliding) { // In shift locked state, shift has been pressed and slid out to other key. @@ -570,20 +587,21 @@ public final class KeyboardState { mShiftKeyState.onRelease(); } - public void onFinishSlidingInput() { + public void onFinishSlidingInput(final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_EVENT) { Log.d(TAG, "onFinishSlidingInput: " + this); } // Switch back to the previous keyboard mode if the user cancels sliding input. switch (mSwitchState) { case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: - toggleAlphabetAndSymbols(); + toggleAlphabetAndSymbols(currentAutoCapsState, currentRecapitalizeState); break; case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: toggleShiftInSymbols(); break; case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: - setAlphabetKeyboard(); + setAlphabetKeyboard(currentAutoCapsState, currentRecapitalizeState); break; } } @@ -592,10 +610,11 @@ public final class KeyboardState { return c == Constants.CODE_SPACE || c == Constants.CODE_ENTER; } - public void onCodeInput(final int code, final int autoCaps) { + public void onCodeInput(final int code, final int currentAutoCapsState, + final int currentRecapitalizeState) { if (DEBUG_EVENT) { Log.d(TAG, "onCodeInput: code=" + Constants.printableCode(code) - + " autoCaps=" + autoCaps + " " + this); + + " autoCaps=" + currentAutoCapsState + " " + this); } switch (mSwitchState) { @@ -631,7 +650,7 @@ public final class KeyboardState { // Switch back to alpha keyboard mode if user types one or more non-space/enter // characters followed by a space/enter. if (isSpaceOrEnter(code)) { - toggleAlphabetAndSymbols(); + toggleAlphabetAndSymbols(currentAutoCapsState, currentRecapitalizeState); mPrevSymbolsKeyboardWasShifted = false; } break; @@ -639,9 +658,11 @@ public final class KeyboardState { // If the code is a letter, update keyboard shift state. if (Constants.isLetterCode(code)) { - updateAlphabetShiftState(autoCaps, RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE); + updateAlphabetShiftState(currentAutoCapsState, currentRecapitalizeState); } else if (code == Constants.CODE_EMOJI) { setEmojiKeyboard(); + } else if (code == Constants.CODE_ALPHA_FROM_EMOJI) { + setAlphabetKeyboard(currentAutoCapsState, currentRecapitalizeState); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java index c2a01b5e8..cd6abeed3 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java @@ -18,3504 +18,132 @@ package com.android.inputmethod.keyboard.internal; import android.content.Context; import android.content.res.Resources; +import android.text.TextUtils; import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.utils.RunInLocale; +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import java.util.HashMap; +import java.util.Locale; -/** - * !!!!! DO NOT EDIT THIS FILE !!!!! - * - * This file is generated by tools/make-keyboard-text. The base template file is - * tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl - * - * This file must be updated when any text resources in keyboard layout files have been changed. - * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions, - * and should be defined in - * tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml - * - * To update this file, please run the following commands. - * $ cd $ANDROID_BUILD_TOP - * $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text - * $ make-keyboard-text -java packages/inputmethods/LatinIME/java/src - * - * The updated source file will be generated to the following path (this file). - * packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/ - * KeyboardTextsSet.java - */ public final class KeyboardTextsSet { - // Language to texts map. - private static final HashMap<String, String[]> sLocaleToTextsMap = CollectionUtils.newHashMap(); - private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap(); + public static final String PREFIX_TEXT = "!text/"; + public static final String SWITCH_TO_ALPHA_KEY_LABEL = "keylabel_to_alpha"; - private String[] mTexts; - // Resource name to text map. - private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap(); + private static final char BACKSLASH = Constants.CODE_BACKSLASH; + private static final int MAX_STRING_REFERENCE_INDIRECTION = 10; - public void setLanguage(final String language) { - mTexts = sLocaleToTextsMap.get(language); - if (mTexts == null) { - mTexts = LANGUAGE_DEFAULT; - } - } + private String[] mTextsTable; + // Resource name to text map. + private HashMap<String, String> mResourceNameToTextsMap = new HashMap<>(); - public void loadStringResources(final Context context) { + public void setLocale(final Locale locale, final Context context) { + mTextsTable = KeyboardTextsTable.getTextsTable(locale); + final Resources res = context.getResources(); final int referenceId = context.getApplicationInfo().labelRes; - loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId); + final String resourcePackageName = res.getResourcePackageName(referenceId); + final RunInLocale<Void> job = new RunInLocale<Void>() { + @Override + protected Void job(final Resources resource) { + loadStringResourcesInternal(res, RESOURCE_NAMES, resourcePackageName); + return null; + } + }; + // Null means the current system locale. + job.runInLocale(res, + SubtypeLocaleUtils.NO_LANGUAGE.equals(locale.toString()) ? null : locale); } @UsedForTesting - void loadStringResourcesInternal(final Context context, final String[] resourceNames, - final int referenceId) { - final Resources res = context.getResources(); - final String packageName = res.getResourcePackageName(referenceId); + void loadStringResourcesInternal(final Resources res, final String[] resourceNames, + final String resourcePackageName) { for (final String resName : resourceNames) { - final int resId = res.getIdentifier(resName, "string", packageName); + final int resId = res.getIdentifier(resName, "string", resourcePackageName); mResourceNameToTextsMap.put(resName, res.getString(resId)); } } public String getText(final String name) { - String text = mResourceNameToTextsMap.get(name); - if (text != null) { - return text; + final String text = mResourceNameToTextsMap.get(name); + return (text != null) ? text : KeyboardTextsTable.getText(name, mTextsTable); + } + + private static int searchTextNameEnd(final String text, final int start) { + final int size = text.length(); + for (int pos = start; pos < size; pos++) { + final char c = text.charAt(pos); + // Label name should be consisted of [a-zA-Z_0-9]. + if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')) { + continue; + } + return pos; } - final Integer id = sNameToIdsMap.get(name); - if (id == null) throw new RuntimeException("Unknown label: " + name); - text = (id < mTexts.length) ? mTexts[id] : null; - return (text == null) ? LANGUAGE_DEFAULT[id] : text; + return size; } - private static final String[] RESOURCE_NAMES = { - // These texts' name should be aligned with the @string/<name> in values/strings.xml. + // TODO: Resolve text reference when creating {@link KeyboardTextsTable} class. + public String resolveTextReference(final String rawText) { + if (TextUtils.isEmpty(rawText)) { + return null; + } + int level = 0; + String text = rawText; + StringBuilder sb; + do { + level++; + if (level >= MAX_STRING_REFERENCE_INDIRECTION) { + throw new RuntimeException("Too many " + PREFIX_TEXT + "name indirection: " + text); + } + + final int prefixLen = PREFIX_TEXT.length(); + final int size = text.length(); + if (size < prefixLen) { + break; + } + + sb = null; + for (int pos = 0; pos < size; pos++) { + final char c = text.charAt(pos); + if (text.startsWith(PREFIX_TEXT, pos)) { + if (sb == null) { + sb = new StringBuilder(text.substring(0, pos)); + } + final int end = searchTextNameEnd(text, pos + prefixLen); + final String name = text.substring(pos + prefixLen, end); + sb.append(getText(name)); + pos = end - 1; + } else if (c == BACKSLASH) { + if (sb != null) { + // Append both escape character and escaped character. + sb.append(text.substring(pos, Math.min(pos + 2, size))); + } + pos++; + } else if (sb != null) { + sb.append(c); + } + } + + if (sb != null) { + text = sb.toString(); + } + } while (sb != null); + return TextUtils.isEmpty(text) ? null : text; + } + + // These texts' name should be aligned with the @string/<name> in + // values*/strings-action-keys.xml. + static final String[] RESOURCE_NAMES = { // Labels for action. "label_go_key", - // "label_search_key", "label_send_key", "label_next_key", "label_done_key", + "label_search_key", "label_previous_key", // Other labels. "label_pause_key", "label_wait_key", }; - - private static final String[] NAMES = { - /* 0 */ "more_keys_for_a", - /* 1 */ "more_keys_for_e", - /* 2 */ "more_keys_for_i", - /* 3 */ "more_keys_for_o", - /* 4 */ "more_keys_for_u", - /* 5 */ "more_keys_for_s", - /* 6 */ "more_keys_for_n", - /* 7 */ "more_keys_for_c", - /* 8 */ "more_keys_for_y", - /* 9 */ "more_keys_for_d", - /* 10 */ "more_keys_for_r", - /* 11 */ "more_keys_for_t", - /* 12 */ "more_keys_for_z", - /* 13 */ "more_keys_for_k", - /* 14 */ "more_keys_for_l", - /* 15 */ "more_keys_for_g", - /* 16 */ "more_keys_for_v", - /* 17 */ "more_keys_for_h", - /* 18 */ "more_keys_for_j", - /* 19 */ "more_keys_for_w", - /* 20 */ "keylabel_for_nordic_row1_11", - /* 21 */ "keylabel_for_nordic_row2_10", - /* 22 */ "keylabel_for_nordic_row2_11", - /* 23 */ "more_keys_for_nordic_row2_10", - /* 24 */ "more_keys_for_nordic_row2_11", - /* 25 */ "keylabel_for_east_slavic_row1_9", - /* 26 */ "keylabel_for_east_slavic_row1_12", - /* 27 */ "keylabel_for_east_slavic_row2_1", - /* 28 */ "keylabel_for_east_slavic_row2_11", - /* 29 */ "keylabel_for_east_slavic_row3_5", - /* 30 */ "more_keys_for_cyrillic_u", - /* 31 */ "more_keys_for_cyrillic_ka", - /* 32 */ "more_keys_for_cyrillic_en", - /* 33 */ "more_keys_for_cyrillic_ghe", - /* 34 */ "more_keys_for_east_slavic_row2_1", - /* 35 */ "more_keys_for_cyrillic_a", - /* 36 */ "more_keys_for_cyrillic_o", - /* 37 */ "more_keys_for_cyrillic_soft_sign", - /* 38 */ "more_keys_for_east_slavic_row2_11", - /* 39 */ "keylabel_for_south_slavic_row1_6", - /* 40 */ "keylabel_for_south_slavic_row2_11", - /* 41 */ "keylabel_for_south_slavic_row3_1", - /* 42 */ "keylabel_for_south_slavic_row3_8", - /* 43 */ "more_keys_for_cyrillic_ie", - /* 44 */ "more_keys_for_cyrillic_i", - /* 45 */ "label_to_alpha_key", - /* 46 */ "single_quotes", - /* 47 */ "double_quotes", - /* 48 */ "single_angle_quotes", - /* 49 */ "double_angle_quotes", - /* 50 */ "more_keys_for_currency_dollar", - /* 51 */ "keylabel_for_currency", - /* 52 */ "more_keys_for_currency", - /* 53 */ "more_keys_for_punctuation", - /* 54 */ "more_keys_for_star", - /* 55 */ "more_keys_for_bullet", - /* 56 */ "more_keys_for_plus", - /* 57 */ "more_keys_for_left_parenthesis", - /* 58 */ "more_keys_for_right_parenthesis", - /* 59 */ "more_keys_for_less_than", - /* 60 */ "more_keys_for_greater_than", - /* 61 */ "more_keys_for_arabic_diacritics", - /* 62 */ "keyhintlabel_for_arabic_diacritics", - /* 63 */ "keylabel_for_symbols_1", - /* 64 */ "keylabel_for_symbols_2", - /* 65 */ "keylabel_for_symbols_3", - /* 66 */ "keylabel_for_symbols_4", - /* 67 */ "keylabel_for_symbols_5", - /* 68 */ "keylabel_for_symbols_6", - /* 69 */ "keylabel_for_symbols_7", - /* 70 */ "keylabel_for_symbols_8", - /* 71 */ "keylabel_for_symbols_9", - /* 72 */ "keylabel_for_symbols_0", - /* 73 */ "label_to_symbol_key", - /* 74 */ "label_to_symbol_with_microphone_key", - /* 75 */ "additional_more_keys_for_symbols_1", - /* 76 */ "additional_more_keys_for_symbols_2", - /* 77 */ "additional_more_keys_for_symbols_3", - /* 78 */ "additional_more_keys_for_symbols_4", - /* 79 */ "additional_more_keys_for_symbols_5", - /* 80 */ "additional_more_keys_for_symbols_6", - /* 81 */ "additional_more_keys_for_symbols_7", - /* 82 */ "additional_more_keys_for_symbols_8", - /* 83 */ "additional_more_keys_for_symbols_9", - /* 84 */ "additional_more_keys_for_symbols_0", - /* 85 */ "more_keys_for_symbols_1", - /* 86 */ "more_keys_for_symbols_2", - /* 87 */ "more_keys_for_symbols_3", - /* 88 */ "more_keys_for_symbols_4", - /* 89 */ "more_keys_for_symbols_5", - /* 90 */ "more_keys_for_symbols_6", - /* 91 */ "more_keys_for_symbols_7", - /* 92 */ "more_keys_for_symbols_8", - /* 93 */ "more_keys_for_symbols_9", - /* 94 */ "more_keys_for_symbols_0", - /* 95 */ "keylabel_for_comma", - /* 96 */ "more_keys_for_comma", - /* 97 */ "keylabel_for_symbols_question", - /* 98 */ "keylabel_for_symbols_semicolon", - /* 99 */ "keylabel_for_symbols_percent", - /* 100 */ "more_keys_for_symbols_exclamation", - /* 101 */ "more_keys_for_symbols_question", - /* 102 */ "more_keys_for_symbols_semicolon", - /* 103 */ "more_keys_for_symbols_percent", - /* 104 */ "keylabel_for_tablet_comma", - /* 105 */ "keyhintlabel_for_tablet_comma", - /* 106 */ "more_keys_for_tablet_comma", - /* 107 */ "keyhintlabel_for_period", - /* 108 */ "more_keys_for_period", - /* 109 */ "keylabel_for_apostrophe", - /* 110 */ "keyhintlabel_for_apostrophe", - /* 111 */ "more_keys_for_apostrophe", - /* 112 */ "more_keys_for_q", - /* 113 */ "more_keys_for_x", - /* 114 */ "keylabel_for_q", - /* 115 */ "keylabel_for_w", - /* 116 */ "keylabel_for_y", - /* 117 */ "keylabel_for_x", - /* 118 */ "keylabel_for_spanish_row2_10", - /* 119 */ "more_keys_for_am_pm", - /* 120 */ "settings_as_more_key", - /* 121 */ "shortcut_as_more_key", - /* 122 */ "action_next_as_more_key", - /* 123 */ "action_previous_as_more_key", - /* 124 */ "label_to_more_symbol_key", - /* 125 */ "label_to_more_symbol_for_tablet_key", - /* 126 */ "label_tab_key", - /* 127 */ "label_to_phone_numeric_key", - /* 128 */ "label_to_phone_symbols_key", - /* 129 */ "label_time_am", - /* 130 */ "label_time_pm", - /* 131 */ "keylabel_for_popular_domain", - /* 132 */ "more_keys_for_popular_domain", - /* 133 */ "more_keys_for_smiley", - /* 134 */ "single_laqm_raqm", - /* 135 */ "single_laqm_raqm_rtl", - /* 136 */ "single_raqm_laqm", - /* 137 */ "double_laqm_raqm", - /* 138 */ "double_laqm_raqm_rtl", - /* 139 */ "double_raqm_laqm", - /* 140 */ "single_lqm_rqm", - /* 141 */ "single_9qm_lqm", - /* 142 */ "single_9qm_rqm", - /* 143 */ "double_lqm_rqm", - /* 144 */ "double_9qm_lqm", - /* 145 */ "double_9qm_rqm", - /* 146 */ "more_keys_for_single_quote", - /* 147 */ "more_keys_for_double_quote", - /* 148 */ "more_keys_for_tablet_double_quote", - /* 149 */ "emoji_key_as_more_key", - }; - - private static final String EMPTY = ""; - - /* Default texts */ - private static final String[] LANGUAGE_DEFAULT = { - /* 0~ */ - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - /* ~44 */ - // Label for "switch to alphabetic" key. - /* 45 */ "ABC", - /* 46 */ "!text/single_lqm_rqm", - /* 47 */ "!text/double_lqm_rqm", - /* 48 */ "!text/single_laqm_raqm", - /* 49 */ "!text/double_laqm_raqm", - // U+00A2: "¢" CENT SIGN - // U+00A3: "£" POUND SIGN - // U+20AC: "€" EURO SIGN - // U+00A5: "¥" YEN SIGN - // U+20B1: "₱" PESO SIGN - /* 50 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1", - /* 51 */ "$", - /* 52 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1", - /* 53 */ "!fixedColumnOrder!8,;,/,(,),#,!,\\,,?,&,\\%,+,\",-,:,',@", - // U+2020: "†" DAGGER - // U+2021: "‡" DOUBLE DAGGER - // U+2605: "★" BLACK STAR - /* 54 */ "\u2020,\u2021,\u2605", - // U+266A: "♪" EIGHTH NOTE - // U+2665: "♥" BLACK HEART SUIT - // U+2660: "♠" BLACK SPADE SUIT - // U+2666: "♦" BLACK DIAMOND SUIT - // U+2663: "♣" BLACK CLUB SUIT - /* 55 */ "\u266A,\u2665,\u2660,\u2666,\u2663", - // U+00B1: "±" PLUS-MINUS SIGN - /* 56 */ "\u00B1", - // The all letters need to be mirrored are found at - // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt - /* 57 */ "!fixedColumnOrder!3,<,{,[", - /* 58 */ "!fixedColumnOrder!3,>,},]", - // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - // U+2264: "≤" LESS-THAN OR EQUAL TO - // U+2265: "≥" GREATER-THAN EQUAL TO - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - /* 59 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB", - /* 60 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB", - /* 61 */ EMPTY, - /* 62 */ EMPTY, - /* 63 */ "1", - /* 64 */ "2", - /* 65 */ "3", - /* 66 */ "4", - /* 67 */ "5", - /* 68 */ "6", - /* 69 */ "7", - /* 70 */ "8", - /* 71 */ "9", - /* 72 */ "0", - // Label for "switch to symbols" key. - /* 73 */ "?123", - // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic" - // part because it'll be appended by the code. - /* 74 */ "123", - /* 75~ */ - EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, - /* ~84 */ - // U+00B9: "¹" SUPERSCRIPT ONE - // U+00BD: "½" VULGAR FRACTION ONE HALF - // U+2153: "⅓" VULGAR FRACTION ONE THIRD - // U+00BC: "¼" VULGAR FRACTION ONE QUARTER - // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH - /* 85 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B", - // U+00B2: "²" SUPERSCRIPT TWO - // U+2154: "⅔" VULGAR FRACTION TWO THIRDS - /* 86 */ "\u00B2,\u2154", - // U+00B3: "³" SUPERSCRIPT THREE - // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS - // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS - /* 87 */ "\u00B3,\u00BE,\u215C", - // U+2074: "⁴" SUPERSCRIPT FOUR - /* 88 */ "\u2074", - // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS - /* 89 */ "\u215D", - /* 90 */ EMPTY, - // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS - /* 91 */ "\u215E", - /* 92 */ EMPTY, - /* 93 */ EMPTY, - // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N - // U+2205: "∅" EMPTY SET - /* 94 */ "\u207F,\u2205", - /* 95 */ ",", - /* 96 */ EMPTY, - /* 97 */ "?", - /* 98 */ ";", - /* 99 */ "%", - // U+00A1: "¡" INVERTED EXCLAMATION MARK - /* 100 */ "\u00A1", - // U+00BF: "¿" INVERTED QUESTION MARK - /* 101 */ "\u00BF", - /* 102 */ EMPTY, - // U+2030: "‰" PER MILLE SIGN - /* 103 */ "\u2030", - /* 104 */ ",", - /* 105~ */ - EMPTY, EMPTY, EMPTY, - /* ~107 */ - // U+2026: "…" HORIZONTAL ELLIPSIS - /* 108 */ "\u2026", - /* 109 */ "\'", - /* 110 */ "\"", - /* 111 */ "\"", - /* 112 */ EMPTY, - /* 113 */ EMPTY, - /* 114 */ "q", - /* 115 */ "w", - /* 116 */ "y", - /* 117 */ "x", - /* 118 */ EMPTY, - /* 119 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm", - /* 120 */ "!icon/settings_key|!code/key_settings", - /* 121 */ "!icon/shortcut_key|!code/key_shortcut", - /* 122 */ "!hasLabels!,!text/label_next_key|!code/key_action_next", - /* 123 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous", - // Label for "switch to more symbol" modifier key. Must be short to fit on key! - /* 124 */ "= \\ <", - // Label for "switch to more symbol" modifier key on tablets. Must be short to fit on key! - /* 125 */ "~ [ <", - // Label for "Tab" key. Must be short to fit on key! - /* 126 */ "Tab", - // Label for "switch to phone numeric" key. Must be short to fit on key! - /* 127 */ "123", - // Label for "switch to phone symbols" key. Must be short to fit on key! - // U+FF0A: "*" FULLWIDTH ASTERISK - // U+FF03: "#" FULLWIDTH NUMBER SIGN - /* 128 */ "\uFF0A\uFF03", - // Key label for "ante meridiem" - /* 129 */ "AM", - // Key label for "post meridiem" - /* 130 */ "PM", - /* 131 */ ".com", - // popular web domains for the locale - most popular, displayed on the keyboard - /* 132 */ "!hasLabels!,.net,.org,.gov,.edu", - /* 133 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ", - // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - // The following characters don't need BIDI mirroring. - // U+2018: "‘" LEFT SINGLE QUOTATION MARK - // U+2019: "’" RIGHT SINGLE QUOTATION MARK - // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK - // U+201C: "“" LEFT DOUBLE QUOTATION MARK - // U+201D: "”" RIGHT DOUBLE QUOTATION MARK - // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK - // Abbreviations are: - // laqm: LEFT-POINTING ANGLE QUOTATION MARK - // raqm: RIGHT-POINTING ANGLE QUOTATION MARK - // rtl: Right-To-Left script order - // lqm: LEFT QUOTATION MARK - // rqm: RIGHT QUOTATION MARK - // 9qm: LOW-9 QUOTATION MARK - // The following each quotation mark pair consist of - // <opening quotation mark>, <closing quotation mark> - // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. - /* 134 */ "\u2039,\u203A", - /* 135 */ "\u2039|\u203A,\u203A|\u2039", - /* 136 */ "\u203A,\u2039", - /* 137 */ "\u00AB,\u00BB", - /* 138 */ "\u00AB|\u00BB,\u00BB|\u00AB", - /* 139 */ "\u00BB,\u00AB", - // The following each quotation mark triplet consists of - // <another quotation mark>, <opening quotation mark>, <closing quotation mark> - // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. - /* 140 */ "\u201A,\u2018,\u2019", - /* 141 */ "\u2019,\u201A,\u2018", - /* 142 */ "\u2018,\u201A,\u2019", - /* 143 */ "\u201E,\u201C,\u201D", - /* 144 */ "\u201D,\u201E,\u201C", - /* 145 */ "\u201C,\u201E,\u201D", - /* 146 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes", - /* 147 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes", - /* 148 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes", - /* 149 */ "!icon/emoji_key|!code/key_emoji", - }; - - /* Language af: Afrikaans */ - private static final String[] LANGUAGE_af = { - // This is the same as Dutch except more keys of y and demoting vowels with diaeresis. - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 2 */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B", - /* 5 */ null, - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - /* 7 */ null, - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 8 */ "\u00FD,\u0133", - }; - - /* Language ar: Arabic */ - private static final String[] LANGUAGE_ar = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0623: "ا" ARABIC LETTER ALEF - // U+200C: ZERO WIDTH NON-JOINER - // U+0628: "ب" ARABIC LETTER BEH - // U+062C: "پ" ARABIC LETTER PEH - /* 45 */ "\u0623\u200C\u0628\u200C\u062C", - /* 46 */ null, - /* 47 */ null, - /* 48 */ "!text/single_laqm_raqm_rtl", - /* 49 */ "!text/double_laqm_raqm_rtl", - /* 50~ */ - null, null, null, - /* ~52 */ - // U+061F: "؟" ARABIC QUESTION MARK - // U+060C: "،" ARABIC COMMA - // U+061B: "؛" ARABIC SEMICOLON - /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(", - // U+2605: "★" BLACK STAR - // U+066D: "٭" ARABIC FIVE POINTED STAR - /* 54 */ "\u2605,\u066D", - // U+266A: "♪" EIGHTH NOTE - /* 55 */ "\u266A", - /* 56 */ null, - // The all letters need to be mirrored are found at - // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt - // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS - // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS - /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]", - /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[", - // U+2264: "≤" LESS-THAN OR EQUAL TO - // U+2265: "≥" GREATER-THAN EQUAL TO - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB", - /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB", - // U+0655: "ٕ" ARABIC HAMZA BELOW - // U+0654: "ٔ" ARABIC HAMZA ABOVE - // U+0652: "ْ" ARABIC SUKUN - // U+064D: "ٍ" ARABIC KASRATAN - // U+064C: "ٌ" ARABIC DAMMATAN - // U+064B: "ً" ARABIC FATHATAN - // U+0651: "ّ" ARABIC SHADDA - // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF - // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF - // U+0653: "ٓ" ARABIC MADDAH ABOVE - // U+0650: "ِ" ARABIC KASRA - // U+064F: "ُ" ARABIC DAMMA - // U+064E: "َ" ARABIC FATHA - // U+0640: "ـ" ARABIC TATWEEL - // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. - // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly. - /* 61 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640", - /* 62 */ "\u0651", - // U+0661: "١" ARABIC-INDIC DIGIT ONE - /* 63 */ "\u0661", - // U+0662: "٢" ARABIC-INDIC DIGIT TWO - /* 64 */ "\u0662", - // U+0663: "٣" ARABIC-INDIC DIGIT THREE - /* 65 */ "\u0663", - // U+0664: "٤" ARABIC-INDIC DIGIT FOUR - /* 66 */ "\u0664", - // U+0665: "٥" ARABIC-INDIC DIGIT FIVE - /* 67 */ "\u0665", - // U+0666: "٦" ARABIC-INDIC DIGIT SIX - /* 68 */ "\u0666", - // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN - /* 69 */ "\u0667", - // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT - /* 70 */ "\u0668", - // U+0669: "٩" ARABIC-INDIC DIGIT NINE - /* 71 */ "\u0669", - // U+0660: "٠" ARABIC-INDIC DIGIT ZERO - /* 72 */ "\u0660", - // Label for "switch to symbols" key. - // U+061F: "؟" ARABIC QUESTION MARK - /* 73 */ "\u0663\u0662\u0661\u061F", - // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic" - // part because it'll be appended by the code. - /* 74 */ "\u0663\u0662\u0661", - /* 75 */ "1", - /* 76 */ "2", - /* 77 */ "3", - /* 78 */ "4", - /* 79 */ "5", - /* 80 */ "6", - /* 81 */ "7", - /* 82 */ "8", - /* 83 */ "9", - // U+066B: "٫" ARABIC DECIMAL SEPARATOR - // U+066C: "٬" ARABIC THOUSANDS SEPARATOR - /* 84 */ "0,\u066B,\u066C", - /* 85~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~94 */ - // U+060C: "،" ARABIC COMMA - /* 95 */ "\u060C", - /* 96 */ "\\,", - /* 97 */ "\u061F", - /* 98 */ "\u061B", - // U+066A: "٪" ARABIC PERCENT SIGN - /* 99 */ "\u066A", - /* 100 */ null, - /* 101 */ "?", - /* 102 */ ";", - // U+2030: "‰" PER MILLE SIGN - /* 103 */ "\\%,\u2030", - /* 104~ */ - null, null, null, null, null, - /* ~108 */ - // U+060C: "،" ARABIC COMMA - // U+061B: "؛" ARABIC SEMICOLON - // U+061F: "؟" ARABIC QUESTION MARK - /* 109 */ "\u060C", - /* 110 */ "\u061F", - /* 111 */ "\u061F,\u061B,!,:,-,/,\',\"", - }; - - /* Language az: Azerbaijani */ - private static final String[] LANGUAGE_az = { - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - /* 0 */ "\u00E2", - // U+0259: "ə" LATIN SMALL LETTER SCHWA - /* 1 */ "\u0259", - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u015F,\u00DF,\u015B,\u0161", - /* 6 */ null, - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - /* 8~ */ - null, null, null, null, null, null, null, - /* ~14 */ - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u011F", - }; - - /* Language be: Belarusian */ - private static final String[] LANGUAGE_be = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, - /* ~24 */ - // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U - /* 25 */ "\u045E", - // U+0451: "ё" CYRILLIC SMALL LETTER IO - /* 26 */ "\u0451", - // U+044B: "ы" CYRILLIC SMALL LETTER YERU - /* 27 */ "\u044B", - // U+044D: "э" CYRILLIC SMALL LETTER E - /* 28 */ "\u044D", - // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - /* 29 */ "\u0456", - /* 30~ */ - null, null, null, null, null, null, null, - /* ~36 */ - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 37 */ "\u044A", - /* 38~ */ - null, null, null, null, null, - /* ~42 */ - // U+0451: "ё" CYRILLIC SMALL LETTER IO - /* 43 */ "\u0451", - /* 44 */ null, - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language bg: Bulgarian */ - private static final String[] LANGUAGE_bg = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ null, - // single_quotes of Bulgarian is default single_quotes_right_left. - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language ca: Catalan */ - private static final String[] LANGUAGE_ca = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", - /* 5 */ null, - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - /* 8~ */ - null, null, null, null, null, null, - /* ~13 */ - // U+00B7: "·" MIDDLE DOT - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "l\u00B7l,\u0142", - /* 15~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, - /* ~52 */ - // U+00B7: "·" MIDDLE DOT - /* 53 */ "!fixedColumnOrder!9,;,/,(,),#,\u00B7,!,\\,,?,&,\\%,+,\",-,:,',@", - /* 54~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, - /* ~107 */ - /* 108 */ "?,\u00B7", - /* 109~ */ - null, null, null, null, null, null, null, null, null, - /* ~117 */ - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - /* 118 */ "\u00E7", - }; - - /* Language cs: Czech */ - private static final String[] LANGUAGE_cs = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - /* 5 */ "\u0161,\u00DF,\u015B", - // U+0148: "ň" LATIN SMALL LETTER N WITH CARON - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u0148,\u00F1,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u00E7,\u0107", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u010F", - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - /* 10 */ "\u0159", - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - /* 11 */ "\u0165", - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - /* 12 */ "\u017E,\u017A,\u017C", - /* 13~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language da: Danish */ - private static final String[] LANGUAGE_da = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - /* 1 */ "\u00E9,\u00EB", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - /* 2 */ "\u00ED,\u00EF", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u00DF,\u015B,\u0161", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - /* 7 */ null, - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+00F0: "ð" LATIN SMALL LETTER ETH - /* 9 */ "\u00F0", - /* 10~ */ - null, null, null, null, - /* ~13 */ - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u0142", - /* 15~ */ - null, null, null, null, null, - /* ~19 */ - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - /* 20 */ "\u00E5", - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 21 */ "\u00E6", - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 22 */ "\u00F8", - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - /* 23 */ "\u00E4", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - /* 24 */ "\u00F6", - /* 25~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language de: German */ - private static final String[] LANGUAGE_de = { - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E4,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117", - /* 2 */ null, - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u00DF,\u015B,\u0161", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - /* 7~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language el: Greek */ - private static final String[] LANGUAGE_el = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0391: "Α" GREEK CAPITAL LETTER ALPHA - // U+0392: "Β" GREEK CAPITAL LETTER BETA - // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA - /* 45 */ "\u0391\u0392\u0393", - }; - - /* Language en: English */ - private static final String[] LANGUAGE_en = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113", - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5", - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* 5 */ "\u00DF", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* 6 */ "\u00F1", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - /* 7 */ "\u00E7", - }; - - /* Language eo: Esperanto */ - private static final String[] LANGUAGE_eo = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 2 */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - // U+00B5: "µ" MICRO SIGN - /* 4 */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* 5 */ "\u00DF,\u0161,\u015B,\u0219,\u015F", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+0148: "ň" LATIN SMALL LETTER N WITH CARON - // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - // U+014B: "ŋ" LATIN SMALL LETTER ENG - /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE - /* 7 */ "\u0107,\u010D,\u00E7,\u010B", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - // U+00FE: "þ" LATIN SMALL LETTER THORN - /* 8 */ "y,\u00FD,\u0177,\u00FF,\u00FE", - // U+00F0: "ð" LATIN SMALL LETTER ETH - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE - /* 9 */ "\u00F0,\u010F,\u0111", - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - /* 10 */ "\u0159,\u0155,\u0157", - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE - /* 11 */ "\u0165,\u021B,\u0163,\u0167", - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - /* 12 */ "\u017A,\u017C,\u017E", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - // U+0138: "ĸ" LATIN SMALL LETTER KRA - /* 13 */ "\u0137,\u0138", - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142", - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - /* 15 */ "\u011F,\u0121,\u0123", - // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX - /* 16 */ "w,\u0175", - // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX - // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE - /* 17 */ "\u0125,\u0127", - /* 18 */ null, - // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX - /* 19 */ "w,\u0175", - /* 20~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, - /* ~111 */ - /* 112 */ "q", - /* 113 */ "x", - // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX - /* 114 */ "\u015D", - // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX - /* 115 */ "\u011D", - // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE - /* 116 */ "\u016D", - // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX - /* 117 */ "\u0109", - // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX - /* 118 */ "\u0135", - }; - - /* Language es: Spanish */ - private static final String[] LANGUAGE_es = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", - /* 5 */ null, - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - /* 8~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~52 */ - // U+00A1: "¡" INVERTED EXCLAMATION MARK - // U+00BF: "¿" INVERTED QUESTION MARK - /* 53 */ "!fixedColumnOrder!4,;,!,\\,,?,:,\u00A1,@,\u00BF", - /* 54~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, - /* ~105 */ - // U+00A1: "¡" INVERTED EXCLAMATION MARK - /* 106 */ "!,\u00A1", - /* 107 */ null, - // U+00BF: "¿" INVERTED QUESTION MARK - /* 108 */ "?,\u00BF", - /* 109 */ "\"", - /* 110 */ "\'", - /* 111 */ "\'", - /* 112~ */ - null, null, null, null, null, null, - /* ~117 */ - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* 118 */ "\u00F1", - }; - - /* Language et: Estonian */ - private static final String[] LANGUAGE_et = { - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - /* 0 */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105", - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - /* 1 */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B", - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - /* 2 */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - /* 4 */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* 5 */ "\u0161,\u00DF,\u015B,\u015F", - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u0146,\u00F1,\u0144,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u00E7,\u0107", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u010F", - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - /* 10 */ "\u0157,\u0159,\u0155", - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - /* 11 */ "\u0163,\u0165", - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - /* 12 */ "\u017E,\u017C,\u017A", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - /* 13 */ "\u0137", - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - /* 14 */ "\u013C,\u0142,\u013A,\u013E", - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u0123,\u011F", - /* 16~ */ - null, null, null, null, - /* ~19 */ - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - /* 20 */ "\u00FC", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - /* 21 */ "\u00F6", - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - /* 22 */ "\u00E4", - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - /* 23 */ "\u00F5", - /* 24~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language fa: Persian */ - private static final String[] LANGUAGE_fa = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0627: "ا" ARABIC LETTER ALEF - // U+200C: ZERO WIDTH NON-JOINER - // U+0628: "ب" ARABIC LETTER BEH - // U+067E: "پ" ARABIC LETTER PEH - /* 45 */ "\u0627\u200C\u0628\u200C\u067E", - /* 46 */ null, - /* 47 */ null, - /* 48 */ "!text/single_laqm_raqm_rtl", - /* 49 */ "!text/double_laqm_raqm_rtl", - /* 50 */ null, - // U+FDFC: "﷼" RIAL SIGN - /* 51 */ "\uFDFC", - /* 52 */ null, - // U+061F: "؟" ARABIC QUESTION MARK - // U+060C: "،" ARABIC COMMA - // U+061B: "؛" ARABIC SEMICOLON - /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(|),)|(", - // U+2605: "★" BLACK STAR - // U+066D: "٭" ARABIC FIVE POINTED STAR - /* 54 */ "\u2605,\u066D", - // U+266A: "♪" EIGHTH NOTE - /* 55 */ "\u266A", - /* 56 */ null, - // The all letters need to be mirrored are found at - // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt - // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS - // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS - /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]", - /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[", - // U+2264: "≤" LESS-THAN OR EQUAL TO - // U+2265: "≥" GREATER-THAN EQUAL TO - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>", - /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<", - // U+0655: "ٕ" ARABIC HAMZA BELOW - // U+0652: "ْ" ARABIC SUKUN - // U+0651: "ّ" ARABIC SHADDA - // U+064C: "ٌ" ARABIC DAMMATAN - // U+064D: "ٍ" ARABIC KASRATAN - // U+064B: "ً" ARABIC FATHATAN - // U+0654: "ٔ" ARABIC HAMZA ABOVE - // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF - // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF - // U+0653: "ٓ" ARABIC MADDAH ABOVE - // U+064F: "ُ" ARABIC DAMMA - // U+0650: "ِ" ARABIC KASRA - // U+064E: "َ" ARABIC FATHA - // U+0640: "ـ" ARABIC TATWEEL - // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. - // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly. - /* 61 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640", - /* 62 */ "\u064B", - // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE - /* 63 */ "\u06F1", - // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO - /* 64 */ "\u06F2", - // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE - /* 65 */ "\u06F3", - // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR - /* 66 */ "\u06F4", - // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE - /* 67 */ "\u06F5", - // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX - /* 68 */ "\u06F6", - // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN - /* 69 */ "\u06F7", - // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT - /* 70 */ "\u06F8", - // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE - /* 71 */ "\u06F9", - // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO - /* 72 */ "\u06F0", - // Label for "switch to symbols" key. - // U+061F: "؟" ARABIC QUESTION MARK - /* 73 */ "\u06F3\u06F2\u06F1\u061F", - // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic" - // part because it'll be appended by the code. - /* 74 */ "\u06F3\u06F2\u06F1", - /* 75 */ "1", - /* 76 */ "2", - /* 77 */ "3", - /* 78 */ "4", - /* 79 */ "5", - /* 80 */ "6", - /* 81 */ "7", - /* 82 */ "8", - /* 83 */ "9", - // U+066B: "٫" ARABIC DECIMAL SEPARATOR - // U+066C: "٬" ARABIC THOUSANDS SEPARATOR - /* 84 */ "0,\u066B,\u066C", - /* 85~ */ - null, null, null, null, null, null, null, null, null, null, - /* ~94 */ - // U+060C: "،" ARABIC COMMA - /* 95 */ "\u060C", - /* 96 */ "\\,", - /* 97 */ "\u061F", - /* 98 */ "\u061B", - // U+066A: "٪" ARABIC PERCENT SIGN - /* 99 */ "\u066A", - /* 100 */ null, - /* 101 */ "?", - /* 102 */ ";", - // U+2030: "‰" PER MILLE SIGN - /* 103 */ "\\%,\u2030", - // U+060C: "،" ARABIC COMMA - // U+061B: "؛" ARABIC SEMICOLON - // U+061F: "؟" ARABIC QUESTION MARK - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - /* 104 */ "\u060C", - /* 105 */ "!", - /* 106 */ "!,\\,", - /* 107 */ "\u061F", - /* 108 */ "\u061F,?", - /* 109 */ "\u060C", - /* 110 */ "\u061F", - /* 111 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB", - }; - - /* Language fi: Finnish */ - private static final String[] LANGUAGE_fi = { - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101", - /* 1 */ null, - /* 2 */ null, - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - /* 4 */ "\u00FC", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - /* 5 */ "\u0161,\u00DF,\u015B", - /* 6~ */ - null, null, null, null, null, null, - /* ~11 */ - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - /* 12 */ "\u017E,\u017A,\u017C", - /* 13~ */ - null, null, null, null, null, null, null, - /* ~19 */ - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - /* 20 */ "\u00E5", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - /* 21 */ "\u00F6", - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - /* 22 */ "\u00E4", - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 23 */ "\u00F8", - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 24 */ "\u00E6", - }; - - /* Language fr: French */ - private static final String[] LANGUAGE_fr = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113", - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA", - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B", - /* 5 */ null, - /* 6 */ null, - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "%,\u00FF", - }; - - /* Language hi: Hindi */ - private static final String[] LANGUAGE_hi = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0915: "क" DEVANAGARI LETTER KA - // U+0916: "ख" DEVANAGARI LETTER KHA - // U+0917: "ग" DEVANAGARI LETTER GA - /* 45 */ "\u0915\u0916\u0917", - /* 46~ */ - null, null, null, null, null, - /* ~50 */ - // U+20B9: "₹" INDIAN RUPEE SIGN - /* 51 */ "\u20B9", - /* 52~ */ - null, null, null, null, null, null, null, null, null, null, null, - /* ~62 */ - // U+0967: "१" DEVANAGARI DIGIT ONE - /* 63 */ "\u0967", - // U+0968: "२" DEVANAGARI DIGIT TWO - /* 64 */ "\u0968", - // U+0969: "३" DEVANAGARI DIGIT THREE - /* 65 */ "\u0969", - // U+096A: "४" DEVANAGARI DIGIT FOUR - /* 66 */ "\u096A", - // U+096B: "५" DEVANAGARI DIGIT FIVE - /* 67 */ "\u096B", - // U+096C: "६" DEVANAGARI DIGIT SIX - /* 68 */ "\u096C", - // U+096D: "७" DEVANAGARI DIGIT SEVEN - /* 69 */ "\u096D", - // U+096E: "८" DEVANAGARI DIGIT EIGHT - /* 70 */ "\u096E", - // U+096F: "९" DEVANAGARI DIGIT NINE - /* 71 */ "\u096F", - // U+0966: "०" DEVANAGARI DIGIT ZERO - /* 72 */ "\u0966", - // Label for "switch to symbols" key. - /* 73 */ "?\u0967\u0968\u0969", - // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic" - // part because it'll be appended by the code. - /* 74 */ "\u0967\u0968\u0969", - /* 75 */ "1", - /* 76 */ "2", - /* 77 */ "3", - /* 78 */ "4", - /* 79 */ "5", - /* 80 */ "6", - /* 81 */ "7", - /* 82 */ "8", - /* 83 */ "9", - /* 84 */ "0", - }; - - /* Language hr: Croatian */ - private static final String[] LANGUAGE_hr = { - /* 0~ */ - null, null, null, null, null, - /* ~4 */ - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* 5 */ "\u0161,\u015B,\u00DF", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - /* 7 */ "\u010D,\u0107,\u00E7", - /* 8 */ null, - // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE - /* 9 */ "\u0111", - /* 10 */ null, - /* 11 */ null, - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - /* 12 */ "\u017E,\u017A,\u017C", - /* 13~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language hu: Hungarian */ - private static final String[] LANGUAGE_hu = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B", - /* 5~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language hy: Armenian */ - private static final String[] LANGUAGE_hy = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, - /* ~52 */ - // U+058A: "֊" ARMENIAN HYPHEN - // U+055C: "՜" ARMENIAN EXCLAMATION MARK - // U+055D: "՝" ARMENIAN COMMA - // U+055E: "՞" ARMENIAN QUESTION MARK - // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING - // U+055A: "՚" ARMENIAN APOSTROPHE - // U+055B: "՛" ARMENIAN EMPHASIS MARK - // U+055F: "՟" ARMENIAN ABBREVIATION MARK - /* 53 */ "!fixedColumnOrder!8,!,?,\\,,.,\u058A,\u055C,\u055D,\u055E,:,;,@,\u0559,\u055A,\u055B,\u055F", - /* 54~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, - /* ~99 */ - // U+055C: "՜" ARMENIAN EXCLAMATION MARK - // U+00A1: "¡" INVERTED EXCLAMATION MARK - /* 100 */ "\u055C,\u00A1", - // U+055E: "՞" ARMENIAN QUESTION MARK - // U+00BF: "¿" INVERTED QUESTION MARK - /* 101 */ "\u055E,\u00BF", - }; - - /* Language is: Icelandic */ - private static final String[] LANGUAGE_is = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", - /* 5~ */ - null, null, null, - /* ~7 */ - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+00F0: "ð" LATIN SMALL LETTER ETH - /* 9 */ "\u00F0", - /* 10 */ null, - // U+00FE: "þ" LATIN SMALL LETTER THORN - /* 11 */ "\u00FE", - /* 12~ */ - null, null, null, null, null, null, null, null, - /* ~19 */ - // U+00F0: "ð" LATIN SMALL LETTER ETH - /* 20 */ "\u00F0", - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 21 */ "\u00E6", - // U+00FE: "þ" LATIN SMALL LETTER THORN - /* 22 */ "\u00FE", - /* 23~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language it: Italian */ - private static final String[] LANGUAGE_it = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113", - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B", - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA", - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B", - }; - - /* Language iw: Hebrew */ - private static final String[] LANGUAGE_iw = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+05D0: "א" HEBREW LETTER ALEF - // U+05D1: "ב" HEBREW LETTER BET - // U+05D2: "ג" HEBREW LETTER GIMEL - /* 45 */ "\u05D0\u05D1\u05D2", - // The following characters don't need BIDI mirroring. - // U+2018: "‘" LEFT SINGLE QUOTATION MARK - // U+2019: "’" RIGHT SINGLE QUOTATION MARK - // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK - // U+201C: "“" LEFT DOUBLE QUOTATION MARK - // U+201D: "”" RIGHT DOUBLE QUOTATION MARK - // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK - /* 46 */ "\u2018,\u2019,\u201A", - /* 47 */ "\u201C,\u201D,\u201E", - /* 48 */ "!text/single_laqm_raqm_rtl", - /* 49 */ "!text/double_laqm_raqm_rtl", - /* 50 */ null, - // U+20AA: "₪" NEW SHEQEL SIGN - /* 51 */ "\u20AA", - /* 52 */ null, - /* 53 */ "!fixedColumnOrder!8,;,/,(|),)|(,#,!,\\,,?,&,\\%,+,\",-,:,',@", - // U+2605: "★" BLACK STAR - /* 54 */ "\u2605", - /* 55 */ null, - // U+00B1: "±" PLUS-MINUS SIGN - // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN - /* 56 */ "\u00B1,\uFB29", - // The all letters need to be mirrored are found at - // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt - /* 57 */ "!fixedColumnOrder!3,<|>,{|},[|]", - /* 58 */ "!fixedColumnOrder!3,>|<,}|{,]|[", - // U+2264: "≤" LESS-THAN OR EQUAL TO - // U+2265: "≥" GREATER-THAN EQUAL TO - // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK - // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB", - /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB", - /* 61~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~104 */ - /* 105 */ "!", - /* 106 */ "!", - /* 107 */ "?", - /* 108 */ "?", - }; - - /* Language ka: Georgian */ - private static final String[] LANGUAGE_ka = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+10D0: "ა" GEORGIAN LETTER AN - // U+10D1: "ბ" GEORGIAN LETTER BAN - // U+10D2: "გ" GEORGIAN LETTER GAN - /* 45 */ "\u10D0\u10D1\u10D2", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language kk: Kazakh */ - private static final String[] LANGUAGE_kk = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, - /* ~24 */ - // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA - /* 25 */ "\u0449", - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 26 */ "\u044A", - // U+044B: "ы" CYRILLIC SMALL LETTER YERU - /* 27 */ "\u044B", - // U+044D: "э" CYRILLIC SMALL LETTER E - /* 28 */ "\u044D", - // U+0438: "и" CYRILLIC SMALL LETTER I - /* 29 */ "\u0438", - // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U - // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE - /* 30 */ "\u04AF,\u04B1", - // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER - /* 31 */ "\u049B", - // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER - /* 32 */ "\u04A3", - // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE - /* 33 */ "\u0493", - // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - /* 34 */ "\u0456", - // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA - /* 35 */ "\u04D9", - // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O - /* 36 */ "\u04E9", - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 37 */ "\u044A", - // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA - /* 38 */ "\u04BB", - /* 39~ */ - null, null, null, null, - /* ~42 */ - // U+0451: "ё" CYRILLIC SMALL LETTER IO - /* 43 */ "\u0451", - /* 44 */ null, - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - }; - - /* Language km: Khmer */ - private static final String[] LANGUAGE_km = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+1780: "ក" KHMER LETTER KA - // U+1781: "ខ" KHMER LETTER KHA - // U+1782: "គ" KHMER LETTER KO - /* 45 */ "\u1780\u1781\u1782", - /* 46~ */ - null, null, null, null, - /* ~49 */ - // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL - /* 50 */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1", - }; - - /* Language ky: Kirghiz */ - private static final String[] LANGUAGE_ky = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, - /* ~24 */ - // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA - /* 25 */ "\u0449", - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 26 */ "\u044A", - // U+044B: "ы" CYRILLIC SMALL LETTER YERU - /* 27 */ "\u044B", - // U+044D: "э" CYRILLIC SMALL LETTER E - /* 28 */ "\u044D", - // U+0438: "и" CYRILLIC SMALL LETTER I - /* 29 */ "\u0438", - // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U - /* 30 */ "\u04AF", - /* 31 */ null, - // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER - /* 32 */ "\u04A3", - /* 33~ */ - null, null, null, - /* ~35 */ - // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O - /* 36 */ "\u04E9", - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 37 */ "\u044A", - /* 38~ */ - null, null, null, null, null, - /* ~42 */ - // U+0451: "ё" CYRILLIC SMALL LETTER IO - /* 43 */ "\u0451", - /* 44 */ null, - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - }; - - /* Language lo: Lao */ - private static final String[] LANGUAGE_lo = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0E81: "ກ" LAO LETTER KO - // U+0E82: "ຂ" LAO LETTER KHO SUNG - // U+0E84: "ຄ" LAO LETTER KHO TAM - /* 45 */ "\u0E81\u0E82\u0E84", - /* 46~ */ - null, null, null, null, null, - /* ~50 */ - // U+20AD: "₭" KIP SIGN - /* 51 */ "\u20AD", - }; - - /* Language lt: Lithuanian */ - private static final String[] LANGUAGE_lt = { - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 0 */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6", - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - /* 1 */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B", - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - /* 2 */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 3 */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8", - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - /* 4 */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* 5 */ "\u0161,\u00DF,\u015B,\u015F", - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u0146,\u00F1,\u0144,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u00E7,\u0107", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u010F", - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - /* 10 */ "\u0157,\u0159,\u0155", - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - /* 11 */ "\u0163,\u0165", - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - /* 12 */ "\u017E,\u017C,\u017A", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - /* 13 */ "\u0137", - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - /* 14 */ "\u013C,\u0142,\u013A,\u013E", - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u0123,\u011F", - /* 16~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language lv: Latvian */ - private static final String[] LANGUAGE_lv = { - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - /* 0 */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105", - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - /* 1 */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B", - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - /* 2 */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8", - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - /* 4 */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* 5 */ "\u0161,\u00DF,\u015B,\u015F", - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u0146,\u00F1,\u0144,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u00E7,\u0107", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u010F", - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - /* 10 */ "\u0157,\u0159,\u0155", - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - /* 11 */ "\u0163,\u0165", - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - /* 12 */ "\u017E,\u017C,\u017A", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - /* 13 */ "\u0137", - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - /* 14 */ "\u013C,\u0142,\u013A,\u013E", - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u0123,\u011F", - /* 16~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language mk: Macedonian */ - private static final String[] LANGUAGE_mk = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, - /* ~38 */ - // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE - /* 39 */ "\u0455", - // U+045C: "ќ" CYRILLIC SMALL LETTER KJE - /* 40 */ "\u045C", - // U+0437: "з" CYRILLIC SMALL LETTER ZE - /* 41 */ "\u0437", - // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE - /* 42 */ "\u0453", - // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE - /* 43 */ "\u0450", - // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE - /* 44 */ "\u045D", - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language mn: Mongolian */ - private static final String[] LANGUAGE_mn = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46~ */ - null, null, null, null, null, - /* ~50 */ - // U+20AE: "₮" TUGRIK SIGN - /* 51 */ "\u20AE", - }; - - /* Language nb: Norwegian Bokmål */ - private static final String[] LANGUAGE_nb = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", - /* 2 */ null, - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", - /* 5~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~19 */ - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - /* 20 */ "\u00E5", - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 21 */ "\u00F8", - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 22 */ "\u00E6", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - /* 23 */ "\u00F6", - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - /* 24 */ "\u00E4", - /* 25~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - }; - - /* Language ne: Nepali */ - private static final String[] LANGUAGE_ne = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0915: "क" DEVANAGARI LETTER KA - // U+0916: "ख" DEVANAGARI LETTER KHA - // U+0917: "ग" DEVANAGARI LETTER GA - /* 45 */ "\u0915\u0916\u0917", - /* 46~ */ - null, null, null, null, null, - /* ~50 */ - // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN - /* 51 */ "\u0930\u0941.", - /* 52~ */ - null, null, null, null, null, null, null, null, null, null, null, - /* ~62 */ - // U+0967: "१" DEVANAGARI DIGIT ONE - /* 63 */ "\u0967", - // U+0968: "२" DEVANAGARI DIGIT TWO - /* 64 */ "\u0968", - // U+0969: "३" DEVANAGARI DIGIT THREE - /* 65 */ "\u0969", - // U+096A: "४" DEVANAGARI DIGIT FOUR - /* 66 */ "\u096A", - // U+096B: "५" DEVANAGARI DIGIT FIVE - /* 67 */ "\u096B", - // U+096C: "६" DEVANAGARI DIGIT SIX - /* 68 */ "\u096C", - // U+096D: "७" DEVANAGARI DIGIT SEVEN - /* 69 */ "\u096D", - // U+096E: "८" DEVANAGARI DIGIT EIGHT - /* 70 */ "\u096E", - // U+096F: "९" DEVANAGARI DIGIT NINE - /* 71 */ "\u096F", - // U+0966: "०" DEVANAGARI DIGIT ZERO - /* 72 */ "\u0966", - // Label for "switch to symbols" key. - /* 73 */ "?\u0967\u0968\u0969", - // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic" - // part because it'll be appended by the code. - /* 74 */ "\u0967\u0968\u0969", - /* 75 */ "1", - /* 76 */ "2", - /* 77 */ "3", - /* 78 */ "4", - /* 79 */ "5", - /* 80 */ "6", - /* 81 */ "7", - /* 82 */ "8", - /* 83 */ "9", - /* 84 */ "0", - }; - - /* Language nl: Dutch */ - private static final String[] LANGUAGE_nl = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", - /* 5 */ null, - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - /* 7 */ null, - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 8 */ "\u0133", - /* 9~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - }; - - /* Language pl: Polish */ - private static final String[] LANGUAGE_pl = { - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113", - /* 2 */ null, - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", - /* 4 */ null, - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u015B,\u00DF,\u0161", - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* 6 */ "\u0144,\u00F1", - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u0107,\u00E7,\u010D", - /* 8~ */ - null, null, null, null, - /* ~11 */ - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - /* 12 */ "\u017C,\u017A,\u017E", - /* 13 */ null, - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u0142", - /* 15~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - }; - - /* Language pt: Portuguese */ - private static final String[] LANGUAGE_pt = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - /* 1 */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", - /* 5 */ null, - /* 6 */ null, - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u00E7,\u010D,\u0107", - }; - - /* Language rm: Raeto-Romance */ - private static final String[] LANGUAGE_rm = { - /* 0~ */ - null, null, null, - /* ~2 */ - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 3 */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8", - }; - - /* Language ro: Romanian */ - private static final String[] LANGUAGE_ro = { - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101", - /* 1 */ null, - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - /* 3 */ null, - /* 4 */ null, - // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u0219,\u00DF,\u015B,\u0161", - /* 6~ */ - null, null, null, null, null, - /* ~10 */ - // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW - /* 11 */ "\u021B", - /* 12~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_rqm", - /* 47 */ "!text/double_9qm_rqm", - }; - - /* Language ru: Russian */ - private static final String[] LANGUAGE_ru = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, - /* ~24 */ - // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA - /* 25 */ "\u0449", - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 26 */ "\u044A", - // U+044B: "ы" CYRILLIC SMALL LETTER YERU - /* 27 */ "\u044B", - // U+044D: "э" CYRILLIC SMALL LETTER E - /* 28 */ "\u044D", - // U+0438: "и" CYRILLIC SMALL LETTER I - /* 29 */ "\u0438", - /* 30~ */ - null, null, null, null, null, null, null, - /* ~36 */ - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 37 */ "\u044A", - /* 38~ */ - null, null, null, null, null, - /* ~42 */ - // U+0451: "ё" CYRILLIC SMALL LETTER IO - /* 43 */ "\u0451", - /* 44 */ null, - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - }; - - /* Language sk: Slovak */ - private static final String[] LANGUAGE_sk = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - /* 0 */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - /* 1 */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - /* 2 */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131", - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - /* 3 */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - /* 4 */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171", - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - /* 5 */ "\u0161,\u00DF,\u015B,\u015F", - // U+0148: "ň" LATIN SMALL LETTER N WITH CARON - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u0148,\u0146,\u00F1,\u0144,\u0144", - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u00E7,\u0107", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u010F", - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - /* 10 */ "\u0155,\u0159,\u0157", - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - /* 11 */ "\u0165,\u0163", - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - /* 12 */ "\u017E,\u017C,\u017A", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - /* 13 */ "\u0137", - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u013E,\u013A,\u013C,\u0142", - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u0123,\u011F", - /* 16~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language sl: Slovenian */ - private static final String[] LANGUAGE_sl = { - /* 0~ */ - null, null, null, null, null, - /* ~4 */ - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u0161", - /* 6 */ null, - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - /* 7 */ "\u010D,\u0107", - /* 8 */ null, - // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE - /* 9 */ "\u0111", - /* 10 */ null, - /* 11 */ null, - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - /* 12 */ "\u017E", - /* 13~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, - /* ~45 */ - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language sr: Serbian */ - private static final String[] LANGUAGE_sr = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, - /* ~38 */ - // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified. - // BEGIN: More keys definitions for Serbian (Latin) - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // <string name="more_keys_for_s">š,ß,ś</string> - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // <string name="more_keys_for_c">č,ç,ć</string> - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - // <string name="more_keys_for_d">ď</string> - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // <string name="more_keys_for_z">ž,ź,ż</string> - // END: More keys definitions for Serbian (Latin) - // BEGIN: More keys definitions for Serbian (Cyrillic) - // U+0437: "з" CYRILLIC SMALL LETTER ZE - /* 39 */ "\u0437", - // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE - /* 40 */ "\u045B", - // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE - /* 41 */ "\u0455", - // U+0452: "ђ" CYRILLIC SMALL LETTER DJE - /* 42 */ "\u0452", - // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE - /* 43 */ "\u0450", - // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE - /* 44 */ "\u045D", - // END: More keys definitions for Serbian (Cyrillic) - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language sv: Swedish */ - private static final String[] LANGUAGE_sv = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - /* 0 */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - /* 1 */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - /* 2 */ "\u00ED,\u00EC,\u00EE,\u00EF", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B", - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* 5 */ "\u015B,\u0161,\u015F,\u00DF", - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0148: "ň" LATIN SMALL LETTER N WITH CARON - /* 6 */ "\u0144,\u00F1,\u0148", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - /* 8 */ "\u00FD,\u00FF,\u00FC", - // U+00F0: "ð" LATIN SMALL LETTER ETH - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - /* 9 */ "\u00F0,\u010F", - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - /* 10 */ "\u0159", - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - // U+00FE: "þ" LATIN SMALL LETTER THORN - /* 11 */ "\u0165,\u00FE", - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - /* 12 */ "\u017A,\u017E,\u017C", - /* 13 */ null, - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u0142", - /* 15~ */ - null, null, null, null, null, - /* ~19 */ - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - /* 20 */ "\u00E5", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - /* 21 */ "\u00F6", - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - /* 22 */ "\u00E4", - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+0153: "œ" LATIN SMALL LIGATURE OE - /* 23 */ "\u00F8,\u0153", - // U+00E6: "æ" LATIN SMALL LETTER AE - /* 24 */ "\u00E6", - /* 25~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, - /* ~47 */ - /* 48 */ "!text/single_raqm_laqm", - /* 49 */ "!text/double_raqm_laqm", - }; - - /* Language sw: Swahili */ - private static final String[] LANGUAGE_sw = { - // This is the same as English except more_keys_for_g. - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113", - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5", - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* 5 */ "\u00DF", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* 6 */ "\u00F1", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - /* 7 */ "\u00E7", - /* 8~ */ - null, null, null, null, null, null, null, - /* ~14 */ - /* 15 */ "g\'", - }; - - /* Language th: Thai */ - private static final String[] LANGUAGE_th = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0E01: "ก" THAI CHARACTER KO KAI - // U+0E02: "ข" THAI CHARACTER KHO KHAI - // U+0E04: "ค" THAI CHARACTER KHO KHWAI - /* 45 */ "\u0E01\u0E02\u0E04", - /* 46~ */ - null, null, null, null, null, - /* ~50 */ - // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT - /* 51 */ "\u0E3F", - }; - - /* Language tl: Tagalog */ - private static final String[] LANGUAGE_tl = { - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", - /* 5 */ null, - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - /* 6 */ "\u00F1,\u0144", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - }; - - /* Language tr: Turkish */ - private static final String[] LANGUAGE_tr = { - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - /* 0 */ "\u00E2", - /* 1 */ null, - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D", - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - /* 5 */ "\u015F,\u00DF,\u015B,\u0161", - /* 6 */ null, - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u010D", - /* 8~ */ - null, null, null, null, null, null, null, - /* ~14 */ - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - /* 15 */ "\u011F", - }; - - /* Language uk: Ukrainian */ - private static final String[] LANGUAGE_uk = { - /* 0~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, - /* ~24 */ - // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA - /* 25 */ "\u0449", - // U+0457: "ї" CYRILLIC SMALL LETTER YI - /* 26 */ "\u0457", - // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - /* 27 */ "\u0456", - // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE - /* 28 */ "\u0454", - // U+0438: "и" CYRILLIC SMALL LETTER I - /* 29 */ "\u0438", - /* 30~ */ - null, null, null, - /* ~32 */ - // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN - /* 33 */ "\u0491", - // U+0457: "ї" CYRILLIC SMALL LETTER YI - /* 34 */ "\u0457", - /* 35 */ null, - /* 36 */ null, - // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN - /* 37 */ "\u044A", - /* 38~ */ - null, null, null, null, null, null, null, - /* ~44 */ - // Label for "switch to alphabetic" key. - // U+0410: "А" CYRILLIC CAPITAL LETTER A - // U+0411: "Б" CYRILLIC CAPITAL LETTER BE - // U+0412: "В" CYRILLIC CAPITAL LETTER VE - /* 45 */ "\u0410\u0411\u0412", - /* 46 */ "!text/single_9qm_lqm", - /* 47 */ "!text/double_9qm_lqm", - /* 48~ */ - null, null, null, - /* ~50 */ - // U+20B4: "₴" HRYVNIA SIGN - /* 51 */ "\u20B4", - }; - - /* Language vi: Vietnamese */ - private static final String[] LANGUAGE_vi = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW - // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE - // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE - // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE - // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE - // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE - // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE - // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE - // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE - // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE - // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW - /* 0 */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE - // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE - // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE - // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE - // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE - // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE - // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW - /* 1 */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7", - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE - // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE - // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW - /* 2 */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB", - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE - // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE - // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE - // U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE - // U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW - // U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN - // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE - // U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE - // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE - // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE - // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW - /* 3 */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3", - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE - // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE - // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW - // U+01B0: "ư" LATIN SMALL LETTER U WITH HORN - // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE - // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE - // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE - // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE - // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW - /* 4 */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1", - /* 5~ */ - null, null, null, - /* ~7 */ - // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE - // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE - // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW - /* 8 */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5", - // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE - /* 9 */ "\u0111", - /* 10~ */ - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, - /* ~50 */ - // U+20AB: "₫" DONG SIGN - /* 51 */ "\u20AB", - }; - - /* Language zu: Zulu */ - private static final String[] LANGUAGE_zu = { - // This is the same as English - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113", - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - /* 2 */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - /* 3 */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5", - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - /* 4 */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - /* 5 */ "\u00DF", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - /* 6 */ "\u00F1", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - /* 7 */ "\u00E7", - }; - - /* Language zz: Alphabet */ - private static final String[] LANGUAGE_zz = { - // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE - // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE - // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX - // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE - // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS - // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE - // U+00E6: "æ" LATIN SMALL LETTER AE - // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON - // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE - // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK - // U+00AA: "ª" FEMININE ORDINAL INDICATOR - /* 0 */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA", - // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE - // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE - // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX - // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS - // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON - // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE - // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE - // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK - // U+011B: "ě" LATIN SMALL LETTER E WITH CARON - /* 1 */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B", - // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE - // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE - // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX - // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS - // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE - // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON - // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE - // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK - // U+0131: "ı" LATIN SMALL LETTER DOTLESS I - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 2 */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133", - // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE - // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE - // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX - // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE - // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS - // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE - // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON - // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE - // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE - // U+0153: "œ" LATIN SMALL LIGATURE OE - // U+00BA: "º" MASCULINE ORDINAL INDICATOR - /* 3 */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA", - // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE - // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE - // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX - // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS - // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE - // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON - // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE - // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE - // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE - // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK - /* 4 */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173", - // U+00DF: "ß" LATIN SMALL LETTER SHARP S - // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE - // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX - // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA - // U+0161: "š" LATIN SMALL LETTER S WITH CARON - // U+017F: "ſ" LATIN SMALL LETTER LONG S - /* 5 */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F", - // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE - // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE - // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA - // U+0148: "ň" LATIN SMALL LETTER N WITH CARON - // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE - // U+014B: "ŋ" LATIN SMALL LETTER ENG - /* 6 */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", - // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA - // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE - // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX - // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE - // U+010D: "č" LATIN SMALL LETTER C WITH CARON - /* 7 */ "\u00E7,\u0107,\u0109,\u010B,\u010D", - // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE - // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX - // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS - // U+0133: "ij" LATIN SMALL LIGATURE IJ - /* 8 */ "\u00FD,\u0177,\u00FF,\u0133", - // U+010F: "ď" LATIN SMALL LETTER D WITH CARON - // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE - // U+00F0: "ð" LATIN SMALL LETTER ETH - /* 9 */ "\u010F,\u0111,\u00F0", - // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE - // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA - // U+0159: "ř" LATIN SMALL LETTER R WITH CARON - /* 10 */ "\u0155,\u0157,\u0159", - // U+00FE: "þ" LATIN SMALL LETTER THORN - // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA - // U+0165: "ť" LATIN SMALL LETTER T WITH CARON - // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE - /* 11 */ "\u00FE,\u0163,\u0165,\u0167", - // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE - // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE - // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON - /* 12 */ "\u017A,\u017C,\u017E", - // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA - // U+0138: "ĸ" LATIN SMALL LETTER KRA - /* 13 */ "\u0137,\u0138", - // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE - // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA - // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON - // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT - // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE - /* 14 */ "\u013A,\u013C,\u013E,\u0140,\u0142", - // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX - // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE - // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE - // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA - /* 15 */ "\u011D,\u011F,\u0121,\u0123", - /* 16 */ null, - // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX - /* 17 */ "\u0125", - // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX - /* 18 */ "\u0135", - // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX - /* 19 */ "\u0175", - }; - - private static final Object[] LANGUAGES_AND_TEXTS = { - "DEFAULT", LANGUAGE_DEFAULT, /* default */ - "af", LANGUAGE_af, /* Afrikaans */ - "ar", LANGUAGE_ar, /* Arabic */ - "az", LANGUAGE_az, /* Azerbaijani */ - "be", LANGUAGE_be, /* Belarusian */ - "bg", LANGUAGE_bg, /* Bulgarian */ - "ca", LANGUAGE_ca, /* Catalan */ - "cs", LANGUAGE_cs, /* Czech */ - "da", LANGUAGE_da, /* Danish */ - "de", LANGUAGE_de, /* German */ - "el", LANGUAGE_el, /* Greek */ - "en", LANGUAGE_en, /* English */ - "eo", LANGUAGE_eo, /* Esperanto */ - "es", LANGUAGE_es, /* Spanish */ - "et", LANGUAGE_et, /* Estonian */ - "fa", LANGUAGE_fa, /* Persian */ - "fi", LANGUAGE_fi, /* Finnish */ - "fr", LANGUAGE_fr, /* French */ - "hi", LANGUAGE_hi, /* Hindi */ - "hr", LANGUAGE_hr, /* Croatian */ - "hu", LANGUAGE_hu, /* Hungarian */ - "hy", LANGUAGE_hy, /* Armenian */ - "is", LANGUAGE_is, /* Icelandic */ - "it", LANGUAGE_it, /* Italian */ - "iw", LANGUAGE_iw, /* Hebrew */ - "ka", LANGUAGE_ka, /* Georgian */ - "kk", LANGUAGE_kk, /* Kazakh */ - "km", LANGUAGE_km, /* Khmer */ - "ky", LANGUAGE_ky, /* Kirghiz */ - "lo", LANGUAGE_lo, /* Lao */ - "lt", LANGUAGE_lt, /* Lithuanian */ - "lv", LANGUAGE_lv, /* Latvian */ - "mk", LANGUAGE_mk, /* Macedonian */ - "mn", LANGUAGE_mn, /* Mongolian */ - "nb", LANGUAGE_nb, /* Norwegian Bokmål */ - "ne", LANGUAGE_ne, /* Nepali */ - "nl", LANGUAGE_nl, /* Dutch */ - "pl", LANGUAGE_pl, /* Polish */ - "pt", LANGUAGE_pt, /* Portuguese */ - "rm", LANGUAGE_rm, /* Raeto-Romance */ - "ro", LANGUAGE_ro, /* Romanian */ - "ru", LANGUAGE_ru, /* Russian */ - "sk", LANGUAGE_sk, /* Slovak */ - "sl", LANGUAGE_sl, /* Slovenian */ - "sr", LANGUAGE_sr, /* Serbian */ - "sv", LANGUAGE_sv, /* Swedish */ - "sw", LANGUAGE_sw, /* Swahili */ - "th", LANGUAGE_th, /* Thai */ - "tl", LANGUAGE_tl, /* Tagalog */ - "tr", LANGUAGE_tr, /* Turkish */ - "uk", LANGUAGE_uk, /* Ukrainian */ - "vi", LANGUAGE_vi, /* Vietnamese */ - "zu", LANGUAGE_zu, /* Zulu */ - "zz", LANGUAGE_zz, /* Alphabet */ - }; - - static { - int id = 0; - for (final String name : NAMES) { - sNameToIdsMap.put(name, id++); - } - - for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) { - final String language = (String)LANGUAGES_AND_TEXTS[i]; - final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1]; - sLocaleToTextsMap.put(language, texts); - } - } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java new file mode 100644 index 000000000..6afc6210c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java @@ -0,0 +1,3892 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import java.util.HashMap; +import java.util.Locale; + +/** + * !!!!! DO NOT EDIT THIS FILE !!!!! + * + * This file is generated by tools/make-keyboard-text. The base template file is + * tools/make-keyboard-text/res/src/com/android/inputmethod/keyboard/internal/ + * KeyboardTextsTable.tmpl + * + * This file must be updated when any text resources in keyboard layout files have been changed. + * These text resources are referred as "!text/<resource_name>" in keyboard XML definitions, + * and should be defined in + * tools/make-keyboard-text/res/values-<locale>/donottranslate-more-keys.xml + * + * To update this file, please run the following commands. + * $ cd $ANDROID_BUILD_TOP + * $ mmm packages/inputmethods/LatinIME/tools/make-keyboard-text + * $ make-keyboard-text -java packages/inputmethods/LatinIME/java + * + * The updated source file will be generated to the following path (this file). + * packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/ + * KeyboardTextsTable.java + */ +public final class KeyboardTextsTable { + // Name to index map. + private static final HashMap<String, Integer> sNameToIndexesMap = new HashMap<>(); + // Locale to texts table map. + private static final HashMap<String, String[]> sLocaleToTextsTableMap = new HashMap<>(); + // TODO: Remove this variable after debugging. + // Texts table to locale maps. + private static final HashMap<String[], String> sTextsTableToLocaleMap = new HashMap<>(); + + public static String getText(final String name, final String[] textsTable) { + final Integer indexObj = sNameToIndexesMap.get(name); + if (indexObj == null) { + throw new RuntimeException("Unknown text name=" + name + " locale=" + + sTextsTableToLocaleMap.get(textsTable)); + } + final int index = indexObj; + final String text = (index < textsTable.length) ? textsTable[index] : null; + if (text != null) { + return text; + } + // Sanity check. + if (index >= 0 && index < TEXTS_DEFAULT.length) { + return TEXTS_DEFAULT[index]; + } + // Throw exception for debugging purpose. + throw new RuntimeException("Illegal index=" + index + " for name=" + name + + " locale=" + sTextsTableToLocaleMap.get(textsTable)); + } + + public static String[] getTextsTable(final Locale locale) { + final String localeKey = locale.toString(); + if (sLocaleToTextsTableMap.containsKey(localeKey)) { + return sLocaleToTextsTableMap.get(localeKey); + } + final String languageKey = locale.getLanguage(); + if (sLocaleToTextsTableMap.containsKey(languageKey)) { + return sLocaleToTextsTableMap.get(languageKey); + } + return TEXTS_DEFAULT; + } + + private static final String[] NAMES = { + // /* index:histogram */ "name", + /* 0:32 */ "morekeys_a", + /* 1:32 */ "morekeys_o", + /* 2:30 */ "morekeys_u", + /* 3:29 */ "morekeys_e", + /* 4:28 */ "morekeys_i", + /* 5:24 */ "keylabel_to_alpha", + /* 6:23 */ "morekeys_c", + /* 7:23 */ "double_quotes", + /* 8:22 */ "morekeys_n", + /* 9:22 */ "single_quotes", + /* 10:20 */ "morekeys_s", + /* 11:14 */ "morekeys_y", + /* 12:13 */ "morekeys_d", + /* 13:12 */ "morekeys_z", + /* 14:11 */ "keyspec_currency", + /* 15:10 */ "morekeys_t", + /* 16:10 */ "morekeys_l", + /* 17: 9 */ "morekeys_g", + /* 18: 9 */ "single_angle_quotes", + /* 19: 9 */ "double_angle_quotes", + /* 20: 8 */ "morekeys_r", + /* 21: 6 */ "morekeys_k", + /* 22: 6 */ "morekeys_cyrillic_ie", + /* 23: 5 */ "keyspec_nordic_row1_11", + /* 24: 5 */ "keyspec_nordic_row2_10", + /* 25: 5 */ "keyspec_nordic_row2_11", + /* 26: 5 */ "morekeys_nordic_row2_10", + /* 27: 5 */ "keyspec_east_slavic_row1_9", + /* 28: 5 */ "keyspec_east_slavic_row2_2", + /* 29: 5 */ "keyspec_east_slavic_row2_11", + /* 30: 5 */ "keyspec_east_slavic_row3_5", + /* 31: 5 */ "morekeys_cyrillic_soft_sign", + /* 32: 5 */ "keyspec_symbols_1", + /* 33: 5 */ "keyspec_symbols_2", + /* 34: 5 */ "keyspec_symbols_3", + /* 35: 5 */ "keyspec_symbols_4", + /* 36: 5 */ "keyspec_symbols_5", + /* 37: 5 */ "keyspec_symbols_6", + /* 38: 5 */ "keyspec_symbols_7", + /* 39: 5 */ "keyspec_symbols_8", + /* 40: 5 */ "keyspec_symbols_9", + /* 41: 5 */ "keyspec_symbols_0", + /* 42: 5 */ "keylabel_to_symbol", + /* 43: 5 */ "additional_morekeys_symbols_1", + /* 44: 5 */ "additional_morekeys_symbols_2", + /* 45: 5 */ "additional_morekeys_symbols_3", + /* 46: 5 */ "additional_morekeys_symbols_4", + /* 47: 5 */ "additional_morekeys_symbols_5", + /* 48: 5 */ "additional_morekeys_symbols_6", + /* 49: 5 */ "additional_morekeys_symbols_7", + /* 50: 5 */ "additional_morekeys_symbols_8", + /* 51: 5 */ "additional_morekeys_symbols_9", + /* 52: 5 */ "additional_morekeys_symbols_0", + /* 53: 4 */ "morekeys_nordic_row2_11", + /* 54: 4 */ "morekeys_punctuation", + /* 55: 4 */ "keyspec_tablet_comma", + /* 56: 3 */ "keyspec_swiss_row1_11", + /* 57: 3 */ "keyspec_swiss_row2_10", + /* 58: 3 */ "keyspec_swiss_row2_11", + /* 59: 3 */ "morekeys_swiss_row1_11", + /* 60: 3 */ "morekeys_swiss_row2_10", + /* 61: 3 */ "morekeys_swiss_row2_11", + /* 62: 3 */ "morekeys_star", + /* 63: 3 */ "keyspec_left_parenthesis", + /* 64: 3 */ "keyspec_right_parenthesis", + /* 65: 3 */ "keyspec_left_square_bracket", + /* 66: 3 */ "keyspec_right_square_bracket", + /* 67: 3 */ "keyspec_left_curly_bracket", + /* 68: 3 */ "keyspec_right_curly_bracket", + /* 69: 3 */ "keyspec_less_than", + /* 70: 3 */ "keyspec_greater_than", + /* 71: 3 */ "keyspec_less_than_equal", + /* 72: 3 */ "keyspec_greater_than_equal", + /* 73: 3 */ "keyspec_left_double_angle_quote", + /* 74: 3 */ "keyspec_right_double_angle_quote", + /* 75: 3 */ "keyspec_left_single_angle_quote", + /* 76: 3 */ "keyspec_right_single_angle_quote", + /* 77: 3 */ "morekeys_tablet_comma", + /* 78: 3 */ "keyhintlabel_period", + /* 79: 3 */ "morekeys_tablet_period", + /* 80: 3 */ "morekeys_question", + /* 81: 2 */ "morekeys_h", + /* 82: 2 */ "morekeys_w", + /* 83: 2 */ "morekeys_east_slavic_row2_2", + /* 84: 2 */ "morekeys_cyrillic_u", + /* 85: 2 */ "morekeys_cyrillic_en", + /* 86: 2 */ "morekeys_cyrillic_ghe", + /* 87: 2 */ "morekeys_cyrillic_o", + /* 88: 2 */ "morekeys_cyrillic_i", + /* 89: 2 */ "keyspec_south_slavic_row1_6", + /* 90: 2 */ "keyspec_south_slavic_row2_11", + /* 91: 2 */ "keyspec_south_slavic_row3_1", + /* 92: 2 */ "keyspec_south_slavic_row3_8", + /* 93: 2 */ "morekeys_tablet_punctuation", + /* 94: 2 */ "keyspec_spanish_row2_10", + /* 95: 2 */ "morekeys_bullet", + /* 96: 2 */ "morekeys_left_parenthesis", + /* 97: 2 */ "morekeys_right_parenthesis", + /* 98: 2 */ "morekeys_arabic_diacritics", + /* 99: 2 */ "keyspec_comma", + /* 100: 2 */ "keyhintlabel_tablet_comma", + /* 101: 2 */ "keyspec_period", + /* 102: 2 */ "morekeys_period", + /* 103: 2 */ "keyspec_tablet_period", + /* 104: 2 */ "keyhintlabel_tablet_period", + /* 105: 2 */ "keyspec_symbols_question", + /* 106: 2 */ "keyspec_symbols_semicolon", + /* 107: 2 */ "keyspec_symbols_percent", + /* 108: 2 */ "morekeys_symbols_semicolon", + /* 109: 2 */ "morekeys_symbols_percent", + /* 110: 1 */ "morekeys_v", + /* 111: 1 */ "morekeys_j", + /* 112: 1 */ "morekeys_q", + /* 113: 1 */ "morekeys_x", + /* 114: 1 */ "keyspec_q", + /* 115: 1 */ "keyspec_w", + /* 116: 1 */ "keyspec_y", + /* 117: 1 */ "keyspec_x", + /* 118: 1 */ "morekeys_east_slavic_row2_11", + /* 119: 1 */ "morekeys_cyrillic_ka", + /* 120: 1 */ "morekeys_cyrillic_a", + /* 121: 1 */ "morekeys_currency_dollar", + /* 122: 1 */ "morekeys_plus", + /* 123: 1 */ "morekeys_less_than", + /* 124: 1 */ "morekeys_greater_than", + /* 125: 1 */ "morekeys_exclamation", + /* 126: 0 */ "morekeys_currency", + /* 127: 0 */ "morekeys_symbols_1", + /* 128: 0 */ "morekeys_symbols_2", + /* 129: 0 */ "morekeys_symbols_3", + /* 130: 0 */ "morekeys_symbols_4", + /* 131: 0 */ "morekeys_symbols_5", + /* 132: 0 */ "morekeys_symbols_6", + /* 133: 0 */ "morekeys_symbols_7", + /* 134: 0 */ "morekeys_symbols_8", + /* 135: 0 */ "morekeys_symbols_9", + /* 136: 0 */ "morekeys_symbols_0", + /* 137: 0 */ "morekeys_am_pm", + /* 138: 0 */ "keyspec_settings", + /* 139: 0 */ "keyspec_shortcut", + /* 140: 0 */ "keyspec_action_next", + /* 141: 0 */ "keyspec_action_previous", + /* 142: 0 */ "keylabel_to_more_symbol", + /* 143: 0 */ "keylabel_tablet_to_more_symbol", + /* 144: 0 */ "keylabel_to_phone_numeric", + /* 145: 0 */ "keylabel_to_phone_symbols", + /* 146: 0 */ "keylabel_time_am", + /* 147: 0 */ "keylabel_time_pm", + /* 148: 0 */ "keyspec_popular_domain", + /* 149: 0 */ "morekeys_popular_domain", + /* 150: 0 */ "keyspecs_left_parenthesis_more_keys", + /* 151: 0 */ "keyspecs_right_parenthesis_more_keys", + /* 152: 0 */ "single_laqm_raqm", + /* 153: 0 */ "single_raqm_laqm", + /* 154: 0 */ "double_laqm_raqm", + /* 155: 0 */ "double_raqm_laqm", + /* 156: 0 */ "single_lqm_rqm", + /* 157: 0 */ "single_9qm_lqm", + /* 158: 0 */ "single_9qm_rqm", + /* 159: 0 */ "single_rqm_9qm", + /* 160: 0 */ "double_lqm_rqm", + /* 161: 0 */ "double_9qm_lqm", + /* 162: 0 */ "double_9qm_rqm", + /* 163: 0 */ "double_rqm_9qm", + /* 164: 0 */ "morekeys_single_quote", + /* 165: 0 */ "morekeys_double_quote", + /* 166: 0 */ "morekeys_tablet_double_quote", + /* 167: 0 */ "keyspec_emoji_key", + }; + + private static final String EMPTY = ""; + + /* Default texts */ + private static final String[] TEXTS_DEFAULT = { + /* morekeys_a ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + /* keylabel_to_alpha */ "ABC", + /* morekeys_c */ EMPTY, + /* double_quotes */ "!text/double_lqm_rqm", + /* morekeys_n */ EMPTY, + /* single_quotes */ "!text/single_lqm_rqm", + /* morekeys_s ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_z */ + /* keyspec_currency */ "$", + /* morekeys_t ~ */ + EMPTY, EMPTY, EMPTY, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_laqm_raqm", + /* double_angle_quotes */ "!text/double_laqm_raqm", + /* morekeys_r ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_cyrillic_soft_sign */ + /* keyspec_symbols_1 */ "1", + /* keyspec_symbols_2 */ "2", + /* keyspec_symbols_3 */ "3", + /* keyspec_symbols_4 */ "4", + /* keyspec_symbols_5 */ "5", + /* keyspec_symbols_6 */ "6", + /* keyspec_symbols_7 */ "7", + /* keyspec_symbols_8 */ "8", + /* keyspec_symbols_9 */ "9", + /* keyspec_symbols_0 */ "0", + // Label for "switch to symbols" key. + /* keylabel_to_symbol */ "?123", + /* additional_morekeys_symbols_1 ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_nordic_row2_11 */ + /* morekeys_punctuation */ "!autoColumnOrder!8,\\,,?,!,#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,',@,:,-,\",+,\\%,&", + /* keyspec_tablet_comma */ ",", + /* keyspec_swiss_row1_11 ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_swiss_row2_11 */ + // U+2020: "†" DAGGER + // U+2021: "‡" DOUBLE DAGGER + // U+2605: "★" BLACK STAR + /* morekeys_star */ "\u2020,\u2021,\u2605", + // The all letters need to be mirrored are found at + // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt + // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK + // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + // U+2264: "≤" LESS-THAN OR EQUAL TO + // U+2265: "≥" GREATER-THAN EQUAL TO + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + /* keyspec_left_parenthesis */ "(", + /* keyspec_right_parenthesis */ ")", + /* keyspec_left_square_bracket */ "[", + /* keyspec_right_square_bracket */ "]", + /* keyspec_left_curly_bracket */ "{", + /* keyspec_right_curly_bracket */ "}", + /* keyspec_less_than */ "<", + /* keyspec_greater_than */ ">", + /* keyspec_less_than_equal */ "\u2264", + /* keyspec_greater_than_equal */ "\u2265", + /* keyspec_left_double_angle_quote */ "\u00AB", + /* keyspec_right_double_angle_quote */ "\u00BB", + /* keyspec_left_single_angle_quote */ "\u2039", + /* keyspec_right_single_angle_quote */ "\u203A", + /* morekeys_tablet_comma */ EMPTY, + /* keyhintlabel_period */ EMPTY, + /* morekeys_tablet_period */ "!text/morekeys_tablet_punctuation", + // U+00BF: "¿" INVERTED QUESTION MARK + /* morekeys_question */ "\u00BF", + /* morekeys_h ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ keyspec_south_slavic_row3_8 */ + /* morekeys_tablet_punctuation */ "!autoColumnOrder!7,\\,,',#,!text/keyspec_right_parenthesis,!text/keyspec_left_parenthesis,/,;,@,:,-,\",+,\\%,&", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* keyspec_spanish_row2_10 */ "\u00F1", + // U+266A: "♪" EIGHTH NOTE + // U+2665: "♥" BLACK HEART SUIT + // U+2660: "♠" BLACK SPADE SUIT + // U+2666: "♦" BLACK DIAMOND SUIT + // U+2663: "♣" BLACK CLUB SUIT + /* morekeys_bullet */ "\u266A,\u2665,\u2660,\u2666,\u2663", + /* morekeys_left_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_left_parenthesis_more_keys", + /* morekeys_right_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_right_parenthesis_more_keys", + /* morekeys_arabic_diacritics */ EMPTY, + // Comma key + /* keyspec_comma */ ",", + /* keyhintlabel_tablet_comma */ EMPTY, + // Period key + /* keyspec_period */ ".", + /* morekeys_period */ "!text/morekeys_punctuation", + /* keyspec_tablet_period */ ".", + /* keyhintlabel_tablet_period */ EMPTY, + /* keyspec_symbols_question */ "?", + /* keyspec_symbols_semicolon */ ";", + /* keyspec_symbols_percent */ "%", + /* morekeys_symbols_semicolon */ EMPTY, + // U+2030: "‰" PER MILLE SIGN + /* morekeys_symbols_percent */ "\u2030", + /* morekeys_v ~ */ + EMPTY, EMPTY, EMPTY, EMPTY, + /* ~ morekeys_x */ + /* keyspec_q */ "q", + /* keyspec_w */ "w", + /* keyspec_y */ "y", + /* keyspec_x */ "x", + /* morekeys_east_slavic_row2_11 ~ */ + EMPTY, EMPTY, EMPTY, + /* ~ morekeys_cyrillic_a */ + // U+00A2: "¢" CENT SIGN + // U+00A3: "£" POUND SIGN + // U+20AC: "€" EURO SIGN + // U+00A5: "¥" YEN SIGN + // U+20B1: "₱" PESO SIGN + /* morekeys_currency_dollar */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1", + // U+00B1: "±" PLUS-MINUS SIGN + /* morekeys_plus */ "\u00B1", + /* morekeys_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_left_double_angle_quote", + /* morekeys_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote", + // U+00A1: "¡" INVERTED EXCLAMATION MARK + /* morekeys_exclamation */ "\u00A1", + /* morekeys_currency */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1", + // U+00B9: "¹" SUPERSCRIPT ONE + // U+00BD: "½" VULGAR FRACTION ONE HALF + // U+2153: "⅓" VULGAR FRACTION ONE THIRD + // U+00BC: "¼" VULGAR FRACTION ONE QUARTER + // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH + /* morekeys_symbols_1 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B", + // U+00B2: "²" SUPERSCRIPT TWO + // U+2154: "⅔" VULGAR FRACTION TWO THIRDS + /* morekeys_symbols_2 */ "\u00B2,\u2154", + // U+00B3: "³" SUPERSCRIPT THREE + // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS + // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS + /* morekeys_symbols_3 */ "\u00B3,\u00BE,\u215C", + // U+2074: "⁴" SUPERSCRIPT FOUR + /* morekeys_symbols_4 */ "\u2074", + // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS + /* morekeys_symbols_5 */ "\u215D", + /* morekeys_symbols_6 */ EMPTY, + // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS + /* morekeys_symbols_7 */ "\u215E", + /* morekeys_symbols_8 */ EMPTY, + /* morekeys_symbols_9 */ EMPTY, + // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N + // U+2205: "∅" EMPTY SET + /* morekeys_symbols_0 */ "\u207F,\u2205", + /* morekeys_am_pm */ "!fixedColumnOrder!2,!hasLabels!,!text/keylabel_time_am,!text/keylabel_time_pm", + /* keyspec_settings */ "!icon/settings_key|!code/key_settings", + /* keyspec_shortcut */ "!icon/shortcut_key|!code/key_shortcut", + /* keyspec_action_next */ "!hasLabels!,!text/label_next_key|!code/key_action_next", + /* keyspec_action_previous */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous", + // Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key! + /* keylabel_to_more_symbol */ "= \\\\ <", + // Label for "switch to more symbol" modifier key on tablets. Must be short to fit on key! + /* keylabel_tablet_to_more_symbol */ "~ [ <", + // Label for "switch to phone numeric" key. Must be short to fit on key! + /* keylabel_to_phone_numeric */ "123", + // Label for "switch to phone symbols" key. Must be short to fit on key! + // U+FF0A: "*" FULLWIDTH ASTERISK + // U+FF03: "#" FULLWIDTH NUMBER SIGN + /* keylabel_to_phone_symbols */ "\uFF0A\uFF03", + // Key label for "ante meridiem" + /* keylabel_time_am */ "AM", + // Key label for "post meridiem" + /* keylabel_time_pm */ "PM", + /* keyspec_popular_domain */ ".com", + // popular web domains for the locale - most popular, displayed on the keyboard + /* morekeys_popular_domain */ "!hasLabels!,.net,.org,.gov,.edu", + /* keyspecs_left_parenthesis_more_keys */ "!text/keyspec_less_than,!text/keyspec_left_curly_bracket,!text/keyspec_left_square_bracket", + /* keyspecs_right_parenthesis_more_keys */ "!text/keyspec_greater_than,!text/keyspec_right_curly_bracket,!text/keyspec_right_square_bracket", + // The following characters don't need BIDI mirroring. + // U+2018: "‘" LEFT SINGLE QUOTATION MARK + // U+2019: "’" RIGHT SINGLE QUOTATION MARK + // U+201A: "‚" SINGLE LOW-9 QUOTATION MARK + // U+201C: "“" LEFT DOUBLE QUOTATION MARK + // U+201D: "”" RIGHT DOUBLE QUOTATION MARK + // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK + // Abbreviations are: + // laqm: LEFT-POINTING ANGLE QUOTATION MARK + // raqm: RIGHT-POINTING ANGLE QUOTATION MARK + // lqm: LEFT QUOTATION MARK + // rqm: RIGHT QUOTATION MARK + // 9qm: LOW-9 QUOTATION MARK + // The following each quotation mark pair consist of + // <opening quotation mark>, <closing quotation mark> + // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. + /* single_laqm_raqm */ "!text/keyspec_left_single_angle_quote,!text/keyspec_right_single_angle_quote", + /* single_raqm_laqm */ "!text/keyspec_right_single_angle_quote,!text/keyspec_left_single_angle_quote", + /* double_laqm_raqm */ "!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", + /* double_raqm_laqm */ "!text/keyspec_right_double_angle_quote,!text/keyspec_left_double_angle_quote", + // The following each quotation mark triplet consists of + // <another quotation mark>, <opening quotation mark>, <closing quotation mark> + // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>. + /* single_lqm_rqm */ "\u201A,\u2018,\u2019", + /* single_9qm_lqm */ "\u2019,\u201A,\u2018", + /* single_9qm_rqm */ "\u2018,\u201A,\u2019", + /* single_rqm_9qm */ "\u2018,\u2019,\u201A", + /* double_lqm_rqm */ "\u201E,\u201C,\u201D", + /* double_9qm_lqm */ "\u201D,\u201E,\u201C", + /* double_9qm_rqm */ "\u201C,\u201E,\u201D", + /* double_rqm_9qm */ "\u201C,\u201D,\u201E", + /* morekeys_single_quote */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes", + /* morekeys_double_quote */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes", + /* morekeys_tablet_double_quote */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes", + /* keyspec_emoji_key */ "!icon/emoji_key|!code/key_emoji", + }; + + /* Locale af: Afrikaans */ + private static final String[] TEXTS_af = { + // This is the same as Dutch except more keys of y and demoting vowels with diaeresis. + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E2,\u00E4,\u00E0,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F4,\u00F6,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133", + /* keylabel_to_alpha ~ */ + null, null, null, + /* ~ double_quotes */ + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes */ null, + /* morekeys_s */ null, + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_y */ "\u00FD,\u0133", + }; + + /* Locale ar: Arabic */ + private static final String[] TEXTS_ar = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE + // U+200C: ZERO WIDTH NON-JOINER + // U+0628: "ب" ARABIC LETTER BEH + // U+062C: "ج" ARABIC LETTER JEEM + /* keylabel_to_alpha */ "\u0623\u200C\u0628\u200C\u062C", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_cyrillic_soft_sign */ + // U+0661: "١" ARABIC-INDIC DIGIT ONE + /* keyspec_symbols_1 */ "\u0661", + // U+0662: "٢" ARABIC-INDIC DIGIT TWO + /* keyspec_symbols_2 */ "\u0662", + // U+0663: "٣" ARABIC-INDIC DIGIT THREE + /* keyspec_symbols_3 */ "\u0663", + // U+0664: "٤" ARABIC-INDIC DIGIT FOUR + /* keyspec_symbols_4 */ "\u0664", + // U+0665: "٥" ARABIC-INDIC DIGIT FIVE + /* keyspec_symbols_5 */ "\u0665", + // U+0666: "٦" ARABIC-INDIC DIGIT SIX + /* keyspec_symbols_6 */ "\u0666", + // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN + /* keyspec_symbols_7 */ "\u0667", + // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT + /* keyspec_symbols_8 */ "\u0668", + // U+0669: "٩" ARABIC-INDIC DIGIT NINE + /* keyspec_symbols_9 */ "\u0669", + // U+0660: "٠" ARABIC-INDIC DIGIT ZERO + /* keyspec_symbols_0 */ "\u0660", + // Label for "switch to symbols" key. + // U+061F: "؟" ARABIC QUESTION MARK + /* keylabel_to_symbol */ "\u0663\u0662\u0661\u061F", + /* additional_morekeys_symbols_1 */ "1", + /* additional_morekeys_symbols_2 */ "2", + /* additional_morekeys_symbols_3 */ "3", + /* additional_morekeys_symbols_4 */ "4", + /* additional_morekeys_symbols_5 */ "5", + /* additional_morekeys_symbols_6 */ "6", + /* additional_morekeys_symbols_7 */ "7", + /* additional_morekeys_symbols_8 */ "8", + /* additional_morekeys_symbols_9 */ "9", + // U+066B: "٫" ARABIC DECIMAL SEPARATOR + // U+066C: "٬" ARABIC THOUSANDS SEPARATOR + /* additional_morekeys_symbols_0 */ "0,\u066B,\u066C", + /* morekeys_nordic_row2_11 */ null, + /* morekeys_punctuation */ null, + // U+061F: "؟" ARABIC QUESTION MARK + // U+060C: "،" ARABIC COMMA + // U+061B: "؛" ARABIC SEMICOLON + /* keyspec_tablet_comma */ "\u060C", + /* keyspec_swiss_row1_11 ~ */ + null, null, null, null, null, null, + /* ~ morekeys_swiss_row2_11 */ + // U+2605: "★" BLACK STAR + // U+066D: "٭" ARABIC FIVE POINTED STAR + /* morekeys_star */ "\u2605,\u066D", + // U+2264: "≤" LESS-THAN OR EQUAL TO + // U+2265: "≥" GREATER-THAN EQUAL TO + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK + // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + /* keyspec_left_parenthesis */ "(|)", + /* keyspec_right_parenthesis */ ")|(", + /* keyspec_left_square_bracket */ "[|]", + /* keyspec_right_square_bracket */ "]|[", + /* keyspec_left_curly_bracket */ "{|}", + /* keyspec_right_curly_bracket */ "}|{", + /* keyspec_less_than */ "<|>", + /* keyspec_greater_than */ ">|<", + /* keyspec_less_than_equal */ "\u2264|\u2265", + /* keyspec_greater_than_equal */ "\u2265|\u2264", + /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB", + /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB", + /* keyspec_left_single_angle_quote */ "\u2039|\u203A", + /* keyspec_right_single_angle_quote */ "\u203A|\u2039", + /* morekeys_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,\",\'", + // U+0651: "ّ" ARABIC SHADDA + /* keyhintlabel_period */ "\u0651", + /* morekeys_tablet_period */ "!text/morekeys_arabic_diacritics", + // U+00BF: "¿" INVERTED QUESTION MARK + /* morekeys_question */ "?,\u00BF", + /* morekeys_h ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ keyspec_spanish_row2_10 */ + // U+266A: "♪" EIGHTH NOTE + /* morekeys_bullet */ "\u266A", + // The all letters need to be mirrored are found at + // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt + // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS + // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS + /* morekeys_left_parenthesis */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,!text/keyspecs_left_parenthesis_more_keys", + /* morekeys_right_parenthesis */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,!text/keyspecs_right_parenthesis_more_keys", + // U+0655: "ٕ" ARABIC HAMZA BELOW + // U+0654: "ٔ" ARABIC HAMZA ABOVE + // U+0652: "ْ" ARABIC SUKUN + // U+064D: "ٍ" ARABIC KASRATAN + // U+064C: "ٌ" ARABIC DAMMATAN + // U+064B: "ً" ARABIC FATHATAN + // U+0651: "ّ" ARABIC SHADDA + // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF + // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF + // U+0653: "ٓ" ARABIC MADDAH ABOVE + // U+0650: "ِ" ARABIC KASRA + // U+064F: "ُ" ARABIC DAMMA + // U+064E: "َ" ARABIC FATHA + // U+0640: "ـ" ARABIC TATWEEL + // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. + // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly. + /* morekeys_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640", + // U+060C: "،" ARABIC COMMA + /* keyspec_comma */ "\u060C", + /* keyhintlabel_tablet_comma */ "\u061F", + /* keyspec_period */ null, + /* morekeys_period */ "!text/morekeys_arabic_diacritics", + /* keyspec_tablet_period */ null, + /* keyhintlabel_tablet_period */ "\u0651", + /* keyspec_symbols_question */ "\u061F", + /* keyspec_symbols_semicolon */ "\u061B", + // U+066A: "٪" ARABIC PERCENT SIGN + /* keyspec_symbols_percent */ "\u066A", + /* morekeys_symbols_semicolon */ ";", + // U+2030: "‰" PER MILLE SIGN + /* morekeys_symbols_percent */ "\\%,\u2030", + }; + + /* Locale az_AZ: Azerbaijani (Azerbaijan) */ + private static final String[] TEXTS_az_AZ = { + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + /* morekeys_a */ "\u00E2", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", + // U+0259: "ə" LATIN SMALL LETTER SCHWA + /* morekeys_e */ "\u0259", + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, + /* ~ single_quotes */ + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u015F,\u00DF,\u015B,\u0161", + /* morekeys_y ~ */ + null, null, null, null, null, null, + /* ~ morekeys_l */ + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u011F", + }; + + /* Locale be_BY: Belarusian (Belarus) */ + private static final String[] TEXTS_be_BY = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_k */ + // U+0451: "ё" CYRILLIC SMALL LETTER IO + /* morekeys_cyrillic_ie */ "\u0451", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, + /* ~ morekeys_nordic_row2_10 */ + // U+045E: "ў" CYRILLIC SMALL LETTER SHORT U + /* keyspec_east_slavic_row1_9 */ "\u045E", + // U+044B: "ы" CYRILLIC SMALL LETTER YERU + /* keyspec_east_slavic_row2_2 */ "\u044B", + // U+044D: "э" CYRILLIC SMALL LETTER E + /* keyspec_east_slavic_row2_11 */ "\u044D", + // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + /* keyspec_east_slavic_row3_5 */ "\u0456", + // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN + /* morekeys_cyrillic_soft_sign */ "\u044A", + }; + + /* Locale bg: Bulgarian */ + private static final String[] TEXTS_bg = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + // single_quotes of Bulgarian is default single_quotes_right_left. + /* double_quotes */ "!text/double_9qm_lqm", + }; + + /* Locale bn: Bengali */ + private static final String[] TEXTS_bn = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0995: "क" BENGALI LETTER KA + // U+0996: "ख" BENGALI LETTER KHA + // U+0997: "ग" BENGALI LETTER GA + /* keylabel_to_alpha */ "\u0995\u0996\u0997", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+09F3: "৳" BENGALI RUPEE SIGN + /* keyspec_currency */ "\u09F3", + }; + + /* Locale ca: Catalan */ + private static final String[] TEXTS_ca = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E0,\u00E1,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E8,\u00E9,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes ~ */ + null, null, null, null, null, null, null, + /* ~ morekeys_t */ + // U+00B7: "·" MIDDLE DOT + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "l\u00B7l,\u0142", + /* morekeys_g ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, + /* ~ morekeys_nordic_row2_11 */ + // U+00B7: "·" MIDDLE DOT + /* morekeys_punctuation */ "!autoColumnOrder!9,\\,,?,!,\u00B7,#,),(,/,;,',@,:,-,\",+,\\%,&", + /* keyspec_tablet_comma ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, + /* ~ keyspec_south_slavic_row3_8 */ + /* morekeys_tablet_punctuation */ "!autoColumnOrder!8,\\,,',\u00B7,#,),(,/,;,@,:,-,\",+,\\%,&", + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + /* keyspec_spanish_row2_10 */ "\u00E7", + }; + + /* Locale cs: Czech */ + private static final String[] TEXTS_cs = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u00E7,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + // U+0148: "ň" LATIN SMALL LETTER N WITH CARON + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u0148,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + /* morekeys_s */ "\u0161,\u00DF,\u015B", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u010F", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + /* morekeys_z */ "\u017E,\u017A,\u017C", + /* keyspec_currency */ null, + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + /* morekeys_t */ "\u0165", + /* morekeys_l */ null, + /* morekeys_g */ null, + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + /* morekeys_r */ "\u0159", + }; + + /* Locale da: Danish */ + private static final String[] TEXTS_da = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + /* morekeys_e */ "\u00E9,\u00EB", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + /* morekeys_i */ "\u00ED,\u00EF", + /* keylabel_to_alpha */ null, + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u00DF,\u015B,\u0161", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+00F0: "ð" LATIN SMALL LETTER ETH + /* morekeys_d */ "\u00F0", + /* morekeys_z ~ */ + null, null, null, + /* ~ morekeys_t */ + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u0142", + /* morekeys_g */ null, + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + /* morekeys_r ~ */ + null, null, null, + /* ~ morekeys_cyrillic_ie */ + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + /* keyspec_nordic_row1_11 */ "\u00E5", + // U+00E6: "æ" LATIN SMALL LETTER AE + /* keyspec_nordic_row2_10 */ "\u00E6", + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* keyspec_nordic_row2_11 */ "\u00F8", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* morekeys_nordic_row2_10 */ "\u00E4", + /* keyspec_east_slavic_row1_9 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, + /* ~ additional_morekeys_symbols_0 */ + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* morekeys_nordic_row2_11 */ "\u00F6", + }; + + /* Locale de: German */ + private static final String[] TEXTS_de = { + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E4,%,\u00E2,\u00E0,\u00E1,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F6,%,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u00F8,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FC,%,\u00FB,\u00F9,\u00FA,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117", + /* morekeys_i ~ */ + null, null, null, + /* ~ morekeys_c */ + /* double_quotes */ "!text/double_9qm_lqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u00DF,\u015B,\u0161", + /* morekeys_y ~ */ + null, null, null, null, null, null, null, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + /* morekeys_r ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ keyspec_tablet_comma */ + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + /* keyspec_swiss_row1_11 */ "\u00FC", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* keyspec_swiss_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* keyspec_swiss_row2_11 */ "\u00E4", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + /* morekeys_swiss_row1_11 */ "\u00E8", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + /* morekeys_swiss_row2_10 */ "\u00E9", + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + /* morekeys_swiss_row2_11 */ "\u00E0", + }; + + /* Locale el: Greek */ + private static final String[] TEXTS_el = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0391: "Α" GREEK CAPITAL LETTER ALPHA + // U+0392: "Β" GREEK CAPITAL LETTER BETA + // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA + /* keylabel_to_alpha */ "\u0391\u0392\u0393", + }; + + /* Locale en: English */ + private static final String[] TEXTS_en = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + /* morekeys_o */ "\u00F3,\u00F4,\u00F6,\u00F2,\u0153,\u00F8,\u014D,\u00F5", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + /* morekeys_c */ "\u00E7", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* morekeys_n */ "\u00F1", + /* single_quotes */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* morekeys_s */ "\u00DF", + }; + + /* Locale eo: Esperanto */ + private static final String[] TEXTS_eo = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u0103,\u0105,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D,\u0151,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + // U+00B5: "µ" MICRO SIGN + /* morekeys_u */ "\u00FA,\u016F,\u00FB,\u00FC,\u00F9,\u016B,\u0169,\u0171,\u0173,\u00B5", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u011B,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133", + /* keylabel_to_alpha */ null, + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE + /* morekeys_c */ "\u0107,\u010D,\u00E7,\u010B", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+0148: "ň" LATIN SMALL LETTER N WITH CARON + // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + // U+014B: "ŋ" LATIN SMALL LETTER ENG + /* morekeys_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", + /* single_quotes */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* morekeys_s */ "\u00DF,\u0161,\u015B,\u0219,\u015F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + // U+00FE: "þ" LATIN SMALL LETTER THORN + /* morekeys_y */ "y,\u00FD,\u0177,\u00FF,\u00FE", + // U+00F0: "ð" LATIN SMALL LETTER ETH + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE + /* morekeys_d */ "\u00F0,\u010F,\u0111", + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + /* morekeys_z */ "\u017A,\u017C,\u017E", + /* keyspec_currency */ null, + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE + /* morekeys_t */ "\u0165,\u021B,\u0163,\u0167", + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u013A,\u013C,\u013E,\u0140,\u0142", + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + /* morekeys_g */ "\u011F,\u0121,\u0123", + /* single_angle_quotes */ null, + /* double_angle_quotes */ null, + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + /* morekeys_r */ "\u0159,\u0155,\u0157", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + // U+0138: "ĸ" LATIN SMALL LETTER KRA + /* morekeys_k */ "\u0137,\u0138", + /* morekeys_cyrillic_ie ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_question */ + // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX + // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE + /* morekeys_h */ "\u0125,\u0127", + // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX + /* morekeys_w */ "w,\u0175", + /* morekeys_east_slavic_row2_2 ~ */ + null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_tablet_punctuation */ + // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX + /* keyspec_spanish_row2_10 */ "\u0135", + /* morekeys_bullet ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_symbols_percent */ + // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX + /* morekeys_v */ "w,\u0175", + /* morekeys_j */ null, + /* morekeys_q */ "q", + /* morekeys_x */ "x", + // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX + /* keyspec_q */ "\u015D", + // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX + /* keyspec_w */ "\u011D", + // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE + /* keyspec_y */ "\u016D", + // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX + /* keyspec_x */ "\u0109", + }; + + /* Locale es: Spanish */ + private static final String[] TEXTS_es = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_nordic_row2_11 */ + // U+00A1: "¡" INVERTED EXCLAMATION MARK + // U+00BF: "¿" INVERTED QUESTION MARK + /* morekeys_punctuation */ "!autoColumnOrder!9,\\,,?,!,#,),(,/,;,\u00A1,',@,:,-,\",+,\\%,&,\u00BF", + }; + + /* Locale et_EE: Estonian (Estonia) */ + private static final String[] TEXTS_et_EE = { + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + /* morekeys_a */ "\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6,\u0105", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_o */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + /* morekeys_u */ "\u00FC,\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u016F,\u0171", + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + /* morekeys_e */ "\u0113,\u00E8,\u0117,\u00E9,\u00EA,\u00EB,\u0119,\u011B", + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + /* morekeys_i */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131", + /* keylabel_to_alpha */ null, + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u00E7,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* morekeys_s */ "\u0161,\u00DF,\u015B,\u015F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u010F", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + /* morekeys_z */ "\u017E,\u017C,\u017A", + /* keyspec_currency */ null, + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + /* morekeys_t */ "\u0163,\u0165", + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E", + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u0123,\u011F", + /* single_angle_quotes */ null, + /* double_angle_quotes */ null, + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + /* morekeys_r */ "\u0157,\u0159,\u0155", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + /* morekeys_k */ "\u0137", + /* morekeys_cyrillic_ie */ null, + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + /* keyspec_nordic_row1_11 */ "\u00FC", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* keyspec_nordic_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* keyspec_nordic_row2_11 */ "\u00E4", + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + /* morekeys_nordic_row2_10 */ "\u00F5", + }; + + /* Locale eu_ES: Basque (Spain) */ + private static final String[] TEXTS_eu_ES = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + }; + + /* Locale fa: Persian */ + private static final String[] TEXTS_fa = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0627: "ا" ARABIC LETTER ALEF + // U+200C: ZERO WIDTH NON-JOINER + // U+0628: "ب" ARABIC LETTER BEH + // U+067E: "پ" ARABIC LETTER PEH + /* keylabel_to_alpha */ "\u0627\u200C\u0628\u200C\u067E", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+FDFC: "﷼" RIAL SIGN + /* keyspec_currency */ "\uFDFC", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ morekeys_cyrillic_soft_sign */ + // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE + /* keyspec_symbols_1 */ "\u06F1", + // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO + /* keyspec_symbols_2 */ "\u06F2", + // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE + /* keyspec_symbols_3 */ "\u06F3", + // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR + /* keyspec_symbols_4 */ "\u06F4", + // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE + /* keyspec_symbols_5 */ "\u06F5", + // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX + /* keyspec_symbols_6 */ "\u06F6", + // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN + /* keyspec_symbols_7 */ "\u06F7", + // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT + /* keyspec_symbols_8 */ "\u06F8", + // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE + /* keyspec_symbols_9 */ "\u06F9", + // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO + /* keyspec_symbols_0 */ "\u06F0", + // Label for "switch to symbols" key. + // U+061F: "؟" ARABIC QUESTION MARK + /* keylabel_to_symbol */ "\u06F3\u06F2\u06F1\u061F", + /* additional_morekeys_symbols_1 */ "1", + /* additional_morekeys_symbols_2 */ "2", + /* additional_morekeys_symbols_3 */ "3", + /* additional_morekeys_symbols_4 */ "4", + /* additional_morekeys_symbols_5 */ "5", + /* additional_morekeys_symbols_6 */ "6", + /* additional_morekeys_symbols_7 */ "7", + /* additional_morekeys_symbols_8 */ "8", + /* additional_morekeys_symbols_9 */ "9", + // U+066B: "٫" ARABIC DECIMAL SEPARATOR + // U+066C: "٬" ARABIC THOUSANDS SEPARATOR + /* additional_morekeys_symbols_0 */ "0,\u066B,\u066C", + /* morekeys_nordic_row2_11 */ null, + /* morekeys_punctuation */ null, + // U+060C: "،" ARABIC COMMA + // U+061B: "؛" ARABIC SEMICOLON + // U+061F: "؟" ARABIC QUESTION MARK + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + /* keyspec_tablet_comma */ "\u060C", + /* keyspec_swiss_row1_11 ~ */ + null, null, null, null, null, null, + /* ~ morekeys_swiss_row2_11 */ + // U+2605: "★" BLACK STAR + // U+066D: "٭" ARABIC FIVE POINTED STAR + /* morekeys_star */ "\u2605,\u066D", + /* keyspec_left_parenthesis */ "(|)", + /* keyspec_right_parenthesis */ ")|(", + /* keyspec_left_square_bracket */ "[|]", + /* keyspec_right_square_bracket */ "]|[", + /* keyspec_left_curly_bracket */ "{|}", + /* keyspec_right_curly_bracket */ "}|{", + /* keyspec_less_than */ "<|>", + /* keyspec_greater_than */ ">|<", + /* keyspec_less_than_equal */ "\u2264|\u2265", + /* keyspec_greater_than_equal */ "\u2265|\u2264", + /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB", + /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB", + /* keyspec_left_single_angle_quote */ "\u2039|\u203A", + /* keyspec_right_single_angle_quote */ "\u203A|\u2039", + /* morekeys_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote", + // U+064B: "ً" ARABIC FATHATAN + /* keyhintlabel_period */ "\u064B", + /* morekeys_tablet_period */ "!text/morekeys_arabic_diacritics", + // U+00BF: "¿" INVERTED QUESTION MARK + /* morekeys_question */ "?,\u00BF", + /* morekeys_h ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ keyspec_spanish_row2_10 */ + // U+266A: "♪" EIGHTH NOTE + /* morekeys_bullet */ "\u266A", + // The all letters need to be mirrored are found at + // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt + // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS + // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS + /* morekeys_left_parenthesis */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,!text/keyspecs_left_parenthesis_more_keys", + /* morekeys_right_parenthesis */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,!text/keyspecs_right_parenthesis_more_keys", + // U+0655: "ٕ" ARABIC HAMZA BELOW + // U+0652: "ْ" ARABIC SUKUN + // U+0651: "ّ" ARABIC SHADDA + // U+064C: "ٌ" ARABIC DAMMATAN + // U+064D: "ٍ" ARABIC KASRATAN + // U+064B: "ً" ARABIC FATHATAN + // U+0654: "ٔ" ARABIC HAMZA ABOVE + // U+0656: "ٖ" ARABIC SUBSCRIPT ALEF + // U+0670: "ٰ" ARABIC LETTER SUPERSCRIPT ALEF + // U+0653: "ٓ" ARABIC MADDAH ABOVE + // U+064F: "ُ" ARABIC DAMMA + // U+0650: "ِ" ARABIC KASRA + // U+064E: "َ" ARABIC FATHA + // U+0640: "ـ" ARABIC TATWEEL + // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. + // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly. + /* morekeys_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640", + // U+060C: "،" ARABIC COMMA + /* keyspec_comma */ "\u060C", + /* keyhintlabel_tablet_comma */ "\u061F", + /* keyspec_period */ null, + /* morekeys_period */ "!text/morekeys_arabic_diacritics", + /* keyspec_tablet_period */ null, + /* keyhintlabel_tablet_period */ "\u064B", + /* keyspec_symbols_question */ "\u061F", + /* keyspec_symbols_semicolon */ "\u061B", + // U+066A: "٪" ARABIC PERCENT SIGN + /* keyspec_symbols_percent */ "\u066A", + /* morekeys_symbols_semicolon */ ";", + // U+2030: "‰" PER MILLE SIGN + /* morekeys_symbols_percent */ "\\%,\u2030", + /* morekeys_v ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_plus */ + // U+2264: "≤" LESS-THAN OR EQUAL TO + // U+2265: "≥" GREATER-THAN EQUAL TO + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK + // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + /* morekeys_less_than */ "!fixedColumnOrder!3,!text/keyspec_left_single_angle_quote,!text/keyspec_less_than_equal,!text/keyspec_less_than", + /* morekeys_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_greater_than", + }; + + /* Locale fi: Finnish */ + private static final String[] TEXTS_fi = { + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101", + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + /* morekeys_u */ "\u00FC", + /* morekeys_e ~ */ + null, null, null, null, null, null, null, + /* ~ single_quotes */ + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + /* morekeys_s */ "\u0161,\u00DF,\u015B", + /* morekeys_y */ null, + /* morekeys_d */ null, + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + /* morekeys_z */ "\u017E,\u017A,\u017C", + /* keyspec_currency ~ */ + null, null, null, null, null, null, null, null, null, + /* ~ morekeys_cyrillic_ie */ + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + /* keyspec_nordic_row1_11 */ "\u00E5", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* keyspec_nordic_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* keyspec_nordic_row2_11 */ "\u00E4", + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_nordic_row2_10 */ "\u00F8", + /* keyspec_east_slavic_row1_9 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, + /* ~ additional_morekeys_symbols_0 */ + // U+00E6: "æ" LATIN SMALL LETTER AE + /* morekeys_nordic_row2_11 */ "\u00E6", + }; + + /* Locale fr: French */ + private static final String[] TEXTS_fr = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E0,\u00E2,%,\u00E6,\u00E1,\u00E4,\u00E3,\u00E5,\u0101,\u00AA", + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F4,\u0153,%,\u00F6,\u00F2,\u00F3,\u00F5,\u00F8,\u014D,\u00BA", + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00F9,\u00FB,%,\u00FC,\u00FA,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,%,\u0119,\u0117,\u0113", + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,%,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, null, + /* ~ morekeys_s */ + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "%,\u00FF", + /* morekeys_d ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ keyspec_tablet_comma */ + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + /* keyspec_swiss_row1_11 */ "\u00E8", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + /* keyspec_swiss_row2_10 */ "\u00E9", + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + /* keyspec_swiss_row2_11 */ "\u00E0", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + /* morekeys_swiss_row1_11 */ "\u00FC", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* morekeys_swiss_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* morekeys_swiss_row2_11 */ "\u00E4", + }; + + /* Locale gl_ES: Gallegan (Spain) */ + private static final String[] TEXTS_gl_ES = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + }; + + /* Locale hi: Hindi */ + private static final String[] TEXTS_hi = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0915: "क" DEVANAGARI LETTER KA + // U+0916: "ख" DEVANAGARI LETTER KHA + // U+0917: "ग" DEVANAGARI LETTER GA + /* keylabel_to_alpha */ "\u0915\u0916\u0917", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+20B9: "₹" INDIAN RUPEE SIGN + /* keyspec_currency */ "\u20B9", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ morekeys_cyrillic_soft_sign */ + // U+0967: "१" DEVANAGARI DIGIT ONE + /* keyspec_symbols_1 */ "\u0967", + // U+0968: "२" DEVANAGARI DIGIT TWO + /* keyspec_symbols_2 */ "\u0968", + // U+0969: "३" DEVANAGARI DIGIT THREE + /* keyspec_symbols_3 */ "\u0969", + // U+096A: "४" DEVANAGARI DIGIT FOUR + /* keyspec_symbols_4 */ "\u096A", + // U+096B: "५" DEVANAGARI DIGIT FIVE + /* keyspec_symbols_5 */ "\u096B", + // U+096C: "६" DEVANAGARI DIGIT SIX + /* keyspec_symbols_6 */ "\u096C", + // U+096D: "७" DEVANAGARI DIGIT SEVEN + /* keyspec_symbols_7 */ "\u096D", + // U+096E: "८" DEVANAGARI DIGIT EIGHT + /* keyspec_symbols_8 */ "\u096E", + // U+096F: "९" DEVANAGARI DIGIT NINE + /* keyspec_symbols_9 */ "\u096F", + // U+0966: "०" DEVANAGARI DIGIT ZERO + /* keyspec_symbols_0 */ "\u0966", + // Label for "switch to symbols" key. + /* keylabel_to_symbol */ "?\u0967\u0968\u0969", + /* additional_morekeys_symbols_1 */ "1", + /* additional_morekeys_symbols_2 */ "2", + /* additional_morekeys_symbols_3 */ "3", + /* additional_morekeys_symbols_4 */ "4", + /* additional_morekeys_symbols_5 */ "5", + /* additional_morekeys_symbols_6 */ "6", + /* additional_morekeys_symbols_7 */ "7", + /* additional_morekeys_symbols_8 */ "8", + /* additional_morekeys_symbols_9 */ "9", + /* additional_morekeys_symbols_0 */ "0", + }; + + /* Locale hr: Croatian */ + private static final String[] TEXTS_hr = { + /* morekeys_a ~ */ + null, null, null, null, null, null, + /* ~ keylabel_to_alpha */ + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + /* morekeys_c */ "\u010D,\u0107,\u00E7", + /* double_quotes */ "!text/double_9qm_rqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_rqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* morekeys_s */ "\u0161,\u015B,\u00DF", + /* morekeys_y */ null, + // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE + /* morekeys_d */ "\u0111", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + /* morekeys_z */ "\u017E,\u017A,\u017C", + /* keyspec_currency ~ */ + null, null, null, null, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + }; + + /* Locale hu: Hungarian */ + private static final String[] TEXTS_hu = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F6,\u0151,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u0171,\u00FB,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B", + /* keylabel_to_alpha */ null, + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_rqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_rqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + }; + + /* Locale hy_AM: Armenian (Armenia) */ + private static final String[] TEXTS_hy_AM = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0531: "Ա" ARMENIAN CAPITAL LETTER AYB + // U+0532: "Բ" ARMENIAN CAPITAL LETTER BEN + // U+0533: "Գ" ARMENIAN CAPITAL LETTER GIM + /* keylabel_to_alpha */ "\u0531\u0532\u0533", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, + /* ~ morekeys_nordic_row2_11 */ + // U+055E: "՞" ARMENIAN QUESTION MARK + // U+055C: "՜" ARMENIAN EXCLAMATION MARK + // U+055A: "՚" ARMENIAN APOSTROPHE + // U+0559: "ՙ" ARMENIAN MODIFIER LETTER LEFT HALF RING + // U+055D: "՝" ARMENIAN COMMA + // U+055B: "՛" ARMENIAN EMPHASIS MARK + // U+058A: "֊" ARMENIAN HYPHEN + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+055F: "՟" ARMENIAN ABBREVIATION MARK + /* morekeys_punctuation */ "!autoColumnOrder!8,\\,,\u055E,\u055C,.,\u055A,\u0559,?,!,\u055D,\u055B,\u058A,\u00BB,\u00AB,\u055F,;,:", + // U+058F: "֏" ARMENIAN DRAM SIGN + // TODO: Enable this when we have glyph for the following letter + // <string name="keyspec_currency">֏</string> + // + // U+055D: "՝" ARMENIAN COMMA + /* keyspec_tablet_comma */ "\u055D", + /* keyspec_swiss_row1_11 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, + /* ~ keyhintlabel_period */ + /* morekeys_tablet_period */ "!text/morekeys_punctuation", + // U+055E: "՞" ARMENIAN QUESTION MARK + // U+00BF: "¿" INVERTED QUESTION MARK + /* morekeys_question */ "\u055E,\u00BF", + /* morekeys_h ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, + /* ~ keyhintlabel_tablet_comma */ + // U+0589: "։" ARMENIAN FULL STOP + /* keyspec_period */ "\u0589", + /* morekeys_period */ null, + /* keyspec_tablet_period */ "\u0589", + /* keyhintlabel_tablet_period ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ morekeys_greater_than */ + // U+055C: "՜" ARMENIAN EXCLAMATION MARK + // U+00A1: "¡" INVERTED EXCLAMATION MARK + /* morekeys_exclamation */ "\u055C,\u00A1", + }; + + /* Locale is: Icelandic */ + private static final String[] TEXTS_is = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E4,\u00E6,\u00E5,\u00E0,\u00E2,\u00E3,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00EB,\u00E8,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B", + /* keylabel_to_alpha */ null, + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s */ null, + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+00F0: "ð" LATIN SMALL LETTER ETH + /* morekeys_d */ "\u00F0", + /* morekeys_z */ null, + /* keyspec_currency */ null, + // U+00FE: "þ" LATIN SMALL LETTER THORN + /* morekeys_t */ "\u00FE", + }; + + /* Locale it: Italian */ + private static final String[] TEXTS_it = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101,\u00AA", + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F2,\u00F3,\u00F4,\u00F6,\u00F5,\u0153,\u00F8,\u014D,\u00BA", + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u016B", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u0117,\u0113", + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B", + /* keylabel_to_alpha ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ keyspec_tablet_comma */ + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + /* keyspec_swiss_row1_11 */ "\u00FC", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* keyspec_swiss_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* keyspec_swiss_row2_11 */ "\u00E4", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + /* morekeys_swiss_row1_11 */ "\u00E8", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + /* morekeys_swiss_row2_10 */ "\u00E9", + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + /* morekeys_swiss_row2_11 */ "\u00E0", + }; + + /* Locale iw: Hebrew */ + private static final String[] TEXTS_iw = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+05D0: "א" HEBREW LETTER ALEF + // U+05D1: "ב" HEBREW LETTER BET + // U+05D2: "ג" HEBREW LETTER GIMEL + /* keylabel_to_alpha */ "\u05D0\u05D1\u05D2", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_rqm_9qm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_rqm_9qm", + /* morekeys_s ~ */ + null, null, null, null, + /* ~ morekeys_z */ + // U+20AA: "₪" NEW SHEQEL SIGN + /* keyspec_currency */ "\u20AA", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ morekeys_swiss_row2_11 */ + // U+2605: "★" BLACK STAR + /* morekeys_star */ "\u2605", + // The all letters need to be mirrored are found at + // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt + // U+2264: "≤" LESS-THAN OR EQUAL TO + // U+2265: "≥" GREATER-THAN EQUAL TO + // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK + // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + /* keyspec_left_parenthesis */ "(|)", + /* keyspec_right_parenthesis */ ")|(", + /* keyspec_left_square_bracket */ "[|]", + /* keyspec_right_square_bracket */ "]|[", + /* keyspec_left_curly_bracket */ "{|}", + /* keyspec_right_curly_bracket */ "}|{", + /* keyspec_less_than */ "<|>", + /* keyspec_greater_than */ ">|<", + /* keyspec_less_than_equal */ "\u2264|\u2265", + /* keyspec_greater_than_equal */ "\u2265|\u2264", + /* keyspec_left_double_angle_quote */ "\u00AB|\u00BB", + /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB", + /* keyspec_left_single_angle_quote */ "\u2039|\u203A", + /* keyspec_right_single_angle_quote */ "\u203A|\u2039", + /* morekeys_tablet_comma ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_currency_dollar */ + // U+00B1: "±" PLUS-MINUS SIGN + // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN + /* morekeys_plus */ "\u00B1,\uFB29", + }; + + /* Locale ka_GE: Georgian (Georgia) */ + private static final String[] TEXTS_ka_GE = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+10D0: "ა" GEORGIAN LETTER AN + // U+10D1: "ბ" GEORGIAN LETTER BAN + // U+10D2: "გ" GEORGIAN LETTER GAN + /* keylabel_to_alpha */ "\u10D0\u10D1\u10D2", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + }; + + /* Locale kk: Kazakh */ + private static final String[] TEXTS_kk = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, + /* ~ morekeys_k */ + // U+0451: "ё" CYRILLIC SMALL LETTER IO + /* morekeys_cyrillic_ie */ "\u0451", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, + /* ~ morekeys_nordic_row2_10 */ + // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA + /* keyspec_east_slavic_row1_9 */ "\u0449", + // U+044B: "ы" CYRILLIC SMALL LETTER YERU + /* keyspec_east_slavic_row2_2 */ "\u044B", + // U+044D: "э" CYRILLIC SMALL LETTER E + /* keyspec_east_slavic_row2_11 */ "\u044D", + // U+0438: "и" CYRILLIC SMALL LETTER I + /* keyspec_east_slavic_row3_5 */ "\u0438", + // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN + /* morekeys_cyrillic_soft_sign */ "\u044A", + /* keyspec_symbols_1 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ morekeys_w */ + // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + /* morekeys_east_slavic_row2_2 */ "\u0456", + // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U + // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + /* morekeys_cyrillic_u */ "\u04AF,\u04B1", + // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER + /* morekeys_cyrillic_en */ "\u04A3", + // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE + /* morekeys_cyrillic_ghe */ "\u0493", + // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O + /* morekeys_cyrillic_o */ "\u04E9", + /* morekeys_cyrillic_i ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ keyspec_x */ + // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA + /* morekeys_east_slavic_row2_11 */ "\u04BB", + // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER + /* morekeys_cyrillic_ka */ "\u049B", + // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA + /* morekeys_cyrillic_a */ "\u04D9", + }; + + /* Locale km_KH: Khmer (Cambodia) */ + private static final String[] TEXTS_km_KH = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+1780: "ក" KHMER LETTER KA + // U+1781: "ខ" KHMER LETTER KHA + // U+1782: "គ" KHMER LETTER KO + /* keylabel_to_alpha */ "\u1780\u1781\u1782", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_cyrillic_a */ + // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL + /* morekeys_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1", + }; + + /* Locale ky: Kirghiz */ + private static final String[] TEXTS_ky = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, + /* ~ morekeys_k */ + // U+0451: "ё" CYRILLIC SMALL LETTER IO + /* morekeys_cyrillic_ie */ "\u0451", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, + /* ~ morekeys_nordic_row2_10 */ + // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA + /* keyspec_east_slavic_row1_9 */ "\u0449", + // U+044B: "ы" CYRILLIC SMALL LETTER YERU + /* keyspec_east_slavic_row2_2 */ "\u044B", + // U+044D: "э" CYRILLIC SMALL LETTER E + /* keyspec_east_slavic_row2_11 */ "\u044D", + // U+0438: "и" CYRILLIC SMALL LETTER I + /* keyspec_east_slavic_row3_5 */ "\u0438", + // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN + /* morekeys_cyrillic_soft_sign */ "\u044A", + /* keyspec_symbols_1 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, + /* ~ morekeys_east_slavic_row2_2 */ + // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U + /* morekeys_cyrillic_u */ "\u04AF", + // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER + /* morekeys_cyrillic_en */ "\u04A3", + /* morekeys_cyrillic_ghe */ null, + // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O + /* morekeys_cyrillic_o */ "\u04E9", + }; + + /* Locale lo_LA: Lao (Laos) */ + private static final String[] TEXTS_lo_LA = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0E81: "ກ" LAO LETTER KO + // U+0E82: "ຂ" LAO LETTER KHO SUNG + // U+0E84: "ຄ" LAO LETTER KHO TAM + /* keylabel_to_alpha */ "\u0E81\u0E82\u0E84", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+20AD: "₭" KIP SIGN + /* keyspec_currency */ "\u20AD", + }; + + /* Locale lt: Lithuanian */ + private static final String[] TEXTS_lt = { + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + /* morekeys_a */ "\u0105,\u00E4,\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E5,\u00E6", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_o */ "\u00F6,\u00F5,\u00F2,\u00F3,\u00F4,\u0153,\u0151,\u00F8", + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + /* morekeys_u */ "\u016B,\u0173,\u00FC,\u016B,\u00F9,\u00FA,\u00FB,\u016F,\u0171", + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + /* morekeys_e */ "\u0117,\u0119,\u0113,\u00E8,\u00E9,\u00EA,\u00EB,\u011B", + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + /* morekeys_i */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", + /* keylabel_to_alpha */ null, + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u00E7,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* morekeys_s */ "\u0161,\u00DF,\u015B,\u015F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u010F", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + /* morekeys_z */ "\u017E,\u017C,\u017A", + /* keyspec_currency */ null, + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + /* morekeys_t */ "\u0163,\u0165", + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E", + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u0123,\u011F", + /* single_angle_quotes */ null, + /* double_angle_quotes */ null, + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + /* morekeys_r */ "\u0157,\u0159,\u0155", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + /* morekeys_k */ "\u0137", + }; + + /* Locale lv: Latvian */ + private static final String[] TEXTS_lv = { + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + /* morekeys_a */ "\u0101,\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0105", + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_o */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u0153,\u0151,\u00F8", + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + /* morekeys_u */ "\u016B,\u0173,\u00F9,\u00FA,\u00FB,\u00FC,\u016F,\u0171", + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + /* morekeys_e */ "\u0113,\u0117,\u00E8,\u00E9,\u00EA,\u00EB,\u0119,\u011B", + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + /* morekeys_i */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131", + /* keylabel_to_alpha */ null, + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u00E7,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* morekeys_s */ "\u0161,\u00DF,\u015B,\u015F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u010F", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + /* morekeys_z */ "\u017E,\u017C,\u017A", + /* keyspec_currency */ null, + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + /* morekeys_t */ "\u0163,\u0165", + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E", + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u0123,\u011F", + /* single_angle_quotes */ null, + /* double_angle_quotes */ null, + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + /* morekeys_r */ "\u0157,\u0159,\u0155", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + /* morekeys_k */ "\u0137", + }; + + /* Locale mk: Macedonian */ + private static final String[] TEXTS_mk = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_k */ + // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE + /* morekeys_cyrillic_ie */ "\u0450", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, + /* ~ morekeys_cyrillic_o */ + // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE + /* morekeys_cyrillic_i */ "\u045D", + // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE + /* keyspec_south_slavic_row1_6 */ "\u0455", + // U+045C: "ќ" CYRILLIC SMALL LETTER KJE + /* keyspec_south_slavic_row2_11 */ "\u045C", + // U+0437: "з" CYRILLIC SMALL LETTER ZE + /* keyspec_south_slavic_row3_1 */ "\u0437", + // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE + /* keyspec_south_slavic_row3_8 */ "\u0453", + }; + + /* Locale mn_MN: Mongolian (Mongolia) */ + private static final String[] TEXTS_mn_MN = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+20AE: "₮" TUGRIK SIGN + /* keyspec_currency */ "\u20AE", + }; + + /* Locale mr_IN: Marathi (India) */ + private static final String[] TEXTS_mr_IN = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0915: "क" DEVANAGARI LETTER KA + // U+0916: "ख" DEVANAGARI LETTER KHA + // U+0917: "ग" DEVANAGARI LETTER GA + /* keylabel_to_alpha */ "\u0915\u0916\u0917", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+20B9: "₹" INDIAN RUPEE SIGN + /* keyspec_currency */ "\u20B9", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ morekeys_cyrillic_soft_sign */ + // U+0967: "१" DEVANAGARI DIGIT ONE + /* keyspec_symbols_1 */ "\u0967", + // U+0968: "२" DEVANAGARI DIGIT TWO + /* keyspec_symbols_2 */ "\u0968", + // U+0969: "३" DEVANAGARI DIGIT THREE + /* keyspec_symbols_3 */ "\u0969", + // U+096A: "४" DEVANAGARI DIGIT FOUR + /* keyspec_symbols_4 */ "\u096A", + // U+096B: "५" DEVANAGARI DIGIT FIVE + /* keyspec_symbols_5 */ "\u096B", + // U+096C: "६" DEVANAGARI DIGIT SIX + /* keyspec_symbols_6 */ "\u096C", + // U+096D: "७" DEVANAGARI DIGIT SEVEN + /* keyspec_symbols_7 */ "\u096D", + // U+096E: "८" DEVANAGARI DIGIT EIGHT + /* keyspec_symbols_8 */ "\u096E", + // U+096F: "९" DEVANAGARI DIGIT NINE + /* keyspec_symbols_9 */ "\u096F", + // U+0966: "०" DEVANAGARI DIGIT ZERO + /* keyspec_symbols_0 */ "\u0966", + // Label for "switch to symbols" key. + /* keylabel_to_symbol */ "?\u0967\u0968\u0969", + /* additional_morekeys_symbols_1 */ "1", + /* additional_morekeys_symbols_2 */ "2", + /* additional_morekeys_symbols_3 */ "3", + /* additional_morekeys_symbols_4 */ "4", + /* additional_morekeys_symbols_5 */ "5", + /* additional_morekeys_symbols_6 */ "6", + /* additional_morekeys_symbols_7 */ "7", + /* additional_morekeys_symbols_8 */ "8", + /* additional_morekeys_symbols_9 */ "9", + /* additional_morekeys_symbols_0 */ "0", + }; + + /* Locale my_MM: Burmese (Myanmar) */ + private static final String[] TEXTS_my_MM = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+1000: "က" MYANMAR LETTER KA + // U+1001: "ခ" MYANMAR LETTER KHA + // U+1002: "ဂ" MYANMAR LETTER GA + /* keylabel_to_alpha */ "\u1000\u1001\u1002", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, + /* ~ morekeys_nordic_row2_11 */ + /* morekeys_punctuation */ "!autoColumnOrder!9,\u104A,.,?,!,#,),(,/,;,...,',@,:,-,\",+,\\%,&", + // U+104A: "၊" MYANMAR SIGN LITTLE SECTION + // U+104B: "။" MYANMAR SIGN SECTION + /* keyspec_tablet_comma */ "\u104A", + /* keyspec_swiss_row1_11 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ keyspec_right_single_angle_quote */ + /* morekeys_tablet_comma */ "\\,", + /* keyhintlabel_period */ "\u104A", + /* morekeys_tablet_period ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ keyspec_south_slavic_row3_8 */ + /* morekeys_tablet_punctuation */ "!autoColumnOrder!8,.,',#,),(,/,;,@,...,:,-,\",+,\\%,&", + /* keyspec_spanish_row2_10 ~ */ + null, null, null, null, null, null, null, + /* ~ keyhintlabel_tablet_comma */ + /* keyspec_period */ "\u104B", + /* morekeys_period */ null, + /* keyspec_tablet_period */ "\u104B", + }; + + /* Locale nb: Norwegian Bokmål */ + private static final String[] TEXTS_nb = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101", + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113", + /* morekeys_i ~ */ + null, null, null, + /* ~ morekeys_c */ + /* double_quotes */ "!text/double_9qm_rqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_rqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_cyrillic_ie */ + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + /* keyspec_nordic_row1_11 */ "\u00E5", + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* keyspec_nordic_row2_10 */ "\u00F8", + // U+00E6: "æ" LATIN SMALL LETTER AE + /* keyspec_nordic_row2_11 */ "\u00E6", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* morekeys_nordic_row2_10 */ "\u00F6", + /* keyspec_east_slavic_row1_9 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, + /* ~ additional_morekeys_symbols_0 */ + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* morekeys_nordic_row2_11 */ "\u00E4", + }; + + /* Locale ne_NP: Nepali (Nepal) */ + private static final String[] TEXTS_ne_NP = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0915: "क" DEVANAGARI LETTER KA + // U+0916: "ख" DEVANAGARI LETTER KHA + // U+0917: "ग" DEVANAGARI LETTER GA + /* keylabel_to_alpha */ "\u0915\u0916\u0917", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN + /* keyspec_currency */ "\u0930\u0941.", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, + /* ~ morekeys_cyrillic_soft_sign */ + // U+0967: "१" DEVANAGARI DIGIT ONE + /* keyspec_symbols_1 */ "\u0967", + // U+0968: "२" DEVANAGARI DIGIT TWO + /* keyspec_symbols_2 */ "\u0968", + // U+0969: "३" DEVANAGARI DIGIT THREE + /* keyspec_symbols_3 */ "\u0969", + // U+096A: "४" DEVANAGARI DIGIT FOUR + /* keyspec_symbols_4 */ "\u096A", + // U+096B: "५" DEVANAGARI DIGIT FIVE + /* keyspec_symbols_5 */ "\u096B", + // U+096C: "६" DEVANAGARI DIGIT SIX + /* keyspec_symbols_6 */ "\u096C", + // U+096D: "७" DEVANAGARI DIGIT SEVEN + /* keyspec_symbols_7 */ "\u096D", + // U+096E: "८" DEVANAGARI DIGIT EIGHT + /* keyspec_symbols_8 */ "\u096E", + // U+096F: "९" DEVANAGARI DIGIT NINE + /* keyspec_symbols_9 */ "\u096F", + // U+0966: "०" DEVANAGARI DIGIT ZERO + /* keyspec_symbols_0 */ "\u0966", + // Label for "switch to symbols" key. + /* keylabel_to_symbol */ "?\u0967\u0968\u0969", + /* additional_morekeys_symbols_1 */ "1", + /* additional_morekeys_symbols_2 */ "2", + /* additional_morekeys_symbols_3 */ "3", + /* additional_morekeys_symbols_4 */ "4", + /* additional_morekeys_symbols_5 */ "5", + /* additional_morekeys_symbols_6 */ "6", + /* additional_morekeys_symbols_7 */ "7", + /* additional_morekeys_symbols_8 */ "8", + /* additional_morekeys_symbols_9 */ "9", + /* additional_morekeys_symbols_0 */ "0", + }; + + /* Locale nl: Dutch */ + private static final String[] TEXTS_nl = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E1,\u00E4,\u00E2,\u00E0,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00FB,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00EB,\u00EA,\u00E8,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133", + /* keylabel_to_alpha */ null, + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_rqm", + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_rqm", + /* morekeys_s */ null, + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_y */ "\u0133", + }; + + /* Locale pl: Polish */ + private static final String[] TEXTS_pl = { + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u0105,\u00E1,\u00E0,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F6,\u00F4,\u00F2,\u00F5,\u0153,\u00F8,\u014D", + /* morekeys_u */ null, + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113", + /* morekeys_i */ null, + /* keylabel_to_alpha */ null, + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u0107,\u00E7,\u010D", + /* double_quotes */ "!text/double_9qm_rqm", + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* morekeys_n */ "\u0144,\u00F1", + /* single_quotes */ "!text/single_9qm_rqm", + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u015B,\u00DF,\u0161", + /* morekeys_y */ null, + /* morekeys_d */ null, + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + /* morekeys_z */ "\u017C,\u017A,\u017E", + /* keyspec_currency */ null, + /* morekeys_t */ null, + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u0142", + }; + + /* Locale pt: Portuguese */ + private static final String[] TEXTS_pt = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E3,\u00E0,\u00E2,\u00E4,\u00E5,\u00E6,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F5,\u00F4,\u00F2,\u00F6,\u0153,\u00F8,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + /* morekeys_e */ "\u00E9,\u00EA,\u00E8,\u0119,\u0117,\u0113,\u00EB", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u00E7,\u010D,\u0107", + }; + + /* Locale rm: Raeto-Romance */ + private static final String[] TEXTS_rm = { + /* morekeys_a */ null, + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_o */ "\u00F2,\u00F3,\u00F6,\u00F4,\u00F5,\u0153,\u00F8", + }; + + /* Locale ro: Romanian */ + private static final String[] TEXTS_ro = { + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E2,\u00E3,\u0103,\u00E0,\u00E1,\u00E4,\u00E6,\u00E5,\u0101", + /* morekeys_o ~ */ + null, null, null, + /* ~ morekeys_e */ + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", + /* keylabel_to_alpha */ null, + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_rqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_rqm", + // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u0219,\u00DF,\u015B,\u0161", + /* morekeys_y ~ */ + null, null, null, null, + /* ~ keyspec_currency */ + // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW + /* morekeys_t */ "\u021B", + }; + + /* Locale ru: Russian */ + private static final String[] TEXTS_ru = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_k */ + // U+0451: "ё" CYRILLIC SMALL LETTER IO + /* morekeys_cyrillic_ie */ "\u0451", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, + /* ~ morekeys_nordic_row2_10 */ + // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA + /* keyspec_east_slavic_row1_9 */ "\u0449", + // U+044B: "ы" CYRILLIC SMALL LETTER YERU + /* keyspec_east_slavic_row2_2 */ "\u044B", + // U+044D: "э" CYRILLIC SMALL LETTER E + /* keyspec_east_slavic_row2_11 */ "\u044D", + // U+0438: "и" CYRILLIC SMALL LETTER I + /* keyspec_east_slavic_row3_5 */ "\u0438", + // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN + /* morekeys_cyrillic_soft_sign */ "\u044A", + }; + + /* Locale si_LK: Sinhalese (Sri Lanka) */ + private static final String[] TEXTS_si_LK = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0D85: "අ" SINHALA LETTER AYANNA + // U+0D86: "ආ" SINHALA LETTER AAYANNA + /* keylabel_to_alpha */ "\u0D85,\u0D86", + }; + + /* Locale sk: Slovak */ + private static final String[] TEXTS_sk = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + /* morekeys_a */ "\u00E1,\u00E4,\u0101,\u00E0,\u00E2,\u00E3,\u00E5,\u00E6,\u0105", + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + /* morekeys_o */ "\u00F4,\u00F3,\u00F6,\u00F2,\u00F5,\u0153,\u0151,\u00F8", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + /* morekeys_u */ "\u00FA,\u016F,\u00FC,\u016B,\u0173,\u00F9,\u00FB,\u0171", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + /* morekeys_e */ "\u00E9,\u011B,\u0113,\u0117,\u00E8,\u00EA,\u00EB,\u0119", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + /* morekeys_i */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131", + /* keylabel_to_alpha */ null, + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u00E7,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + // U+0148: "ň" LATIN SMALL LETTER N WITH CARON + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u0148,\u0146,\u00F1,\u0144", + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + /* morekeys_s */ "\u0161,\u00DF,\u015B,\u015F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u010F", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + /* morekeys_z */ "\u017E,\u017C,\u017A", + /* keyspec_currency */ null, + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + /* morekeys_t */ "\u0165,\u0163", + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u013E,\u013A,\u013C,\u0142", + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u0123,\u011F", + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + /* morekeys_r */ "\u0155,\u0159,\u0157", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + /* morekeys_k */ "\u0137", + }; + + /* Locale sl: Slovenian */ + private static final String[] TEXTS_sl = { + /* morekeys_a ~ */ + null, null, null, null, null, null, + /* ~ keylabel_to_alpha */ + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + /* morekeys_c */ "\u010D,\u0107", + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u0161", + /* morekeys_y */ null, + // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE + /* morekeys_d */ "\u0111", + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + /* morekeys_z */ "\u017E", + /* keyspec_currency ~ */ + null, null, null, null, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + }; + + /* Locale sr: Serbian */ + private static final String[] TEXTS_sr = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // END: More keys definitions for Serbian (Cyrillic) + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_g */ + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + /* morekeys_r */ null, + /* morekeys_k */ null, + // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE + /* morekeys_cyrillic_ie */ "\u0450", + /* keyspec_nordic_row1_11 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, + /* ~ morekeys_cyrillic_o */ + // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE + /* morekeys_cyrillic_i */ "\u045D", + // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified. + // BEGIN: More keys definitions for Serbian (Latin) + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // <string name="morekeys_s">š,ß,ś</string> + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // <string name="morekeys_c">č,ç,ć</string> + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + // <string name="morekeys_d">ď</string> + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // <string name="morekeys_z">ž,ź,ż</string> + // END: More keys definitions for Serbian (Latin) + // BEGIN: More keys definitions for Serbian (Cyrillic) + // U+0437: "з" CYRILLIC SMALL LETTER ZE + /* keyspec_south_slavic_row1_6 */ "\u0437", + // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE + /* keyspec_south_slavic_row2_11 */ "\u045B", + // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE + /* keyspec_south_slavic_row3_1 */ "\u0455", + // U+0452: "ђ" CYRILLIC SMALL LETTER DJE + /* keyspec_south_slavic_row3_8 */ "\u0452", + }; + + /* Locale sv: Swedish */ + private static final String[] TEXTS_sv = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + /* morekeys_a */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FC,\u00FA,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + /* morekeys_i */ "\u00ED,\u00EC,\u00EE,\u00EF", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0148: "ň" LATIN SMALL LETTER N WITH CARON + /* morekeys_n */ "\u0144,\u00F1,\u0148", + /* single_quotes */ null, + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* morekeys_s */ "\u015B,\u0161,\u015F,\u00DF", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + /* morekeys_y */ "\u00FD,\u00FF", + // U+00F0: "ð" LATIN SMALL LETTER ETH + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + /* morekeys_d */ "\u00F0,\u010F", + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + /* morekeys_z */ "\u017A,\u017E,\u017C", + /* keyspec_currency */ null, + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + // U+00FE: "þ" LATIN SMALL LETTER THORN + /* morekeys_t */ "\u0165,\u00FE", + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u0142", + /* morekeys_g */ null, + /* single_angle_quotes */ "!text/single_raqm_laqm", + /* double_angle_quotes */ "!text/double_raqm_laqm", + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + /* morekeys_r */ "\u0159", + /* morekeys_k */ null, + /* morekeys_cyrillic_ie */ null, + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + /* keyspec_nordic_row1_11 */ "\u00E5", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + /* keyspec_nordic_row2_10 */ "\u00F6", + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + /* keyspec_nordic_row2_11 */ "\u00E4", + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + /* morekeys_nordic_row2_10 */ "\u00F8,\u0153", + /* keyspec_east_slavic_row1_9 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, + /* ~ additional_morekeys_symbols_0 */ + // U+00E6: "æ" LATIN SMALL LETTER AE + /* morekeys_nordic_row2_11 */ "\u00E6", + }; + + /* Locale sw: Swahili */ + private static final String[] TEXTS_sw = { + // This is the same as English except morekeys_g. + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + /* morekeys_o */ "\u00F4,\u00F6,\u00F2,\u00F3,\u0153,\u00F8,\u014D,\u00F5", + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FB,\u00FC,\u00F9,\u00FA,\u016B", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113", + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + /* morekeys_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + /* morekeys_c */ "\u00E7", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* morekeys_n */ "\u00F1", + /* single_quotes */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* morekeys_s */ "\u00DF", + /* morekeys_y ~ */ + null, null, null, null, null, null, + /* ~ morekeys_l */ + /* morekeys_g */ "g\'", + }; + + /* Locale th: Thai */ + private static final String[] TEXTS_th = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0E01: "ก" THAI CHARACTER KO KAI + // U+0E02: "ข" THAI CHARACTER KHO KHAI + // U+0E04: "ค" THAI CHARACTER KHO KHWAI + /* keylabel_to_alpha */ "\u0E01\u0E02\u0E04", + /* morekeys_c ~ */ + null, null, null, null, null, null, null, null, + /* ~ morekeys_z */ + // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT + /* keyspec_currency */ "\u0E3F", + }; + + /* Locale tl: Tagalog */ + private static final String[] TEXTS_tl = { + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E1,\u00E0,\u00E4,\u00E2,\u00E3,\u00E5,\u0105,\u00E6,\u0101,\u00AA", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F3,\u00F2,\u00F6,\u00F4,\u00F5,\u00F8,\u0153,\u014D,\u00BA", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FC,\u00F9,\u00FB,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EB,\u00EA,\u0119,\u0117,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + /* morekeys_n */ "\u00F1,\u0144", + }; + + /* Locale tr: Turkish */ + private static final String[] TEXTS_tr = { + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + /* morekeys_a */ "\u00E2", + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + /* morekeys_o */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D", + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B", + /* morekeys_e */ null, + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u010D", + /* double_quotes ~ */ + null, null, null, + /* ~ single_quotes */ + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + /* morekeys_s */ "\u015F,\u00DF,\u015B,\u0161", + /* morekeys_y ~ */ + null, null, null, null, null, null, + /* ~ morekeys_l */ + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + /* morekeys_g */ "\u011F", + }; + + /* Locale uk: Ukrainian */ + private static final String[] TEXTS_uk = { + /* morekeys_a ~ */ + null, null, null, null, null, + /* ~ morekeys_i */ + // Label for "switch to alphabetic" key. + // U+0410: "А" CYRILLIC CAPITAL LETTER A + // U+0411: "Б" CYRILLIC CAPITAL LETTER BE + // U+0412: "В" CYRILLIC CAPITAL LETTER VE + /* keylabel_to_alpha */ "\u0410\u0411\u0412", + /* morekeys_c */ null, + /* double_quotes */ "!text/double_9qm_lqm", + /* morekeys_n */ null, + /* single_quotes */ "!text/single_9qm_lqm", + /* morekeys_s ~ */ + null, null, null, null, + /* ~ morekeys_z */ + // U+20B4: "₴" HRYVNIA SIGN + /* keyspec_currency */ "\u20B4", + /* morekeys_t ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_nordic_row2_10 */ + // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA + /* keyspec_east_slavic_row1_9 */ "\u0449", + // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + /* keyspec_east_slavic_row2_2 */ "\u0456", + // U+0454: "є" CYRILLIC SMALL LETTER UKRAINIAN IE + /* keyspec_east_slavic_row2_11 */ "\u0454", + // U+0438: "и" CYRILLIC SMALL LETTER I + /* keyspec_east_slavic_row3_5 */ "\u0438", + // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN + /* morekeys_cyrillic_soft_sign */ "\u044A", + /* keyspec_symbols_1 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, + /* ~ morekeys_w */ + // U+0457: "ї" CYRILLIC SMALL LETTER YI + /* morekeys_east_slavic_row2_2 */ "\u0457", + /* morekeys_cyrillic_u */ null, + /* morekeys_cyrillic_en */ null, + // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN + /* morekeys_cyrillic_ghe */ "\u0491", + }; + + /* Locale vi: Vietnamese */ + private static final String[] TEXTS_vi = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+1EA3: "ả" LATIN SMALL LETTER A WITH HOOK ABOVE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+1EA1: "ạ" LATIN SMALL LETTER A WITH DOT BELOW + // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE + // U+1EB1: "ằ" LATIN SMALL LETTER A WITH BREVE AND GRAVE + // U+1EAF: "ắ" LATIN SMALL LETTER A WITH BREVE AND ACUTE + // U+1EB3: "ẳ" LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE + // U+1EB5: "ẵ" LATIN SMALL LETTER A WITH BREVE AND TILDE + // U+1EB7: "ặ" LATIN SMALL LETTER A WITH BREVE AND DOT BELOW + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+1EA7: "ầ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE + // U+1EA5: "ấ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE + // U+1EA9: "ẩ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE + // U+1EAB: "ẫ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE + // U+1EAD: "ậ" LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW + /* morekeys_a */ "\u00E0,\u00E1,\u1EA3,\u00E3,\u1EA1,\u0103,\u1EB1,\u1EAF,\u1EB3,\u1EB5,\u1EB7,\u00E2,\u1EA7,\u1EA5,\u1EA9,\u1EAB,\u1EAD", + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+1ECF: "ỏ" LATIN SMALL LETTER O WITH HOOK ABOVE + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+1ECD: "ọ" LATIN SMALL LETTER O WITH DOT BELOW + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+1ED3: "ồ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE + // U+1ED1: "ố" LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE + // U+1ED5: "ổ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE + // U+1ED7: "ỗ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE + // U+1ED9: "ộ" LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW + // U+01A1: "ơ" LATIN SMALL LETTER O WITH HORN + // U+1EDD: "ờ" LATIN SMALL LETTER O WITH HORN AND GRAVE + // U+1EDB: "ớ" LATIN SMALL LETTER O WITH HORN AND ACUTE + // U+1EDF: "ở" LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE + // U+1EE1: "ỡ" LATIN SMALL LETTER O WITH HORN AND TILDE + // U+1EE3: "ợ" LATIN SMALL LETTER O WITH HORN AND DOT BELOW + /* morekeys_o */ "\u00F2,\u00F3,\u1ECF,\u00F5,\u1ECD,\u00F4,\u1ED3,\u1ED1,\u1ED5,\u1ED7,\u1ED9,\u01A1,\u1EDD,\u1EDB,\u1EDF,\u1EE1,\u1EE3", + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+1EE7: "ủ" LATIN SMALL LETTER U WITH HOOK ABOVE + // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE + // U+1EE5: "ụ" LATIN SMALL LETTER U WITH DOT BELOW + // U+01B0: "ư" LATIN SMALL LETTER U WITH HORN + // U+1EEB: "ừ" LATIN SMALL LETTER U WITH HORN AND GRAVE + // U+1EE9: "ứ" LATIN SMALL LETTER U WITH HORN AND ACUTE + // U+1EED: "ử" LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE + // U+1EEF: "ữ" LATIN SMALL LETTER U WITH HORN AND TILDE + // U+1EF1: "ự" LATIN SMALL LETTER U WITH HORN AND DOT BELOW + /* morekeys_u */ "\u00F9,\u00FA,\u1EE7,\u0169,\u1EE5,\u01B0,\u1EEB,\u1EE9,\u1EED,\u1EEF,\u1EF1", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+1EBB: "ẻ" LATIN SMALL LETTER E WITH HOOK ABOVE + // U+1EBD: "ẽ" LATIN SMALL LETTER E WITH TILDE + // U+1EB9: "ẹ" LATIN SMALL LETTER E WITH DOT BELOW + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+1EC1: "ề" LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE + // U+1EBF: "ế" LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE + // U+1EC3: "ể" LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE + // U+1EC5: "ễ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE + // U+1EC7: "ệ" LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW + /* morekeys_e */ "\u00E8,\u00E9,\u1EBB,\u1EBD,\u1EB9,\u00EA,\u1EC1,\u1EBF,\u1EC3,\u1EC5,\u1EC7", + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+1EC9: "ỉ" LATIN SMALL LETTER I WITH HOOK ABOVE + // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE + // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW + /* morekeys_i */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB", + /* keylabel_to_alpha ~ */ + null, null, null, null, null, null, + /* ~ morekeys_s */ + // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+1EF7: "ỷ" LATIN SMALL LETTER Y WITH HOOK ABOVE + // U+1EF9: "ỹ" LATIN SMALL LETTER Y WITH TILDE + // U+1EF5: "ỵ" LATIN SMALL LETTER Y WITH DOT BELOW + /* morekeys_y */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5", + // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE + /* morekeys_d */ "\u0111", + /* morekeys_z */ null, + // U+20AB: "₫" DONG SIGN + /* keyspec_currency */ "\u20AB", + }; + + /* Locale zu: Zulu */ + private static final String[] TEXTS_zu = { + // This is the same as English + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E4,\u00E6,\u00E3,\u00E5,\u0101", + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + /* morekeys_o */ "\u00F3,\u00F4,\u00F6,\u00F2,\u0153,\u00F8,\u014D,\u00F5", + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + /* morekeys_u */ "\u00FA,\u00FB,\u00FC,\u00F9,\u016B", + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0113", + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + /* morekeys_c */ "\u00E7", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + /* morekeys_n */ "\u00F1", + /* single_quotes */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + /* morekeys_s */ "\u00DF", + }; + + /* Locale zz: Alphabet */ + private static final String[] TEXTS_zz = { + // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE + // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE + // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX + // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE + // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS + // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE + // U+00E6: "æ" LATIN SMALL LETTER AE + // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON + // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE + // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK + // U+00AA: "ª" FEMININE ORDINAL INDICATOR + /* morekeys_a */ "\u00E0,\u00E1,\u00E2,\u00E3,\u00E4,\u00E5,\u00E6,\u0101,\u0103,\u0105,\u00AA", + // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE + // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE + // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX + // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE + // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS + // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE + // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON + // U+014F: "ŏ" LATIN SMALL LETTER O WITH BREVE + // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE + // U+0153: "œ" LATIN SMALL LIGATURE OE + // U+00BA: "º" MASCULINE ORDINAL INDICATOR + /* morekeys_o */ "\u00F2,\u00F3,\u00F4,\u00F5,\u00F6,\u00F8,\u014D,\u014F,\u0151,\u0153,\u00BA", + // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE + // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE + // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX + // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS + // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE + // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON + // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE + // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE + // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE + // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK + /* morekeys_u */ "\u00F9,\u00FA,\u00FB,\u00FC,\u0169,\u016B,\u016D,\u016F,\u0171,\u0173", + // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE + // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE + // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX + // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS + // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON + // U+0115: "ĕ" LATIN SMALL LETTER E WITH BREVE + // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE + // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK + // U+011B: "ě" LATIN SMALL LETTER E WITH CARON + /* morekeys_e */ "\u00E8,\u00E9,\u00EA,\u00EB,\u0113,\u0115,\u0117,\u0119,\u011B", + // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE + // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE + // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX + // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS + // U+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE + // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON + // U+012D: "ĭ" LATIN SMALL LETTER I WITH BREVE + // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK + // U+0131: "ı" LATIN SMALL LETTER DOTLESS I + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133", + /* keylabel_to_alpha */ null, + // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA + // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE + // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX + // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE + // U+010D: "č" LATIN SMALL LETTER C WITH CARON + /* morekeys_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D", + /* double_quotes */ null, + // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE + // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE + // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA + // U+0148: "ň" LATIN SMALL LETTER N WITH CARON + // U+0149: "ʼn" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + // U+014B: "ŋ" LATIN SMALL LETTER ENG + /* morekeys_n */ "\u00F1,\u0144,\u0146,\u0148,\u0149,\u014B", + /* single_quotes */ null, + // U+00DF: "ß" LATIN SMALL LETTER SHARP S + // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE + // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX + // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA + // U+0161: "š" LATIN SMALL LETTER S WITH CARON + // U+017F: "ſ" LATIN SMALL LETTER LONG S + /* morekeys_s */ "\u00DF,\u015B,\u015D,\u015F,\u0161,\u017F", + // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE + // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX + // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS + // U+0133: "ij" LATIN SMALL LIGATURE IJ + /* morekeys_y */ "\u00FD,\u0177,\u00FF,\u0133", + // U+010F: "ď" LATIN SMALL LETTER D WITH CARON + // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE + // U+00F0: "ð" LATIN SMALL LETTER ETH + /* morekeys_d */ "\u010F,\u0111,\u00F0", + // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE + // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE + // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON + /* morekeys_z */ "\u017A,\u017C,\u017E", + /* keyspec_currency */ null, + // U+00FE: "þ" LATIN SMALL LETTER THORN + // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA + // U+0165: "ť" LATIN SMALL LETTER T WITH CARON + // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE + /* morekeys_t */ "\u00FE,\u0163,\u0165,\u0167", + // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE + // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA + // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON + // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT + // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE + /* morekeys_l */ "\u013A,\u013C,\u013E,\u0140,\u0142", + // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX + // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE + // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE + // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA + /* morekeys_g */ "\u011D,\u011F,\u0121,\u0123", + /* single_angle_quotes */ null, + /* double_angle_quotes */ null, + // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE + // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA + // U+0159: "ř" LATIN SMALL LETTER R WITH CARON + /* morekeys_r */ "\u0155,\u0157,\u0159", + // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA + // U+0138: "ĸ" LATIN SMALL LETTER KRA + /* morekeys_k */ "\u0137,\u0138", + /* morekeys_cyrillic_ie ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_question */ + // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX + /* morekeys_h */ "\u0125", + // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX + /* morekeys_w */ "\u0175", + /* morekeys_east_slavic_row2_2 ~ */ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, + /* ~ morekeys_v */ + // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX + /* morekeys_j */ "\u0135", + }; + + private static final Object[] LOCALES_AND_TEXTS = { + // "locale", TEXT_ARRAY, /* numberOfNonNullText/lengthOf_TEXT_ARRAY localeName */ + "DEFAULT", TEXTS_DEFAULT, /* 168/168 DEFAULT */ + "af" , TEXTS_af, /* 7/ 12 Afrikaans */ + "ar" , TEXTS_ar, /* 55/110 Arabic */ + "az_AZ" , TEXTS_az_AZ, /* 8/ 18 Azerbaijani (Azerbaijan) */ + "be_BY" , TEXTS_be_BY, /* 9/ 32 Belarusian (Belarus) */ + "bg" , TEXTS_bg, /* 2/ 8 Bulgarian */ + "bn" , TEXTS_bn, /* 2/ 15 Bengali */ + "ca" , TEXTS_ca, /* 11/ 95 Catalan */ + "cs" , TEXTS_cs, /* 17/ 21 Czech */ + "da" , TEXTS_da, /* 19/ 54 Danish */ + "de" , TEXTS_de, /* 16/ 62 German */ + "el" , TEXTS_el, /* 1/ 6 Greek */ + "en" , TEXTS_en, /* 8/ 11 English */ + "eo" , TEXTS_eo, /* 26/118 Esperanto */ + "es" , TEXTS_es, /* 8/ 55 Spanish */ + "et_EE" , TEXTS_et_EE, /* 22/ 27 Estonian (Estonia) */ + "eu_ES" , TEXTS_eu_ES, /* 7/ 9 Basque (Spain) */ + "fa" , TEXTS_fa, /* 58/125 Persian */ + "fi" , TEXTS_fi, /* 10/ 54 Finnish */ + "fr" , TEXTS_fr, /* 13/ 62 French */ + "gl_ES" , TEXTS_gl_ES, /* 7/ 9 Gallegan (Spain) */ + "hi" , TEXTS_hi, /* 23/ 53 Hindi */ + "hr" , TEXTS_hr, /* 9/ 20 Croatian */ + "hu" , TEXTS_hu, /* 9/ 20 Hungarian */ + "hy_AM" , TEXTS_hy_AM, /* 8/126 Armenian (Armenia) */ + "is" , TEXTS_is, /* 10/ 16 Icelandic */ + "it" , TEXTS_it, /* 11/ 62 Italian */ + "iw" , TEXTS_iw, /* 20/123 Hebrew */ + "ka_GE" , TEXTS_ka_GE, /* 3/ 10 Georgian (Georgia) */ + "kk" , TEXTS_kk, /* 15/121 Kazakh */ + "km_KH" , TEXTS_km_KH, /* 2/122 Khmer (Cambodia) */ + "ky" , TEXTS_ky, /* 10/ 88 Kirghiz */ + "lo_LA" , TEXTS_lo_LA, /* 2/ 15 Lao (Laos) */ + "lt" , TEXTS_lt, /* 18/ 22 Lithuanian */ + "lv" , TEXTS_lv, /* 18/ 22 Latvian */ + "mk" , TEXTS_mk, /* 9/ 93 Macedonian */ + "mn_MN" , TEXTS_mn_MN, /* 2/ 15 Mongolian (Mongolia) */ + "mr_IN" , TEXTS_mr_IN, /* 23/ 53 Marathi (India) */ + "my_MM" , TEXTS_my_MM, /* 8/104 Burmese (Myanmar) */ + "nb" , TEXTS_nb, /* 11/ 54 Norwegian Bokmål */ + "ne_NP" , TEXTS_ne_NP, /* 23/ 53 Nepali (Nepal) */ + "nl" , TEXTS_nl, /* 9/ 12 Dutch */ + "pl" , TEXTS_pl, /* 10/ 17 Polish */ + "pt" , TEXTS_pt, /* 6/ 7 Portuguese */ + "rm" , TEXTS_rm, /* 1/ 2 Raeto-Romance */ + "ro" , TEXTS_ro, /* 6/ 16 Romanian */ + "ru" , TEXTS_ru, /* 9/ 32 Russian */ + "si_LK" , TEXTS_si_LK, /* 1/ 6 Sinhalese (Sri Lanka) */ + "sk" , TEXTS_sk, /* 20/ 22 Slovak */ + "sl" , TEXTS_sl, /* 8/ 20 Slovenian */ + "sr" , TEXTS_sr, /* 11/ 93 Serbian */ + "sv" , TEXTS_sv, /* 21/ 54 Swedish */ + "sw" , TEXTS_sw, /* 9/ 18 Swahili */ + "th" , TEXTS_th, /* 2/ 15 Thai */ + "tl" , TEXTS_tl, /* 7/ 9 Tagalog */ + "tr" , TEXTS_tr, /* 7/ 18 Turkish */ + "uk" , TEXTS_uk, /* 11/ 87 Ukrainian */ + "vi" , TEXTS_vi, /* 8/ 15 Vietnamese */ + "zu" , TEXTS_zu, /* 8/ 11 Zulu */ + "zz" , TEXTS_zz, /* 19/112 Alphabet */ + }; + + static { + for (int index = 0; index < NAMES.length; index++) { + sNameToIndexesMap.put(NAMES[index], index); + } + + for (int i = 0; i < LOCALES_AND_TEXTS.length; i += 2) { + final String locale = (String)LOCALES_AND_TEXTS[i]; + final String[] textsTable = (String[])LOCALES_AND_TEXTS[i + 1]; + sLocaleToTextsTableMap.put(locale, textsTable); + sTextsTableToLocaleMap.put(textsTable, locale); + } + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeysCache.java b/java/src/com/android/inputmethod/keyboard/internal/KeysCache.java index 7c2e3e174..7743d4744 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeysCache.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeysCache.java @@ -17,12 +17,11 @@ package com.android.inputmethod.keyboard.internal; import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.HashMap; public final class KeysCache { - private final HashMap<Key, Key> mMap = CollectionUtils.newHashMap(); + private final HashMap<Key, Key> mMap = new HashMap<>(); public void clear() { mMap.clear(); diff --git a/java/src/com/android/inputmethod/keyboard/internal/LanguageOnSpacebarHelper.java b/java/src/com/android/inputmethod/keyboard/internal/LanguageOnSpacebarHelper.java new file mode 100644 index 000000000..6400a2440 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/LanguageOnSpacebarHelper.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; + +import java.util.Collections; +import java.util.List; + +/** + * This class determines that the language name on the spacebar should be displayed in what format. + */ +public final class LanguageOnSpacebarHelper { + public static final int FORMAT_TYPE_NONE = 0; + public static final int FORMAT_TYPE_LANGUAGE_ONLY = 1; + public static final int FORMAT_TYPE_FULL_LOCALE = 2; + + private List<InputMethodSubtype> mEnabledSubtypes = Collections.emptyList(); + private boolean mIsSystemLanguageSameAsInputLanguage; + + public int getLanguageOnSpacebarFormatType(final InputMethodSubtype subtype) { + if (SubtypeLocaleUtils.isNoLanguage(subtype)) { + return FORMAT_TYPE_FULL_LOCALE; + } + // Only this subtype is enabled and equals to the system locale. + if (mEnabledSubtypes.size() < 2 && mIsSystemLanguageSameAsInputLanguage) { + return FORMAT_TYPE_NONE; + } + final String keyboardLanguage = SubtypeLocaleUtils.getSubtypeLocale(subtype).getLanguage(); + final String keyboardLayout = SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype); + int sameLanguageAndLayoutCount = 0; + for (final InputMethodSubtype ims : mEnabledSubtypes) { + final String language = SubtypeLocaleUtils.getSubtypeLocale(ims).getLanguage(); + if (keyboardLanguage.equals(language) && keyboardLayout.equals( + SubtypeLocaleUtils.getKeyboardLayoutSetName(ims))) { + sameLanguageAndLayoutCount++; + } + } + // Display full locale name only when there are multiple subtypes that have the same + // locale and keyboard layout. Otherwise displaying language name is enough. + return sameLanguageAndLayoutCount > 1 ? FORMAT_TYPE_FULL_LOCALE + : FORMAT_TYPE_LANGUAGE_ONLY; + } + + public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) { + mEnabledSubtypes = enabledSubtypes; + } + + public void updateIsSystemLanguageSameAsInputLanguage(final boolean isSame) { + mIsSystemLanguageSameAsInputLanguage = isSame; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java index 110936f8f..e0d5173ac 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java +++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java @@ -18,23 +18,42 @@ package com.android.inputmethod.keyboard.internal; import android.text.TextUtils; +import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.StringUtils; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; +/** + * The more key specification object. The more keys are an array of {@link MoreKeySpec}. + * + * The more keys specification is comma separated "key specification" each of which represents one + * "more key". + * The key specification might have label or string resource reference in it. These references are + * expanded before parsing comma. + * Special character, comma ',' backslash '\' can be escaped by '\' character. + * Note that the '\' is also parsed by XML parser and {@link MoreKeySpec#splitKeySpecs(String)} + * as well. + */ +// TODO: Should extend the key specification object. public final class MoreKeySpec { public final int mCode; public final String mLabel; public final String mOutputText; public final int mIconId; - public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale, - final KeyboardCodesSet codesSet) { - mLabel = KeySpecParser.toUpperCaseOfStringForLocale( + public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale) { + if (TextUtils.isEmpty(moreKeySpec)) { + throw new KeySpecParser.KeySpecParserError("Empty more key spec"); + } + mLabel = StringUtils.toUpperCaseOfStringForLocale( KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale); - final int code = KeySpecParser.toUpperCaseOfCodeForLocale( - KeySpecParser.getCode(moreKeySpec, codesSet), needsToUpperCase, locale); + final int code = StringUtils.toUpperCaseOfCodeForLocale( + KeySpecParser.getCode(moreKeySpec), needsToUpperCase, locale); if (code == Constants.CODE_UNSPECIFIED) { // Some letter, for example German Eszett (U+00DF: "ß"), has multiple characters // upper case representation ("SS"). @@ -42,12 +61,19 @@ public final class MoreKeySpec { mOutputText = mLabel; } else { mCode = code; - mOutputText = KeySpecParser.toUpperCaseOfStringForLocale( + mOutputText = StringUtils.toUpperCaseOfStringForLocale( KeySpecParser.getOutputText(moreKeySpec), needsToUpperCase, locale); } mIconId = KeySpecParser.getIconId(moreKeySpec); } + public Key buildKey(final int x, final int y, final int labelFlags, + final KeyboardParams params) { + return new Key(mLabel, mIconId, mCode, mOutputText, null /* hintLabel */, labelFlags, + Key.BACKGROUND_TYPE_NORMAL, x, y, params.mDefaultKeyWidth, params.mDefaultRowHeight, + params.mHorizontalGap, params.mVerticalGap); + } + @Override public int hashCode() { int hashCode = 1; @@ -74,7 +100,7 @@ public final class MoreKeySpec { @Override public String toString() { final String label = (mIconId == KeyboardIconsSet.ICON_UNDEFINED ? mLabel - : KeySpecParser.PREFIX_ICON + KeyboardIconsSet.getIconName(mIconId)); + : KeyboardIconsSet.PREFIX_ICON + KeyboardIconsSet.getIconName(mIconId)); final String output = (mCode == Constants.CODE_OUTPUT_TEXT ? mOutputText : Constants.printableCode(mCode)); if (StringUtils.codePointCount(label) == 1 && label.codePointAt(0) == mCode) { @@ -83,4 +109,196 @@ public final class MoreKeySpec { return label + "|" + output; } } + + private static final boolean DEBUG = LatinImeLogger.sDBG; + // Constants for parsing. + private static final char COMMA = Constants.CODE_COMMA; + private static final char BACKSLASH = Constants.CODE_BACKSLASH; + private static final String ADDITIONAL_MORE_KEY_MARKER = + StringUtils.newSingleCodePointString(Constants.CODE_PERCENT); + + /** + * Split the text containing multiple key specifications separated by commas into an array of + * key specifications. + * A key specification can contain a character escaped by the backslash character, including a + * comma character. + * Note that an empty key specification will be eliminated from the result array. + * + * @param text the text containing multiple key specifications. + * @return an array of key specification text. Null if the specified <code>text</code> is empty + * or has no key specifications. + */ + public static String[] splitKeySpecs(final String text) { + if (TextUtils.isEmpty(text)) { + return null; + } + final int size = text.length(); + // Optimization for one-letter key specification. + if (size == 1) { + return text.charAt(0) == COMMA ? null : new String[] { text }; + } + + ArrayList<String> list = null; + int start = 0; + // The characters in question in this loop are COMMA and BACKSLASH. These characters never + // match any high or low surrogate character. So it is OK to iterate through with char + // index. + for (int pos = 0; pos < size; pos++) { + final char c = text.charAt(pos); + if (c == COMMA) { + // Skip empty entry. + if (pos - start > 0) { + if (list == null) { + list = new ArrayList<>(); + } + list.add(text.substring(start, pos)); + } + // Skip comma + start = pos + 1; + } else if (c == BACKSLASH) { + // Skip escape character and escaped character. + pos++; + } + } + final String remain = (size - start > 0) ? text.substring(start) : null; + if (list == null) { + return remain != null ? new String[] { remain } : null; + } + if (remain != null) { + list.add(remain); + } + return list.toArray(new String[list.size()]); + } + + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + + private static String[] filterOutEmptyString(final String[] array) { + if (array == null) { + return EMPTY_STRING_ARRAY; + } + ArrayList<String> out = null; + for (int i = 0; i < array.length; i++) { + final String entry = array[i]; + if (TextUtils.isEmpty(entry)) { + if (out == null) { + out = CollectionUtils.arrayAsList(array, 0, i); + } + } else if (out != null) { + out.add(entry); + } + } + if (out == null) { + return array; + } + return out.toArray(new String[out.size()]); + } + + public static String[] insertAdditionalMoreKeys(final String[] moreKeySpecs, + final String[] additionalMoreKeySpecs) { + final String[] moreKeys = filterOutEmptyString(moreKeySpecs); + final String[] additionalMoreKeys = filterOutEmptyString(additionalMoreKeySpecs); + final int moreKeysCount = moreKeys.length; + final int additionalCount = additionalMoreKeys.length; + ArrayList<String> out = null; + int additionalIndex = 0; + for (int moreKeyIndex = 0; moreKeyIndex < moreKeysCount; moreKeyIndex++) { + final String moreKeySpec = moreKeys[moreKeyIndex]; + if (moreKeySpec.equals(ADDITIONAL_MORE_KEY_MARKER)) { + if (additionalIndex < additionalCount) { + // Replace '%' marker with additional more key specification. + final String additionalMoreKey = additionalMoreKeys[additionalIndex]; + if (out != null) { + out.add(additionalMoreKey); + } else { + moreKeys[moreKeyIndex] = additionalMoreKey; + } + additionalIndex++; + } else { + // Filter out excessive '%' marker. + if (out == null) { + out = CollectionUtils.arrayAsList(moreKeys, 0, moreKeyIndex); + } + } + } else { + if (out != null) { + out.add(moreKeySpec); + } + } + } + if (additionalCount > 0 && additionalIndex == 0) { + // No '%' marker is found in more keys. + // Insert all additional more keys to the head of more keys. + if (DEBUG && out != null) { + throw new RuntimeException("Internal logic error:" + + " moreKeys=" + Arrays.toString(moreKeys) + + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); + } + out = CollectionUtils.arrayAsList(additionalMoreKeys, additionalIndex, additionalCount); + for (int i = 0; i < moreKeysCount; i++) { + out.add(moreKeys[i]); + } + } else if (additionalIndex < additionalCount) { + // The number of '%' markers are less than additional more keys. + // Append remained additional more keys to the tail of more keys. + if (DEBUG && out != null) { + throw new RuntimeException("Internal logic error:" + + " moreKeys=" + Arrays.toString(moreKeys) + + " additionalMoreKeys=" + Arrays.toString(additionalMoreKeys)); + } + out = CollectionUtils.arrayAsList(moreKeys, 0, moreKeysCount); + for (int i = additionalIndex; i < additionalCount; i++) { + out.add(additionalMoreKeys[additionalIndex]); + } + } + if (out == null && moreKeysCount > 0) { + return moreKeys; + } else if (out != null && out.size() > 0) { + return out.toArray(new String[out.size()]); + } else { + return null; + } + } + + public static int getIntValue(final String[] moreKeys, final String key, + final int defaultValue) { + if (moreKeys == null) { + return defaultValue; + } + final int keyLen = key.length(); + boolean foundValue = false; + int value = defaultValue; + for (int i = 0; i < moreKeys.length; i++) { + final String moreKeySpec = moreKeys[i]; + if (moreKeySpec == null || !moreKeySpec.startsWith(key)) { + continue; + } + moreKeys[i] = null; + try { + if (!foundValue) { + value = Integer.parseInt(moreKeySpec.substring(keyLen)); + foundValue = true; + } + } catch (NumberFormatException e) { + throw new RuntimeException( + "integer should follow after " + key + ": " + moreKeySpec); + } + } + return value; + } + + public static boolean getBooleanValue(final String[] moreKeys, final String key) { + if (moreKeys == null) { + return false; + } + boolean value = false; + for (int i = 0; i < moreKeys.length; i++) { + final String moreKeySpec = moreKeys[i]; + if (moreKeySpec == null || !moreKeySpec.equals(key)) { + continue; + } + moreKeys[i] = null; + value = true; + } + return value; + } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java index a0935b985..3a9aa81a3 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java +++ b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java @@ -20,18 +20,19 @@ import android.util.Log; import android.view.MotionEvent; import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.KeyDetector; import com.android.inputmethod.keyboard.PointerTracker; -import com.android.inputmethod.keyboard.PointerTracker.KeyEventHandler; import com.android.inputmethod.latin.utils.CoordinateUtils; public final class NonDistinctMultitouchHelper { private static final String TAG = NonDistinctMultitouchHelper.class.getSimpleName(); + private static final int MAIN_POINTER_TRACKER_ID = 0; private int mOldPointerCount = 1; private Key mOldKey; private int[] mLastCoords = CoordinateUtils.newInstance(); - public void processMotionEvent(final MotionEvent me, final KeyEventHandler keyEventHandler) { + public void processMotionEvent(final MotionEvent me, final KeyDetector keyDetector) { final int pointerCount = me.getPointerCount(); final int oldPointerCount = mOldPointerCount; mOldPointerCount = pointerCount; @@ -41,8 +42,9 @@ public final class NonDistinctMultitouchHelper { return; } - // Use only main (id=0) pointer tracker. - final PointerTracker mainTracker = PointerTracker.getPointerTracker(0, keyEventHandler); + // Use only main pointer tracker. + final PointerTracker mainTracker = PointerTracker.getPointerTracker( + MAIN_POINTER_TRACKER_ID); final int action = me.getActionMasked(); final int index = me.getActionIndex(); final long eventTime = me.getEventTime(); @@ -51,12 +53,12 @@ public final class NonDistinctMultitouchHelper { // In single-touch. if (oldPointerCount == 1 && pointerCount == 1) { if (me.getPointerId(index) == mainTracker.mPointerId) { - mainTracker.processMotionEvent(me, keyEventHandler); + mainTracker.processMotionEvent(me, keyDetector); return; } // Inject a copied event. injectMotionEvent(action, me.getX(index), me.getY(index), downTime, eventTime, - mainTracker, keyEventHandler); + mainTracker, keyDetector); return; } @@ -70,7 +72,7 @@ public final class NonDistinctMultitouchHelper { mOldKey = mainTracker.getKeyOn(x, y); // Inject an artifact up event for the old key. injectMotionEvent(MotionEvent.ACTION_UP, x, y, downTime, eventTime, - mainTracker, keyEventHandler); + mainTracker, keyDetector); return; } @@ -85,11 +87,11 @@ public final class NonDistinctMultitouchHelper { // Inject an artifact down event for the new key. // An artifact up event for the new key will usually be injected as a single-touch. injectMotionEvent(MotionEvent.ACTION_DOWN, x, y, downTime, eventTime, - mainTracker, keyEventHandler); + mainTracker, keyDetector); if (action == MotionEvent.ACTION_UP) { // Inject an artifact up event for the new key also. injectMotionEvent(MotionEvent.ACTION_UP, x, y, downTime, eventTime, - mainTracker, keyEventHandler); + mainTracker, keyDetector); } } return; @@ -101,11 +103,11 @@ public final class NonDistinctMultitouchHelper { private static void injectMotionEvent(final int action, final float x, final float y, final long downTime, final long eventTime, final PointerTracker tracker, - final KeyEventHandler handler) { + final KeyDetector keyDetector) { final MotionEvent me = MotionEvent.obtain( downTime, eventTime, action, x, y, 0 /* metaState */); try { - tracker.processMotionEvent(me, handler); + tracker.processMotionEvent(me, keyDetector); } finally { me.recycle(); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java index 7ee45e8f6..8e89e61ea 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java @@ -18,8 +18,6 @@ package com.android.inputmethod.keyboard.internal; import android.util.Log; -import com.android.inputmethod.latin.utils.CollectionUtils; - import java.util.ArrayList; public final class PointerTrackerQueue { @@ -28,7 +26,7 @@ public final class PointerTrackerQueue { public interface Element { public boolean isModifier(); - public boolean isInSlidingKeyInput(); + public boolean isInDraggingFinger(); public void onPhantomUpEvent(long eventTime); public void cancelTrackingForAction(); } @@ -37,7 +35,7 @@ public final class PointerTrackerQueue { // Note: {@link #mExpandableArrayOfActivePointers} and {@link #mArraySize} are synchronized by // {@link #mExpandableArrayOfActivePointers} private final ArrayList<Element> mExpandableArrayOfActivePointers = - CollectionUtils.newArrayList(INITIAL_CAPACITY); + new ArrayList<>(INITIAL_CAPACITY); private int mArraySize = 0; public int size() { @@ -193,13 +191,13 @@ public final class PointerTrackerQueue { } } - public boolean isAnyInSlidingKeyInput() { + public boolean isAnyInDraggingFinger() { synchronized (mExpandableArrayOfActivePointers) { final ArrayList<Element> expandableArray = mExpandableArrayOfActivePointers; final int arraySize = mArraySize; for (int index = 0; index < arraySize; index++) { final Element element = expandableArray.get(index); - if (element.isInSlidingKeyInput()) { + if (element.isInDraggingFinger()) { return true; } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/ScrollKeyboardView.java b/java/src/com/android/inputmethod/keyboard/internal/ScrollKeyboardView.java deleted file mode 100644 index 9cf68d43d..000000000 --- a/java/src/com/android/inputmethod/keyboard/internal/ScrollKeyboardView.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.keyboard.internal; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.widget.ScrollView; -import android.widget.Scroller; - -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.keyboard.KeyDetector; -import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.KeyboardView; -import com.android.inputmethod.latin.R; - -/** - * This is an extended {@link KeyboardView} class that hosts a vertical scroll keyboard. - * Multi-touch unsupported. No {@link PointerTracker}s. No gesture support. - * TODO: Vertical scroll capability should be removed from this class because it's no longer used. - */ -// TODO: Implement key popup preview. -public final class ScrollKeyboardView extends KeyboardView implements - ScrollViewWithNotifier.ScrollListener, GestureDetector.OnGestureListener { - private static final boolean PAGINATION = false; - - public interface OnKeyClickListener { - public void onKeyClick(Key key); - } - - private static final OnKeyClickListener EMPTY_LISTENER = new OnKeyClickListener() { - @Override - public void onKeyClick(final Key key) {} - }; - - private OnKeyClickListener mListener = EMPTY_LISTENER; - private final KeyDetector mKeyDetector = new KeyDetector(0.0f /*keyHysteresisDistance */); - private final GestureDetector mGestureDetector; - - private final Scroller mScroller; - private ScrollViewWithNotifier mScrollView; - - public ScrollKeyboardView(final Context context, final AttributeSet attrs) { - this(context, attrs, R.attr.keyboardViewStyle); - } - - public ScrollKeyboardView(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - mGestureDetector = new GestureDetector(context, this); - mGestureDetector.setIsLongpressEnabled(false /* isLongpressEnabled */); - mScroller = new Scroller(context); - } - - public void setScrollView(final ScrollViewWithNotifier scrollView) { - mScrollView = scrollView; - scrollView.setScrollListener(this); - } - - private final Runnable mScrollTask = new Runnable() { - @Override - public void run() { - final Scroller scroller = mScroller; - final ScrollView scrollView = mScrollView; - scroller.computeScrollOffset(); - scrollView.scrollTo(0, scroller.getCurrY()); - if (!scroller.isFinished()) { - scrollView.post(this); - } - } - }; - - // {@link ScrollViewWithNotified#ScrollListener} methods. - @Override - public void notifyScrollChanged(final int scrollX, final int scrollY, final int oldX, - final int oldY) { - if (PAGINATION) { - mScroller.forceFinished(true /* finished */); - mScrollView.removeCallbacks(mScrollTask); - final int currentTop = mScrollView.getScrollY(); - final int pageHeight = getKeyboard().mBaseHeight; - final int lastPageNo = currentTop / pageHeight; - final int lastPageTop = lastPageNo * pageHeight; - final int nextPageNo = lastPageNo + 1; - final int nextPageTop = Math.min(nextPageNo * pageHeight, getHeight() - pageHeight); - final int scrollTo = (currentTop - lastPageTop) < (nextPageTop - currentTop) - ? lastPageTop : nextPageTop; - final int deltaY = scrollTo - currentTop; - mScroller.startScroll(0, currentTop, 0, deltaY, 300); - mScrollView.post(mScrollTask); - } - } - - @Override - public void notifyOverScrolled(final int scrollX, final int scrollY, final boolean clampedX, - final boolean clampedY) { - releaseCurrentKey(); - } - - public void setOnKeyClickListener(final OnKeyClickListener listener) { - mListener = listener; - } - - /** - * {@inheritDoc} - */ - @Override - public void setKeyboard(final Keyboard keyboard) { - super.setKeyboard(keyboard); - mKeyDetector.setKeyboard(keyboard, 0 /* correctionX */, 0 /* correctionY */); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onTouchEvent(final MotionEvent e) { - if (mGestureDetector.onTouchEvent(e)) { - return true; - } - final Key key = getKey(e); - if (key != null && key != mCurrentKey) { - releaseCurrentKey(); - } - return true; - } - - // {@link GestureDetector#OnGestureListener} methods. - private Key mCurrentKey; - - private Key getKey(final MotionEvent e) { - final int index = e.getActionIndex(); - final int x = (int)e.getX(index); - final int y = (int)e.getY(index); - return mKeyDetector.detectHitKey(x, y); - } - - public void releaseCurrentKey() { - final Key currentKey = mCurrentKey; - if (currentKey == null) { - return; - } - currentKey.onReleased(); - invalidateKey(currentKey); - mCurrentKey = null; - } - - @Override - public boolean onDown(final MotionEvent e) { - final Key key = getKey(e); - releaseCurrentKey(); - mCurrentKey = key; - if (key == null) { - return false; - } - // TODO: May call {@link KeyboardActionListener#onPressKey(int,int,boolean)}. - key.onPressed(); - invalidateKey(key); - return false; - } - - @Override - public void onShowPress(final MotionEvent e) { - // User feedback is done at {@link #onDown(MotionEvent)}. - } - - @Override - public boolean onSingleTapUp(final MotionEvent e) { - final Key key = getKey(e); - releaseCurrentKey(); - if (key == null) { - return false; - } - // TODO: May call {@link KeyboardActionListener#onReleaseKey(int,boolean)}. - key.onReleased(); - invalidateKey(key); - mListener.onKeyClick(key); - return true; - } - - @Override - public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, - final float distanceY) { - releaseCurrentKey(); - return false; - } - - @Override - public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, - final float velocityY) { - releaseCurrentKey(); - return false; - } - - @Override - public void onLongPress(final MotionEvent e) { - // Long press detection of {@link #mGestureDetector} is disabled and not used. - } -} diff --git a/java/src/com/android/inputmethod/keyboard/internal/ScrollViewWithNotifier.java b/java/src/com/android/inputmethod/keyboard/internal/ScrollViewWithNotifier.java deleted file mode 100644 index d1ccdc7b5..000000000 --- a/java/src/com/android/inputmethod/keyboard/internal/ScrollViewWithNotifier.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.keyboard.internal; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.ScrollView; - -/** - * This is an extended {@link ScrollView} that can notify - * {@link ScrollView#onScrollChanged(int,int,int,int} and - * {@link ScrollView#onOverScrolled(int,int,int,int)} to a content view. - */ -public class ScrollViewWithNotifier extends ScrollView { - private ScrollListener mScrollListener = EMPTY_LISTER; - - public interface ScrollListener { - public void notifyScrollChanged(int scrollX, int scrollY, int oldX, int oldY); - public void notifyOverScrolled(int scrollX, int scrollY, boolean clampedX, - boolean clampedY); - } - - private static final ScrollListener EMPTY_LISTER = new ScrollListener() { - @Override - public void notifyScrollChanged(int scrollX, int scrollY, int oldX, int oldY) {} - @Override - public void notifyOverScrolled(int scrollX, int scrollY, boolean clampedX, - boolean clampedY) {} - }; - - public ScrollViewWithNotifier(final Context context, final AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onScrollChanged(final int scrollX, final int scrollY, final int oldX, - final int oldY) { - super.onScrollChanged(scrollX, scrollY, oldX, oldY); - mScrollListener.notifyScrollChanged(scrollX, scrollY, oldX, oldY); - } - - @Override - protected void onOverScrolled(final int scrollX, final int scrollY, final boolean clampedX, - final boolean clampedY) { - super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); - mScrollListener.notifyOverScrolled(scrollX, scrollY, clampedX, clampedY); - } - - public void setScrollListener(final ScrollListener listener) { - mScrollListener = listener; - } -} diff --git a/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputPreview.java b/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java index 2787ebfb9..ef4c74d61 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputPreview.java +++ b/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java @@ -20,7 +20,6 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; -import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.latin.R; @@ -28,8 +27,13 @@ import com.android.inputmethod.latin.utils.CoordinateUtils; /** * Draw rubber band preview graphics during sliding key input. + * + * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewColor + * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewWidth + * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewBodyRatio + * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewShadowRatio */ -public final class SlidingKeyInputPreview extends AbstractDrawingPreview { +public final class SlidingKeyInputDrawingPreview extends AbstractDrawingPreview { private final float mPreviewBodyRadius; private boolean mShowsSlidingKeyInputPreview; @@ -40,8 +44,7 @@ public final class SlidingKeyInputPreview extends AbstractDrawingPreview { private final RoundedLine mRoundedLine = new RoundedLine(); private final Paint mPaint = new Paint(); - public SlidingKeyInputPreview(final View drawingView, final TypedArray mainKeyboardViewAttr) { - super(drawingView); + public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) { final int previewColor = mainKeyboardViewAttr.getColor( R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0); final float previewRadius = mainKeyboardViewAttr.getDimension( @@ -61,9 +64,14 @@ public final class SlidingKeyInputPreview extends AbstractDrawingPreview { mPaint.setColor(previewColor); } + @Override + public void onDeallocateMemory() { + // Nothing to do here. + } + public void dismissSlidingKeyInputPreview() { mShowsSlidingKeyInputPreview = false; - getDrawingView().invalidate(); + invalidateDrawingView(); } /** @@ -93,6 +101,6 @@ public final class SlidingKeyInputPreview extends AbstractDrawingPreview { tracker.getDownCoordinates(mPreviewFrom); tracker.getLastCoordinates(mPreviewTo); mShowsSlidingKeyInputPreview = true; - getDrawingView().invalidate(); + invalidateDrawingView(); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java b/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java new file mode 100644 index 000000000..ec7b9b024 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.os.Message; +import android.os.SystemClock; +import android.view.ViewConfiguration; + +import com.android.inputmethod.keyboard.Key; +import com.android.inputmethod.keyboard.PointerTracker; +import com.android.inputmethod.keyboard.PointerTracker.TimerProxy; +import com.android.inputmethod.keyboard.internal.TimerHandler.Callbacks; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; + +// TODO: Separate this class into KeyTimerHandler and BatchInputTimerHandler or so. +public final class TimerHandler extends LeakGuardHandlerWrapper<Callbacks> implements TimerProxy { + public interface Callbacks { + public void startWhileTypingFadeinAnimation(); + public void startWhileTypingFadeoutAnimation(); + public void onLongPress(PointerTracker tracker); + } + + private static final int MSG_TYPING_STATE_EXPIRED = 0; + private static final int MSG_REPEAT_KEY = 1; + private static final int MSG_LONGPRESS_KEY = 2; + private static final int MSG_LONGPRESS_SHIFT_KEY = 3; + private static final int MSG_DOUBLE_TAP_SHIFT_KEY = 4; + private static final int MSG_UPDATE_BATCH_INPUT = 5; + + private final int mIgnoreAltCodeKeyTimeout; + private final int mGestureRecognitionUpdateTime; + + public TimerHandler(final Callbacks ownerInstance, final int ignoreAltCodeKeyTimeout, + final int gestureRecognitionUpdateTime) { + super(ownerInstance); + mIgnoreAltCodeKeyTimeout = ignoreAltCodeKeyTimeout; + mGestureRecognitionUpdateTime = gestureRecognitionUpdateTime; + } + + @Override + public void handleMessage(final Message msg) { + final Callbacks callbacks = getOwnerInstance(); + if (callbacks == null) { + return; + } + final PointerTracker tracker = (PointerTracker) msg.obj; + switch (msg.what) { + case MSG_TYPING_STATE_EXPIRED: + callbacks.startWhileTypingFadeinAnimation(); + break; + case MSG_REPEAT_KEY: + tracker.onKeyRepeat(msg.arg1 /* code */, msg.arg2 /* repeatCount */); + break; + case MSG_LONGPRESS_KEY: + case MSG_LONGPRESS_SHIFT_KEY: + cancelLongPressTimers(); + callbacks.onLongPress(tracker); + break; + case MSG_UPDATE_BATCH_INPUT: + tracker.updateBatchInputByTimer(SystemClock.uptimeMillis()); + startUpdateBatchInputTimer(tracker); + break; + } + } + + @Override + public void startKeyRepeatTimerOf(final PointerTracker tracker, final int repeatCount, + final int delay) { + final Key key = tracker.getKey(); + if (key == null || delay == 0) { + return; + } + sendMessageDelayed( + obtainMessage(MSG_REPEAT_KEY, key.getCode(), repeatCount, tracker), delay); + } + + private void cancelKeyRepeatTimerOf(final PointerTracker tracker) { + removeMessages(MSG_REPEAT_KEY, tracker); + } + + public void cancelKeyRepeatTimers() { + removeMessages(MSG_REPEAT_KEY); + } + + // TODO: Suppress layout changes in key repeat mode + public boolean isInKeyRepeat() { + return hasMessages(MSG_REPEAT_KEY); + } + + @Override + public void startLongPressTimerOf(final PointerTracker tracker, final int delay) { + final Key key = tracker.getKey(); + if (key == null) { + return; + } + // Use a separate message id for long pressing shift key, because long press shift key + // timers should be canceled when other key is pressed. + final int messageId = (key.getCode() == Constants.CODE_SHIFT) + ? MSG_LONGPRESS_SHIFT_KEY : MSG_LONGPRESS_KEY; + sendMessageDelayed(obtainMessage(messageId, tracker), delay); + } + + @Override + public void cancelLongPressTimerOf(final PointerTracker tracker) { + removeMessages(MSG_LONGPRESS_KEY, tracker); + removeMessages(MSG_LONGPRESS_SHIFT_KEY, tracker); + } + + @Override + public void cancelLongPressShiftKeyTimers() { + removeMessages(MSG_LONGPRESS_SHIFT_KEY); + } + + public void cancelLongPressTimers() { + removeMessages(MSG_LONGPRESS_KEY); + removeMessages(MSG_LONGPRESS_SHIFT_KEY); + } + + @Override + public void startTypingStateTimer(final Key typedKey) { + if (typedKey.isModifier() || typedKey.altCodeWhileTyping()) { + return; + } + + final boolean isTyping = isTypingState(); + removeMessages(MSG_TYPING_STATE_EXPIRED); + final Callbacks callbacks = getOwnerInstance(); + if (callbacks == null) { + return; + } + + // When user hits the space or the enter key, just cancel the while-typing timer. + final int typedCode = typedKey.getCode(); + if (typedCode == Constants.CODE_SPACE || typedCode == Constants.CODE_ENTER) { + if (isTyping) { + callbacks.startWhileTypingFadeinAnimation(); + } + return; + } + + sendMessageDelayed( + obtainMessage(MSG_TYPING_STATE_EXPIRED), mIgnoreAltCodeKeyTimeout); + if (isTyping) { + return; + } + callbacks.startWhileTypingFadeoutAnimation(); + } + + @Override + public boolean isTypingState() { + return hasMessages(MSG_TYPING_STATE_EXPIRED); + } + + @Override + public void startDoubleTapShiftKeyTimer() { + sendMessageDelayed(obtainMessage(MSG_DOUBLE_TAP_SHIFT_KEY), + ViewConfiguration.getDoubleTapTimeout()); + } + + @Override + public void cancelDoubleTapShiftKeyTimer() { + removeMessages(MSG_DOUBLE_TAP_SHIFT_KEY); + } + + @Override + public boolean isInDoubleTapShiftKeyTimeout() { + return hasMessages(MSG_DOUBLE_TAP_SHIFT_KEY); + } + + @Override + public void cancelKeyTimersOf(final PointerTracker tracker) { + cancelKeyRepeatTimerOf(tracker); + cancelLongPressTimerOf(tracker); + } + + public void cancelAllKeyTimers() { + cancelKeyRepeatTimers(); + cancelLongPressTimers(); + } + + @Override + public void startUpdateBatchInputTimer(final PointerTracker tracker) { + if (mGestureRecognitionUpdateTime <= 0) { + return; + } + removeMessages(MSG_UPDATE_BATCH_INPUT, tracker); + sendMessageDelayed(obtainMessage(MSG_UPDATE_BATCH_INPUT, tracker), + mGestureRecognitionUpdateTime); + } + + @Override + public void cancelUpdateBatchInputTimer(final PointerTracker tracker) { + removeMessages(MSG_UPDATE_BATCH_INPUT, tracker); + } + + @Override + public void cancelAllUpdateBatchInputTimers() { + removeMessages(MSG_UPDATE_BATCH_INPUT); + } + + public void cancelAllMessages() { + cancelAllKeyTimers(); + cancelAllUpdateBatchInputTimers(); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/TypingTimeRecorder.java b/java/src/com/android/inputmethod/keyboard/internal/TypingTimeRecorder.java new file mode 100644 index 000000000..9593f715c --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/TypingTimeRecorder.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +public final class TypingTimeRecorder { + private final int mStaticTimeThresholdAfterFastTyping; // msec + private final int mSuppressKeyPreviewAfterBatchInputDuration; + private long mLastTypingTime; + private long mLastLetterTypingTime; + private long mLastBatchInputTime; + + public TypingTimeRecorder(final int staticTimeThresholdAfterFastTyping, + final int suppressKeyPreviewAfterBatchInputDuration) { + mStaticTimeThresholdAfterFastTyping = staticTimeThresholdAfterFastTyping; + mSuppressKeyPreviewAfterBatchInputDuration = suppressKeyPreviewAfterBatchInputDuration; + } + + public boolean isInFastTyping(final long eventTime) { + final long elapsedTimeSinceLastLetterTyping = eventTime - mLastLetterTypingTime; + return elapsedTimeSinceLastLetterTyping < mStaticTimeThresholdAfterFastTyping; + } + + private boolean wasLastInputTyping() { + return mLastTypingTime >= mLastBatchInputTime; + } + + public void onCodeInput(final int code, final long eventTime) { + // Record the letter typing time when + // 1. Letter keys are typed successively without any batch input in between. + // 2. A letter key is typed within the threshold time since the last any key typing. + // 3. A non-letter key is typed within the threshold time since the last letter key typing. + if (Character.isLetter(code)) { + if (wasLastInputTyping() + || eventTime - mLastTypingTime < mStaticTimeThresholdAfterFastTyping) { + mLastLetterTypingTime = eventTime; + } + } else { + if (eventTime - mLastLetterTypingTime < mStaticTimeThresholdAfterFastTyping) { + // This non-letter typing should be treated as a part of fast typing. + mLastLetterTypingTime = eventTime; + } + } + mLastTypingTime = eventTime; + } + + public void onEndBatchInput(final long eventTime) { + mLastBatchInputTime = eventTime; + } + + public long getLastLetterTypingTime() { + return mLastLetterTypingTime; + } + + public boolean needsToSuppressKeyPreviewPopup(final long eventTime) { + return !wasLastInputTyping() + && eventTime - mLastBatchInputTime < mSuppressKeyPreviewAfterBatchInputDuration; + } +} diff --git a/java/src/com/android/inputmethod/latin/AbstractDictionaryWriter.java b/java/src/com/android/inputmethod/latin/AbstractDictionaryWriter.java deleted file mode 100644 index 463d09344..000000000 --- a/java/src/com/android/inputmethod/latin/AbstractDictionaryWriter.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2013 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.util.Log; - -import com.android.inputmethod.latin.makedict.DictEncoder; -import com.android.inputmethod.latin.makedict.UnsupportedFormatException; -import com.android.inputmethod.latin.makedict.Ver3DictEncoder; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -// TODO: Quit extending Dictionary after implementing dynamic binary dictionary. -abstract public class AbstractDictionaryWriter extends Dictionary { - /** Used for Log actions from this class */ - private static final String TAG = AbstractDictionaryWriter.class.getSimpleName(); - - private final Context mContext; - - public AbstractDictionaryWriter(final Context context, final String dictType) { - super(dictType); - mContext = context; - } - - abstract public void clear(); - - /** - * Add a unigram with an optional shortcut to the dictionary. - * @param word The word to add. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this unigram. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored - * if shortcutTarget is null. - * @param isNotAWord true if this is not a word, i.e. shortcut only. - */ - abstract public void addUnigramWord(final String word, final String shortcutTarget, - final int frequency, final int shortcutFreq, final boolean isNotAWord); - - // TODO: Remove lastModifiedTime after making binary dictionary support forgetting curve. - abstract public void addBigramWords(final String word0, final String word1, - final int frequency, final boolean isValid, - final long lastModifiedTime); - - abstract public void removeBigramWords(final String word0, final String word1); - - abstract protected void writeDictionary(final DictEncoder dictEncoder, - final Map<String, String> attributeMap) throws IOException, UnsupportedFormatException; - - public void write(final String fileName, final Map<String, String> attributeMap) { - final String tempFileName = fileName + ".temp"; - final File file = new File(mContext.getFilesDir(), fileName); - final File tempFile = new File(mContext.getFilesDir(), tempFileName); - try { - final DictEncoder dictEncoder = new Ver3DictEncoder(tempFile); - writeDictionary(dictEncoder, attributeMap); - tempFile.renameTo(file); - } catch (IOException e) { - Log.e(TAG, "IO exception while writing file", e); - } catch (UnsupportedFormatException e) { - Log.e(TAG, "Unsupported format", e); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/AssetFileAddress.java b/java/src/com/android/inputmethod/latin/AssetFileAddress.java index 875192554..fd6c24dfe 100644 --- a/java/src/com/android/inputmethod/latin/AssetFileAddress.java +++ b/java/src/com/android/inputmethod/latin/AssetFileAddress.java @@ -16,6 +16,8 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.utils.FileUtils; + import java.io.File; /** @@ -52,4 +54,12 @@ public final class AssetFileAddress { if (!f.isFile()) return null; return new AssetFileAddress(filename, offset, length); } + + public boolean pointsToPhysicalFile() { + return 0 == mOffset; + } + + public void deleteUnderlyingFile() { + FileUtils.deleteRecursively(new File(mFilename)); + } } diff --git a/java/src/com/android/inputmethod/latin/AudioAndHapticFeedbackManager.java b/java/src/com/android/inputmethod/latin/AudioAndHapticFeedbackManager.java index 54bc29559..eb8b34ccd 100644 --- a/java/src/com/android/inputmethod/latin/AudioAndHapticFeedbackManager.java +++ b/java/src/com/android/inputmethod/latin/AudioAndHapticFeedbackManager.java @@ -16,14 +16,14 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.latin.settings.SettingsValues; - import android.content.Context; import android.media.AudioManager; import android.os.Vibrator; import android.view.HapticFeedbackConstants; import android.view.View; +import com.android.inputmethod.latin.settings.SettingsValues; + /** * This class gathers audio feedback and haptic feedback functions. * @@ -86,40 +86,41 @@ public final class AudioAndHapticFeedbackManager { if (mAudioManager == null) { return; } - if (mSoundOn) { - final int sound; - switch (code) { - case Constants.CODE_DELETE: - sound = AudioManager.FX_KEYPRESS_DELETE; - break; - case Constants.CODE_ENTER: - sound = AudioManager.FX_KEYPRESS_RETURN; - break; - case Constants.CODE_SPACE: - sound = AudioManager.FX_KEYPRESS_SPACEBAR; - break; - default: - sound = AudioManager.FX_KEYPRESS_STANDARD; - break; - } - mAudioManager.playSoundEffect(sound, mSettingsValues.mKeypressSoundVolume); + if (!mSoundOn) { + return; + } + final int sound; + switch (code) { + case Constants.CODE_DELETE: + sound = AudioManager.FX_KEYPRESS_DELETE; + break; + case Constants.CODE_ENTER: + sound = AudioManager.FX_KEYPRESS_RETURN; + break; + case Constants.CODE_SPACE: + sound = AudioManager.FX_KEYPRESS_SPACEBAR; + break; + default: + sound = AudioManager.FX_KEYPRESS_STANDARD; + break; } + mAudioManager.playSoundEffect(sound, mSettingsValues.mKeypressSoundVolume); } public void performHapticFeedback(final View viewToPerformHapticFeedbackOn) { if (!mSettingsValues.mVibrateOn) { return; } - if (mSettingsValues.mKeypressVibrationDuration < 0) { - // Go ahead with the system default - if (viewToPerformHapticFeedbackOn != null) { - viewToPerformHapticFeedbackOn.performHapticFeedback( - HapticFeedbackConstants.KEYBOARD_TAP, - HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } + if (mSettingsValues.mKeypressVibrationDuration >= 0) { + vibrate(mSettingsValues.mKeypressVibrationDuration); return; } - vibrate(mSettingsValues.mKeypressVibrationDuration); + // Go ahead with the system default + if (viewToPerformHapticFeedbackOn != null) { + viewToPerformHapticFeedbackOn.performHapticFeedback( + HapticFeedbackConstants.KEYBOARD_TAP, + HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } } public void onSettingsChanged(final SettingsValues settingsValues) { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index fd296988e..1b5791809 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -17,19 +17,27 @@ package com.android.inputmethod.latin; import android.text.TextUtils; +import android.util.Log; import android.util.SparseArray; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.settings.NativeSuggestOptions; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.makedict.DictionaryHeader; +import com.android.inputmethod.latin.makedict.FormatSpec; +import com.android.inputmethod.latin.makedict.FormatSpec.DictionaryOptions; +import com.android.inputmethod.latin.makedict.UnsupportedFormatException; +import com.android.inputmethod.latin.makedict.WordProperty; +import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; +import com.android.inputmethod.latin.utils.FileUtils; import com.android.inputmethod.latin.utils.JniUtils; +import com.android.inputmethod.latin.utils.LanguageModelParam; import com.android.inputmethod.latin.utils.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -40,10 +48,6 @@ import java.util.Map; public final class BinaryDictionary extends Dictionary { private static final String TAG = BinaryDictionary.class.getSimpleName(); - // Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h - private static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH; - // Must be equal to MAX_RESULTS in native/jni/src/defines.h - private static final int MAX_RESULTS = 18; // The cutoff returned by native for auto-commit confidence. // Must be equal to CONFIDENCE_TO_AUTO_COMMIT in native/jni/src/defines.h private static final int CONFIDENCE_TO_AUTO_COMMIT = 1000000; @@ -57,22 +61,34 @@ public final class BinaryDictionary extends Dictionary { @UsedForTesting public static final String MAX_BIGRAM_COUNT_QUERY = "MAX_BIGRAM_COUNT"; + public static final int NOT_A_VALID_TIMESTAMP = -1; + + // Format to get unigram flags from native side via getWordPropertyNative(). + private static final int FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT = 5; + private static final int FORMAT_WORD_PROPERTY_IS_NOT_A_WORD_INDEX = 0; + private static final int FORMAT_WORD_PROPERTY_IS_BLACKLISTED_INDEX = 1; + private static final int FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX = 2; + private static final int FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX = 3; + private static final int FORMAT_WORD_PROPERTY_IS_BEGINNING_OF_SENTENCE_INDEX = 4; + + // Format to get probability and historical info from native side via getWordPropertyNative(). + public static final int FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT = 4; + public static final int FORMAT_WORD_PROPERTY_PROBABILITY_INDEX = 0; + public static final int FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX = 1; + public static final int FORMAT_WORD_PROPERTY_LEVEL_INDEX = 2; + public static final int FORMAT_WORD_PROPERTY_COUNT_INDEX = 3; + + public static final String DICT_FILE_NAME_SUFFIX_FOR_MIGRATION = ".migrate"; + private long mNativeDict; private final Locale mLocale; private final long mDictSize; private final String mDictFilePath; - private final int[] mInputCodePoints = new int[MAX_WORD_LENGTH]; - private final int[] mOutputCodePoints = new int[MAX_WORD_LENGTH * MAX_RESULTS]; - private final int[] mSpaceIndices = new int[MAX_RESULTS]; - private final int[] mOutputScores = new int[MAX_RESULTS]; - private final int[] mOutputTypes = new int[MAX_RESULTS]; - // Only one result is ever used - private final int[] mOutputAutoCommitFirstWordConfidence = new int[1]; + private final boolean mUseFullEditDistance; + private final boolean mIsUpdatable; + private boolean mHasUpdated; - private final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions(); - - private final SparseArray<DicTraverseSession> mDicTraverseSessions = - CollectionUtils.newSparseArray(); + private final SparseArray<DicTraverseSession> mDicTraverseSessions = new SparseArray<>(); // TODO: There should be a way to remove used DicTraverseSession objects from // {@code mDicTraverseSessions}. @@ -80,19 +96,15 @@ public final class BinaryDictionary extends Dictionary { synchronized(mDicTraverseSessions) { DicTraverseSession traverseSession = mDicTraverseSessions.get(traverseSessionId); if (traverseSession == null) { - traverseSession = mDicTraverseSessions.get(traverseSessionId); - if (traverseSession == null) { - traverseSession = new DicTraverseSession(mLocale, mNativeDict, mDictSize); - mDicTraverseSessions.put(traverseSessionId, traverseSession); - } + traverseSession = new DicTraverseSession(mLocale, mNativeDict, mDictSize); + mDicTraverseSessions.put(traverseSessionId, traverseSession); } return traverseSession; } } /** - * Constructor for the binary dictionary. This is supposed to be called from the - * dictionary factory. + * Constructs binary dictionary using existing dictionary file. * @param filename the name of the file to read through native code. * @param offset the offset of the dictionary data within the file. * @param length the length of the binary data. @@ -107,125 +119,201 @@ public final class BinaryDictionary extends Dictionary { mLocale = locale; mDictSize = length; mDictFilePath = filename; - mNativeSuggestOptions.setUseFullEditDistance(useFullEditDistance); + mIsUpdatable = isUpdatable; + mHasUpdated = false; + mUseFullEditDistance = useFullEditDistance; loadDictionary(filename, offset, length, isUpdatable); } + /** + * Constructs binary dictionary on memory. + * @param filename the name of the file used to flush. + * @param useFullEditDistance whether to use the full edit distance in suggestions + * @param dictType the dictionary type, as a human-readable string + * @param formatVersion the format version of the dictionary + * @param attributeMap the attributes of the dictionary + */ + public BinaryDictionary(final String filename, final boolean useFullEditDistance, + final Locale locale, final String dictType, final long formatVersion, + final Map<String, String> attributeMap) { + super(dictType); + mLocale = locale; + mDictSize = 0; + mDictFilePath = filename; + // On memory dictionary is always updatable. + mIsUpdatable = true; + mHasUpdated = false; + mUseFullEditDistance = useFullEditDistance; + final String[] keyArray = new String[attributeMap.size()]; + final String[] valueArray = new String[attributeMap.size()]; + int index = 0; + for (final String key : attributeMap.keySet()) { + keyArray[index] = key; + valueArray[index] = attributeMap.get(key); + index++; + } + mNativeDict = createOnMemoryNative(formatVersion, locale.toString(), keyArray, valueArray); + } + + static { JniUtils.loadNativeLibrary(); } - private static native boolean createEmptyDictFileNative(String filePath, long dictVersion, - String[] attributeKeyStringArray, String[] attributeValueStringArray); private static native long openNative(String sourceDir, long dictOffset, long dictSize, boolean isUpdatable); - private static native void flushNative(long dict, String filePath); + private static native long createOnMemoryNative(long formatVersion, + String locale, String[] attributeKeyStringArray, String[] attributeValueStringArray); + private static native void getHeaderInfoNative(long dict, int[] outHeaderSize, + int[] outFormatVersion, ArrayList<int[]> outAttributeKeys, + ArrayList<int[]> outAttributeValues); + private static native boolean flushNative(long dict, String filePath); private static native boolean needsToRunGCNative(long dict, boolean mindsBlockByGC); - private static native void flushWithGCNative(long dict, String filePath); + private static native boolean flushWithGCNative(long dict, String filePath); private static native void closeNative(long dict); + private static native int getFormatVersionNative(long dict); private static native int getProbabilityNative(long dict, int[] word); - private static native int getBigramProbabilityNative(long dict, int[] word0, int[] word1); - private static native int getSuggestionsNative(long dict, long proximityInfo, + private static native int getMaxProbabilityOfExactMatchesNative(long dict, int[] word); + private static native int getNgramProbabilityNative(long dict, int[][] prevWordCodePointArrays, + boolean[] isBeginningOfSentenceArray, int[] word); + private static native void getWordPropertyNative(long dict, int[] word, + boolean isBeginningOfSentence, int[] outCodePoints, boolean[] outFlags, + int[] outProbabilityInfo, ArrayList<int[]> outBigramTargets, + ArrayList<int[]> outBigramProbabilityInfo, ArrayList<int[]> outShortcutTargets, + ArrayList<Integer> outShortcutProbabilities); + private static native int getNextWordNative(long dict, int token, int[] outCodePoints, + boolean[] outIsBeginningOfSentence); + private static native void getSuggestionsNative(long dict, long proximityInfo, long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times, - int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint, - int[] suggestOptions, int[] prevWordCodePointArray, - int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes, - int[] outputAutoCommitFirstWordConfidence); - private static native float calcNormalizedScoreNative(int[] before, int[] after, int score); - private static native int editDistanceNative(int[] before, int[] after); - private static native void addUnigramWordNative(long dict, int[] word, int probability); - private static native void addBigramWordsNative(long dict, int[] word0, int[] word1, - int probability); - private static native void removeBigramWordsNative(long dict, int[] word0, int[] word1); - private static native int calculateProbabilityNative(long dict, int unigramProbability, - int bigramProbability); + int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions, + int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray, + int[] outputSuggestionCount, int[] outputCodePoints, int[] outputScores, + int[] outputIndices, int[] outputTypes, int[] outputAutoCommitFirstWordConfidence, + float[] inOutLanguageWeight); + private static native boolean addUnigramEntryNative(long dict, int[] word, int probability, + int[] shortcutTarget, int shortcutProbability, boolean isBeginningOfSentence, + boolean isNotAWord, boolean isBlacklisted, int timestamp); + private static native boolean removeUnigramEntryNative(long dict, int[] word); + private static native boolean addNgramEntryNative(long dict, + int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray, + int[] word, int probability, int timestamp); + private static native boolean removeNgramEntryNative(long dict, + int[][] prevWordCodePointArrays, boolean[] isBeginningOfSentenceArray, int[] word); + private static native int addMultipleDictionaryEntriesNative(long dict, + LanguageModelParam[] languageModelParams, int startIndex); private static native String getPropertyNative(long dict, String query); - - @UsedForTesting - public static boolean createEmptyDictFile(final String filePath, final long dictVersion, - final Map<String, String> attributeMap) { - final String[] keyArray = new String[attributeMap.size()]; - final String[] valueArray = new String[attributeMap.size()]; - int index = 0; - for (final String key : attributeMap.keySet()) { - keyArray[index] = key; - valueArray[index] = attributeMap.get(key); - index++; - } - return createEmptyDictFileNative(filePath, dictVersion, keyArray, valueArray); - } + private static native boolean isCorruptedNative(long dict); + private static native boolean migrateNative(long dict, String dictFilePath, + long newFormatVersion); // TODO: Move native dict into session private final void loadDictionary(final String path, final long startOffset, final long length, final boolean isUpdatable) { + mHasUpdated = false; mNativeDict = openNative(path, startOffset, length, isUpdatable); } - @Override - public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - return getSuggestionsWithSessionId(composer, prevWord, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, 0 /* sessionId */); + // TODO: Check isCorrupted() for main dictionaries. + public boolean isCorrupted() { + if (!isValidDictionary()) { + return false; + } + if (!isCorruptedNative(mNativeDict)) { + return false; + } + // TODO: Record the corruption. + Log.e(TAG, "BinaryDictionary (" + mDictFilePath + ") is corrupted."); + Log.e(TAG, "locale: " + mLocale); + Log.e(TAG, "dict size: " + mDictSize); + Log.e(TAG, "updatable: " + mIsUpdatable); + return true; + } + + public DictionaryHeader getHeader() throws UnsupportedFormatException { + if (mNativeDict == 0) { + return null; + } + final int[] outHeaderSize = new int[1]; + final int[] outFormatVersion = new int[1]; + final ArrayList<int[]> outAttributeKeys = new ArrayList<>(); + final ArrayList<int[]> outAttributeValues = new ArrayList<>(); + getHeaderInfoNative(mNativeDict, outHeaderSize, outFormatVersion, outAttributeKeys, + outAttributeValues); + final HashMap<String, String> attributes = new HashMap<>(); + for (int i = 0; i < outAttributeKeys.size(); i++) { + final String attributeKey = StringUtils.getStringFromNullTerminatedCodePointArray( + outAttributeKeys.get(i)); + final String attributeValue = StringUtils.getStringFromNullTerminatedCodePointArray( + outAttributeValues.get(i)); + attributes.put(attributeKey, attributeValue); + } + final boolean hasHistoricalInfo = DictionaryHeader.ATTRIBUTE_VALUE_TRUE.equals( + attributes.get(DictionaryHeader.HAS_HISTORICAL_INFO_KEY)); + return new DictionaryHeader(outHeaderSize[0], new DictionaryOptions(attributes), + new FormatSpec.FormatOptions(outFormatVersion[0], hasHistoricalInfo)); } @Override - public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, - final int sessionId) { - if (!isValidDictionary()) return null; - - Arrays.fill(mInputCodePoints, Constants.NOT_A_CODE); - // TODO: toLowerCase in the native code - final int[] prevWordCodePointArray = (null == prevWord) - ? null : StringUtils.toCodePointArray(prevWord); - final int composerSize = composer.size(); - + final int sessionId, final float[] inOutLanguageWeight) { + if (!isValidDictionary()) { + return null; + } + final DicTraverseSession session = getTraverseSession(sessionId); + Arrays.fill(session.mInputCodePoints, Constants.NOT_A_CODE); + prevWordsInfo.outputToArray(session.mPrevWordCodePointArrays, + session.mIsBeginningOfSentenceArray); + final InputPointers inputPointers = composer.getInputPointers(); final boolean isGesture = composer.isBatchMode(); - if (composerSize <= 1 || !isGesture) { - if (composerSize > MAX_WORD_LENGTH - 1) return null; - for (int i = 0; i < composerSize; i++) { - mInputCodePoints[i] = composer.getCodeAt(i); + final int inputSize; + if (!isGesture) { + inputSize = composer.copyCodePointsExceptTrailingSingleQuotesAndReturnCodePointCount( + session.mInputCodePoints); + if (inputSize < 0) { + return null; } + } else { + inputSize = inputPointers.getPointerSize(); } - - final InputPointers ips = composer.getInputPointers(); - final int inputSize = isGesture ? ips.getPointerSize() : composerSize; - mNativeSuggestOptions.setIsGesture(isGesture); - mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions); - // proximityInfo and/or prevWordForBigrams may not be null. - final int count = getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(), - getTraverseSession(sessionId).getSession(), ips.getXCoordinates(), - ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), mInputCodePoints, - inputSize, 0 /* commitPoint */, mNativeSuggestOptions.getOptions(), - prevWordCodePointArray, mOutputCodePoints, mOutputScores, mSpaceIndices, - mOutputTypes, mOutputAutoCommitFirstWordConfidence); - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); + session.mNativeSuggestOptions.setUseFullEditDistance(mUseFullEditDistance); + session.mNativeSuggestOptions.setIsGesture(isGesture); + session.mNativeSuggestOptions.setBlockOffensiveWords(blockOffensiveWords); + session.mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions); + if (inOutLanguageWeight != null) { + session.mInputOutputLanguageWeight[0] = inOutLanguageWeight[0]; + } else { + session.mInputOutputLanguageWeight[0] = Dictionary.NOT_A_LANGUAGE_WEIGHT; + } + // TOOD: Pass multiple previous words information for n-gram. + getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(), + getTraverseSession(sessionId).getSession(), inputPointers.getXCoordinates(), + inputPointers.getYCoordinates(), inputPointers.getTimes(), + inputPointers.getPointerIds(), session.mInputCodePoints, inputSize, + session.mNativeSuggestOptions.getOptions(), session.mPrevWordCodePointArrays, + session.mIsBeginningOfSentenceArray, session.mOutputSuggestionCount, + session.mOutputCodePoints, session.mOutputScores, session.mSpaceIndices, + session.mOutputTypes, session.mOutputAutoCommitFirstWordConfidence, + session.mInputOutputLanguageWeight); + if (inOutLanguageWeight != null) { + inOutLanguageWeight[0] = session.mInputOutputLanguageWeight[0]; + } + final int count = session.mOutputSuggestionCount[0]; + final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>(); for (int j = 0; j < count; ++j) { - final int start = j * MAX_WORD_LENGTH; + final int start = j * Constants.DICTIONARY_MAX_WORD_LENGTH; int len = 0; - while (len < MAX_WORD_LENGTH && mOutputCodePoints[start + len] != 0) { + while (len < Constants.DICTIONARY_MAX_WORD_LENGTH + && session.mOutputCodePoints[start + len] != 0) { ++len; } if (len > 0) { - final int flags = mOutputTypes[j] & SuggestedWordInfo.KIND_MASK_FLAGS; - if (blockOffensiveWords - && 0 != (flags & SuggestedWordInfo.KIND_FLAG_POSSIBLY_OFFENSIVE) - && 0 == (flags & SuggestedWordInfo.KIND_FLAG_EXACT_MATCH)) { - // If we block potentially offensive words, and if the word is possibly - // offensive, then we don't output it unless it's also an exact match. - continue; - } - final int kind = mOutputTypes[j] & SuggestedWordInfo.KIND_MASK_KIND; - final int score = SuggestedWordInfo.KIND_WHITELIST == kind - ? SuggestedWordInfo.MAX_SCORE : mOutputScores[j]; - // TODO: check that all users of the `kind' parameter are ready to accept - // flags too and pass mOutputTypes[j] instead of kind - suggestions.add(new SuggestedWordInfo(new String(mOutputCodePoints, start, len), - score, kind, this /* sourceDict */, - mSpaceIndices[j] /* indexOfTouchPointOfSecondWord */, - mOutputAutoCommitFirstWordConfidence[0])); + suggestions.add(new SuggestedWordInfo( + new String(session.mOutputCodePoints, start, len), + session.mOutputScores[j], session.mOutputTypes[j], this /* sourceDict */, + session.mSpaceIndices[j] /* indexOfTouchPointOfSecondWord */, + session.mOutputAutoCommitFirstWordConfidence[0])); } } return suggestions; @@ -235,91 +323,220 @@ public final class BinaryDictionary extends Dictionary { return mNativeDict != 0; } - public static float calcNormalizedScore(final String before, final String after, - final int score) { - return calcNormalizedScoreNative(StringUtils.toCodePointArray(before), - StringUtils.toCodePointArray(after), score); - } - - public static int editDistance(final String before, final String after) { - if (before == null || after == null) { - throw new IllegalArgumentException(); - } - return editDistanceNative(StringUtils.toCodePointArray(before), - StringUtils.toCodePointArray(after)); + public int getFormatVersion() { + return getFormatVersionNative(mNativeDict); } @Override - public boolean isValidWord(final String word) { + public boolean isInDictionary(final String word) { return getFrequency(word) != NOT_A_PROBABILITY; } @Override public int getFrequency(final String word) { - if (word == null) return NOT_A_PROBABILITY; + if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY; int[] codePoints = StringUtils.toCodePointArray(word); return getProbabilityNative(mNativeDict, codePoints); } - // TODO: Add a batch process version (isValidBigramMultiple?) to avoid excessive numbers of jni - // calls when checking for changes in an entire dictionary. - public boolean isValidBigram(final String word0, final String word1) { - return getBigramProbability(word0, word1) != NOT_A_PROBABILITY; + @Override + public int getMaxFrequencyOfExactMatches(final String word) { + if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY; + int[] codePoints = StringUtils.toCodePointArray(word); + return getMaxProbabilityOfExactMatchesNative(mNativeDict, codePoints); + } + + @UsedForTesting + public boolean isValidNgram(final PrevWordsInfo prevWordsInfo, final String word) { + return getNgramProbability(prevWordsInfo, word) != NOT_A_PROBABILITY; } - public int getBigramProbability(final String word0, final String word1) { - if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) return NOT_A_PROBABILITY; - final int[] codePoints0 = StringUtils.toCodePointArray(word0); - final int[] codePoints1 = StringUtils.toCodePointArray(word1); - return getBigramProbabilityNative(mNativeDict, codePoints0, codePoints1); + public int getNgramProbability(final PrevWordsInfo prevWordsInfo, final String word) { + if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) { + return NOT_A_PROBABILITY; + } + final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][]; + final boolean[] isBeginningOfSentenceArray = + new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray); + final int[] wordCodePoints = StringUtils.toCodePointArray(word); + return getNgramProbabilityNative(mNativeDict, prevWordCodePointArrays, + isBeginningOfSentenceArray, wordCodePoints); } - // Add a unigram entry to binary dictionary in native code. - public void addUnigramWord(final String word, final int probability) { + public WordProperty getWordProperty(final String word, final boolean isBeginningOfSentence) { + if (word == null) { + return null; + } + final int[] codePoints = StringUtils.toCodePointArray(word); + final int[] outCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH]; + final boolean[] outFlags = new boolean[FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT]; + final int[] outProbabilityInfo = + new int[FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT]; + final ArrayList<int[]> outBigramTargets = new ArrayList<>(); + final ArrayList<int[]> outBigramProbabilityInfo = new ArrayList<>(); + final ArrayList<int[]> outShortcutTargets = new ArrayList<>(); + final ArrayList<Integer> outShortcutProbabilities = new ArrayList<>(); + getWordPropertyNative(mNativeDict, codePoints, isBeginningOfSentence, outCodePoints, + outFlags, outProbabilityInfo, outBigramTargets, outBigramProbabilityInfo, + outShortcutTargets, outShortcutProbabilities); + return new WordProperty(codePoints, + outFlags[FORMAT_WORD_PROPERTY_IS_NOT_A_WORD_INDEX], + outFlags[FORMAT_WORD_PROPERTY_IS_BLACKLISTED_INDEX], + outFlags[FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX], + outFlags[FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX], + outFlags[FORMAT_WORD_PROPERTY_IS_BEGINNING_OF_SENTENCE_INDEX], outProbabilityInfo, + outBigramTargets, outBigramProbabilityInfo, outShortcutTargets, + outShortcutProbabilities); + } + + public static class GetNextWordPropertyResult { + public WordProperty mWordProperty; + public int mNextToken; + + public GetNextWordPropertyResult(final WordProperty wordProperty, final int nextToken) { + mWordProperty = wordProperty; + mNextToken = nextToken; + } + } + + /** + * Method to iterate all words in the dictionary for makedict. + * If token is 0, this method newly starts iterating the dictionary. + */ + public GetNextWordPropertyResult getNextWordProperty(final int token) { + final int[] codePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH]; + final boolean[] isBeginningOfSentence = new boolean[1]; + final int nextToken = getNextWordNative(mNativeDict, token, codePoints, + isBeginningOfSentence); + final String word = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints); + return new GetNextWordPropertyResult( + getWordProperty(word, isBeginningOfSentence[0]), nextToken); + } + + // Add a unigram entry to binary dictionary with unigram attributes in native code. + public boolean addUnigramEntry(final String word, final int probability, + final String shortcutTarget, final int shortcutProbability, + final boolean isBeginningOfSentence, final boolean isNotAWord, + final boolean isBlacklisted, final int timestamp) { + if (word == null || (word.isEmpty() && !isBeginningOfSentence)) { + return false; + } + final int[] codePoints = StringUtils.toCodePointArray(word); + final int[] shortcutTargetCodePoints = (shortcutTarget != null) ? + StringUtils.toCodePointArray(shortcutTarget) : null; + if (!addUnigramEntryNative(mNativeDict, codePoints, probability, shortcutTargetCodePoints, + shortcutProbability, isBeginningOfSentence, isNotAWord, isBlacklisted, timestamp)) { + return false; + } + mHasUpdated = true; + return true; + } + + // Remove a unigram entry from the binary dictionary in native code. + public boolean removeUnigramEntry(final String word) { if (TextUtils.isEmpty(word)) { - return; + return false; } final int[] codePoints = StringUtils.toCodePointArray(word); - addUnigramWordNative(mNativeDict, codePoints, probability); + if (!removeUnigramEntryNative(mNativeDict, codePoints)) { + return false; + } + mHasUpdated = true; + return true; } - // Add a bigram entry to binary dictionary in native code. - public void addBigramWords(final String word0, final String word1, final int probability) { - if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) { - return; + // Add an n-gram entry to the binary dictionary with timestamp in native code. + public boolean addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word, + final int probability, final int timestamp) { + if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) { + return false; } - final int[] codePoints0 = StringUtils.toCodePointArray(word0); - final int[] codePoints1 = StringUtils.toCodePointArray(word1); - addBigramWordsNative(mNativeDict, codePoints0, codePoints1, probability); + final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][]; + final boolean[] isBeginningOfSentenceArray = + new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray); + final int[] wordCodePoints = StringUtils.toCodePointArray(word); + if (!addNgramEntryNative(mNativeDict, prevWordCodePointArrays, + isBeginningOfSentenceArray, wordCodePoints, probability, timestamp)) { + return false; + } + mHasUpdated = true; + return true; } - // Remove a bigram entry form binary dictionary in native code. - public void removeBigramWords(final String word0, final String word1) { - if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) { - return; + // Remove an n-gram entry from the binary dictionary in native code. + public boolean removeNgramEntry(final PrevWordsInfo prevWordsInfo, final String word) { + if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) { + return false; + } + final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][]; + final boolean[] isBeginningOfSentenceArray = + new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray); + final int[] wordCodePoints = StringUtils.toCodePointArray(word); + if (!removeNgramEntryNative(mNativeDict, prevWordCodePointArrays, + isBeginningOfSentenceArray, wordCodePoints)) { + return false; + } + mHasUpdated = true; + return true; + } + + public void addMultipleDictionaryEntries(final LanguageModelParam[] languageModelParams) { + if (!isValidDictionary()) return; + int processedParamCount = 0; + while (processedParamCount < languageModelParams.length) { + if (needsToRunGC(true /* mindsBlockByGC */)) { + flushWithGC(); + } + processedParamCount = addMultipleDictionaryEntriesNative(mNativeDict, + languageModelParams, processedParamCount); + mHasUpdated = true; + if (processedParamCount <= 0) { + return; + } } - final int[] codePoints0 = StringUtils.toCodePointArray(word0); - final int[] codePoints1 = StringUtils.toCodePointArray(word1); - removeBigramWordsNative(mNativeDict, codePoints0, codePoints1); } private void reopen() { close(); final File dictFile = new File(mDictFilePath); - mNativeDict = openNative(dictFile.getAbsolutePath(), 0 /* startOffset */, - dictFile.length(), true /* isUpdatable */); + // WARNING: Because we pass 0 as the offset and file.length() as the length, this can + // only be called for actual files. Right now it's only called by the flush() family of + // functions, which require an updatable dictionary, so it's okay. But beware. + loadDictionary(dictFile.getAbsolutePath(), 0 /* startOffset */, + dictFile.length(), mIsUpdatable); } - public void flush() { - if (!isValidDictionary()) return; - flushNative(mNativeDict, mDictFilePath); - reopen(); + // Flush to dict file if the dictionary has been updated. + public boolean flush() { + if (!isValidDictionary()) return false; + if (mHasUpdated) { + if (!flushNative(mNativeDict, mDictFilePath)) { + return false; + } + reopen(); + } + return true; } - public void flushWithGC() { - if (!isValidDictionary()) return; - flushWithGCNative(mNativeDict, mDictFilePath); + // Run GC and flush to dict file if the dictionary has been updated. + public boolean flushWithGCIfHasUpdated() { + if (mHasUpdated) { + return flushWithGC(); + } + return true; + } + + // Run GC and flush to dict file. + public boolean flushWithGC() { + if (!isValidDictionary()) return false; + if (!flushWithGCNative(mNativeDict, mDictFilePath)) { + return false; + } reopen(); + return true; } /** @@ -333,14 +550,30 @@ public final class BinaryDictionary extends Dictionary { return needsToRunGCNative(mNativeDict, mindsBlockByGC); } - @UsedForTesting - public int calculateProbability(final int unigramProbability, final int bigramProbability) { - if (!isValidDictionary()) return NOT_A_PROBABILITY; - return calculateProbabilityNative(mNativeDict, unigramProbability, bigramProbability); + public boolean migrateTo(final int newFormatVersion) { + if (!isValidDictionary()) { + return false; + } + final String tmpDictFilePath = mDictFilePath + DICT_FILE_NAME_SUFFIX_FOR_MIGRATION; + if (!migrateNative(mNativeDict, tmpDictFilePath, newFormatVersion)) { + return false; + } + close(); + final File dictFile = new File(mDictFilePath); + final File tmpDictFile = new File(tmpDictFilePath); + if (!FileUtils.deleteRecursively(dictFile)) { + return false; + } + if (!BinaryDictionaryUtils.renameDict(tmpDictFile, dictFile)) { + return false; + } + loadDictionary(dictFile.getAbsolutePath(), 0 /* startOffset */, + dictFile.length(), mIsUpdatable); + return true; } @UsedForTesting - public String getPropertyForTests(String query) { + public String getPropertyForTest(final String query) { if (!isValidDictionary()) return ""; return getPropertyNative(mNativeDict, query); } diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 722a82961..10b1f1b77 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -28,7 +28,7 @@ import android.text.TextUtils; import android.util.Log; import com.android.inputmethod.dictionarypack.DictionaryPackConstants; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.dictionarypack.MD5Calculator; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils.DictionaryInfo; import com.android.inputmethod.latin.utils.FileTransforms; @@ -38,12 +38,13 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Closeable; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -98,7 +99,7 @@ public final class BinaryDictionaryFileDumper { * This creates a URI builder able to build a URI pointing to the dictionary * pack content provider for a specific dictionary id. */ - private static Uri.Builder getProviderUriBuilder(final String path) { + public static Uri.Builder getProviderUriBuilder(final String path) { return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) .authority(DictionaryPackConstants.AUTHORITY).appendPath(path); } @@ -142,7 +143,7 @@ public final class BinaryDictionaryFileDumper { final ContentProviderClient client = context.getContentResolver(). acquireContentProviderClient(getProviderUriBuilder("").build()); if (null == client) return Collections.<WordListInfo>emptyList(); - + Cursor cursor = null; try { final Uri.Builder builder = getContentUriBuilderForType(clientId, client, QUERY_PATH_DICT_INFO, locale.toString()); @@ -154,24 +155,23 @@ public final class BinaryDictionaryFileDumper { final boolean isProtocolV2 = (QUERY_PARAMETER_PROTOCOL_VALUE.equals( queryUri.getQueryParameter(QUERY_PARAMETER_PROTOCOL))); - Cursor c = client.query(queryUri, DICTIONARY_PROJECTION, null, null, null); - if (isProtocolV2 && null == c) { + cursor = client.query(queryUri, DICTIONARY_PROJECTION, null, null, null); + if (isProtocolV2 && null == cursor) { reinitializeClientRecordInDictionaryContentProvider(context, client, clientId); - c = client.query(queryUri, DICTIONARY_PROJECTION, null, null, null); + cursor = client.query(queryUri, DICTIONARY_PROJECTION, null, null, null); } - if (null == c) return Collections.<WordListInfo>emptyList(); - if (c.getCount() <= 0 || !c.moveToFirst()) { - c.close(); + if (null == cursor) return Collections.<WordListInfo>emptyList(); + if (cursor.getCount() <= 0 || !cursor.moveToFirst()) { return Collections.<WordListInfo>emptyList(); } - final ArrayList<WordListInfo> list = CollectionUtils.newArrayList(); + final ArrayList<WordListInfo> list = new ArrayList<>(); do { - final String wordListId = c.getString(0); - final String wordListLocale = c.getString(1); + final String wordListId = cursor.getString(0); + final String wordListLocale = cursor.getString(1); + final String wordListRawChecksum = cursor.getString(2); if (TextUtils.isEmpty(wordListId)) continue; - list.add(new WordListInfo(wordListId, wordListLocale)); - } while (c.moveToNext()); - c.close(); + list.add(new WordListInfo(wordListId, wordListLocale, wordListRawChecksum)); + } while (cursor.moveToNext()); return list; } catch (RemoteException e) { // The documentation is unclear as to in which cases this may happen, but it probably @@ -186,6 +186,9 @@ public final class BinaryDictionaryFileDumper { Log.e(TAG, "Unexpected exception communicating with the dictionary pack", e); return Collections.<WordListInfo>emptyList(); } finally { + if (null != cursor) { + cursor.close(); + } client.release(); } } @@ -216,7 +219,8 @@ public final class BinaryDictionaryFileDumper { * and creating it (and its containing directory) if necessary. */ private static void cacheWordList(final String wordlistId, final String locale, - final ContentProviderClient providerClient, final Context context) { + final String rawChecksum, final ContentProviderClient providerClient, + final Context context) { final int COMPRESSED_CRYPTED_COMPRESSED = 0; final int CRYPTED_COMPRESSED = 1; final int COMPRESSED_CRYPTED = 2; @@ -298,6 +302,13 @@ public final class BinaryDictionaryFileDumper { checkMagicAndCopyFileTo(bufferedInputStream, bufferedOutputStream); bufferedOutputStream.flush(); bufferedOutputStream.close(); + final String actualRawChecksum = MD5Calculator.checksum( + new BufferedInputStream(new FileInputStream(outputFile))); + Log.i(TAG, "Computed checksum for downloaded dictionary. Expected = " + rawChecksum + + " ; actual = " + actualRawChecksum); + if (!TextUtils.isEmpty(rawChecksum) && !rawChecksum.equals(actualRawChecksum)) { + throw new IOException("Could not decode the file correctly : checksum differs"); + } final File finalFile = new File(finalFileName); finalFile.delete(); if (!outputFile.renameTo(finalFile)) { @@ -339,15 +350,25 @@ public final class BinaryDictionaryFileDumper { Log.e(TAG, "Could not copy a word list. Will not be able to use it."); // If we can't copy it we should warn the dictionary provider so that it can mark it // as invalid. - wordListUriBuilder.appendQueryParameter(QUERY_PARAMETER_DELETE_RESULT, - QUERY_PARAMETER_FAILURE); + reportBrokenFileToDictionaryProvider(providerClient, clientId, wordlistId); + } + + public static boolean reportBrokenFileToDictionaryProvider( + final ContentProviderClient providerClient, final String clientId, + final String wordlistId) { try { + final Uri.Builder wordListUriBuilder = getContentUriBuilderForType(clientId, + providerClient, QUERY_PATH_DATAFILE, wordlistId /* extraPath */); + wordListUriBuilder.appendQueryParameter(QUERY_PARAMETER_DELETE_RESULT, + QUERY_PARAMETER_FAILURE); if (0 >= providerClient.delete(wordListUriBuilder.build(), null, null)) { - Log.e(TAG, "In addition, we were unable to delete it."); + Log.e(TAG, "Unable to delete a word list."); } } catch (RemoteException e) { - Log.e(TAG, "In addition, communication with the dictionary provider was cut", e); + Log.e(TAG, "Communication with the dictionary provider was cut", e); + return false; } + return true; } // Ideally the two following methods should be merged, but AssetFileDescriptor does not @@ -397,7 +418,7 @@ public final class BinaryDictionaryFileDumper { final List<WordListInfo> idList = getWordListWordListInfos(locale, context, hasDefaultWordList); for (WordListInfo id : idList) { - cacheWordList(id.mId, id.mLocale, providerClient, context); + cacheWordList(id.mId, id.mLocale, id.mRawChecksum, providerClient, context); } } finally { providerClient.release(); @@ -432,8 +453,9 @@ public final class BinaryDictionaryFileDumper { // Actually copy the file final byte[] buffer = new byte[FILE_READ_BUFFER_SIZE]; - for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) + for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) { output.write(buffer, 0, readBytes); + } input.close(); } @@ -478,8 +500,7 @@ public final class BinaryDictionaryFileDumper { * @param context the context for resources and providers. * @param clientId the client ID to use. */ - public static void initializeClientRecordHelper(final Context context, - final String clientId) { + public static void initializeClientRecordHelper(final Context context, final String clientId) { try { final ContentProviderClient client = context.getContentResolver(). acquireContentProviderClient(getProviderUriBuilder("").build()); diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java index 181ad17ea..867c18686 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -21,11 +21,9 @@ import android.content.SharedPreferences; import android.content.res.AssetFileDescriptor; import android.util.Log; -import com.android.inputmethod.latin.makedict.DictDecoder; -import com.android.inputmethod.latin.makedict.FormatSpec; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; +import com.android.inputmethod.latin.makedict.DictionaryHeader; import com.android.inputmethod.latin.makedict.UnsupportedFormatException; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.LocaleUtils; @@ -112,7 +110,7 @@ final public class BinaryDictionaryGetter { public DictPackSettings(final Context context) { mDictPreferences = null == context ? null : context.getSharedPreferences(COMMON_PREFERENCES_NAME, - Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS); + Context.MODE_MULTI_PROCESS); } public boolean isWordListActive(final String dictId) { if (null == mDictPreferences) { @@ -161,7 +159,7 @@ final public class BinaryDictionaryGetter { public static File[] getCachedWordLists(final String locale, final Context context) { final File[] directoryList = DictionaryInfoUtils.getCachedDirectoryList(context); if (null == directoryList) return EMPTY_FILE_ARRAY; - final HashMap<String, FileAndMatchLevel> cacheFiles = CollectionUtils.newHashMap(); + final HashMap<String, FileAndMatchLevel> cacheFiles = new HashMap<>(); for (File directory : directoryList) { if (!directory.isDirectory()) continue; final String dirLocale = @@ -226,12 +224,10 @@ final public class BinaryDictionaryGetter { // ## HACK ## we prevent usage of a dictionary before version 18. The reason for this is, since // those do not include whitelist entries, the new code with an old version of the dictionary // would lose whitelist functionality. - private static boolean hackCanUseDictionaryFile(final Locale locale, final File f) { + private static boolean hackCanUseDictionaryFile(final Locale locale, final File file) { try { // Read the version of the file - final DictDecoder dictDecoder = FormatSpec.getDictDecoder(f); - final FileHeader header = dictDecoder.readHeader(); - + final DictionaryHeader header = BinaryDictionaryUtils.getHeader(file); final String version = header.mDictionaryOptions.mAttributes.get(VERSION_KEY); if (null == version) { // No version in the options : the format is unexpected @@ -276,7 +272,7 @@ final public class BinaryDictionaryGetter { final DictPackSettings dictPackSettings = new DictPackSettings(context); boolean foundMainDict = false; - final ArrayList<AssetFileAddress> fileList = CollectionUtils.newArrayList(); + final ArrayList<AssetFileAddress> fileList = new ArrayList<>(); // cachedWordLists may not be null, see doc for getCachedDictionaryList for (final File f : cachedWordLists) { final String wordListId = DictionaryInfoUtils.getWordListIdFromFileName(f.getName()); diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java index 9a9653094..43af66eb7 100644 --- a/java/src/com/android/inputmethod/latin/Constants.java +++ b/java/src/com/android/inputmethod/latin/Constants.java @@ -70,42 +70,56 @@ public final class Constants { public static final class ExtraValue { /** - * The subtype extra value used to indicate that the subtype keyboard layout is capable - * for typing ASCII characters. + * The subtype extra value used to indicate that this subtype is capable of + * entering ASCII characters. */ public static final String ASCII_CAPABLE = "AsciiCapable"; /** - * The subtype extra value used to indicate that the subtype keyboard layout is capable - * for typing EMOJI characters. + * The subtype extra value used to indicate that this subtype is enabled + * when the default subtype is not marked as ascii capable. + */ + public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE = + "EnabledWhenDefaultIsNotAsciiCapable"; + + /** + * The subtype extra value used to indicate that this subtype is capable of + * entering emoji characters. */ public static final String EMOJI_CAPABLE = "EmojiCapable"; + /** - * The subtype extra value used to indicate that the subtype require network connection - * to work. + * The subtype extra value used to indicate that this subtype requires a network + * connection to work. */ public static final String REQ_NETWORK_CONNECTIVITY = "requireNetworkConnectivity"; /** - * The subtype extra value used to indicate that the subtype display name contains "%s" - * for replacement mark and it should be replaced by this extra value. + * The subtype extra value used to indicate that the display name of this subtype + * contains a "%s" for printf-like replacement and it should be replaced by + * this extra value. * This extra value is supported on JellyBean and later. */ public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME = "UntranslatableReplacementStringInSubtypeName"; /** - * The subtype extra value used to indicate that the subtype keyboard layout set name. + * The subtype extra value used to indicate this subtype keyboard layout set name. * This extra value is private to LatinIME. */ public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet"; /** - * The subtype extra value used to indicate that the subtype is additional subtype + * The subtype extra value used to indicate that this subtype is an additional subtype * that the user defined. This extra value is private to LatinIME. */ public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype"; + /** + * The subtype extra value used to specify the combining rules. + */ + public static final String COMBINING_RULES = "CombiningRules"; + private ExtraValue() { // This utility class is not publicly instantiable. } @@ -124,6 +138,8 @@ public final class Constants { * {@link android.text.TextUtils#CAP_MODE_WORDS}, and * {@link android.text.TextUtils#CAP_MODE_SENTENCES}. */ + // TODO: Straighten this out. It's bizarre to have to use android.text.TextUtils.CAP_MODE_* + // except for OFF that is in Constants.TextUtils. public static final int CAP_MODE_OFF = 0; private TextUtils() { @@ -132,7 +148,8 @@ public final class Constants { } public static final int NOT_A_CODE = -1; - + public static final int NOT_A_CURSOR_POSITION = -1; + // TODO: replace the following constants with state in InputTransaction? public static final int NOT_A_COORDINATE = -1; public static final int SUGGESTION_STRIP_COORDINATE = -2; public static final int SPELL_CHECKER_COORDINATE = -3; @@ -141,10 +158,27 @@ public final class Constants { // A hint on how many characters to cache from the TextView. A good value of this is given by // how many characters we need to be able to almost always find the caps mode. public static final int EDITOR_CONTENTS_CACHE_SIZE = 1024; + // How many characters we accept for the recapitalization functionality. This needs to be + // large enough for all reasonable purposes, but avoid purposeful attacks. 100k sounds about + // right for this. + public static final int MAX_CHARACTERS_FOR_RECAPITALIZATION = 1024 * 100; // Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h public static final int DICTIONARY_MAX_WORD_LENGTH = 48; + // (MAX_PREV_WORD_COUNT_FOR_N_GRAM + 1)-gram is supported in Java side. Needs to modify + // MAX_PREV_WORD_COUNT_FOR_N_GRAM in native/jni/src/defines.h for suggestions. + public static final int MAX_PREV_WORD_COUNT_FOR_N_GRAM = 2; + + // Key events coming any faster than this are long-presses. + public static final int LONG_PRESS_MILLISECONDS = 200; + // TODO: Set this value appropriately. + public static final int GET_SUGGESTED_WORDS_TIMEOUT = 200; + // How many continuous deletes at which to start deleting at a higher speed. + public static final int DELETE_ACCELERATE_AT = 20; + + public static final String WORD_SEPARATOR = " "; + public static boolean isValidCoordinate(final int coordinate) { // Detect {@link NOT_A_COORDINATE}, {@link SUGGESTION_STRIP_COORDINATE}, // and {@link SPELL_CHECKER_COORDINATE}. @@ -165,13 +199,15 @@ public final class Constants { public static final int CODE_TAB = '\t'; public static final int CODE_SPACE = ' '; public static final int CODE_PERIOD = '.'; - public static final int CODE_ARMENIAN_PERIOD = 0x0589; + public static final int CODE_COMMA = ','; public static final int CODE_DASH = '-'; public static final int CODE_SINGLE_QUOTE = '\''; public static final int CODE_DOUBLE_QUOTE = '"'; public static final int CODE_QUESTION_MARK = '?'; public static final int CODE_EXCLAMATION_MARK = '!'; public static final int CODE_SLASH = '/'; + public static final int CODE_BACKSLASH = '\\'; + public static final int CODE_VERTICAL_BAR = '|'; public static final int CODE_COMMERCIAL_AT = '@'; public static final int CODE_PLUS = '+'; public static final int CODE_PERCENT = '%'; @@ -179,6 +215,12 @@ public final class Constants { public static final int CODE_CLOSING_SQUARE_BRACKET = ']'; public static final int CODE_CLOSING_CURLY_BRACKET = '}'; public static final int CODE_CLOSING_ANGLE_BRACKET = '>'; + public static final int CODE_INVERTED_QUESTION_MARK = 0xBF; // ¿ + public static final int CODE_INVERTED_EXCLAMATION_MARK = 0xA1; // ¡ + + public static final String REGEXP_PERIOD = "\\."; + public static final String STRING_SPACE = " "; + public static final String STRING_PERIOD_AND_SPACE = ". "; /** * Special keys code. Must be negative. @@ -197,8 +239,10 @@ public final class Constants { public static final int CODE_LANGUAGE_SWITCH = -10; public static final int CODE_EMOJI = -11; public static final int CODE_SHIFT_ENTER = -12; + public static final int CODE_SYMBOL_SHIFT = -13; + public static final int CODE_ALPHA_FROM_EMOJI = -14; // Code value representing the code is not specified. - public static final int CODE_UNSPECIFIED = -13; + public static final int CODE_UNSPECIFIED = -15; public static boolean isLetterCode(final int code) { return code >= CODE_SPACE; @@ -218,20 +262,50 @@ public final class Constants { case CODE_LANGUAGE_SWITCH: return "languageSwitch"; case CODE_EMOJI: return "emoji"; case CODE_SHIFT_ENTER: return "shiftEnter"; + case CODE_ALPHA_FROM_EMOJI: return "alpha"; case CODE_UNSPECIFIED: return "unspec"; case CODE_TAB: return "tab"; case CODE_ENTER: return "enter"; + case CODE_SPACE: return "space"; default: - if (code < CODE_SPACE) return String.format("'\\u%02x'", code); - if (code < 0x100) return String.format("'%c'", code); - return String.format("'\\u%04x'", code); + if (code < CODE_SPACE) return String.format("\\u%02X", code); + if (code < 0x100) return String.format("%c", code); + if (code < 0x10000) return String.format("\\u%04X", code); + return String.format("\\U%05X", code); + } + } + + public static String printableCodes(final int[] codes) { + final StringBuilder sb = new StringBuilder(); + boolean addDelimiter = false; + for (final int code : codes) { + if (code == NOT_A_CODE) break; + if (addDelimiter) sb.append(", "); + sb.append(printableCode(code)); + addDelimiter = true; } + return "[" + sb + "]"; } public static final int MAX_INT_BIT_COUNT = 32; + /** + * Screen metrics (a.k.a. Device form factor) constants of + * {@link R.integer#config_screen_metrics}. + */ + public static final int SCREEN_METRICS_SMALL_PHONE = 0; + public static final int SCREEN_METRICS_LARGE_PHONE = 1; + public static final int SCREEN_METRICS_LARGE_TABLET = 2; + public static final int SCREEN_METRICS_SMALL_TABLET = 3; + + /** + * Default capacity of gesture points container. + * This constant is used by {@link BatchInputArbiter} and etc. to preallocate regions that + * contain gesture event points. + */ + public static final int DEFAULT_GESTURE_POINTS_CAPACITY = 128; + private Constants() { // This utility class is not publicly instantiable. } - } diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java index 47891c6b7..ad14c06ef 100644 --- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java @@ -16,8 +16,6 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.latin.personalization.AccountUtils; - import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; @@ -31,8 +29,13 @@ import android.provider.ContactsContract.Contacts; import android.text.TextUtils; import android.util.Log; +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.personalization.AccountUtils; +import com.android.inputmethod.latin.utils.ExecutorUtils; import com.android.inputmethod.latin.utils.StringUtils; +import java.io.File; +import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -44,7 +47,8 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { private static final String TAG = ContactsBinaryDictionary.class.getSimpleName(); private static final String NAME = "contacts"; - private static boolean DEBUG = false; + private static final boolean DEBUG = false; + private static final boolean DEBUG_DUMP = false; /** * Frequency for contacts information into the dictionary @@ -58,10 +62,10 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { private static final int INDEX_NAME = 1; /** The number of contacts in the most recent dictionary rebuild. */ - static private int sContactCountAtLastRebuild = 0; + private int mContactCountAtLastRebuild = 0; - /** The locale for this contacts dictionary. Controls name bigram predictions. */ - public final Locale mLocale; + /** The hash code of ArrayList of contacts names in the most recent dictionary rebuild. */ + private int mHashCodeAtLastRebuild = 0; private ContentObserver mObserver; @@ -70,36 +74,40 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { */ private final boolean mUseFirstLastBigrams; - public ContactsBinaryDictionary(final Context context, final Locale locale) { - super(context, getFilenameWithLocale(NAME, locale.toString()), Dictionary.TYPE_CONTACTS, - false /* isUpdatable */); - mLocale = locale; + protected ContactsBinaryDictionary(final Context context, final Locale locale, + final File dictFile, final String name) { + super(context, getDictName(name, locale, dictFile), locale, Dictionary.TYPE_CONTACTS, + dictFile); mUseFirstLastBigrams = useFirstLastBigramsForLocale(locale); registerObserver(context); + reloadDictionaryIfRequired(); + } - // Load the current binary dictionary from internal storage. If no binary dictionary exists, - // loadDictionary will start a new thread to generate one asynchronously. - loadDictionary(); + @UsedForTesting + public static ContactsBinaryDictionary getDictionary(final Context context, final Locale locale, + final File dictFile, final String dictNamePrefix) { + return new ContactsBinaryDictionary(context, locale, dictFile, dictNamePrefix + NAME); } private synchronized void registerObserver(final Context context) { - // Perform a managed query. The Activity will handle closing and requerying the cursor - // when needed. if (mObserver != null) return; ContentResolver cres = context.getContentResolver(); cres.registerContentObserver(Contacts.CONTENT_URI, true, mObserver = new ContentObserver(null) { @Override public void onChange(boolean self) { - setRequiresReload(true); + ExecutorUtils.getExecutor("Check Contacts").execute(new Runnable() { + @Override + public void run() { + if (haveContentsChanged()) { + setNeedsToRecreate(); + } + } + }); } }); } - public void reopen(final Context context) { - registerObserver(context); - } - @Override public synchronized void close() { if (mObserver != null) { @@ -110,14 +118,14 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { } @Override - public void loadDictionaryAsync() { - loadDeviceAccountsEmailAddresses(); - loadDictionaryAsyncForUri(ContactsContract.Profile.CONTENT_URI); + public void loadInitialContentsLocked() { + loadDeviceAccountsEmailAddressesLocked(); + loadDictionaryForUriLocked(ContactsContract.Profile.CONTENT_URI); // TODO: Switch this URL to the newer ContactsContract too - loadDictionaryAsyncForUri(Contacts.CONTENT_URI); + loadDictionaryForUriLocked(Contacts.CONTENT_URI); } - private void loadDeviceAccountsEmailAddresses() { + private void loadDeviceAccountsEmailAddressesLocked() { final List<String> accountVocabulary = AccountUtils.getDeviceAccountsEmailAddresses(mContext); if (accountVocabulary == null || accountVocabulary.isEmpty()) { @@ -127,29 +135,32 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { if (DEBUG) { Log.d(TAG, "loadAccountVocabulary: " + word); } - super.addWord(word, null /* shortcut */, FREQUENCY_FOR_CONTACTS, 0 /* shortcutFreq */, - false /* isNotAWord */); + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, FREQUENCY_FOR_CONTACTS, null /* shortcut */, + 0 /* shortcutFreq */, false /* isNotAWord */, false /* isBlacklisted */, + BinaryDictionary.NOT_A_VALID_TIMESTAMP); } } - private void loadDictionaryAsyncForUri(final Uri uri) { + private void loadDictionaryForUriLocked(final Uri uri) { + Cursor cursor = null; try { - Cursor cursor = mContext.getContentResolver() - .query(uri, PROJECTION, null, null, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - sContactCountAtLastRebuild = getContactCount(); - addWords(cursor); - } - } finally { - cursor.close(); - } + cursor = mContext.getContentResolver().query(uri, PROJECTION, null, null, null); + if (null == cursor) { + return; + } + if (cursor.moveToFirst()) { + mContactCountAtLastRebuild = getContactCount(); + addWordsLocked(cursor); } } catch (final SQLiteException e) { Log.e(TAG, "SQLiteException in the remote Contacts process.", e); } catch (final IllegalStateException e) { Log.e(TAG, "Contacts DB is having problems", e); + } finally { + if (null != cursor) { + cursor.close(); + } } } @@ -161,33 +172,42 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { return false; } - private void addWords(final Cursor cursor) { + private void addWordsLocked(final Cursor cursor) { int count = 0; + final ArrayList<String> names = new ArrayList<>(); while (!cursor.isAfterLast() && count < MAX_CONTACT_COUNT) { String name = cursor.getString(INDEX_NAME); if (isValidName(name)) { - addName(name); + names.add(name); + addNameLocked(name); ++count; + } else { + if (DEBUG_DUMP) { + Log.d(TAG, "Invalid name: " + name); + } } cursor.moveToNext(); } + mHashCodeAtLastRebuild = names.hashCode(); } private int getContactCount() { // TODO: consider switching to a rawQuery("select count(*)...") on the database if // performance is a bottleneck. + Cursor cursor = null; try { - final Cursor cursor = mContext.getContentResolver().query( - Contacts.CONTENT_URI, PROJECTION_ID_ONLY, null, null, null); - if (cursor != null) { - try { - return cursor.getCount(); - } finally { - cursor.close(); - } + cursor = mContext.getContentResolver().query(Contacts.CONTENT_URI, PROJECTION_ID_ONLY, + null, null, null); + if (null == cursor) { + return 0; } + return cursor.getCount(); } catch (final SQLiteException e) { Log.e(TAG, "SQLiteException in the remote Contacts process.", e); + } finally { + if (null != cursor) { + cursor.close(); + } } return 0; } @@ -196,31 +216,36 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { * Adds the words in a name (e.g., firstname/lastname) to the binary dictionary along with their * bigrams depending on locale. */ - private void addName(final String name) { + private void addNameLocked(final String name) { int len = StringUtils.codePointCount(name); - String prevWord = null; + PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; // TODO: Better tokenization for non-Latin writing systems for (int i = 0; i < len; i++) { if (Character.isLetter(name.codePointAt(i))) { int end = getWordEndPosition(name, len, i); String word = name.substring(i, end); + if (DEBUG_DUMP) { + Log.d(TAG, "addName word = " + word); + } i = end - 1; // Don't add single letter words, possibly confuses // capitalization of i. final int wordLen = StringUtils.codePointCount(word); if (wordLen < MAX_WORD_LENGTH && wordLen > 1) { if (DEBUG) { - Log.d(TAG, "addName " + name + ", " + word + ", " + prevWord); + Log.d(TAG, "addName " + name + ", " + word + ", " + prevWordsInfo); } - super.addWord(word, null /* shortcut */, FREQUENCY_FOR_CONTACTS, - 0 /* shortcutFreq */, false /* isNotAWord */); - if (!TextUtils.isEmpty(prevWord)) { - if (mUseFirstLastBigrams) { - super.addBigram(prevWord, word, FREQUENCY_FOR_CONTACTS_BIGRAM, - 0 /* lastModifiedTime */); - } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, FREQUENCY_FOR_CONTACTS, + null /* shortcut */, 0 /* shortcutFreq */, false /* isNotAWord */, + false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP); + if (!prevWordsInfo.isValid() && mUseFirstLastBigrams) { + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addNgramEntryLocked(prevWordsInfo, word, FREQUENCY_FOR_CONTACTS_BIGRAM, + BinaryDictionary.NOT_A_VALID_TIMESTAMP); } - prevWord = word; + prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo( + new PrevWordsInfo.WordInfo(word)); } } } @@ -243,13 +268,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { return end; } - @Override - protected boolean needsToReloadBeforeWriting() { - return true; - } - - @Override - protected boolean hasContentChanged() { + private boolean haveContentsChanged() { final long startTime = SystemClock.uptimeMillis(); final int contactCount = getContactCount(); if (contactCount > MAX_CONTACT_COUNT) { @@ -258,9 +277,9 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { // TODO: Sort and check only the MAX_CONTACT_COUNT most recent contacts? return false; } - if (contactCount != sContactCountAtLastRebuild) { + if (contactCount != mContactCountAtLastRebuild) { if (DEBUG) { - Log.d(TAG, "Contact count changed: " + sContactCountAtLastRebuild + " to " + Log.d(TAG, "Contact count changed: " + mContactCountAtLastRebuild + " to " + contactCount); } return true; @@ -268,26 +287,27 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { // Check all contacts since it's not possible to find out which names have changed. // This is needed because it's possible to receive extraneous onChange events even when no // name has changed. - Cursor cursor = mContext.getContentResolver().query( - Contacts.CONTENT_URI, PROJECTION, null, null, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - while (!cursor.isAfterLast()) { - String name = cursor.getString(INDEX_NAME); - if (isValidName(name) && !isNameInDictionary(name)) { - if (DEBUG) { - Log.d(TAG, "Contact name missing: " + name + " (runtime = " - + (SystemClock.uptimeMillis() - startTime) + " ms)"); - } - return true; - } - cursor.moveToNext(); + final Cursor cursor = mContext.getContentResolver().query(Contacts.CONTENT_URI, PROJECTION, + null, null, null); + if (null == cursor) { + return false; + } + final ArrayList<String> names = new ArrayList<>(); + try { + if (cursor.moveToFirst()) { + while (!cursor.isAfterLast()) { + String name = cursor.getString(INDEX_NAME); + if (isValidName(name)) { + names.add(name); } + cursor.moveToNext(); } - } finally { - cursor.close(); } + if (names.hashCode() != mHashCodeAtLastRebuild) { + return true; + } + } finally { + cursor.close(); } if (DEBUG) { Log.d(TAG, "No contacts changed. (runtime = " + (SystemClock.uptimeMillis() - startTime) @@ -302,33 +322,4 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { } return false; } - - /** - * Checks if the words in a name are in the current binary dictionary. - */ - private boolean isNameInDictionary(final String name) { - int len = StringUtils.codePointCount(name); - String prevWord = null; - for (int i = 0; i < len; i++) { - if (Character.isLetter(name.codePointAt(i))) { - int end = getWordEndPosition(name, len, i); - String word = name.substring(i, end); - i = end - 1; - final int wordLen = StringUtils.codePointCount(word); - if (wordLen < MAX_WORD_LENGTH && wordLen > 1) { - if (!TextUtils.isEmpty(prevWord) && mUseFirstLastBigrams) { - if (!super.isValidBigramLocked(prevWord, word)) { - return false; - } - } else { - if (!super.isValidWordLocked(word)) { - return false; - } - } - prevWord = word; - } - } - } - return true; - } } diff --git a/java/src/com/android/inputmethod/latin/DicTraverseSession.java b/java/src/com/android/inputmethod/latin/DicTraverseSession.java index 8d295adee..b341f623e 100644 --- a/java/src/com/android/inputmethod/latin/DicTraverseSession.java +++ b/java/src/com/android/inputmethod/latin/DicTraverseSession.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.latin.settings.NativeSuggestOptions; import com.android.inputmethod.latin.utils.JniUtils; import java.util.Locale; @@ -24,6 +25,24 @@ public final class DicTraverseSession { static { JniUtils.loadNativeLibrary(); } + // Must be equal to MAX_RESULTS in native/jni/src/defines.h + private static final int MAX_RESULTS = 18; + public final int[] mInputCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH]; + public final int[][] mPrevWordCodePointArrays = + new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][]; + public final boolean[] mIsBeginningOfSentenceArray = + new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + public final int[] mOutputSuggestionCount = new int[1]; + public final int[] mOutputCodePoints = + new int[Constants.DICTIONARY_MAX_WORD_LENGTH * MAX_RESULTS]; + public final int[] mSpaceIndices = new int[MAX_RESULTS]; + public final int[] mOutputScores = new int[MAX_RESULTS]; + public final int[] mOutputTypes = new int[MAX_RESULTS]; + // Only one result is ever used + public final int[] mOutputAutoCommitFirstWordConfidence = new int[1]; + public final float[] mInputOutputLanguageWeight = new float[1]; + + public final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions(); private static native long setDicTraverseSessionNative(String locale, long dictSize); private static native void initDicTraverseSessionNative(long nativeDicTraverseSession, diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index fa79f5af7..b55ed125f 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; @@ -27,6 +28,7 @@ import java.util.ArrayList; */ public abstract class Dictionary { public static final int NOT_A_PROBABILITY = -1; + public static final float NOT_A_LANGUAGE_WEIGHT = -1.0f; // The following types do not actually come from real dictionary instances, so we create // corresponding instances. @@ -52,13 +54,12 @@ public abstract class Dictionary { public static final String TYPE_CONTACTS = "contacts"; // User dictionary, the system-managed one. public static final String TYPE_USER = "user"; - // User history dictionary internal to LatinIME. This assumes bigram prediction for now. + // User history dictionary internal to LatinIME. public static final String TYPE_USER_HISTORY = "history"; - // Personalization binary dictionary internal to LatinIME. + // Personalization dictionary. public static final String TYPE_PERSONALIZATION = "personalization"; - // Personalization prediction dictionary internal to LatinIME's Java code. - public static final String TYPE_PERSONALIZATION_PREDICTION_IN_JAVA = - "personalization_prediction_in_java"; + // Contextual dictionary. + public static final String TYPE_CONTEXTUAL = "contextual"; public final String mDictType; public Dictionary(final String dictType) { @@ -69,39 +70,44 @@ public abstract class Dictionary { * Searches for suggestions for a given context. For the moment the context is only the * previous word. * @param composer the key sequence to match with coordinate info, as a WordComposer - * @param prevWord the previous word, or null if none + * @param prevWordsInfo the information of previous words. * @param proximityInfo the object for key proximity. May be ignored by some implementations. * @param blockOffensiveWords whether to block potentially offensive words * @param additionalFeaturesOptions options about additional features used for the suggestion. + * @param sessionId the session id. + * @param inOutLanguageWeight the language weight used for generating suggestions. + * inOutLanguageWeight is a float array that has only one element. This can be updated when the + * different language weight is used. * @return the list of suggestions (possibly null if none) */ - // TODO: pass more context than just the previous word, to enable better suggestions (n-gram - // and more) abstract public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions); - - // The default implementation of this method ignores sessionId. - // Subclasses that want to use sessionId need to override this method. - public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, - final int sessionId) { - return getSuggestions(composer, prevWord, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions); - } + final int sessionId, final float[] inOutLanguageWeight); /** - * Checks if the given word occurs in the dictionary + * Checks if the given word has to be treated as a valid word. Please note that some + * dictionaries have entries that should be treated as invalid words. * @param word the word to search for. The search should be case-insensitive. - * @return true if the word exists, false otherwise + * @return true if the word is valid, false otherwise */ - abstract public boolean isValidWord(final String word); + public boolean isValidWord(final String word) { + return isInDictionary(word); + } + + /** + * Checks if the given word is in the dictionary regardless of it being valid or not. + */ + abstract public boolean isInDictionary(final String word); public int getFrequency(final String word) { return NOT_A_PROBABILITY; } + public int getMaxFrequencyOfExactMatches(final String word) { + return NOT_A_PROBABILITY; + } + /** * Compares the contents of the character array with the typed word and returns true if they * are the same. @@ -161,13 +167,14 @@ public abstract class Dictionary { @Override public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { return null; } @Override - public boolean isValidWord(String word) { + public boolean isInDictionary(String word) { return false; } } diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java index bf075140e..89d61ce2a 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java +++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java @@ -20,7 +20,6 @@ import android.util.Log; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; import java.util.Collection; @@ -36,49 +35,52 @@ public final class DictionaryCollection extends Dictionary { public DictionaryCollection(final String dictType) { super(dictType); - mDictionaries = CollectionUtils.newCopyOnWriteArrayList(); + mDictionaries = new CopyOnWriteArrayList<>(); } public DictionaryCollection(final String dictType, final Dictionary... dictionaries) { super(dictType); if (null == dictionaries) { - mDictionaries = CollectionUtils.newCopyOnWriteArrayList(); + mDictionaries = new CopyOnWriteArrayList<>(); } else { - mDictionaries = CollectionUtils.newCopyOnWriteArrayList(dictionaries); + mDictionaries = new CopyOnWriteArrayList<>(dictionaries); mDictionaries.removeAll(Collections.singleton(null)); } } public DictionaryCollection(final String dictType, final Collection<Dictionary> dictionaries) { super(dictType); - mDictionaries = CollectionUtils.newCopyOnWriteArrayList(dictionaries); + mDictionaries = new CopyOnWriteArrayList<>(dictionaries); mDictionaries.removeAll(Collections.singleton(null)); } @Override public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { final CopyOnWriteArrayList<Dictionary> dictionaries = mDictionaries; if (dictionaries.isEmpty()) return null; // To avoid creating unnecessary objects, we get the list out of the first // dictionary and add the rest to it if not null, hence the get(0) ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getSuggestions(composer, - prevWord, proximityInfo, blockOffensiveWords, additionalFeaturesOptions); - if (null == suggestions) suggestions = CollectionUtils.newArrayList(); + prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, + sessionId, inOutLanguageWeight); + if (null == suggestions) suggestions = new ArrayList<>(); final int length = dictionaries.size(); for (int i = 1; i < length; ++ i) { final ArrayList<SuggestedWordInfo> sugg = dictionaries.get(i).getSuggestions(composer, - prevWord, proximityInfo, blockOffensiveWords, additionalFeaturesOptions); + prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, + sessionId, inOutLanguageWeight); if (null != sugg) suggestions.addAll(sugg); } return suggestions; } @Override - public boolean isValidWord(final String word) { + public boolean isInDictionary(final String word) { for (int i = mDictionaries.size() - 1; i >= 0; --i) - if (mDictionaries.get(i).isValidWord(word)) return true; + if (mDictionaries.get(i).isInDictionary(word)) return true; return false; } @@ -87,9 +89,17 @@ public final class DictionaryCollection extends Dictionary { int maxFreq = -1; for (int i = mDictionaries.size() - 1; i >= 0; --i) { final int tempFreq = mDictionaries.get(i).getFrequency(word); - if (tempFreq >= maxFreq) { - maxFreq = tempFreq; - } + maxFreq = Math.max(tempFreq, maxFreq); + } + return maxFreq; + } + + @Override + public int getMaxFrequencyOfExactMatches(final String word) { + int maxFreq = -1; + for (int i = mDictionaries.size() - 1; i >= 0; --i) { + final int tempFreq = mDictionaries.get(i).getMaxFrequencyOfExactMatches(word); + maxFreq = Math.max(tempFreq, maxFreq); } return maxFreq; } diff --git a/java/src/com/android/inputmethod/latin/DictionaryDumpBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/DictionaryDumpBroadcastReceiver.java new file mode 100644 index 000000000..ee2fdc6c7 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/DictionaryDumpBroadcastReceiver.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014 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.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +public class DictionaryDumpBroadcastReceiver extends BroadcastReceiver { + private static final String TAG = DictionaryDumpBroadcastReceiver.class.getSimpleName(); + + private static final String DOMAIN = "com.android.inputmethod.latin"; + public static final String DICTIONARY_DUMP_INTENT_ACTION = DOMAIN + ".DICT_DUMP"; + public static final String DICTIONARY_NAME_KEY = "dictName"; + + final LatinIME mLatinIme; + + public DictionaryDumpBroadcastReceiver(final LatinIME latinIme) { + mLatinIme = latinIme; + } + + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (action.equals(DICTIONARY_DUMP_INTENT_ACTION)) { + final String dictName = intent.getStringExtra(DICTIONARY_NAME_KEY); + if (dictName == null) { + Log.e(TAG, "Received dictionary dump intent action " + + "but the dictionary name is not set."); + return; + } + mLatinIme.dumpDictionaryForDebug(dictName); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java new file mode 100644 index 000000000..b8feb2278 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java @@ -0,0 +1,658 @@ +/* + * Copyright (C) 2013 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.text.TextUtils; +import android.util.Log; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.PrevWordsInfo.WordInfo; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.personalization.ContextualDictionary; +import com.android.inputmethod.latin.personalization.PersonalizationDataChunk; +import com.android.inputmethod.latin.personalization.PersonalizationDictionary; +import com.android.inputmethod.latin.personalization.UserHistoryDictionary; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; +import com.android.inputmethod.latin.utils.DistracterFilter; +import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary; +import com.android.inputmethod.latin.utils.ExecutorUtils; +import com.android.inputmethod.latin.utils.LanguageModelParam; +import com.android.inputmethod.latin.utils.SuggestionResults; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +// TODO: Consolidate dictionaries in native code. +public class DictionaryFacilitator { + public static final String TAG = DictionaryFacilitator.class.getSimpleName(); + + // HACK: This threshold is being used when adding a capitalized entry in the User History + // dictionary. + private static final int CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140; + + private Dictionaries mDictionaries = new Dictionaries(); + private boolean mIsUserDictEnabled = false; + private volatile CountDownLatch mLatchForWaitingLoadingMainDictionary = new CountDownLatch(0); + // To synchronize assigning mDictionaries to ensure closing dictionaries. + private final Object mLock = new Object(); + private final DistracterFilter mDistracterFilter; + + private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS = + new String[] { + Dictionary.TYPE_MAIN, + Dictionary.TYPE_USER_HISTORY, + Dictionary.TYPE_PERSONALIZATION, + Dictionary.TYPE_USER, + Dictionary.TYPE_CONTACTS, + Dictionary.TYPE_CONTEXTUAL + }; + + public static final Map<String, Class<? extends ExpandableBinaryDictionary>> + DICT_TYPE_TO_CLASS = new HashMap<>(); + + static { + DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class); + DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_PERSONALIZATION, PersonalizationDictionary.class); + DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER, UserBinaryDictionary.class); + DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTACTS, ContactsBinaryDictionary.class); + DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTEXTUAL, ContextualDictionary.class); + } + + private static final String DICT_FACTORY_METHOD_NAME = "getDictionary"; + private static final Class<?>[] DICT_FACTORY_METHOD_ARG_TYPES = + new Class[] { Context.class, Locale.class, File.class, String.class }; + + private static final String[] SUB_DICT_TYPES = + Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS, 1 /* start */, + DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS.length); + + /** + * Class contains dictionaries for a locale. + */ + private static class Dictionaries { + public final Locale mLocale; + private Dictionary mMainDict; + public final ConcurrentHashMap<String, ExpandableBinaryDictionary> mSubDictMap = + new ConcurrentHashMap<>(); + + public Dictionaries() { + mLocale = null; + } + + public Dictionaries(final Locale locale, final Dictionary mainDict, + final Map<String, ExpandableBinaryDictionary> subDicts) { + mLocale = locale; + // Main dictionary can be asynchronously loaded. + setMainDict(mainDict); + for (final Map.Entry<String, ExpandableBinaryDictionary> entry : subDicts.entrySet()) { + setSubDict(entry.getKey(), entry.getValue()); + } + } + + private void setSubDict(final String dictType, final ExpandableBinaryDictionary dict) { + if (dict != null) { + mSubDictMap.put(dictType, dict); + } + } + + public void setMainDict(final Dictionary mainDict) { + // Close old dictionary if exists. Main dictionary can be assigned multiple times. + final Dictionary oldDict = mMainDict; + mMainDict = mainDict; + if (oldDict != null && mainDict != oldDict) { + oldDict.close(); + } + } + + public Dictionary getDict(final String dictType) { + if (Dictionary.TYPE_MAIN.equals(dictType)) { + return mMainDict; + } else { + return getSubDict(dictType); + } + } + + public ExpandableBinaryDictionary getSubDict(final String dictType) { + return mSubDictMap.get(dictType); + } + + public boolean hasDict(final String dictType) { + if (Dictionary.TYPE_MAIN.equals(dictType)) { + return mMainDict != null; + } else { + return mSubDictMap.containsKey(dictType); + } + } + + public void closeDict(final String dictType) { + final Dictionary dict; + if (Dictionary.TYPE_MAIN.equals(dictType)) { + dict = mMainDict; + } else { + dict = mSubDictMap.remove(dictType); + } + if (dict != null) { + dict.close(); + } + } + } + + public interface DictionaryInitializationListener { + public void onUpdateMainDictionaryAvailability(boolean isMainDictionaryAvailable); + } + + public DictionaryFacilitator() { + mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER; + } + + public DictionaryFacilitator(final DistracterFilter distracterFilter) { + mDistracterFilter = distracterFilter; + } + + public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) { + mDistracterFilter.updateEnabledSubtypes(enabledSubtypes); + } + + public Locale getLocale() { + return mDictionaries.mLocale; + } + + private static ExpandableBinaryDictionary getSubDict(final String dictType, + final Context context, final Locale locale, final File dictFile, + final String dictNamePrefix) { + final Class<? extends ExpandableBinaryDictionary> dictClass = + DICT_TYPE_TO_CLASS.get(dictType); + if (dictClass == null) { + return null; + } + try { + final Method factoryMethod = dictClass.getMethod(DICT_FACTORY_METHOD_NAME, + DICT_FACTORY_METHOD_ARG_TYPES); + final Object dict = factoryMethod.invoke(null /* obj */, + new Object[] { context, locale, dictFile, dictNamePrefix }); + return (ExpandableBinaryDictionary) dict; + } catch (final NoSuchMethodException | SecurityException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + Log.e(TAG, "Cannot create dictionary: " + dictType, e); + return null; + } + } + + public void resetDictionaries(final Context context, final Locale newLocale, + final boolean useContactsDict, final boolean usePersonalizedDicts, + final boolean forceReloadMainDictionary, + final DictionaryInitializationListener listener) { + resetDictionariesWithDictNamePrefix(context, newLocale, useContactsDict, + usePersonalizedDicts, forceReloadMainDictionary, listener, "" /* dictNamePrefix */); + } + + public void resetDictionariesWithDictNamePrefix(final Context context, final Locale newLocale, + final boolean useContactsDict, final boolean usePersonalizedDicts, + final boolean forceReloadMainDictionary, + final DictionaryInitializationListener listener, + final String dictNamePrefix) { + final boolean localeHasBeenChanged = !newLocale.equals(mDictionaries.mLocale); + // We always try to have the main dictionary. Other dictionaries can be unused. + final boolean reloadMainDictionary = localeHasBeenChanged || forceReloadMainDictionary; + // TODO: Make subDictTypesToUse configurable by resource or a static final list. + final HashSet<String> subDictTypesToUse = new HashSet<>(); + if (useContactsDict) { + subDictTypesToUse.add(Dictionary.TYPE_CONTACTS); + } + subDictTypesToUse.add(Dictionary.TYPE_USER); + if (usePersonalizedDicts) { + subDictTypesToUse.add(Dictionary.TYPE_USER_HISTORY); + subDictTypesToUse.add(Dictionary.TYPE_PERSONALIZATION); + subDictTypesToUse.add(Dictionary.TYPE_CONTEXTUAL); + } + + final Dictionary newMainDict; + if (reloadMainDictionary) { + // The main dictionary will be asynchronously loaded. + newMainDict = null; + } else { + newMainDict = mDictionaries.getDict(Dictionary.TYPE_MAIN); + } + + final Map<String, ExpandableBinaryDictionary> subDicts = new HashMap<>(); + for (final String dictType : SUB_DICT_TYPES) { + if (!subDictTypesToUse.contains(dictType)) { + // This dictionary will not be used. + continue; + } + final ExpandableBinaryDictionary dict; + if (!localeHasBeenChanged && mDictionaries.hasDict(dictType)) { + // Continue to use current dictionary. + dict = mDictionaries.getSubDict(dictType); + } else { + // Start to use new dictionary. + dict = getSubDict(dictType, context, newLocale, null /* dictFile */, + dictNamePrefix); + } + subDicts.put(dictType, dict); + } + + // Replace Dictionaries. + final Dictionaries newDictionaries = new Dictionaries(newLocale, newMainDict, subDicts); + final Dictionaries oldDictionaries; + synchronized (mLock) { + oldDictionaries = mDictionaries; + mDictionaries = newDictionaries; + mIsUserDictEnabled = UserBinaryDictionary.isEnabled(context); + if (reloadMainDictionary) { + asyncReloadMainDictionary(context, newLocale, listener); + } + } + if (listener != null) { + listener.onUpdateMainDictionaryAvailability(hasInitializedMainDictionary()); + } + // Clean up old dictionaries. + if (reloadMainDictionary) { + oldDictionaries.closeDict(Dictionary.TYPE_MAIN); + } + for (final String dictType : SUB_DICT_TYPES) { + if (localeHasBeenChanged || !subDictTypesToUse.contains(dictType)) { + oldDictionaries.closeDict(dictType); + } + } + oldDictionaries.mSubDictMap.clear(); + } + + private void asyncReloadMainDictionary(final Context context, final Locale locale, + final DictionaryInitializationListener listener) { + final CountDownLatch latchForWaitingLoadingMainDictionary = new CountDownLatch(1); + mLatchForWaitingLoadingMainDictionary = latchForWaitingLoadingMainDictionary; + ExecutorUtils.getExecutor("InitializeBinaryDictionary").execute(new Runnable() { + @Override + public void run() { + final Dictionary mainDict = + DictionaryFactory.createMainDictionaryFromManager(context, locale); + synchronized (mLock) { + if (locale.equals(mDictionaries.mLocale)) { + mDictionaries.setMainDict(mainDict); + } else { + // Dictionary facilitator has been reset for another locale. + mainDict.close(); + } + } + if (listener != null) { + listener.onUpdateMainDictionaryAvailability(hasInitializedMainDictionary()); + } + latchForWaitingLoadingMainDictionary.countDown(); + } + }); + } + + @UsedForTesting + public void resetDictionariesForTesting(final Context context, final Locale locale, + final ArrayList<String> dictionaryTypes, final HashMap<String, File> dictionaryFiles, + final Map<String, Map<String, String>> additionalDictAttributes) { + Dictionary mainDictionary = null; + final Map<String, ExpandableBinaryDictionary> subDicts = new HashMap<>(); + + for (final String dictType : dictionaryTypes) { + if (dictType.equals(Dictionary.TYPE_MAIN)) { + mainDictionary = DictionaryFactory.createMainDictionaryFromManager(context, locale); + } else { + final File dictFile = dictionaryFiles.get(dictType); + final ExpandableBinaryDictionary dict = getSubDict( + dictType, context, locale, dictFile, "" /* dictNamePrefix */); + if (additionalDictAttributes.containsKey(dictType)) { + dict.clearAndFlushDictionaryWithAdditionalAttributes( + additionalDictAttributes.get(dictType)); + } + if (dict == null) { + throw new RuntimeException("Unknown dictionary type: " + dictType); + } + dict.reloadDictionaryIfRequired(); + dict.waitAllTasksForTests(); + subDicts.put(dictType, dict); + } + } + mDictionaries = new Dictionaries(locale, mainDictionary, subDicts); + } + + public void closeDictionaries() { + final Dictionaries dictionaries; + synchronized (mLock) { + dictionaries = mDictionaries; + mDictionaries = new Dictionaries(); + } + for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { + dictionaries.closeDict(dictType); + } + mDistracterFilter.close(); + } + + @UsedForTesting + public ExpandableBinaryDictionary getSubDictForTesting(final String dictName) { + return mDictionaries.getSubDict(dictName); + } + + // The main dictionary could have been loaded asynchronously. Don't cache the return value + // of this method. + public boolean hasInitializedMainDictionary() { + final Dictionary mainDict = mDictionaries.getDict(Dictionary.TYPE_MAIN); + return mainDict != null && mainDict.isInitialized(); + } + + public boolean hasPersonalizationDictionary() { + return mDictionaries.hasDict(Dictionary.TYPE_PERSONALIZATION); + } + + public void flushPersonalizationDictionary() { + final ExpandableBinaryDictionary personalizationDict = + mDictionaries.getSubDict(Dictionary.TYPE_PERSONALIZATION); + if (personalizationDict != null) { + personalizationDict.asyncFlushBinaryDictionary(); + } + } + + public void waitForLoadingMainDictionary(final long timeout, final TimeUnit unit) + throws InterruptedException { + mLatchForWaitingLoadingMainDictionary.await(timeout, unit); + } + + @UsedForTesting + public void waitForLoadingDictionariesForTesting(final long timeout, final TimeUnit unit) + throws InterruptedException { + waitForLoadingMainDictionary(timeout, unit); + final Map<String, ExpandableBinaryDictionary> dictMap = mDictionaries.mSubDictMap; + for (final ExpandableBinaryDictionary dict : dictMap.values()) { + dict.waitAllTasksForTests(); + } + } + + public boolean isUserDictionaryEnabled() { + return mIsUserDictEnabled; + } + + public void addWordToUserDictionary(final Context context, final String word) { + final Locale locale = getLocale(); + if (locale == null) { + return; + } + UserBinaryDictionary.addWordToUserDictionary(context, locale, word); + } + + public void addToUserHistory(final String suggestion, final boolean wasAutoCapitalized, + final PrevWordsInfo prevWordsInfo, final int timeStampInSeconds, + final boolean blockPotentiallyOffensive) { + final Dictionaries dictionaries = mDictionaries; + final String[] words = suggestion.split(Constants.WORD_SEPARATOR); + PrevWordsInfo prevWordsInfoForCurrentWord = prevWordsInfo; + for (int i = 0; i < words.length; i++) { + final String currentWord = words[i]; + final boolean wasCurrentWordAutoCapitalized = (i == 0) ? wasAutoCapitalized : false; + addWordToUserHistory(dictionaries, prevWordsInfoForCurrentWord, currentWord, + wasCurrentWordAutoCapitalized, timeStampInSeconds, blockPotentiallyOffensive); + prevWordsInfoForCurrentWord = + prevWordsInfoForCurrentWord.getNextPrevWordsInfo(new WordInfo(currentWord)); + } + } + + private void addWordToUserHistory(final Dictionaries dictionaries, + final PrevWordsInfo prevWordsInfo, final String word, final boolean wasAutoCapitalized, + final int timeStampInSeconds, final boolean blockPotentiallyOffensive) { + final ExpandableBinaryDictionary userHistoryDictionary = + dictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY); + if (userHistoryDictionary == null) { + return; + } + final int maxFreq = getFrequency(word); + if (maxFreq == 0 && blockPotentiallyOffensive) { + return; + } + final String lowerCasedWord = word.toLowerCase(dictionaries.mLocale); + final String secondWord; + if (wasAutoCapitalized) { + if (isValidWord(word, false /* ignoreCase */) + && !isValidWord(lowerCasedWord, false /* ignoreCase */)) { + // If the word was auto-capitalized and exists only as a capitalized word in the + // dictionary, then we must not downcase it before registering it. For example, + // the name of the contacts in start-of-sentence position would come here with the + // wasAutoCapitalized flag: if we downcase it, we'd register a lower-case version + // of that contact's name which would end up popping in suggestions. + secondWord = word; + } else { + // If however the word is not in the dictionary, or exists as a lower-case word + // only, then we consider that was a lower-case word that had been auto-capitalized. + secondWord = lowerCasedWord; + } + } else { + // HACK: We'd like to avoid adding the capitalized form of common words to the User + // History dictionary in order to avoid suggesting them until the dictionary + // consolidation is done. + // TODO: Remove this hack when ready. + final int lowerCaseFreqInMainDict = dictionaries.hasDict(Dictionary.TYPE_MAIN) ? + dictionaries.getDict(Dictionary.TYPE_MAIN).getFrequency(lowerCasedWord) : + Dictionary.NOT_A_PROBABILITY; + if (maxFreq < lowerCaseFreqInMainDict + && lowerCaseFreqInMainDict >= CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT) { + // Use lower cased word as the word can be a distracter of the popular word. + secondWord = lowerCasedWord; + } else { + secondWord = word; + } + } + // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid". + // We don't add words with 0-frequency (assuming they would be profanity etc.). + final boolean isValid = maxFreq > 0; + UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord, + isValid, timeStampInSeconds, mDistracterFilter); + } + + private void removeWord(final String dictName, final String word) { + final ExpandableBinaryDictionary dictionary = mDictionaries.getSubDict(dictName); + if (dictionary != null) { + dictionary.removeUnigramEntryDynamically(word); + } + } + + public void removeWordFromPersonalizedDicts(final String word) { + removeWord(Dictionary.TYPE_USER_HISTORY, word); + removeWord(Dictionary.TYPE_PERSONALIZATION, word); + removeWord(Dictionary.TYPE_CONTEXTUAL, word); + } + + // TODO: Revise the way to fusion suggestion results. + public SuggestionResults getSuggestionResults(final WordComposer composer, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId) { + final Dictionaries dictionaries = mDictionaries; + final SuggestionResults suggestionResults = + new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS); + final float[] languageWeight = new float[] { Dictionary.NOT_A_LANGUAGE_WEIGHT }; + for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { + final Dictionary dictionary = dictionaries.getDict(dictType); + if (null == dictionary) continue; + final ArrayList<SuggestedWordInfo> dictionarySuggestions = + dictionary.getSuggestions(composer, prevWordsInfo, proximityInfo, + blockOffensiveWords, additionalFeaturesOptions, sessionId, + languageWeight); + if (null == dictionarySuggestions) continue; + suggestionResults.addAll(dictionarySuggestions); + if (null != suggestionResults.mRawSuggestions) { + suggestionResults.mRawSuggestions.addAll(dictionarySuggestions); + } + } + return suggestionResults; + } + + public boolean isValidWord(final String word, final boolean ignoreCase) { + if (TextUtils.isEmpty(word)) { + return false; + } + final Dictionaries dictionaries = mDictionaries; + if (dictionaries.mLocale == null) { + return false; + } + final String lowerCasedWord = word.toLowerCase(dictionaries.mLocale); + for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { + final Dictionary dictionary = dictionaries.getDict(dictType); + // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and + // would be immutable once it's finished initializing, but concretely a null test is + // probably good enough for the time being. + if (null == dictionary) continue; + if (dictionary.isValidWord(word) + || (ignoreCase && dictionary.isValidWord(lowerCasedWord))) { + return true; + } + } + return false; + } + + private int getFrequencyInternal(final String word, + final boolean isGettingMaxFrequencyOfExactMatches) { + if (TextUtils.isEmpty(word)) { + return Dictionary.NOT_A_PROBABILITY; + } + int maxFreq = Dictionary.NOT_A_PROBABILITY; + final Dictionaries dictionaries = mDictionaries; + for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) { + final Dictionary dictionary = dictionaries.getDict(dictType); + if (dictionary == null) continue; + final int tempFreq; + if (isGettingMaxFrequencyOfExactMatches) { + tempFreq = dictionary.getMaxFrequencyOfExactMatches(word); + } else { + tempFreq = dictionary.getFrequency(word); + } + if (tempFreq >= maxFreq) { + maxFreq = tempFreq; + } + } + return maxFreq; + } + + public int getFrequency(final String word) { + return getFrequencyInternal(word, false /* isGettingMaxFrequencyOfExactMatches */); + } + + public int getMaxFrequencyOfExactMatches(final String word) { + return getFrequencyInternal(word, true /* isGettingMaxFrequencyOfExactMatches */); + } + + private void clearSubDictionary(final String dictName) { + final ExpandableBinaryDictionary dictionary = mDictionaries.getSubDict(dictName); + if (dictionary != null) { + dictionary.clear(); + } + } + + public void clearUserHistoryDictionary() { + clearSubDictionary(Dictionary.TYPE_USER_HISTORY); + } + + // This method gets called only when the IME receives a notification to remove the + // personalization dictionary. + public void clearPersonalizationDictionary() { + clearSubDictionary(Dictionary.TYPE_PERSONALIZATION); + } + + public void clearContextualDictionary() { + clearSubDictionary(Dictionary.TYPE_CONTEXTUAL); + } + + public void addEntriesToPersonalizationDictionary( + final PersonalizationDataChunk personalizationDataChunk, + final SpacingAndPunctuations spacingAndPunctuations, + final ExpandableBinaryDictionary.AddMultipleDictionaryEntriesCallback callback) { + final ExpandableBinaryDictionary personalizationDict = + mDictionaries.getSubDict(Dictionary.TYPE_PERSONALIZATION); + if (personalizationDict == null) { + if (callback != null) { + callback.onFinished(); + } + return; + } + final ArrayList<LanguageModelParam> languageModelParams = + LanguageModelParam.createLanguageModelParamsFrom( + personalizationDataChunk.mTokens, + personalizationDataChunk.mTimestampInSeconds, + this /* dictionaryFacilitator */, spacingAndPunctuations, + new DistracterFilterCheckingIsInDictionary( + mDistracterFilter, personalizationDict)); + if (languageModelParams == null || languageModelParams.isEmpty()) { + if (callback != null) { + callback.onFinished(); + } + return; + } + personalizationDict.addMultipleDictionaryEntriesDynamically(languageModelParams, callback); + } + + public void addPhraseToContextualDictionary(final String[] phrase, final int probability, + final int bigramProbabilityForWords, final int bigramProbabilityForPhrases) { + final ExpandableBinaryDictionary contextualDict = + mDictionaries.getSubDict(Dictionary.TYPE_CONTEXTUAL); + if (contextualDict == null) { + return; + } + PrevWordsInfo prevWordsInfo = PrevWordsInfo.BEGINNING_OF_SENTENCE; + for (int i = 0; i < phrase.length; i++) { + final String[] subPhrase = Arrays.copyOfRange(phrase, i /* start */, phrase.length); + final String subPhraseStr = TextUtils.join(Constants.WORD_SEPARATOR, subPhrase); + contextualDict.addUnigramEntryWithCheckingDistracter( + subPhraseStr, probability, null /* shortcutTarget */, + Dictionary.NOT_A_PROBABILITY /* shortcutFreq */, + false /* isNotAWord */, false /* isBlacklisted */, + BinaryDictionary.NOT_A_VALID_TIMESTAMP, + DistracterFilter.EMPTY_DISTRACTER_FILTER); + contextualDict.addNgramEntry(prevWordsInfo, subPhraseStr, + bigramProbabilityForPhrases, BinaryDictionary.NOT_A_VALID_TIMESTAMP); + + if (i < phrase.length - 1) { + contextualDict.addUnigramEntryWithCheckingDistracter( + phrase[i], probability, null /* shortcutTarget */, + Dictionary.NOT_A_PROBABILITY /* shortcutFreq */, + false /* isNotAWord */, false /* isBlacklisted */, + BinaryDictionary.NOT_A_VALID_TIMESTAMP, + DistracterFilter.EMPTY_DISTRACTER_FILTER); + contextualDict.addNgramEntry(prevWordsInfo, phrase[i], + bigramProbabilityForWords, BinaryDictionary.NOT_A_VALID_TIMESTAMP); + } + prevWordsInfo = + prevWordsInfo.getNextPrevWordsInfo(new PrevWordsInfo.WordInfo(phrase[i])); + } + } + + public void dumpDictionaryForDebug(final String dictName) { + final ExpandableBinaryDictionary dictToDump = mDictionaries.getSubDict(dictName); + if (dictToDump == null) { + Log.e(TAG, "Cannot dump " + dictName + ". " + + "The dictionary is not being used for suggestion or cannot be dumped."); + return; + } + dictToDump.dumpAllWordsForDebug(); + } +} diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java index 828e54f14..59de4f82a 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java +++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java @@ -16,13 +16,13 @@ package com.android.inputmethod.latin; +import android.content.ContentProviderClient; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.util.Log; import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import java.io.File; @@ -54,7 +54,7 @@ public final class DictionaryFactory { createReadOnlyBinaryDictionary(context, locale)); } - final LinkedList<Dictionary> dictList = CollectionUtils.newLinkedList(); + final LinkedList<Dictionary> dictList = new LinkedList<>(); final ArrayList<AssetFileAddress> assetFileList = BinaryDictionaryGetter.getDictionaryFiles(locale, context); if (null != assetFileList) { @@ -64,6 +64,10 @@ public final class DictionaryFactory { useFullEditDistance, locale, Dictionary.TYPE_MAIN); if (readOnlyBinaryDictionary.isValidDictionary()) { dictList.add(readOnlyBinaryDictionary); + } else { + readOnlyBinaryDictionary.close(); + // Prevent this dictionary to do any further harm. + killDictionary(context, f); } } } @@ -75,6 +79,51 @@ public final class DictionaryFactory { } /** + * Kills a dictionary so that it is never used again, if possible. + * @param context The context to contact the dictionary provider, if possible. + * @param f A file address to the dictionary to kill. + */ + private static void killDictionary(final Context context, final AssetFileAddress f) { + if (f.pointsToPhysicalFile()) { + f.deleteUnderlyingFile(); + // Warn the dictionary provider if the dictionary came from there. + final ContentProviderClient providerClient; + try { + providerClient = context.getContentResolver().acquireContentProviderClient( + BinaryDictionaryFileDumper.getProviderUriBuilder("").build()); + } catch (final SecurityException e) { + Log.e(TAG, "No permission to communicate with the dictionary provider", e); + return; + } + if (null == providerClient) { + Log.e(TAG, "Can't establish communication with the dictionary provider"); + return; + } + final String wordlistId = + DictionaryInfoUtils.getWordListIdFromFileName(new File(f.mFilename).getName()); + if (null != wordlistId) { + // TODO: this is a reasonable last resort, but it is suboptimal. + // The following will remove the entry for this dictionary with the dictionary + // provider. When the metadata is downloaded again, we will try downloading it + // again. + // However, in the practice that will mean the user will find themselves without + // the new dictionary. That's fine for languages where it's included in the APK, + // but for other languages it will leave the user without a dictionary at all until + // the next update, which may be a few days away. + // Ideally, we would trigger a new download right away, and use increasing retry + // delays for this particular id/version combination. + // Then again, this is expected to only ever happen in case of human mistake. If + // the wrong file is on the server, the following is still doing the right thing. + // If it's a file left over from the last version however, it's not great. + BinaryDictionaryFileDumper.reportBrokenFileToDictionaryProvider( + providerClient, + context.getString(R.string.dictionary_pack_client_id), + wordlistId); + } + } + } + + /** * Initializes a main dictionary collection from a dictionary pack, with default flags. * * This searches for a content provider providing a dictionary pack for the specified diff --git a/java/src/com/android/inputmethod/latin/DictionaryWriter.java b/java/src/com/android/inputmethod/latin/DictionaryWriter.java deleted file mode 100644 index 3df2a2b63..000000000 --- a/java/src/com/android/inputmethod/latin/DictionaryWriter.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2013 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 com.android.inputmethod.keyboard.ProximityInfo; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.makedict.DictEncoder; -import com.android.inputmethod.latin.makedict.FormatSpec; -import com.android.inputmethod.latin.makedict.FusionDictionary; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; -import com.android.inputmethod.latin.makedict.UnsupportedFormatException; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - * An in memory dictionary for memorizing entries and writing a binary dictionary. - */ -public class DictionaryWriter extends AbstractDictionaryWriter { - private static final int BINARY_DICT_VERSION = 3; - private static final FormatSpec.FormatOptions FORMAT_OPTIONS = - new FormatSpec.FormatOptions(BINARY_DICT_VERSION, true /* supportsDynamicUpdate */); - - private FusionDictionary mFusionDictionary; - - public DictionaryWriter(final Context context, final String dictType) { - super(context, dictType); - clear(); - } - - @Override - public void clear() { - final HashMap<String, String> attributes = CollectionUtils.newHashMap(); - mFusionDictionary = new FusionDictionary(new PtNodeArray(), - new FusionDictionary.DictionaryOptions(attributes, false, false)); - } - - /** - * Adds a word unigram to the fusion dictionary. - */ - // TODO: Create "cache dictionary" to cache fresh words for frequently updated dictionaries, - // considering performance regression. - @Override - public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, - final int shortcutFreq, final boolean isNotAWord) { - if (shortcutTarget == null) { - mFusionDictionary.add(word, frequency, null, isNotAWord); - } else { - // TODO: Do this in the subclass, with this class taking an arraylist. - final ArrayList<WeightedString> shortcutTargets = CollectionUtils.newArrayList(); - shortcutTargets.add(new WeightedString(shortcutTarget, shortcutFreq)); - mFusionDictionary.add(word, frequency, shortcutTargets, isNotAWord); - } - } - - @Override - public void addBigramWords(final String word0, final String word1, final int frequency, - final boolean isValid, final long lastModifiedTime) { - mFusionDictionary.setBigram(word0, word1, frequency); - } - - @Override - public void removeBigramWords(final String word0, final String word1) { - // This class don't support removing bigram words. - } - - @Override - protected void writeDictionary(final DictEncoder dictEncoder, - final Map<String, String> attributeMap) throws IOException, UnsupportedFormatException { - for (final Map.Entry<String, String> entry : attributeMap.entrySet()) { - mFusionDictionary.addOptionAttribute(entry.getKey(), entry.getValue()); - } - dictEncoder.writeDictionary(mFusionDictionary, FORMAT_OPTIONS); - } - - @Override - public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - // This class doesn't support suggestion. - return null; - } - - @Override - public boolean isValidWord(String word) { - // This class doesn't support dictionary retrieval. - return false; - } -} diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index eb8650e6f..37879cf68 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -17,69 +17,57 @@ package com.android.inputmethod.latin; import android.content.Context; -import android.os.SystemClock; import android.util.Log; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.makedict.DictionaryHeader; import com.android.inputmethod.latin.makedict.FormatSpec; -import com.android.inputmethod.latin.personalization.DynamicPersonalizationDictionaryWriter; +import com.android.inputmethod.latin.makedict.UnsupportedFormatException; +import com.android.inputmethod.latin.makedict.WordProperty; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.utils.AsyncResultHolder; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.PrioritizedSerialExecutor; +import com.android.inputmethod.latin.utils.CombinedFormatUtils; +import com.android.inputmethod.latin.utils.DistracterFilter; +import com.android.inputmethod.latin.utils.ExecutorUtils; +import com.android.inputmethod.latin.utils.FileUtils; +import com.android.inputmethod.latin.utils.LanguageModelParam; import java.io.File; import java.util.ArrayList; import java.util.HashMap; +import java.util.Locale; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Abstract base class for an expandable dictionary that can be created and updated dynamically * during runtime. When updated it automatically generates a new binary dictionary to handle future - * queries in native code. This binary dictionary is written to internal storage, and potentially - * shared across multiple ExpandableBinaryDictionary instances. Updates to each dictionary filename - * are controlled across multiple instances to ensure that only one instance can update the same - * dictionary at the same time. + * queries in native code. This binary dictionary is written to internal storage. */ abstract public class ExpandableBinaryDictionary extends Dictionary { + private static final boolean DEBUG = false; /** Used for Log actions from this class */ private static final String TAG = ExpandableBinaryDictionary.class.getSimpleName(); /** Whether to print debug output to log */ - private static boolean DEBUG = false; - - // TODO: Remove. - /** Whether to call binary dictionary dynamically updating methods. */ - public static boolean ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE = true; + private static final boolean DBG_STRESS_TEST = false; private static final int TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS = 100; + private static final int DEFAULT_MAX_UNIGRAM_COUNT = 10000; + private static final int DEFAULT_MAX_BIGRAM_COUNT = 10000; + /** * The maximum length of a word in this dictionary. */ protected static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH; - private static final int DICTIONARY_FORMAT_VERSION = 3; - - private static final String SUPPORTS_DYNAMIC_UPDATE = - FormatSpec.FileHeader.ATTRIBUTE_VALUE_TRUE; - - /** - * A static map of update controllers, each of which records the time of accesses to a single - * binary dictionary file and tracks whether the file is regenerating. The key for this map is - * the filename and the value is the shared dictionary time recorder associated with that - * filename. - */ - private static final ConcurrentHashMap<String, DictionaryUpdateController> - sFilenameDictionaryUpdateControllerMap = CollectionUtils.newConcurrentHashMap(); - - private static final ConcurrentHashMap<String, PrioritizedSerialExecutor> - sFilenameExecutorMap = CollectionUtils.newConcurrentHashMap(); + private static final int DICTIONARY_FORMAT_VERSION = FormatSpec.VERSION4; /** The application context. */ protected final Context mContext; @@ -90,138 +78,109 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { */ private BinaryDictionary mBinaryDictionary; - // TODO: Remove and handle dictionaries in native code. - /** The in-memory dictionary used to generate the binary dictionary. */ - protected AbstractDictionaryWriter mDictionaryWriter; - /** - * The name of this dictionary, used as the filename for storing the binary dictionary. Multiple - * dictionary instances with the same filename is supported, with access controlled by - * DictionaryTimeRecorder. + * The name of this dictionary, used as a part of the filename for storing the binary + * dictionary. */ - private final String mFilename; + private final String mDictName; - /** Whether to support dynamically updating the dictionary */ - private final boolean mIsUpdatable; + /** Dictionary locale */ + private final Locale mLocale; - // TODO: remove, once dynamic operations is serialized - /** Controls updating the shared binary dictionary file across multiple instances. */ - private final DictionaryUpdateController mFilenameDictionaryUpdateController; + /** Dictionary file */ + private final File mDictFile; - // TODO: remove, once dynamic operations is serialized - /** Controls updating the local binary dictionary for this instance. */ - private final DictionaryUpdateController mPerInstanceDictionaryUpdateController = - new DictionaryUpdateController(); + /** Indicates whether a task for reloading the dictionary has been scheduled. */ + private final AtomicBoolean mIsReloading; - /* A extension for a binary dictionary file. */ - public static final String DICT_FILE_EXTENSION = ".dict"; + /** Indicates whether the current dictionary needs to be recreated. */ + private boolean mNeedsToRecreate; - private final AtomicReference<Runnable> mUnfinishedFlushingTask = - new AtomicReference<Runnable>(); + private final ReentrantReadWriteLock mLock; - /** - * Abstract method for loading the unigrams and bigrams of a given dictionary in a background - * thread. - */ - protected abstract void loadDictionaryAsync(); + private Map<String, String> mAdditionalAttributeMap = null; - /** - * Indicates that the source dictionary content has changed and a rebuild of the binary file is - * required. If it returns false, the next reload will only read the current binary dictionary - * from file. Note that the shared binary dictionary is locked when this is called. - */ - protected abstract boolean hasContentChanged(); + /* A extension for a binary dictionary file. */ + protected static final String DICT_FILE_EXTENSION = ".dict"; /** - * Gets the dictionary update controller for the given filename. + * Abstract method for loading initial contents of a given dictionary. */ - private static DictionaryUpdateController getDictionaryUpdateController( - String filename) { - DictionaryUpdateController recorder = sFilenameDictionaryUpdateControllerMap.get(filename); - if (recorder == null) { - synchronized(sFilenameDictionaryUpdateControllerMap) { - recorder = new DictionaryUpdateController(); - sFilenameDictionaryUpdateControllerMap.put(filename, recorder); - } - } - return recorder; + protected abstract void loadInitialContentsLocked(); + + private boolean matchesExpectedBinaryDictFormatVersionForThisType(final int formatVersion) { + return formatVersion == FormatSpec.VERSION4; } - /** - * Gets the executor for the given filename. - */ - private static PrioritizedSerialExecutor getExecutor(final String filename) { - PrioritizedSerialExecutor executor = sFilenameExecutorMap.get(filename); - if (executor == null) { - synchronized(sFilenameExecutorMap) { - executor = new PrioritizedSerialExecutor(); - sFilenameExecutorMap.put(filename, executor); - } - } - return executor; + private boolean needsToMigrateDictionary(final int formatVersion) { + // When we bump up the dictionary format version, the old version should be added to here + // for supporting migration. Note that native code has to support reading such formats. + return formatVersion == FormatSpec.VERSION4_ONLY_FOR_TESTING; } - private static AbstractDictionaryWriter getDictionaryWriter(final Context context, - final String dictType, final boolean isDynamicPersonalizationDictionary) { - if (isDynamicPersonalizationDictionary) { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - return null; - } else { - return new DynamicPersonalizationDictionaryWriter(context, dictType); - } - } else { - return new DictionaryWriter(context, dictType); - } + public boolean isValidDictionaryLocked() { + return mBinaryDictionary.isValidDictionary(); } /** * Creates a new expandable binary dictionary. * * @param context The application context of the parent. - * @param filename The filename for this binary dictionary. Multiple dictionaries with the same - * filename is supported. + * @param dictName The name of the dictionary. Multiple instances with the same + * name is supported. + * @param locale the dictionary locale. * @param dictType the dictionary type, as a human-readable string - * @param isUpdatable whether to support dynamically updating the dictionary. Please note that - * dynamic dictionary has negative effects on memory space and computation time. + * @param dictFile dictionary file path. if null, use default dictionary path based on + * dictionary type. */ - public ExpandableBinaryDictionary(final Context context, final String filename, - final String dictType, final boolean isUpdatable) { + public ExpandableBinaryDictionary(final Context context, final String dictName, + final Locale locale, final String dictType, final File dictFile) { super(dictType); - mFilename = filename; + mDictName = dictName; mContext = context; - mIsUpdatable = isUpdatable; + mLocale = locale; + mDictFile = getDictFile(context, dictName, dictFile); mBinaryDictionary = null; - mFilenameDictionaryUpdateController = getDictionaryUpdateController(filename); - // Currently, only dynamic personalization dictionary is updatable. - mDictionaryWriter = getDictionaryWriter(context, dictType, isUpdatable); + mIsReloading = new AtomicBoolean(); + mNeedsToRecreate = false; + mLock = new ReentrantReadWriteLock(); } - protected static String getFilenameWithLocale(final String name, final String localeStr) { - return name + "." + localeStr + DICT_FILE_EXTENSION; + public static File getDictFile(final Context context, final String dictName, + final File dictFile) { + return (dictFile != null) ? dictFile + : new File(context.getFilesDir(), dictName + DICT_FILE_EXTENSION); } - /** - * Closes and cleans up the binary dictionary. - */ - @Override - public void close() { - getExecutor(mFilename).execute(new Runnable() { + public static String getDictName(final String name, final Locale locale, + final File dictFile) { + return dictFile != null ? dictFile.getName() : name + "." + locale.toString(); + } + + private void asyncExecuteTaskWithWriteLock(final Runnable task) { + asyncExecuteTaskWithLock(mLock.writeLock(), task); + } + + private void asyncExecuteTaskWithLock(final Lock lock, final Runnable task) { + ExecutorUtils.getExecutor(mDictName).execute(new Runnable() { @Override public void run() { - if (mBinaryDictionary!= null) { - mBinaryDictionary.close(); - mBinaryDictionary = null; - } - if (mDictionaryWriter != null) { - mDictionaryWriter.close(); + lock.lock(); + try { + task.run(); + } finally { + lock.unlock(); } } }); } - protected void closeBinaryDictionary() { - // Ensure that no other threads are accessing the local binary dictionary. - getExecutor(mFilename).execute(new Runnable() { + /** + * Closes and cleans up the binary dictionary. + */ + @Override + public void close() { + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { if (mBinaryDictionary != null) { @@ -233,504 +192,482 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } protected Map<String, String> getHeaderAttributeMap() { - HashMap<String, String> attributeMap = new HashMap<String, String>(); - attributeMap.put(FormatSpec.FileHeader.SUPPORTS_DYNAMIC_UPDATE_ATTRIBUTE, - SUPPORTS_DYNAMIC_UPDATE); - attributeMap.put(FormatSpec.FileHeader.DICTIONARY_ID_ATTRIBUTE, mFilename); + HashMap<String, String> attributeMap = new HashMap<>(); + if (mAdditionalAttributeMap != null) { + attributeMap.putAll(mAdditionalAttributeMap); + } + attributeMap.put(DictionaryHeader.DICTIONARY_ID_KEY, mDictName); + attributeMap.put(DictionaryHeader.DICTIONARY_LOCALE_KEY, mLocale.toString()); + attributeMap.put(DictionaryHeader.DICTIONARY_VERSION_KEY, + String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()))); + attributeMap.put(DictionaryHeader.MAX_UNIGRAM_COUNT_KEY, + String.valueOf(DEFAULT_MAX_UNIGRAM_COUNT)); + attributeMap.put(DictionaryHeader.MAX_BIGRAM_COUNT_KEY, + String.valueOf(DEFAULT_MAX_BIGRAM_COUNT)); return attributeMap; } - protected void clear() { - getExecutor(mFilename).execute(new Runnable() { + private void removeBinaryDictionary() { + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE && mDictionaryWriter == null) { - mBinaryDictionary.close(); - final File file = new File(mContext.getFilesDir(), mFilename); - BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(), - DICTIONARY_FORMAT_VERSION, getHeaderAttributeMap()); - mBinaryDictionary = new BinaryDictionary( - file.getAbsolutePath(), 0 /* offset */, file.length(), - true /* useFullEditDistance */, null, mDictType, mIsUpdatable); - } else { - mDictionaryWriter.clear(); - } + removeBinaryDictionaryLocked(); } }); } - /** - * Adds a word unigram to the dictionary. Used for loading a dictionary. - * @param word The word to add. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this unigram. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored - * if shortcutTarget is null. - * @param isNotAWord true if this is not a word, i.e. shortcut only. - */ - protected void addWord(final String word, final String shortcutTarget, - final int frequency, final int shortcutFreq, final boolean isNotAWord) { - mDictionaryWriter.addUnigramWord(word, shortcutTarget, frequency, shortcutFreq, isNotAWord); + private void removeBinaryDictionaryLocked() { + if (mBinaryDictionary != null) { + mBinaryDictionary.close(); + } + if (mDictFile.exists() && !FileUtils.deleteRecursively(mDictFile)) { + Log.e(TAG, "Can't remove a file: " + mDictFile.getName()); + } + mBinaryDictionary = null; } - /** - * Adds a word bigram in the dictionary. Used for loading a dictionary. - */ - protected void addBigram(final String prevWord, final String word, final int frequency, - final long lastModifiedTime) { - mDictionaryWriter.addBigramWords(prevWord, word, frequency, true /* isValid */, - lastModifiedTime); + private void openBinaryDictionaryLocked() { + mBinaryDictionary = new BinaryDictionary( + mDictFile.getAbsolutePath(), 0 /* offset */, mDictFile.length(), + true /* useFullEditDistance */, mLocale, mDictType, true /* isUpdatable */); + } + + private void createOnMemoryBinaryDictionaryLocked() { + mBinaryDictionary = new BinaryDictionary( + mDictFile.getAbsolutePath(), true /* useFullEditDistance */, mLocale, mDictType, + DICTIONARY_FORMAT_VERSION, getHeaderAttributeMap()); + } + + public void clear() { + asyncExecuteTaskWithWriteLock(new Runnable() { + @Override + public void run() { + removeBinaryDictionaryLocked(); + createOnMemoryBinaryDictionaryLocked(); + } + }); } /** * Check whether GC is needed and run GC if required. */ protected void runGCIfRequired(final boolean mindsBlockByGC) { - if (!ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) return; - getExecutor(mFilename).execute(new Runnable() { + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - runGCIfRequiredInternalLocked(mindsBlockByGC); + if (mBinaryDictionary == null) { + return; + } + runGCIfRequiredLocked(mindsBlockByGC); } }); } - private void runGCIfRequiredInternalLocked(final boolean mindsBlockByGC) { - if (!ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) return; - // Calls to needsToRunGC() need to be serialized. + protected void runGCIfRequiredLocked(final boolean mindsBlockByGC) { if (mBinaryDictionary.needsToRunGC(mindsBlockByGC)) { - if (setIsRegeneratingIfNotRegenerating()) { - // Run GC after currently existing time sensitive operations. - getExecutor(mFilename).executePrioritized(new Runnable() { - @Override - public void run() { - try { - mBinaryDictionary.flushWithGC(); - } finally { - mFilenameDictionaryUpdateController.mIsRegenerating.set(false); - } - } - }); - } + mBinaryDictionary.flushWithGC(); } } /** - * Dynamically adds a word unigram to the dictionary. May overwrite an existing entry. + * Adds unigram information of a word to the dictionary. May overwrite an existing entry. */ - protected void addWordDynamically(final String word, final String shortcutTarget, - final int frequency, final int shortcutFreq, final boolean isNotAWord) { - if (!mIsUpdatable) { - Log.w(TAG, "addWordDynamically is called for non-updatable dictionary: " + mFilename); - return; - } - getExecutor(mFilename).execute(new Runnable() { + public void addUnigramEntryWithCheckingDistracter(final String word, final int frequency, + final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord, + final boolean isBlacklisted, final int timestamp, + final DistracterFilter distracterFilter) { + reloadDictionaryIfRequired(); + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - runGCIfRequiredInternalLocked(true /* mindsBlockByGC */); - mBinaryDictionary.addUnigramWord(word, frequency); - } else { - // TODO: Remove. - mDictionaryWriter.addUnigramWord(word, shortcutTarget, frequency, shortcutFreq, - isNotAWord); + if (mBinaryDictionary == null) { + return; + } + if (distracterFilter.isDistracterToWordsInDictionaries( + PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale)) { + // The word is a distracter. + return; } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq, + isNotAWord, isBlacklisted, timestamp); } }); } + protected void addUnigramLocked(final String word, final int frequency, + final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord, + final boolean isBlacklisted, final int timestamp) { + if (!mBinaryDictionary.addUnigramEntry(word, frequency, shortcutTarget, shortcutFreq, + false /* isBeginningOfSentence */, isNotAWord, isBlacklisted, timestamp)) { + Log.e(TAG, "Cannot add unigram entry. word: " + word); + } + } + /** - * Dynamically adds a word bigram in the dictionary. May overwrite an existing entry. + * Dynamically remove the unigram entry from the dictionary. */ - protected void addBigramDynamically(final String word0, final String word1, - final int frequency, final boolean isValid) { - if (!mIsUpdatable) { - Log.w(TAG, "addBigramDynamically is called for non-updatable dictionary: " - + mFilename); - return; - } - getExecutor(mFilename).execute(new Runnable() { + public void removeUnigramEntryDynamically(final String word) { + reloadDictionaryIfRequired(); + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - runGCIfRequiredInternalLocked(true /* mindsBlockByGC */); - mBinaryDictionary.addBigramWords(word0, word1, frequency); - } else { - // TODO: Remove. - mDictionaryWriter.addBigramWords(word0, word1, frequency, isValid, - 0 /* lastTouchedTime */); + if (mBinaryDictionary == null) { + return; + } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + if (!mBinaryDictionary.removeUnigramEntry(word)) { + if (DEBUG) { + Log.i(TAG, "Cannot remove unigram entry: " + word); + } } } }); } /** - * Dynamically remove a word bigram in the dictionary. + * Adds n-gram information of a word to the dictionary. May overwrite an existing entry. */ - protected void removeBigramDynamically(final String word0, final String word1) { - if (!mIsUpdatable) { - Log.w(TAG, "removeBigramDynamically is called for non-updatable dictionary: " - + mFilename); - return; + public void addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word, + final int frequency, final int timestamp) { + reloadDictionaryIfRequired(); + asyncExecuteTaskWithWriteLock(new Runnable() { + @Override + public void run() { + if (mBinaryDictionary == null) { + return; + } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addNgramEntryLocked(prevWordsInfo, word, frequency, timestamp); + } + }); + } + + protected void addNgramEntryLocked(final PrevWordsInfo prevWordsInfo, final String word, + final int frequency, final int timestamp) { + if (!mBinaryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp)) { + if (DEBUG) { + Log.i(TAG, "Cannot add n-gram entry."); + Log.i(TAG, " PrevWordsInfo: " + prevWordsInfo + ", word: " + word); + } } - getExecutor(mFilename).execute(new Runnable() { + } + + /** + * Dynamically remove the n-gram entry in the dictionary. + */ + @UsedForTesting + public void removeNgramDynamically(final PrevWordsInfo prevWordsInfo, final String word) { + reloadDictionaryIfRequired(); + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - runGCIfRequiredInternalLocked(true /* mindsBlockByGC */); - mBinaryDictionary.removeBigramWords(word0, word1); - } else { - // TODO: Remove. - mDictionaryWriter.removeBigramWords(word0, word1); + if (mBinaryDictionary == null) { + return; + } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + if (!mBinaryDictionary.removeNgramEntry(prevWordsInfo, word)) { + if (DEBUG) { + Log.i(TAG, "Cannot remove n-gram entry."); + Log.i(TAG, " PrevWordsInfo: " + prevWordsInfo + ", word: " + word); + } } } }); } - @Override - public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, - final int sessionId) { + public interface AddMultipleDictionaryEntriesCallback { + public void onFinished(); + } + + /** + * Dynamically add multiple entries to the dictionary. + */ + public void addMultipleDictionaryEntriesDynamically( + final ArrayList<LanguageModelParam> languageModelParams, + final AddMultipleDictionaryEntriesCallback callback) { reloadDictionaryIfRequired(); - if (isRegenerating()) { - return null; - } - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); - final AsyncResultHolder<ArrayList<SuggestedWordInfo>> holder = - new AsyncResultHolder<ArrayList<SuggestedWordInfo>>(); - getExecutor(mFilename).executePrioritized(new Runnable() { + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { + try { if (mBinaryDictionary == null) { - holder.set(null); return; } - final ArrayList<SuggestedWordInfo> binarySuggestion = - mBinaryDictionary.getSuggestionsWithSessionId(composer, prevWord, - proximityInfo, blockOffensiveWords, additionalFeaturesOptions, - sessionId); - holder.set(binarySuggestion); - } else { - final ArrayList<SuggestedWordInfo> inMemDictSuggestion = - composer.isBatchMode() ? null : - mDictionaryWriter.getSuggestionsWithSessionId(composer, - prevWord, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, sessionId); - // TODO: Remove checking mIsUpdatable and use native suggestion. - if (mBinaryDictionary != null && !mIsUpdatable) { - final ArrayList<SuggestedWordInfo> binarySuggestion = - mBinaryDictionary.getSuggestionsWithSessionId(composer, prevWord, - proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, sessionId); - if (inMemDictSuggestion == null) { - holder.set(binarySuggestion); - } else if (binarySuggestion == null) { - holder.set(inMemDictSuggestion); - } else { - binarySuggestion.addAll(inMemDictSuggestion); - holder.set(binarySuggestion); - } - } else { - holder.set(inMemDictSuggestion); + mBinaryDictionary.addMultipleDictionaryEntries( + languageModelParams.toArray( + new LanguageModelParam[languageModelParams.size()])); + } finally { + if (callback != null) { + callback.onFinished(); } } } }); - return holder.get(null, TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS); } @Override public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - return getSuggestionsWithSessionId(composer, prevWord, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, 0 /* sessionId */); + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { + reloadDictionaryIfRequired(); + boolean lockAcquired = false; + try { + lockAcquired = mLock.readLock().tryLock( + TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + if (lockAcquired) { + if (mBinaryDictionary == null) { + return null; + } + final ArrayList<SuggestedWordInfo> suggestions = + mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo, + blockOffensiveWords, additionalFeaturesOptions, sessionId, + inOutLanguageWeight); + if (mBinaryDictionary.isCorrupted()) { + Log.i(TAG, "Dictionary (" + mDictName +") is corrupted. " + + "Remove and regenerate it."); + removeBinaryDictionary(); + } + return suggestions; + } + } catch (final InterruptedException e) { + Log.e(TAG, "Interrupted tryLock() in getSuggestionsWithSessionId().", e); + } finally { + if (lockAcquired) { + mLock.readLock().unlock(); + } + } + return null; } @Override - public boolean isValidWord(final String word) { + public boolean isInDictionary(final String word) { reloadDictionaryIfRequired(); - return isValidWordInner(word); - } - - protected boolean isValidWordInner(final String word) { - if (isRegenerating()) { - return false; - } - final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>(); - getExecutor(mFilename).executePrioritized(new Runnable() { - @Override - public void run() { - holder.set(isValidWordLocked(word)); + boolean lockAcquired = false; + try { + lockAcquired = mLock.readLock().tryLock( + TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + if (lockAcquired) { + if (mBinaryDictionary == null) { + return false; + } + return isInDictionaryLocked(word); } - }); - return holder.get(false, TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS); + } catch (final InterruptedException e) { + Log.e(TAG, "Interrupted tryLock() in isInDictionary().", e); + } finally { + if (lockAcquired) { + mLock.readLock().unlock(); + } + } + return false; } - protected boolean isValidWordLocked(final String word) { + protected boolean isInDictionaryLocked(final String word) { if (mBinaryDictionary == null) return false; - return mBinaryDictionary.isValidWord(word); + return mBinaryDictionary.isInDictionary(word); } - protected boolean isValidBigramLocked(final String word1, final String word2) { - if (mBinaryDictionary == null) return false; - return mBinaryDictionary.isValidBigram(word1, word2); + @Override + public int getMaxFrequencyOfExactMatches(final String word) { + reloadDictionaryIfRequired(); + boolean lockAcquired = false; + try { + lockAcquired = mLock.readLock().tryLock( + TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + if (lockAcquired) { + if (mBinaryDictionary == null) { + return NOT_A_PROBABILITY; + } + return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); + } + } catch (final InterruptedException e) { + Log.e(TAG, "Interrupted tryLock() in getMaxFrequencyOfExactMatches().", e); + } finally { + if (lockAcquired) { + mLock.readLock().unlock(); + } + } + return NOT_A_PROBABILITY; } - /** - * Load the current binary dictionary from internal storage in a background thread. If no binary - * dictionary exists, this method will generate one. - */ - protected void loadDictionary() { - mPerInstanceDictionaryUpdateController.mLastUpdateRequestTime = SystemClock.uptimeMillis(); - reloadDictionaryIfRequired(); + + protected boolean isValidNgramLocked(final PrevWordsInfo prevWordsInfo, final String word) { + if (mBinaryDictionary == null) return false; + return mBinaryDictionary.isValidNgram(prevWordsInfo, word); } /** * Loads the current binary dictionary from internal storage. Assumes the dictionary file * exists. */ - private void loadBinaryDictionary() { - if (DEBUG) { - Log.d(TAG, "Loading binary dictionary: " + mFilename + " request=" - + mFilenameDictionaryUpdateController.mLastUpdateRequestTime + " update=" - + mFilenameDictionaryUpdateController.mLastUpdateTime); + private void loadBinaryDictionaryLocked() { + if (DBG_STRESS_TEST) { + // Test if this class does not cause problems when it takes long time to load binary + // dictionary. + try { + Log.w(TAG, "Start stress in loading: " + mDictName); + Thread.sleep(15000); + Log.w(TAG, "End stress in loading"); + } catch (InterruptedException e) { + } } - - final File file = new File(mContext.getFilesDir(), mFilename); - final String filename = file.getAbsolutePath(); - final long length = file.length(); - - // Build the new binary dictionary - final BinaryDictionary newBinaryDictionary = new BinaryDictionary(filename, 0 /* offset */, - length, true /* useFullEditDistance */, null, mDictType, mIsUpdatable); - - // Ensure all threads accessing the current dictionary have finished before - // swapping in the new one. - // TODO: Ensure multi-thread assignment of mBinaryDictionary. final BinaryDictionary oldBinaryDictionary = mBinaryDictionary; - getExecutor(mFilename).executePrioritized(new Runnable() { - @Override - public void run() { - mBinaryDictionary = newBinaryDictionary; - if (oldBinaryDictionary != null) { - oldBinaryDictionary.close(); - } + openBinaryDictionaryLocked(); + if (oldBinaryDictionary != null) { + oldBinaryDictionary.close(); + } + if (mBinaryDictionary.isValidDictionary() + && needsToMigrateDictionary(mBinaryDictionary.getFormatVersion())) { + if (!mBinaryDictionary.migrateTo(DICTIONARY_FORMAT_VERSION)) { + Log.e(TAG, "Dictionary migration failed: " + mDictName); + removeBinaryDictionaryLocked(); } - }); + } } /** - * Abstract method for checking if it is required to reload the dictionary before writing - * a binary dictionary. + * Create a new binary dictionary and load initial contents. */ - abstract protected boolean needsToReloadBeforeWriting(); - - /** - * Writes a new binary dictionary based on the contents of the fusion dictionary. - */ - private void writeBinaryDictionary() { - if (DEBUG) { - Log.d(TAG, "Generating binary dictionary: " + mFilename + " request=" - + mFilenameDictionaryUpdateController.mLastUpdateRequestTime + " update=" - + mFilenameDictionaryUpdateController.mLastUpdateTime); - } - if (needsToReloadBeforeWriting()) { - mDictionaryWriter.clear(); - loadDictionaryAsync(); - mDictionaryWriter.write(mFilename, getHeaderAttributeMap()); - } else { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - if (mBinaryDictionary == null || !mBinaryDictionary.isValidDictionary()) { - final File file = new File(mContext.getFilesDir(), mFilename); - BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(), - DICTIONARY_FORMAT_VERSION, getHeaderAttributeMap()); - } else { - if (mBinaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) { - mBinaryDictionary.flushWithGC(); - } else { - mBinaryDictionary.flush(); - } - } - } else { - mDictionaryWriter.write(mFilename, getHeaderAttributeMap()); - } - } + private void createNewDictionaryLocked() { + removeBinaryDictionaryLocked(); + createOnMemoryBinaryDictionaryLocked(); + loadInitialContentsLocked(); + // Run GC and flush to file when initial contents have been loaded. + mBinaryDictionary.flushWithGCIfHasUpdated(); } /** - * Marks that the dictionary is out of date and requires a reload. + * Marks that the dictionary needs to be recreated. * - * @param requiresRebuild Indicates that the source dictionary content has changed and a rebuild - * of the binary file is required. If not true, the next reload process will only read - * the current binary dictionary from file. */ - protected void setRequiresReload(final boolean requiresRebuild) { - final long time = SystemClock.uptimeMillis(); - mPerInstanceDictionaryUpdateController.mLastUpdateRequestTime = time; - mFilenameDictionaryUpdateController.mLastUpdateRequestTime = time; - if (DEBUG) { - Log.d(TAG, "Reload request: " + mFilename + ": request=" + time + " update=" - + mFilenameDictionaryUpdateController.mLastUpdateTime); - } + protected void setNeedsToRecreate() { + mNeedsToRecreate = true; } /** - * Reloads the dictionary if required. + * Load the current binary dictionary from internal storage. If the dictionary file doesn't + * exists or needs to be regenerated, the new dictionary file will be asynchronously generated. + * However, the dictionary itself is accessible even before the new dictionary file is actually + * generated. It may return a null result for getSuggestions() in that case by design. */ public final void reloadDictionaryIfRequired() { if (!isReloadRequired()) return; - if (setIsRegeneratingIfNotRegenerating()) { - reloadDictionary(); - } + asyncReloadDictionary(); } /** * Returns whether a dictionary reload is required. */ private boolean isReloadRequired() { - return mBinaryDictionary == null || mPerInstanceDictionaryUpdateController.isOutOfDate(); - } - - private boolean isRegenerating() { - return mFilenameDictionaryUpdateController.mIsRegenerating.get(); - } - - // Returns whether the dictionary can be regenerated. - private boolean setIsRegeneratingIfNotRegenerating() { - return mFilenameDictionaryUpdateController.mIsRegenerating.compareAndSet( - false /* expect */ , true /* update */); + return mBinaryDictionary == null || mNeedsToRecreate; } /** - * Reloads the dictionary. Access is controlled on a per dictionary file basis and supports - * concurrent calls from multiple instances that share the same dictionary file. + * Reloads the dictionary. Access is controlled on a per dictionary file basis. */ - private final void reloadDictionary() { - // Ensure that only one thread attempts to read or write to the shared binary dictionary - // file at the same time. - getExecutor(mFilename).execute(new Runnable() { - @Override - public void run() { - try { - final long time = SystemClock.uptimeMillis(); - final boolean dictionaryFileExists = dictionaryFileExists(); - if (mFilenameDictionaryUpdateController.isOutOfDate() - || !dictionaryFileExists) { - // If the shared dictionary file does not exist or is out of date, the - // first instance that acquires the lock will generate a new one. - if (hasContentChanged() || !dictionaryFileExists) { - // If the source content has changed or the dictionary does not exist, - // rebuild the binary dictionary. Empty dictionaries are supported (in - // the case where loadDictionaryAsync() adds nothing) in order to - // provide a uniform framework. - mFilenameDictionaryUpdateController.mLastUpdateTime = time; - writeBinaryDictionary(); - loadBinaryDictionary(); - } else { - // If not, the reload request was unnecessary so revert - // LastUpdateRequestTime to LastUpdateTime. - mFilenameDictionaryUpdateController.mLastUpdateRequestTime = - mFilenameDictionaryUpdateController.mLastUpdateTime; + private final void asyncReloadDictionary() { + if (mIsReloading.compareAndSet(false, true)) { + asyncExecuteTaskWithWriteLock(new Runnable() { + @Override + public void run() { + try { + if (!mDictFile.exists() || mNeedsToRecreate) { + // If the dictionary file does not exist or contents have been updated, + // generate a new one. + createNewDictionaryLocked(); + } else if (mBinaryDictionary == null) { + // Otherwise, load the existing dictionary. + loadBinaryDictionaryLocked(); + if (mBinaryDictionary != null && !(isValidDictionaryLocked() + // TODO: remove the check below + && matchesExpectedBinaryDictFormatVersionForThisType( + mBinaryDictionary.getFormatVersion()))) { + // Binary dictionary or its format version is not valid. Regenerate + // the dictionary file. createNewDictionaryLocked will remove the + // existing files if appropriate. + createNewDictionaryLocked(); + } } - } else if (mBinaryDictionary == null || - mPerInstanceDictionaryUpdateController.mLastUpdateTime - < mFilenameDictionaryUpdateController.mLastUpdateTime) { - // Otherwise, if the local dictionary is older than the shared dictionary, - // load the shared dictionary. - loadBinaryDictionary(); + mNeedsToRecreate = false; + } finally { + mIsReloading.set(false); } - if (mBinaryDictionary != null && !mBinaryDictionary.isValidDictionary()) { - // Binary dictionary is not valid. Regenerate the dictionary file. - mFilenameDictionaryUpdateController.mLastUpdateTime = time; - writeBinaryDictionary(); - loadBinaryDictionary(); - } - mPerInstanceDictionaryUpdateController.mLastUpdateTime = time; - } finally { - mFilenameDictionaryUpdateController.mIsRegenerating.set(false); } - } - }); - } - - // TODO: cache the file's existence so that we avoid doing a disk access each time. - private boolean dictionaryFileExists() { - final File file = new File(mContext.getFilesDir(), mFilename); - return file.exists(); + }); + } } /** - * Load the dictionary to memory. + * Flush binary dictionary to dictionary file. */ - protected void asyncLoadDictionaryToMemory() { - getExecutor(mFilename).executePrioritized(new Runnable() { + public void asyncFlushBinaryDictionary() { + asyncExecuteTaskWithWriteLock(new Runnable() { @Override public void run() { - if (!ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - loadDictionaryAsync(); + if (mBinaryDictionary == null) { + return; + } + if (mBinaryDictionary.needsToRunGC(false /* mindsBlockByGC */)) { + mBinaryDictionary.flushWithGC(); + } else { + mBinaryDictionary.flush(); } } }); } - /** - * Generate binary dictionary using DictionaryWriter. - */ - protected void asyncFlashAllBinaryDictionary() { - final Runnable newTask = new Runnable() { + @UsedForTesting + public void waitAllTasksForTests() { + final CountDownLatch countDownLatch = new CountDownLatch(1); + ExecutorUtils.getExecutor(mDictName).execute(new Runnable() { @Override public void run() { - writeBinaryDictionary(); + countDownLatch.countDown(); } - }; - final Runnable oldTask = mUnfinishedFlushingTask.getAndSet(newTask); - getExecutor(mFilename).replaceAndExecute(oldTask, newTask); - } - - /** - * For tracking whether the dictionary is out of date and the dictionary is regenerating. - * Can be shared across multiple dictionary instances that access the same filename. - */ - private static class DictionaryUpdateController { - public volatile long mLastUpdateTime = 0; - public volatile long mLastUpdateRequestTime = 0; - public volatile AtomicBoolean mIsRegenerating = new AtomicBoolean(); - - public boolean isOutOfDate() { - return (mLastUpdateRequestTime > mLastUpdateTime); + }); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + Log.e(TAG, "Interrupted while waiting for finishing dictionary operations.", e); } } - // TODO: Implement native binary methods once the dynamic dictionary implementation is done. @UsedForTesting - public boolean isInDictionaryForTests(final String word) { - final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>(); - getExecutor(mFilename).executePrioritized(new Runnable() { + public void clearAndFlushDictionaryWithAdditionalAttributes( + final Map<String, String> attributeMap) { + mAdditionalAttributeMap = attributeMap; + clear(); + } + + public void dumpAllWordsForDebug() { + reloadDictionaryIfRequired(); + asyncExecuteTaskWithLock(mLock.readLock(), new Runnable() { @Override public void run() { - if (mDictType == Dictionary.TYPE_USER_HISTORY) { - if (ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - holder.set(mBinaryDictionary.isValidWord(word)); - } else { - holder.set(((DynamicPersonalizationDictionaryWriter) mDictionaryWriter) - .isInBigramListForTests(word)); - } + Log.d(TAG, "Dump dictionary: " + mDictName); + try { + final DictionaryHeader header = mBinaryDictionary.getHeader(); + Log.d(TAG, "Format version: " + mBinaryDictionary.getFormatVersion()); + Log.d(TAG, CombinedFormatUtils.formatAttributeMap( + header.mDictionaryOptions.mAttributes)); + } catch (final UnsupportedFormatException e) { + Log.d(TAG, "Cannot fetch header information.", e); } + int token = 0; + do { + final BinaryDictionary.GetNextWordPropertyResult result = + mBinaryDictionary.getNextWordProperty(token); + final WordProperty wordProperty = result.mWordProperty; + if (wordProperty == null) { + Log.d(TAG, " dictionary is empty."); + break; + } + Log.d(TAG, wordProperty.toString()); + token = result.mNextToken; + } while (token != 0); } }); - return holder.get(false, TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS); - } - - @UsedForTesting - public void shutdownExecutorForTests() { - getExecutor(mFilename).shutdown(); - } - - @UsedForTesting - public boolean isTerminatedForTests() { - return getExecutor(mFilename).isTerminated(); } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java deleted file mode 100644 index 95c9bcab9..000000000 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ /dev/null @@ -1,894 +0,0 @@ -/* - * Copyright (C) 2009 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.text.TextUtils; -import android.util.Log; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.keyboard.ProximityInfo; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils.ForgettingCurveParams; - -import java.util.ArrayList; -import java.util.LinkedList; - -/** - * Class for an in-memory dictionary that can grow dynamically and can - * be searched for suggestions and valid words. - */ -// TODO: Remove after binary dictionary supports dynamic update. -public class ExpandableDictionary extends Dictionary { - private static final String TAG = ExpandableDictionary.class.getSimpleName(); - /** - * The weight to give to a word if it's length is the same as the number of typed characters. - */ - private static final int FULL_WORD_SCORE_MULTIPLIER = 2; - - private char[] mWordBuilder = new char[Constants.DICTIONARY_MAX_WORD_LENGTH]; - private int mMaxDepth; - private int mInputLength; - - private static final class Node { - char mCode; - int mFrequency; - boolean mTerminal; - Node mParent; - NodeArray mChildren; - ArrayList<char[]> mShortcutTargets; - boolean mShortcutOnly; - LinkedList<NextWord> mNGrams; // Supports ngram - } - - private static final class NodeArray { - Node[] mData; - int mLength = 0; - private static final int INCREMENT = 2; - - NodeArray() { - mData = new Node[INCREMENT]; - } - - void add(final Node n) { - if (mLength + 1 > mData.length) { - Node[] tempData = new Node[mLength + INCREMENT]; - if (mLength > 0) { - System.arraycopy(mData, 0, tempData, 0, mLength); - } - mData = tempData; - } - mData[mLength++] = n; - } - } - - public interface NextWord { - public Node getWordNode(); - public int getFrequency(); - public ForgettingCurveParams getFcParams(); - public int notifyTypedAgainAndGetFrequency(); - } - - private static final class NextStaticWord implements NextWord { - public final Node mWord; - private final int mFrequency; - public NextStaticWord(Node word, int frequency) { - mWord = word; - mFrequency = frequency; - } - - @Override - public Node getWordNode() { - return mWord; - } - - @Override - public int getFrequency() { - return mFrequency; - } - - @Override - public ForgettingCurveParams getFcParams() { - return null; - } - - @Override - public int notifyTypedAgainAndGetFrequency() { - return mFrequency; - } - } - - private static final class NextHistoryWord implements NextWord { - public final Node mWord; - public final ForgettingCurveParams mFcp; - - public NextHistoryWord(Node word, ForgettingCurveParams fcp) { - mWord = word; - mFcp = fcp; - } - - @Override - public Node getWordNode() { - return mWord; - } - - @Override - public int getFrequency() { - return mFcp.getFrequency(); - } - - @Override - public ForgettingCurveParams getFcParams() { - return mFcp; - } - - @Override - public int notifyTypedAgainAndGetFrequency() { - return mFcp.notifyTypedAgainAndGetFrequency(); - } - } - - private NodeArray mRoots; - - private int[][] mCodes; - - public ExpandableDictionary(final String dictType) { - super(dictType); - clearDictionary(); - mCodes = new int[Constants.DICTIONARY_MAX_WORD_LENGTH][]; - } - - public int getMaxWordLength() { - return Constants.DICTIONARY_MAX_WORD_LENGTH; - } - - /** - * Add a word with an optional shortcut to the dictionary. - * @param word The word to add. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this unigram. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored - * if shortcutTarget is null. - */ - public void addWord(final String word, final String shortcutTarget, final int frequency, - final int shortcutFreq) { - if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH) { - return; - } - addWordRec(mRoots, word, 0, shortcutTarget, frequency, shortcutFreq, null); - } - - /** - * Add a word, recursively searching for its correct place in the trie tree. - * @param children The node to recursively search for addition. Initially, the root of the tree. - * @param word The word to add. - * @param depth The current depth in the tree. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this unigram. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored - * if shortcutTarget is null. - * @param parentNode The parent node, for up linking. Initially null, as the root has no parent. - */ - private void addWordRec(final NodeArray children, final String word, final int depth, - final String shortcutTarget, final int frequency, final int shortcutFreq, - final 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.mLength; - Node childNode = null; - for (int i = 0; i < childrenLength; i++) { - final Node node = children.mData[i]; - if (node.mCode == c) { - childNode = node; - break; - } - } - final boolean isShortcutOnly = (null != shortcutTarget); - if (childNode == null) { - childNode = new Node(); - childNode.mCode = c; - childNode.mParent = parentNode; - childNode.mShortcutOnly = isShortcutOnly; - children.add(childNode); - } - if (wordLength == depth + 1) { - // Terminate this word - childNode.mTerminal = true; - if (isShortcutOnly) { - if (null == childNode.mShortcutTargets) { - childNode.mShortcutTargets = CollectionUtils.newArrayList(); - } - childNode.mShortcutTargets.add(shortcutTarget.toCharArray()); - } else { - childNode.mShortcutOnly = false; - } - childNode.mFrequency = Math.max(frequency, childNode.mFrequency); - if (childNode.mFrequency > 255) childNode.mFrequency = 255; - return; - } - if (childNode.mChildren == null) { - childNode.mChildren = new NodeArray(); - } - addWordRec(childNode.mChildren, word, depth + 1, shortcutTarget, frequency, shortcutFreq, - childNode); - } - - @Override - public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - if (composer.size() > 1) { - if (composer.size() >= Constants.DICTIONARY_MAX_WORD_LENGTH) { - return null; - } - final ArrayList<SuggestedWordInfo> suggestions = - getWordsInner(composer, prevWord, proximityInfo); - return suggestions; - } else { - if (TextUtils.isEmpty(prevWord)) return null; - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); - runBigramReverseLookUp(prevWord, suggestions); - return suggestions; - } - } - - private ArrayList<SuggestedWordInfo> getWordsInner(final WordComposer codes, - final String prevWordForBigrams, final ProximityInfo proximityInfo) { - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); - mInputLength = codes.size(); - if (mCodes.length < mInputLength) mCodes = new int[mInputLength][]; - final InputPointers ips = codes.getInputPointers(); - final int[] xCoordinates = ips.getXCoordinates(); - final int[] yCoordinates = ips.getYCoordinates(); - // Cache the codes so that we don't have to lookup an array list - for (int i = 0; i < mInputLength; i++) { - // TODO: Calculate proximity info here. - if (mCodes[i] == null || mCodes[i].length < 1) { - mCodes[i] = new int[ProximityInfo.MAX_PROXIMITY_CHARS_SIZE]; - } - final int x = xCoordinates != null && i < xCoordinates.length ? - xCoordinates[i] : Constants.NOT_A_COORDINATE; - final int y = xCoordinates != null && i < yCoordinates.length ? - yCoordinates[i] : Constants.NOT_A_COORDINATE; - proximityInfo.fillArrayWithNearestKeyCodes(x, y, codes.getCodeAt(i), mCodes[i]); - } - mMaxDepth = mInputLength * 3; - getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1, 0, -1, suggestions); - for (int i = 0; i < mInputLength; i++) { - getWordsRec(mRoots, codes, mWordBuilder, 0, false, 1, 0, i, suggestions); - } - return suggestions; - } - - @Override - public synchronized boolean isValidWord(final String word) { - final Node node = searchNode(mRoots, word, 0, word.length()); - // If node is null, we didn't find the word, so it's not valid. - // If node.mShortcutOnly is true, then it exists as a shortcut but not as a word, - // so that means it's not a valid word. - // If node.mShortcutOnly is false, then it exists as a word (it may also exist as - // a shortcut, but this does not matter), so it's a valid word. - return (node == null) ? false : !node.mShortcutOnly; - } - - public boolean removeBigram(final String word0, final String word1) { - // Refer to addOrSetBigram() about word1.toLowerCase() - final Node firstWord = searchWord(mRoots, word0.toLowerCase(), 0, null); - final Node secondWord = searchWord(mRoots, word1, 0, null); - LinkedList<NextWord> bigrams = firstWord.mNGrams; - NextWord bigramNode = null; - if (bigrams == null || bigrams.size() == 0) { - return false; - } else { - for (NextWord nw : bigrams) { - if (nw.getWordNode() == secondWord) { - bigramNode = nw; - break; - } - } - } - if (bigramNode == null) { - return false; - } - return bigrams.remove(bigramNode); - } - - /** - * Returns the word's frequency or -1 if not found - */ - @UsedForTesting - public int getWordFrequency(final String word) { - // Case-sensitive search - final Node node = searchNode(mRoots, word, 0, word.length()); - return (node == null) ? -1 : node.mFrequency; - } - - public NextWord getBigramWord(final String word0, final String word1) { - // Refer to addOrSetBigram() about word0.toLowerCase() - final Node firstWord = searchWord(mRoots, word0.toLowerCase(), 0, null); - final Node secondWord = searchWord(mRoots, word1, 0, null); - LinkedList<NextWord> bigrams = firstWord.mNGrams; - if (bigrams == null || bigrams.size() == 0) { - return null; - } else { - for (NextWord nw : bigrams) { - if (nw.getWordNode() == secondWord) { - return nw; - } - } - } - return null; - } - - private static int computeSkippedWordFinalFreq(final int freq, final int snr, - final int inputLength) { - // The computation itself makes sense for >= 2, but the == 2 case returns 0 - // anyway so we may as well test against 3 instead and return the constant - if (inputLength >= 3) { - return (freq * snr * (inputLength - 2)) / (inputLength - 1); - } else { - return 0; - } - } - - /** - * Helper method to add a word and its shortcuts. - * - * @param node the terminal node - * @param word the word to insert, as an array of code points - * @param depth the depth of the node in the tree - * @param finalFreq the frequency for this word - * @param suggestions the suggestion collection to add the suggestions to - * @return whether there is still space for more words. - */ - private boolean addWordAndShortcutsFromNode(final Node node, final char[] word, final int depth, - final int finalFreq, final ArrayList<SuggestedWordInfo> suggestions) { - if (finalFreq > 0 && !node.mShortcutOnly) { - // Use KIND_CORRECTION always. This dictionary does not really have a notion of - // COMPLETION against CORRECTION; we could artificially add one by looking at - // the respective size of the typed word and the suggestion if it matters sometime - // in the future. - suggestions.add(new SuggestedWordInfo(new String(word, 0, depth + 1), finalFreq, - SuggestedWordInfo.KIND_CORRECTION, this /* sourceDict */, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); - if (suggestions.size() >= Suggest.MAX_SUGGESTIONS) return false; - } - if (null != node.mShortcutTargets) { - final int length = node.mShortcutTargets.size(); - for (int shortcutIndex = 0; shortcutIndex < length; ++shortcutIndex) { - final char[] shortcut = node.mShortcutTargets.get(shortcutIndex); - suggestions.add(new SuggestedWordInfo(new String(shortcut, 0, shortcut.length), - finalFreq, SuggestedWordInfo.KIND_SHORTCUT, this /* sourceDict */, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); - if (suggestions.size() > Suggest.MAX_SUGGESTIONS) return false; - } - } - return true; - } - - /** - * Recursively traverse the tree for words that match the input. Input consists of - * a list of arrays. Each item in the list is one input character position. An input - * character is actually an array of multiple possible candidates. This function is not - * optimized for speed, assuming that the user dictionary will only be a few hundred words in - * size. - * @param roots node whose children have to be search for matches - * @param codes the input character codes - * @param word the word being composed as a possible match - * @param depth the depth of traversal - the length of the word being composed thus far - * @param completion whether the traversal is now in completion mode - meaning that we've - * exhausted the input and we're looking for all possible suffixes. - * @param snr current weight of the word being formed - * @param inputIndex position in the input characters. This can be off from the depth in - * case we skip over some punctuations such as apostrophe in the traversal. That is, if you type - * "wouldve", it could be matching "would've", so the depth will be one more than the - * inputIndex - * @param suggestions the list in which to add suggestions - */ - // TODO: Share this routine with the native code for BinaryDictionary - private void getWordsRec(final NodeArray roots, final WordComposer codes, final char[] word, - final int depth, final boolean completion, final int snr, final int inputIndex, - final int skipPos, final ArrayList<SuggestedWordInfo> suggestions) { - 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) { - return; - } - final int[] currentChars; - if (codeSize <= inputIndex) { - currentChars = null; - } else { - currentChars = mCodes[inputIndex]; - } - - for (int i = 0; i < count; i++) { - final Node node = roots.mData[i]; - final char c = node.mCode; - final char lowerC = toLowerCase(c); - final boolean terminal = node.mTerminal; - final NodeArray children = node.mChildren; - final int freq = node.mFrequency; - if (completion || currentChars == null) { - word[depth] = c; - if (terminal) { - final int finalFreq; - if (skipPos < 0) { - finalFreq = freq * snr; - } else { - finalFreq = computeSkippedWordFinalFreq(freq, snr, mInputLength); - } - if (!addWordAndShortcutsFromNode(node, word, depth, finalFreq, suggestions)) { - // No space left in the queue, bail out - return; - } - } - if (children != null) { - getWordsRec(children, codes, word, depth + 1, true, snr, inputIndex, - skipPos, suggestions); - } - } else if ((c == Constants.CODE_SINGLE_QUOTE - && currentChars[0] != Constants.CODE_SINGLE_QUOTE) || depth == skipPos) { - // Skip the ' and continue deeper - word[depth] = c; - if (children != null) { - getWordsRec(children, codes, word, depth + 1, completion, snr, inputIndex, - skipPos, suggestions); - } - } else { - // Don't use alternatives if we're looking for missing characters - final int alternativesSize = skipPos >= 0 ? 1 : currentChars.length; - for (int j = 0; j < alternativesSize; j++) { - final int addedAttenuation = (j > 0 ? 1 : 2); - final int currentChar = currentChars[j]; - if (currentChar == Constants.NOT_A_CODE) { - break; - } - if (currentChar == lowerC || currentChar == c) { - word[depth] = c; - - if (codeSize == inputIndex + 1) { - if (terminal) { - final int finalFreq; - if (skipPos < 0) { - finalFreq = freq * snr * addedAttenuation - * FULL_WORD_SCORE_MULTIPLIER; - } else { - finalFreq = computeSkippedWordFinalFreq(freq, - snr * addedAttenuation, mInputLength); - } - if (!addWordAndShortcutsFromNode(node, word, depth, finalFreq, - suggestions)) { - // No space left in the queue, bail out - return; - } - } - if (children != null) { - getWordsRec(children, codes, word, depth + 1, - true, snr * addedAttenuation, inputIndex + 1, - skipPos, suggestions); - } - } else if (children != null) { - getWordsRec(children, codes, word, depth + 1, - false, snr * addedAttenuation, inputIndex + 1, - skipPos, suggestions); - } - } - } - } - } - } - - public int setBigramAndGetFrequency(final String word0, final String word1, - final int frequency) { - return setBigramAndGetFrequency(word0, word1, frequency, null /* unused */); - } - - public int setBigramAndGetFrequency(final String word0, final String word1, - final ForgettingCurveParams fcp) { - return setBigramAndGetFrequency(word0, word1, 0 /* unused */, fcp); - } - - /** - * Adds bigrams to the in-memory trie structure that is being used to retrieve any word - * @param word0 the first word of this bigram - * @param word1 the second word of this bigram - * @param frequency frequency for this bigram - * @param fcp an instance of ForgettingCurveParams to use for decay policy - * @return returns the final bigram frequency - */ - private int setBigramAndGetFrequency(final String word0, final String word1, - final int frequency, final ForgettingCurveParams fcp) { - if (TextUtils.isEmpty(word0)) { - Log.e(TAG, "Invalid bigram previous word: " + word0); - return frequency; - } - // We don't want results to be different according to case of the looked up left hand side - // word. We do want however to return the correct case for the right hand side. - // So we want to squash the case of the left hand side, and preserve that of the right - // hand side word. - final String word0Lower = word0.toLowerCase(); - if (TextUtils.isEmpty(word0Lower) || TextUtils.isEmpty(word1)) { - Log.e(TAG, "Invalid bigram pair: " + word0 + ", " + word0Lower + ", " + word1); - return frequency; - } - final Node firstWord = searchWord(mRoots, word0Lower, 0, null); - final Node secondWord = searchWord(mRoots, word1, 0, null); - LinkedList<NextWord> bigrams = firstWord.mNGrams; - if (bigrams == null || bigrams.size() == 0) { - firstWord.mNGrams = CollectionUtils.newLinkedList(); - bigrams = firstWord.mNGrams; - } else { - for (NextWord nw : bigrams) { - if (nw.getWordNode() == secondWord) { - return nw.notifyTypedAgainAndGetFrequency(); - } - } - } - if (fcp != null) { - // history - firstWord.mNGrams.add(new NextHistoryWord(secondWord, fcp)); - } else { - firstWord.mNGrams.add(new NextStaticWord(secondWord, frequency)); - } - return frequency; - } - - /** - * Searches for the word and add the word if it does not exist. - * @return Returns the terminal node of the word we are searching for. - */ - private Node searchWord(final NodeArray children, final String word, final int depth, - final Node parentNode) { - final int wordLength = word.length(); - final char c = word.charAt(depth); - // Does children have the current character? - final int childrenLength = children.mLength; - Node childNode = null; - for (int i = 0; i < childrenLength; i++) { - final Node node = children.mData[i]; - if (node.mCode == c) { - childNode = node; - break; - } - } - if (childNode == null) { - childNode = new Node(); - childNode.mCode = c; - childNode.mParent = parentNode; - children.add(childNode); - } - if (wordLength == depth + 1) { - // Terminate this word - childNode.mTerminal = true; - return childNode; - } - if (childNode.mChildren == null) { - childNode.mChildren = new NodeArray(); - } - return searchWord(childNode.mChildren, word, depth + 1, childNode); - } - - private void runBigramReverseLookUp(final String previousWord, - final ArrayList<SuggestedWordInfo> suggestions) { - // Search for the lowercase version of the word only, because that's where bigrams - // store their sons. - final Node prevWord = searchNode(mRoots, previousWord.toLowerCase(), 0, - previousWord.length()); - if (prevWord != null && prevWord.mNGrams != null) { - reverseLookUp(prevWord.mNGrams, suggestions); - } - } - - // Local to reverseLookUp, but do not allocate each time. - private final char[] mLookedUpString = new char[Constants.DICTIONARY_MAX_WORD_LENGTH]; - - /** - * reverseLookUp retrieves the full word given a list of terminal nodes and adds those words - * to the suggestions list passed as an argument. - * @param terminalNodes list of terminal nodes we want to add - * @param suggestions the suggestion collection to add the word to - */ - private void reverseLookUp(final LinkedList<NextWord> terminalNodes, - final ArrayList<SuggestedWordInfo> suggestions) { - Node node; - int freq; - for (NextWord nextWord : terminalNodes) { - node = nextWord.getWordNode(); - freq = nextWord.getFrequency(); - int index = Constants.DICTIONARY_MAX_WORD_LENGTH; - do { - --index; - mLookedUpString[index] = node.mCode; - node = node.mParent; - } while (node != null && index > 0); - - // If node is null, we have a word longer than MAX_WORD_LENGTH in the dictionary. - // It's a little unclear how this can happen, but just in case it does it's safer - // to ignore the word in this case. - if (freq >= 0 && node == null) { - suggestions.add(new SuggestedWordInfo(new String(mLookedUpString, index, - Constants.DICTIONARY_MAX_WORD_LENGTH - index), - freq, SuggestedWordInfo.KIND_CORRECTION, this /* sourceDict */, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); - } - } - } - - /** - * Recursively search for the terminal node of the word. - * - * One iteration takes the full word to search for and the current index of the recursion. - * - * @param children the node of the trie to search under. - * @param word the word to search for. Only read [offset..length] so there may be trailing chars - * @param offset the index in {@code word} this recursion should operate on. - * @param length the length of the input word. - * @return Returns the terminal node of the word if the word exists - */ - private Node searchNode(final NodeArray children, final CharSequence word, final int offset, - final int length) { - final int count = children.mLength; - final char currentChar = word.charAt(offset); - for (int j = 0; j < count; j++) { - final Node node = children.mData[j]; - if (node.mCode == currentChar) { - if (offset == length - 1) { - if (node.mTerminal) { - return node; - } - } else { - if (node.mChildren != null) { - Node returnNode = searchNode(node.mChildren, word, offset + 1, length); - if (returnNode != null) return returnNode; - } - } - } - } - return null; - } - - public void clearDictionary() { - mRoots = new NodeArray(); - } - - private static char toLowerCase(final char c) { - char baseChar = c; - if (c < BASE_CHARS.length) { - baseChar = BASE_CHARS[c]; - } - if (baseChar >= 'A' && baseChar <= 'Z') { - return (char)(baseChar | 32); - } else if (baseChar > 127) { - return Character.toLowerCase(baseChar); - } - return baseChar; - } - - /** - * Table mapping most combined Latin, Greek, and Cyrillic characters - * to their base characters. If c is in range, BASE_CHARS[c] == c - * if c is not a combined character, or the base character if it - * is combined. - * - * cf. native/jni/src/utils/char_utils.cpp - */ - private static final char BASE_CHARS[] = { - /* U+0000 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - /* U+0008 */ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, - /* U+0010 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, - /* U+0018 */ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, - /* U+0020 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - /* U+0028 */ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, - /* U+0030 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - /* U+0038 */ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, - /* U+0040 */ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - /* U+0048 */ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, - /* U+0050 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - /* U+0058 */ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, - /* U+0060 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - /* U+0068 */ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, - /* U+0070 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - /* U+0078 */ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, - /* U+0080 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - /* U+0088 */ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, - /* U+0090 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - /* U+0098 */ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, - /* U+00A0 */ 0x0020, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - /* U+00A8 */ 0x0020, 0x00A9, 0x0061, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0020, - /* U+00B0 */ 0x00B0, 0x00B1, 0x0032, 0x0033, 0x0020, 0x03BC, 0x00B6, 0x00B7, - /* U+00B8 */ 0x0020, 0x0031, 0x006F, 0x00BB, 0x0031, 0x0031, 0x0033, 0x00BF, - /* U+00C0 */ 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x00C6, 0x0043, - /* U+00C8 */ 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, - /* U+00D0 */ 0x00D0, 0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x00D7, - /* U+00D8 */ 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x00DE, 0x0073, - // U+00D8: Manually changed from 00D8 to 004F - // TODO: Check if it's really acceptable to consider Ø a diacritical variant of O - // U+00DF: Manually changed from 00DF to 0073 - /* U+00E0 */ 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x00E6, 0x0063, - /* U+00E8 */ 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, - /* U+00F0 */ 0x00F0, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00F7, - /* U+00F8 */ 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x00FE, 0x0079, - // U+00F8: Manually changed from 00F8 to 006F - // TODO: Check if it's really acceptable to consider ø a diacritical variant of o - /* U+0100 */ 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063, - /* U+0108 */ 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, - /* U+0110 */ 0x0110, 0x0111, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, - /* U+0118 */ 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, - /* U+0120 */ 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0126, 0x0127, - /* U+0128 */ 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, - /* U+0130 */ 0x0049, 0x0131, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, - /* U+0138 */ 0x0138, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, - /* U+0140 */ 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, - // U+0141: Manually changed from 0141 to 004C - // U+0142: Manually changed from 0142 to 006C - /* U+0148 */ 0x006E, 0x02BC, 0x014A, 0x014B, 0x004F, 0x006F, 0x004F, 0x006F, - /* U+0150 */ 0x004F, 0x006F, 0x0152, 0x0153, 0x0052, 0x0072, 0x0052, 0x0072, - /* U+0158 */ 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, - /* U+0160 */ 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0166, 0x0167, - /* U+0168 */ 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, - /* U+0170 */ 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, - /* U+0178 */ 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A, 0x0073, - /* U+0180 */ 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0185, 0x0186, 0x0187, - /* U+0188 */ 0x0188, 0x0189, 0x018A, 0x018B, 0x018C, 0x018D, 0x018E, 0x018F, - /* U+0190 */ 0x0190, 0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, - /* U+0198 */ 0x0198, 0x0199, 0x019A, 0x019B, 0x019C, 0x019D, 0x019E, 0x019F, - /* U+01A0 */ 0x004F, 0x006F, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7, - /* U+01A8 */ 0x01A8, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE, 0x0055, - /* U+01B0 */ 0x0075, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5, 0x01B6, 0x01B7, - /* U+01B8 */ 0x01B8, 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD, 0x01BE, 0x01BF, - /* U+01C0 */ 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x0044, 0x0044, 0x0064, 0x004C, - /* U+01C8 */ 0x004C, 0x006C, 0x004E, 0x004E, 0x006E, 0x0041, 0x0061, 0x0049, - /* U+01D0 */ 0x0069, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, - // U+01D5: Manually changed from 00DC to 0055 - // U+01D6: Manually changed from 00FC to 0075 - // U+01D7: Manually changed from 00DC to 0055 - /* U+01D8 */ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x01DD, 0x0041, 0x0061, - // U+01D8: Manually changed from 00FC to 0075 - // U+01D9: Manually changed from 00DC to 0055 - // U+01DA: Manually changed from 00FC to 0075 - // U+01DB: Manually changed from 00DC to 0055 - // U+01DC: Manually changed from 00FC to 0075 - // U+01DE: Manually changed from 00C4 to 0041 - // U+01DF: Manually changed from 00E4 to 0061 - /* U+01E0 */ 0x0041, 0x0061, 0x00C6, 0x00E6, 0x01E4, 0x01E5, 0x0047, 0x0067, - // U+01E0: Manually changed from 0226 to 0041 - // U+01E1: Manually changed from 0227 to 0061 - /* U+01E8 */ 0x004B, 0x006B, 0x004F, 0x006F, 0x004F, 0x006F, 0x01B7, 0x0292, - // U+01EC: Manually changed from 01EA to 004F - // U+01ED: Manually changed from 01EB to 006F - /* U+01F0 */ 0x006A, 0x0044, 0x0044, 0x0064, 0x0047, 0x0067, 0x01F6, 0x01F7, - /* U+01F8 */ 0x004E, 0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x004F, 0x006F, - // U+01FA: Manually changed from 00C5 to 0041 - // U+01FB: Manually changed from 00E5 to 0061 - // U+01FE: Manually changed from 00D8 to 004F - // TODO: Check if it's really acceptable to consider Ø a diacritical variant of O - // U+01FF: Manually changed from 00F8 to 006F - // TODO: Check if it's really acceptable to consider ø a diacritical variant of o - /* U+0200 */ 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, - /* U+0208 */ 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, - /* U+0210 */ 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, - /* U+0218 */ 0x0053, 0x0073, 0x0054, 0x0074, 0x021C, 0x021D, 0x0048, 0x0068, - /* U+0220 */ 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0041, 0x0061, - /* U+0228 */ 0x0045, 0x0065, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, - // U+022A: Manually changed from 00D6 to 004F - // U+022B: Manually changed from 00F6 to 006F - // U+022C: Manually changed from 00D5 to 004F - // U+022D: Manually changed from 00F5 to 006F - /* U+0230 */ 0x004F, 0x006F, 0x0059, 0x0079, 0x0234, 0x0235, 0x0236, 0x0237, - // U+0230: Manually changed from 022E to 004F - // U+0231: Manually changed from 022F to 006F - /* U+0238 */ 0x0238, 0x0239, 0x023A, 0x023B, 0x023C, 0x023D, 0x023E, 0x023F, - /* U+0240 */ 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, - /* U+0248 */ 0x0248, 0x0249, 0x024A, 0x024B, 0x024C, 0x024D, 0x024E, 0x024F, - /* U+0250 */ 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, - /* U+0258 */ 0x0258, 0x0259, 0x025A, 0x025B, 0x025C, 0x025D, 0x025E, 0x025F, - /* U+0260 */ 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, - /* U+0268 */ 0x0268, 0x0269, 0x026A, 0x026B, 0x026C, 0x026D, 0x026E, 0x026F, - /* U+0270 */ 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, - /* U+0278 */ 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F, - /* U+0280 */ 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, - /* U+0288 */ 0x0288, 0x0289, 0x028A, 0x028B, 0x028C, 0x028D, 0x028E, 0x028F, - /* U+0290 */ 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, - /* U+0298 */ 0x0298, 0x0299, 0x029A, 0x029B, 0x029C, 0x029D, 0x029E, 0x029F, - /* U+02A0 */ 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, 0x02A6, 0x02A7, - /* U+02A8 */ 0x02A8, 0x02A9, 0x02AA, 0x02AB, 0x02AC, 0x02AD, 0x02AE, 0x02AF, - /* U+02B0 */ 0x0068, 0x0266, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, - /* U+02B8 */ 0x0079, 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD, 0x02BE, 0x02BF, - /* U+02C0 */ 0x02C0, 0x02C1, 0x02C2, 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C7, - /* U+02C8 */ 0x02C8, 0x02C9, 0x02CA, 0x02CB, 0x02CC, 0x02CD, 0x02CE, 0x02CF, - /* U+02D0 */ 0x02D0, 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, 0x02D6, 0x02D7, - /* U+02D8 */ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x02DE, 0x02DF, - /* U+02E0 */ 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x02E5, 0x02E6, 0x02E7, - /* U+02E8 */ 0x02E8, 0x02E9, 0x02EA, 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF, - /* U+02F0 */ 0x02F0, 0x02F1, 0x02F2, 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, - /* U+02F8 */ 0x02F8, 0x02F9, 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x02FE, 0x02FF, - /* U+0300 */ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, - /* U+0308 */ 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, - /* U+0310 */ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, - /* U+0318 */ 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, - /* U+0320 */ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, - /* U+0328 */ 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, - /* U+0330 */ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, - /* U+0338 */ 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, - /* U+0340 */ 0x0300, 0x0301, 0x0342, 0x0313, 0x0308, 0x0345, 0x0346, 0x0347, - /* U+0348 */ 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, - /* U+0350 */ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, - /* U+0358 */ 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, - /* U+0360 */ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, - /* U+0368 */ 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, - /* U+0370 */ 0x0370, 0x0371, 0x0372, 0x0373, 0x02B9, 0x0375, 0x0376, 0x0377, - /* U+0378 */ 0x0378, 0x0379, 0x0020, 0x037B, 0x037C, 0x037D, 0x003B, 0x037F, - /* U+0380 */ 0x0380, 0x0381, 0x0382, 0x0383, 0x0020, 0x00A8, 0x0391, 0x00B7, - /* U+0388 */ 0x0395, 0x0397, 0x0399, 0x038B, 0x039F, 0x038D, 0x03A5, 0x03A9, - /* U+0390 */ 0x03CA, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - /* U+0398 */ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - /* U+03A0 */ 0x03A0, 0x03A1, 0x03A2, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - /* U+03A8 */ 0x03A8, 0x03A9, 0x0399, 0x03A5, 0x03B1, 0x03B5, 0x03B7, 0x03B9, - /* U+03B0 */ 0x03CB, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - /* U+03B8 */ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - /* U+03C0 */ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - /* U+03C8 */ 0x03C8, 0x03C9, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03CF, - /* U+03D0 */ 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0, 0x03D7, - /* U+03D8 */ 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, - /* U+03E0 */ 0x03E0, 0x03E1, 0x03E2, 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7, - /* U+03E8 */ 0x03E8, 0x03E9, 0x03EA, 0x03EB, 0x03EC, 0x03ED, 0x03EE, 0x03EF, - /* U+03F0 */ 0x03BA, 0x03C1, 0x03C2, 0x03F3, 0x0398, 0x03B5, 0x03F6, 0x03F7, - /* U+03F8 */ 0x03F8, 0x03A3, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, - /* U+0400 */ 0x0415, 0x0415, 0x0402, 0x0413, 0x0404, 0x0405, 0x0406, 0x0406, - /* U+0408 */ 0x0408, 0x0409, 0x040A, 0x040B, 0x041A, 0x0418, 0x0423, 0x040F, - /* U+0410 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - /* U+0418 */ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - // U+0419: Manually changed from 0418 to 0419 - /* U+0420 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - /* U+0428 */ 0x0428, 0x0429, 0x042C, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - // U+042A: Manually changed from 042A to 042C - /* U+0430 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - /* U+0438 */ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - // U+0439: Manually changed from 0438 to 0439 - /* U+0440 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - /* U+0448 */ 0x0448, 0x0449, 0x044C, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, - // U+044A: Manually changed from 044A to 044C - /* U+0450 */ 0x0435, 0x0435, 0x0452, 0x0433, 0x0454, 0x0455, 0x0456, 0x0456, - /* U+0458 */ 0x0458, 0x0459, 0x045A, 0x045B, 0x043A, 0x0438, 0x0443, 0x045F, - /* U+0460 */ 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, - /* U+0468 */ 0x0468, 0x0469, 0x046A, 0x046B, 0x046C, 0x046D, 0x046E, 0x046F, - /* U+0470 */ 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0474, 0x0475, - /* U+0478 */ 0x0478, 0x0479, 0x047A, 0x047B, 0x047C, 0x047D, 0x047E, 0x047F, - /* U+0480 */ 0x0480, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, - /* U+0488 */ 0x0488, 0x0489, 0x048A, 0x048B, 0x048C, 0x048D, 0x048E, 0x048F, - /* U+0490 */ 0x0490, 0x0491, 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, - /* U+0498 */ 0x0498, 0x0499, 0x049A, 0x049B, 0x049C, 0x049D, 0x049E, 0x049F, - /* U+04A0 */ 0x04A0, 0x04A1, 0x04A2, 0x04A3, 0x04A4, 0x04A5, 0x04A6, 0x04A7, - /* U+04A8 */ 0x04A8, 0x04A9, 0x04AA, 0x04AB, 0x04AC, 0x04AD, 0x04AE, 0x04AF, - /* U+04B0 */ 0x04B0, 0x04B1, 0x04B2, 0x04B3, 0x04B4, 0x04B5, 0x04B6, 0x04B7, - /* U+04B8 */ 0x04B8, 0x04B9, 0x04BA, 0x04BB, 0x04BC, 0x04BD, 0x04BE, 0x04BF, - /* U+04C0 */ 0x04C0, 0x0416, 0x0436, 0x04C3, 0x04C4, 0x04C5, 0x04C6, 0x04C7, - /* U+04C8 */ 0x04C8, 0x04C9, 0x04CA, 0x04CB, 0x04CC, 0x04CD, 0x04CE, 0x04CF, - /* U+04D0 */ 0x0410, 0x0430, 0x0410, 0x0430, 0x04D4, 0x04D5, 0x0415, 0x0435, - /* U+04D8 */ 0x04D8, 0x04D9, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437, - /* U+04E0 */ 0x04E0, 0x04E1, 0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, - /* U+04E8 */ 0x04E8, 0x04E9, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, - /* U+04F0 */ 0x0423, 0x0443, 0x0423, 0x0443, 0x0427, 0x0447, 0x04F6, 0x04F7, - /* U+04F8 */ 0x042B, 0x044B, 0x04FA, 0x04FB, 0x04FC, 0x04FD, 0x04FE, 0x04FF, - }; -} diff --git a/java/src/com/android/inputmethod/latin/ImportantNoticeDialog.java b/java/src/com/android/inputmethod/latin/ImportantNoticeDialog.java new file mode 100644 index 000000000..567087c81 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/ImportantNoticeDialog.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2014 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.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; + +import com.android.inputmethod.latin.utils.DialogUtils; +import com.android.inputmethod.latin.utils.ImportantNoticeUtils; + +/** + * The dialog box that shows the important notice contents. + */ +public final class ImportantNoticeDialog extends AlertDialog implements OnClickListener { + public interface ImportantNoticeDialogListener { + public void onUserAcknowledgmentOfImportantNoticeDialog(final int nextVersion); + public void onClickSettingsOfImportantNoticeDialog(final int nextVersion); + } + + private final ImportantNoticeDialogListener mListener; + private final int mNextImportantNoticeVersion; + + public ImportantNoticeDialog( + final Context context, final ImportantNoticeDialogListener listener) { + super(DialogUtils.getPlatformDialogThemeContext(context)); + mListener = listener; + mNextImportantNoticeVersion = ImportantNoticeUtils.getNextImportantNoticeVersion(context); + setMessage(ImportantNoticeUtils.getNextImportantNoticeContents(context)); + // Create buttons and set listeners. + setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), this); + if (shouldHaveSettingsButton()) { + setButton(BUTTON_NEGATIVE, context.getString(R.string.go_to_settings), this); + } + // This dialog is cancelable by pressing back key. See {@link #onBackPress()}. + setCancelable(true /* cancelable */); + setCanceledOnTouchOutside(false /* cancelable */); + } + + private boolean shouldHaveSettingsButton() { + return mNextImportantNoticeVersion + == ImportantNoticeUtils.VERSION_TO_ENABLE_PERSONALIZED_SUGGESTIONS; + } + + private void userAcknowledged() { + ImportantNoticeUtils.updateLastImportantNoticeVersion(getContext()); + mListener.onUserAcknowledgmentOfImportantNoticeDialog(mNextImportantNoticeVersion); + } + + @Override + public void onClick(final DialogInterface dialog, final int which) { + if (shouldHaveSettingsButton() && which == BUTTON_NEGATIVE) { + mListener.onClickSettingsOfImportantNoticeDialog(mNextImportantNoticeVersion); + } + userAcknowledged(); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + userAcknowledged(); + } +} diff --git a/java/src/com/android/inputmethod/latin/InputAttributes.java b/java/src/com/android/inputmethod/latin/InputAttributes.java index 8caf6f17f..ebe436128 100644 --- a/java/src/com/android/inputmethod/latin/InputAttributes.java +++ b/java/src/com/android/inputmethod/latin/InputAttributes.java @@ -16,6 +16,9 @@ package com.android.inputmethod.latin; +import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE; +import static com.android.inputmethod.latin.Constants.ImeOption.NO_MICROPHONE_COMPAT; + import android.text.InputType; import android.util.Log; import android.view.inputmethod.EditorInfo; @@ -23,22 +26,36 @@ import android.view.inputmethod.EditorInfo; import com.android.inputmethod.latin.utils.InputTypeUtils; import com.android.inputmethod.latin.utils.StringUtils; +import java.util.ArrayList; +import java.util.Arrays; + /** * Class to hold attributes of the input field. */ public final class InputAttributes { private final String TAG = InputAttributes.class.getSimpleName(); + final public String mTargetApplicationPackageName; final public boolean mInputTypeNoAutoCorrect; - final public boolean mIsSettingsSuggestionStripOn; + final public boolean mIsPasswordField; + final public boolean mShouldShowSuggestions; final public boolean mApplicationSpecifiedCompletionOn; final public boolean mShouldInsertSpacesAutomatically; + final public boolean mShouldShowVoiceInputKey; final private int mInputType; + final private EditorInfo mEditorInfo; + final private String mPackageNameForPrivateImeOptions; - public InputAttributes(final EditorInfo editorInfo, final boolean isFullscreenMode) { + public InputAttributes(final EditorInfo editorInfo, final boolean isFullscreenMode, + final String packageNameForPrivateImeOptions) { + mEditorInfo = editorInfo; + mPackageNameForPrivateImeOptions = packageNameForPrivateImeOptions; + mTargetApplicationPackageName = null != editorInfo ? editorInfo.packageName : null; final int inputType = null != editorInfo ? editorInfo.inputType : 0; final int inputClass = inputType & InputType.TYPE_MASK_CLASS; mInputType = inputType; + mIsPasswordField = InputTypeUtils.isPasswordInputType(inputType) + || InputTypeUtils.isVisiblePasswordInputType(inputType); if (inputClass != InputType.TYPE_CLASS_TEXT) { // If we are not looking at a TYPE_CLASS_TEXT field, the following strange // cases may arise, so we do a couple sanity checks for them. If it's a @@ -52,55 +69,54 @@ public final class InputAttributes { } else if (inputClass == 0) { // TODO: is this check still necessary? Log.w(TAG, String.format("Unexpected input class: inputType=0x%08x" - + " imeOptions=0x%08x", - inputType, editorInfo.imeOptions)); + + " imeOptions=0x%08x", inputType, editorInfo.imeOptions)); } - mIsSettingsSuggestionStripOn = false; + mShouldShowSuggestions = false; mInputTypeNoAutoCorrect = false; mApplicationSpecifiedCompletionOn = false; mShouldInsertSpacesAutomatically = false; - } else { - final int variation = inputType & InputType.TYPE_MASK_VARIATION; - final boolean flagNoSuggestions = - 0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); - final boolean flagMultiLine = - 0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE); - final boolean flagAutoCorrect = - 0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); - final boolean flagAutoComplete = - 0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); - - // TODO: Have a helper method in InputTypeUtils - // Make sure that passwords are not displayed in {@link SuggestionStripView}. - if (InputTypeUtils.isPasswordInputType(inputType) - || InputTypeUtils.isVisiblePasswordInputType(inputType) - || InputTypeUtils.isEmailVariation(variation) - || InputType.TYPE_TEXT_VARIATION_URI == variation - || InputType.TYPE_TEXT_VARIATION_FILTER == variation - || flagNoSuggestions - || flagAutoComplete) { - mIsSettingsSuggestionStripOn = false; - } else { - mIsSettingsSuggestionStripOn = true; - } + mShouldShowVoiceInputKey = false; + return; + } + // inputClass == InputType.TYPE_CLASS_TEXT + final int variation = inputType & InputType.TYPE_MASK_VARIATION; + final boolean flagNoSuggestions = + 0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + final boolean flagMultiLine = + 0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE); + final boolean flagAutoCorrect = + 0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + final boolean flagAutoComplete = + 0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); - mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType); - - // If it's a browser edit field and auto correct is not ON explicitly, then - // disable auto correction, but keep suggestions on. - // If NO_SUGGESTIONS is set, don't do prediction. - // If it's not multiline and the autoCorrect flag is not set, then don't correct - if ((variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT - && !flagAutoCorrect) - || flagNoSuggestions - || (!flagAutoCorrect && !flagMultiLine)) { - mInputTypeNoAutoCorrect = true; - } else { - mInputTypeNoAutoCorrect = false; - } + // TODO: Have a helper method in InputTypeUtils + // Make sure that passwords are not displayed in {@link SuggestionStripView}. + final boolean shouldSuppressSuggestions = mIsPasswordField + || InputTypeUtils.isEmailVariation(variation) + || InputType.TYPE_TEXT_VARIATION_URI == variation + || InputType.TYPE_TEXT_VARIATION_FILTER == variation + || flagNoSuggestions + || flagAutoComplete; + mShouldShowSuggestions = !shouldSuppressSuggestions; - mApplicationSpecifiedCompletionOn = flagAutoComplete && isFullscreenMode; - } + mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType); + + final boolean noMicrophone = mIsPasswordField + || InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS == variation + || InputType.TYPE_TEXT_VARIATION_URI == variation + || hasNoMicrophoneKeyOption(); + mShouldShowVoiceInputKey = !noMicrophone; + + // If it's a browser edit field and auto correct is not ON explicitly, then + // disable auto correction, but keep suggestions on. + // If NO_SUGGESTIONS is set, don't do prediction. + // If it's not multiline and the autoCorrect flag is not set, then don't correct + mInputTypeNoAutoCorrect = + (variation == InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT && !flagAutoCorrect) + || flagNoSuggestions + || (!flagAutoCorrect && !flagMultiLine); + + mApplicationSpecifiedCompletionOn = flagAutoComplete && isFullscreenMode; } public boolean isTypeNull() { @@ -111,101 +127,155 @@ public final class InputAttributes { return editorInfo.inputType == mInputType; } + private boolean hasNoMicrophoneKeyOption() { + @SuppressWarnings("deprecation") + final boolean deprecatedNoMicrophone = InputAttributes.inPrivateImeOptions( + null, NO_MICROPHONE_COMPAT, mEditorInfo); + final boolean noMicrophone = InputAttributes.inPrivateImeOptions( + mPackageNameForPrivateImeOptions, NO_MICROPHONE, mEditorInfo); + return noMicrophone || deprecatedNoMicrophone; + } + @SuppressWarnings("unused") private void dumpFlags(final int inputType) { - Log.i(TAG, "Input class:"); final int inputClass = inputType & InputType.TYPE_MASK_CLASS; - if (inputClass == InputType.TYPE_CLASS_TEXT) - Log.i(TAG, " TYPE_CLASS_TEXT"); - if (inputClass == InputType.TYPE_CLASS_PHONE) - Log.i(TAG, " TYPE_CLASS_PHONE"); - if (inputClass == InputType.TYPE_CLASS_NUMBER) - Log.i(TAG, " TYPE_CLASS_NUMBER"); - if (inputClass == InputType.TYPE_CLASS_DATETIME) - Log.i(TAG, " TYPE_CLASS_DATETIME"); - Log.i(TAG, "Variation:"); - switch (InputType.TYPE_MASK_VARIATION & inputType) { - case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS: - Log.i(TAG, " TYPE_TEXT_VARIATION_EMAIL_ADDRESS"); - break; - case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT: - Log.i(TAG, " TYPE_TEXT_VARIATION_EMAIL_SUBJECT"); - break; - case InputType.TYPE_TEXT_VARIATION_FILTER: - Log.i(TAG, " TYPE_TEXT_VARIATION_FILTER"); - break; - case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE: - Log.i(TAG, " TYPE_TEXT_VARIATION_LONG_MESSAGE"); - break; - case InputType.TYPE_TEXT_VARIATION_NORMAL: - Log.i(TAG, " TYPE_TEXT_VARIATION_NORMAL"); - break; - case InputType.TYPE_TEXT_VARIATION_PASSWORD: - Log.i(TAG, " TYPE_TEXT_VARIATION_PASSWORD"); - break; - case InputType.TYPE_TEXT_VARIATION_PERSON_NAME: - Log.i(TAG, " TYPE_TEXT_VARIATION_PERSON_NAME"); - break; - case InputType.TYPE_TEXT_VARIATION_PHONETIC: - Log.i(TAG, " TYPE_TEXT_VARIATION_PHONETIC"); - break; - case InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS: - Log.i(TAG, " TYPE_TEXT_VARIATION_POSTAL_ADDRESS"); - break; - case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE: - Log.i(TAG, " TYPE_TEXT_VARIATION_SHORT_MESSAGE"); - break; - case InputType.TYPE_TEXT_VARIATION_URI: - Log.i(TAG, " TYPE_TEXT_VARIATION_URI"); - break; - case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD: - Log.i(TAG, " TYPE_TEXT_VARIATION_VISIBLE_PASSWORD"); - break; - case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT: - Log.i(TAG, " TYPE_TEXT_VARIATION_WEB_EDIT_TEXT"); - break; - case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS: - Log.i(TAG, " TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS"); - break; - case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD: - Log.i(TAG, " TYPE_TEXT_VARIATION_WEB_PASSWORD"); - break; - default: - Log.i(TAG, " Unknown variation"); - break; + final String inputClassString = toInputClassString(inputClass); + final String variationString = toVariationString( + inputClass, inputType & InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); + final String flagsString = toFlagsString(inputType & InputType.TYPE_MASK_FLAGS); + Log.i(TAG, "Input class: " + inputClassString); + Log.i(TAG, "Variation: " + variationString); + Log.i(TAG, "Flags: " + flagsString); + } + + private static String toInputClassString(final int inputClass) { + switch (inputClass) { + case InputType.TYPE_CLASS_TEXT: + return "TYPE_CLASS_TEXT"; + case InputType.TYPE_CLASS_PHONE: + return "TYPE_CLASS_PHONE"; + case InputType.TYPE_CLASS_NUMBER: + return "TYPE_CLASS_NUMBER"; + case InputType.TYPE_CLASS_DATETIME: + return "TYPE_CLASS_DATETIME"; + default: + return String.format("unknownInputClass<0x%08x>", inputClass); } - Log.i(TAG, "Flags:"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)) - Log.i(TAG, " TYPE_TEXT_FLAG_NO_SUGGESTIONS"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE)) - Log.i(TAG, " TYPE_TEXT_FLAG_MULTI_LINE"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE)) - Log.i(TAG, " TYPE_TEXT_FLAG_IME_MULTI_LINE"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS)) - Log.i(TAG, " TYPE_TEXT_FLAG_CAP_WORDS"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)) - Log.i(TAG, " TYPE_TEXT_FLAG_CAP_SENTENCES"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS)) - Log.i(TAG, " TYPE_TEXT_FLAG_CAP_CHARACTERS"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT)) - Log.i(TAG, " TYPE_TEXT_FLAG_AUTO_CORRECT"); - if (0 != (inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE)) - Log.i(TAG, " TYPE_TEXT_FLAG_AUTO_COMPLETE"); + } + + private static String toVariationString(final int inputClass, final int variation) { + switch (inputClass) { + case InputType.TYPE_CLASS_TEXT: + return toTextVariationString(variation); + case InputType.TYPE_CLASS_NUMBER: + return toNumberVariationString(variation); + case InputType.TYPE_CLASS_DATETIME: + return toDatetimeVariationString(variation); + default: + return ""; + } + } + + private static String toTextVariationString(final int variation) { + switch (variation) { + case InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS: + return " TYPE_TEXT_VARIATION_EMAIL_ADDRESS"; + case InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT: + return "TYPE_TEXT_VARIATION_EMAIL_SUBJECT"; + case InputType.TYPE_TEXT_VARIATION_FILTER: + return "TYPE_TEXT_VARIATION_FILTER"; + case InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE: + return "TYPE_TEXT_VARIATION_LONG_MESSAGE"; + case InputType.TYPE_TEXT_VARIATION_NORMAL: + return "TYPE_TEXT_VARIATION_NORMAL"; + case InputType.TYPE_TEXT_VARIATION_PASSWORD: + return "TYPE_TEXT_VARIATION_PASSWORD"; + case InputType.TYPE_TEXT_VARIATION_PERSON_NAME: + return "TYPE_TEXT_VARIATION_PERSON_NAME"; + case InputType.TYPE_TEXT_VARIATION_PHONETIC: + return "TYPE_TEXT_VARIATION_PHONETIC"; + case InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS: + return "TYPE_TEXT_VARIATION_POSTAL_ADDRESS"; + case InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE: + return "TYPE_TEXT_VARIATION_SHORT_MESSAGE"; + case InputType.TYPE_TEXT_VARIATION_URI: + return "TYPE_TEXT_VARIATION_URI"; + case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD: + return "TYPE_TEXT_VARIATION_VISIBLE_PASSWORD"; + case InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT: + return "TYPE_TEXT_VARIATION_WEB_EDIT_TEXT"; + case InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS: + return "TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS"; + case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD: + return "TYPE_TEXT_VARIATION_WEB_PASSWORD"; + default: + return String.format("unknownVariation<0x%08x>", variation); + } + } + + private static String toNumberVariationString(final int variation) { + switch (variation) { + case InputType.TYPE_NUMBER_VARIATION_NORMAL: + return "TYPE_NUMBER_VARIATION_NORMAL"; + case InputType.TYPE_NUMBER_VARIATION_PASSWORD: + return "TYPE_NUMBER_VARIATION_PASSWORD"; + default: + return String.format("unknownVariation<0x%08x>", variation); + } + } + + private static String toDatetimeVariationString(final int variation) { + switch (variation) { + case InputType.TYPE_DATETIME_VARIATION_NORMAL: + return "TYPE_DATETIME_VARIATION_NORMAL"; + case InputType.TYPE_DATETIME_VARIATION_DATE: + return "TYPE_DATETIME_VARIATION_DATE"; + case InputType.TYPE_DATETIME_VARIATION_TIME: + return "TYPE_DATETIME_VARIATION_TIME"; + default: + return String.format("unknownVariation<0x%08x>", variation); + } + } + + private static String toFlagsString(final int flags) { + final ArrayList<String> flagsArray = new ArrayList<>(); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)) + flagsArray.add("TYPE_TEXT_FLAG_NO_SUGGESTIONS"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_MULTI_LINE)) + flagsArray.add("TYPE_TEXT_FLAG_MULTI_LINE"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE)) + flagsArray.add("TYPE_TEXT_FLAG_IME_MULTI_LINE"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_WORDS)) + flagsArray.add("TYPE_TEXT_FLAG_CAP_WORDS"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)) + flagsArray.add("TYPE_TEXT_FLAG_CAP_SENTENCES"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS)) + flagsArray.add("TYPE_TEXT_FLAG_CAP_CHARACTERS"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT)) + flagsArray.add("TYPE_TEXT_FLAG_AUTO_CORRECT"); + if (0 != (flags & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE)) + flagsArray.add("TYPE_TEXT_FLAG_AUTO_COMPLETE"); + return flagsArray.isEmpty() ? "" : Arrays.toString(flagsArray.toArray()); } // Pretty print @Override public String toString() { - return "\n mInputTypeNoAutoCorrect = " + mInputTypeNoAutoCorrect - + "\n mIsSettingsSuggestionStripOn = " + mIsSettingsSuggestionStripOn - + "\n mApplicationSpecifiedCompletionOn = " + mApplicationSpecifiedCompletionOn; + return String.format( + "%s: inputType=0x%08x%s%s%s%s%s targetApp=%s\n", getClass().getSimpleName(), + mInputType, + (mInputTypeNoAutoCorrect ? " noAutoCorrect" : ""), + (mIsPasswordField ? " password" : ""), + (mShouldShowSuggestions ? " shouldShowSuggestions" : ""), + (mApplicationSpecifiedCompletionOn ? " appSpecified" : ""), + (mShouldInsertSpacesAutomatically ? " insertSpaces" : ""), + mTargetApplicationPackageName); } - public static boolean inPrivateImeOptions(String packageName, String key, - EditorInfo editorInfo) { + public static boolean inPrivateImeOptions(final String packageName, final String key, + final EditorInfo editorInfo) { if (editorInfo == null) return false; - final String findingKey = (packageName != null) ? packageName + "." + key - : key; + final String findingKey = (packageName != null) ? packageName + "." + key : key; return StringUtils.containsInCommaSplittableText(findingKey, editorInfo.privateImeOptions); } } diff --git a/java/src/com/android/inputmethod/latin/InputPointers.java b/java/src/com/android/inputmethod/latin/InputPointers.java index 2e638aaf3..47bc6b078 100644 --- a/java/src/com/android/inputmethod/latin/InputPointers.java +++ b/java/src/com/android/inputmethod/latin/InputPointers.java @@ -16,14 +16,17 @@ package com.android.inputmethod.latin; +import android.util.Log; +import android.util.SparseIntArray; + import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.utils.ResizableIntArray; -import android.util.Log; - // TODO: This class is not thread-safe. public final class InputPointers { private static final String TAG = InputPointers.class.getSimpleName(); + private static final boolean DEBUG_TIME = false; + private final int mDefaultCapacity; private final ResizableIntArray mXCoordinates; private final ResizableIntArray mYCoordinates; @@ -38,11 +41,29 @@ public final class InputPointers { mTimes = new ResizableIntArray(defaultCapacity); } - public void addPointer(int index, int x, int y, int pointerId, int time) { - mXCoordinates.add(index, x); - mYCoordinates.add(index, y); - mPointerIds.add(index, pointerId); - mTimes.add(index, time); + private void fillWithLastTimeUntil(final int index) { + final int fromIndex = mTimes.getLength(); + // Fill the gap with the latest time. + // See {@link #getTime(int)} and {@link #isValidTimeStamps()}. + if (fromIndex <= 0) { + return; + } + final int fillLength = index - fromIndex + 1; + if (fillLength <= 0) { + return; + } + final int lastTime = mTimes.get(fromIndex - 1); + mTimes.fill(lastTime, fromIndex, fillLength); + } + + public void addPointerAt(int index, int x, int y, int pointerId, int time) { + mXCoordinates.addAt(index, x); + mYCoordinates.addAt(index, y); + mPointerIds.addAt(index, pointerId); + if (LatinImeLogger.sDBG || DEBUG_TIME) { + fillWithLastTimeUntil(index); + } + mTimes.addAt(index, time); } @UsedForTesting @@ -68,23 +89,6 @@ public final class InputPointers { } /** - * Append the pointers in the specified {@link InputPointers} to the end of this. - * @param src the source {@link InputPointers} to read the data from. - * @param startPos the starting index of the pointers in {@code src}. - * @param length the number of pointers to be appended. - */ - @UsedForTesting - void append(InputPointers src, int startPos, int length) { - if (length == 0) { - return; - } - mXCoordinates.append(src.mXCoordinates, startPos, length); - mYCoordinates.append(src.mYCoordinates, startPos, length); - mPointerIds.append(src.mPointerIds, startPos, length); - mTimes.append(src.mTimes, startPos, length); - } - - /** * Append the times, x-coordinates and y-coordinates in the specified {@link ResizableIntArray} * to the end of this. * @param pointerId the pointer id of the source. @@ -141,7 +145,7 @@ public final class InputPointers { } public int[] getTimes() { - if (LatinImeLogger.sDBG) { + if (LatinImeLogger.sDBG || DEBUG_TIME) { if (!isValidTimeStamps()) { throw new RuntimeException("Time stamps are invalid."); } @@ -157,14 +161,21 @@ public final class InputPointers { private boolean isValidTimeStamps() { final int[] times = mTimes.getPrimitiveArray(); - for (int i = 1; i < getPointerSize(); ++i) { - if (times[i] < times[i - 1]) { + final int[] pointerIds = mPointerIds.getPrimitiveArray(); + final SparseIntArray lastTimeOfPointers = new SparseIntArray(); + final int size = getPointerSize(); + for (int i = 0; i < size; ++i) { + final int pointerId = pointerIds[i]; + final int time = times[i]; + final int lastTime = lastTimeOfPointers.get(pointerId, time); + if (time < lastTime) { // dump - for (int j = 0; j < times.length; ++j) { + for (int j = 0; j < size; ++j) { Log.d(TAG, "--- (" + j + ") " + times[j]); } return false; } + lastTimeOfPointers.put(pointerId, time); } return true; } diff --git a/java/src/com/android/inputmethod/latin/InputView.java b/java/src/com/android/inputmethod/latin/InputView.java index 81ccf83d8..e9e12f09f 100644 --- a/java/src/com/android/inputmethod/latin/InputView.java +++ b/java/src/com/android/inputmethod/latin/InputView.java @@ -23,87 +23,227 @@ import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; -public final class InputView extends LinearLayout { - private View mSuggestionStripView; - private View mKeyboardView; - private int mKeyboardTopPadding; +import com.android.inputmethod.accessibility.AccessibilityUtils; +import com.android.inputmethod.keyboard.MainKeyboardView; +import com.android.inputmethod.latin.suggestions.MoreSuggestionsView; +import com.android.inputmethod.latin.suggestions.SuggestionStripView; - private boolean mIsForwardingEvent; +public final class InputView extends LinearLayout { private final Rect mInputViewRect = new Rect(); - private final Rect mEventForwardingRect = new Rect(); - private final Rect mEventReceivingRect = new Rect(); + private MainKeyboardView mMainKeyboardView; + private KeyboardTopPaddingForwarder mKeyboardTopPaddingForwarder; + private MoreSuggestionsViewCanceler mMoreSuggestionsViewCanceler; + private MotionEventForwarder<?, ?> mActiveForwarder; public InputView(final Context context, final AttributeSet attrs) { super(context, attrs, 0); } - public void setKeyboardGeometry(final int keyboardTopPadding) { - mKeyboardTopPadding = keyboardTopPadding; - } - @Override protected void onFinishInflate() { - mSuggestionStripView = findViewById(R.id.suggestion_strip_view); - mKeyboardView = findViewById(R.id.keyboard_view); + final SuggestionStripView suggestionStripView = + (SuggestionStripView)findViewById(R.id.suggestion_strip_view); + mMainKeyboardView = (MainKeyboardView)findViewById(R.id.keyboard_view); + mKeyboardTopPaddingForwarder = new KeyboardTopPaddingForwarder( + mMainKeyboardView, suggestionStripView); + mMoreSuggestionsViewCanceler = new MoreSuggestionsViewCanceler( + mMainKeyboardView, suggestionStripView); + } + + public void setKeyboardTopPadding(final int keyboardTopPadding) { + mKeyboardTopPaddingForwarder.setKeyboardTopPadding(keyboardTopPadding); } @Override - public boolean dispatchTouchEvent(final MotionEvent me) { - if (mSuggestionStripView.getVisibility() != VISIBLE - || mKeyboardView.getVisibility() != VISIBLE) { - return super.dispatchTouchEvent(me); + protected boolean dispatchHoverEvent(final MotionEvent event) { + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled() + && mMainKeyboardView.isShowingMoreKeysPanel()) { + // With accessibility mode on, discard hover events while a more keys keyboard is shown. + // The {@link MoreKeysKeyboard} receives hover events directly from the platform. + return true; } + return super.dispatchHoverEvent(event); + } + + @Override + public boolean onInterceptTouchEvent(final MotionEvent me) { + final Rect rect = mInputViewRect; + getGlobalVisibleRect(rect); + final int index = me.getActionIndex(); + final int x = (int)me.getX(index) + rect.left; + final int y = (int)me.getY(index) + rect.top; // The touch events that hit the top padding of keyboard should be forwarded to // {@link SuggestionStripView}. + if (mKeyboardTopPaddingForwarder.onInterceptTouchEvent(x, y, me)) { + mActiveForwarder = mKeyboardTopPaddingForwarder; + return true; + } + + // To cancel {@link MoreSuggestionsView}, we should intercept a touch event to + // {@link MainKeyboardView} and dismiss the {@link MoreSuggestionsView}. + if (mMoreSuggestionsViewCanceler.onInterceptTouchEvent(x, y, me)) { + mActiveForwarder = mMoreSuggestionsViewCanceler; + return true; + } + + mActiveForwarder = null; + return false; + } + + @Override + public boolean onTouchEvent(final MotionEvent me) { + if (mActiveForwarder == null) { + return super.onTouchEvent(me); + } + final Rect rect = mInputViewRect; - this.getGlobalVisibleRect(rect); - final int x = (int)me.getX() + rect.left; - final int y = (int)me.getY() + rect.top; + getGlobalVisibleRect(rect); + final int index = me.getActionIndex(); + final int x = (int)me.getX(index) + rect.left; + final int y = (int)me.getY(index) + rect.top; + return mActiveForwarder.onTouchEvent(x, y, me); + } + + /** + * This class forwards series of {@link MotionEvent}s from <code>SenderView</code> to + * <code>ReceiverView</code>. + * + * @param <SenderView> a {@link View} that may send a {@link MotionEvent} to <ReceiverView>. + * @param <ReceiverView> a {@link View} that receives forwarded {@link MotionEvent} from + * <SenderView>. + */ + private static abstract class + MotionEventForwarder<SenderView extends View, ReceiverView extends View> { + protected final SenderView mSenderView; + protected final ReceiverView mReceiverView; - final Rect forwardingRect = mEventForwardingRect; - mKeyboardView.getGlobalVisibleRect(forwardingRect); - if (!mIsForwardingEvent && !forwardingRect.contains(x, y)) { - return super.dispatchTouchEvent(me); + protected final Rect mEventSendingRect = new Rect(); + protected final Rect mEventReceivingRect = new Rect(); + + public MotionEventForwarder(final SenderView senderView, final ReceiverView receiverView) { + mSenderView = senderView; + mReceiverView = receiverView; } - final int forwardingLimitY = forwardingRect.top + mKeyboardTopPadding; - boolean sendToTarget = false; + // Return true if a touch event of global coordinate x, y needs to be forwarded. + protected abstract boolean needsToForward(final int x, final int y); + + // Translate global x-coordinate to <code>ReceiverView</code> local coordinate. + protected int translateX(final int x) { + return x - mEventReceivingRect.left; + } - switch (me.getAction()) { - case MotionEvent.ACTION_DOWN: - if (y < forwardingLimitY) { - // This down event and further move and up events should be forwarded to the target. - mIsForwardingEvent = true; - sendToTarget = true; + // Translate global y-coordinate to <code>ReceiverView</code> local coordinate. + protected int translateY(final int y) { + return y - mEventReceivingRect.top; + } + + // Callback when a {@link MotionEvent} is forwarded. + protected void onForwardingEvent(final MotionEvent me) {} + + // Returns true if a {@link MotionEvent} is needed to be forwarded to + // <code>ReceiverView</code>. Otherwise returns false. + public boolean onInterceptTouchEvent(final int x, final int y, final MotionEvent me) { + // Forwards a {link MotionEvent} only if both <code>SenderView</code> and + // <code>ReceiverView</code> are visible. + if (mSenderView.getVisibility() != View.VISIBLE || + mReceiverView.getVisibility() != View.VISIBLE) { + return false; + } + mSenderView.getGlobalVisibleRect(mEventSendingRect); + if (!mEventSendingRect.contains(x, y)) { + return false; } - break; - case MotionEvent.ACTION_MOVE: - sendToTarget = mIsForwardingEvent; - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - sendToTarget = mIsForwardingEvent; - mIsForwardingEvent = false; - break; - } - - if (!sendToTarget) { - return super.dispatchTouchEvent(me); - } - - final Rect receivingRect = mEventReceivingRect; - mSuggestionStripView.getGlobalVisibleRect(receivingRect); - final int translatedX = x - receivingRect.left; - final int translatedY; - if (y < forwardingLimitY) { - // The forwarded event should have coordinates that are inside of the target. - translatedY = Math.min(y - receivingRect.top, receivingRect.height() - 1); - } else { - translatedY = y - receivingRect.top; - } - me.setLocation(translatedX, translatedY); - mSuggestionStripView.dispatchTouchEvent(me); - return true; + + if (me.getActionMasked() == MotionEvent.ACTION_DOWN) { + // If the down event happens in the forwarding area, successive + // {@link MotionEvent}s should be forwarded to <code>ReceiverView</code>. + if (needsToForward(x, y)) { + return true; + } + } + + return false; + } + + // Returns true if a {@link MotionEvent} is forwarded to <code>ReceiverView</code>. + // Otherwise returns false. + public boolean onTouchEvent(final int x, final int y, final MotionEvent me) { + mReceiverView.getGlobalVisibleRect(mEventReceivingRect); + // Translate global coordinates to <code>ReceiverView</code> local coordinates. + me.setLocation(translateX(x), translateY(y)); + mReceiverView.dispatchTouchEvent(me); + onForwardingEvent(me); + return true; + } + } + + /** + * This class forwards {@link MotionEvent}s happened in the top padding of + * {@link MainKeyboardView} to {@link SuggestionStripView}. + */ + private static class KeyboardTopPaddingForwarder + extends MotionEventForwarder<MainKeyboardView, SuggestionStripView> { + private int mKeyboardTopPadding; + + public KeyboardTopPaddingForwarder(final MainKeyboardView mainKeyboardView, + final SuggestionStripView suggestionStripView) { + super(mainKeyboardView, suggestionStripView); + } + + public void setKeyboardTopPadding(final int keyboardTopPadding) { + mKeyboardTopPadding = keyboardTopPadding; + } + + private boolean isInKeyboardTopPadding(final int y) { + return y < mEventSendingRect.top + mKeyboardTopPadding; + } + + @Override + protected boolean needsToForward(final int x, final int y) { + // Forwarding an event only when {@link MainKeyboardView} is visible. + // Because the visibility of {@link MainKeyboardView} is controlled by its parent + // view in {@link KeyboardSwitcher#setMainKeyboardFrame()}, we should check the + // visibility of the parent view. + final View mainKeyboardFrame = (View)mSenderView.getParent(); + return mainKeyboardFrame.getVisibility() == View.VISIBLE && isInKeyboardTopPadding(y); + } + + @Override + protected int translateY(final int y) { + final int translatedY = super.translateY(y); + if (isInKeyboardTopPadding(y)) { + // The forwarded event should have coordinates that are inside of the target. + return Math.min(translatedY, mEventReceivingRect.height() - 1); + } + return translatedY; + } + } + + /** + * This class forwards {@link MotionEvent}s happened in the {@link MainKeyboardView} to + * {@link SuggestionStripView} when the {@link MoreSuggestionsView} is showing. + * {@link SuggestionStripView} dismisses {@link MoreSuggestionsView} when it receives any event + * outside of it. + */ + private static class MoreSuggestionsViewCanceler + extends MotionEventForwarder<MainKeyboardView, SuggestionStripView> { + public MoreSuggestionsViewCanceler(final MainKeyboardView mainKeyboardView, + final SuggestionStripView suggestionStripView) { + super(mainKeyboardView, suggestionStripView); + } + + @Override + protected boolean needsToForward(final int x, final int y) { + return mReceiverView.isShowingMoreSuggestionPanel() && mEventSendingRect.contains(x, y); + } + + @Override + protected void onForwardingEvent(final MotionEvent me) { + if (me.getActionMasked() == MotionEvent.ACTION_DOWN) { + mReceiverView.dismissMoreSuggestionsPanel(); + } + } } } diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java index 2e9280c77..8cbf8379b 100644 --- a/java/src/com/android/inputmethod/latin/LastComposedWord.java +++ b/java/src/com/android/inputmethod/latin/LastComposedWord.java @@ -18,6 +18,10 @@ package com.android.inputmethod.latin; import android.text.TextUtils; +import com.android.inputmethod.event.Event; + +import java.util.ArrayList; + /** * This class encapsulates data about a word previously composed, but that has been * committed already. This is used for resuming suggestion, and cancel auto-correction. @@ -40,11 +44,11 @@ public final class LastComposedWord { public static final String NOT_A_SEPARATOR = ""; - public final int[] mPrimaryKeyCodes; + public final ArrayList<Event> mEvents; public final String mTypedWord; - public final String mCommittedWord; + public final CharSequence mCommittedWord; public final String mSeparatorString; - public final String mPrevWord; + public final PrevWordsInfo mPrevWordsInfo; public final int mCapitalizedMode; public final InputPointers mInputPointers = new InputPointers(Constants.DICTIONARY_MAX_WORD_LENGTH); @@ -52,23 +56,24 @@ public final class LastComposedWord { private boolean mActive; public static final LastComposedWord NOT_A_COMPOSED_WORD = - new LastComposedWord(null, null, "", "", NOT_A_SEPARATOR, null, - WordComposer.CAPS_MODE_OFF); + new LastComposedWord(new ArrayList<Event>(), null, "", "", + NOT_A_SEPARATOR, null, WordComposer.CAPS_MODE_OFF); // Warning: this is using the passed objects as is and fully expects them to be // immutable. Do not fiddle with their contents after you passed them to this constructor. - public LastComposedWord(final int[] primaryKeyCodes, final InputPointers inputPointers, - final String typedWord, final String committedWord, final String separatorString, - final String prevWord, final int capitalizedMode) { - mPrimaryKeyCodes = primaryKeyCodes; + public LastComposedWord(final ArrayList<Event> events, + final InputPointers inputPointers, final String typedWord, + final CharSequence committedWord, final String separatorString, + final PrevWordsInfo prevWordsInfo, final int capitalizedMode) { if (inputPointers != null) { mInputPointers.copy(inputPointers); } mTypedWord = typedWord; + mEvents = new ArrayList<>(events); mCommittedWord = committedWord; mSeparatorString = separatorString; mActive = true; - mPrevWord = prevWord; + mPrevWordsInfo = prevWordsInfo; mCapitalizedMode = capitalizedMode; } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 77d07019f..d2c4ca712 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -25,10 +25,9 @@ import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; @@ -36,39 +35,31 @@ import android.inputmethodservice.InputMethodService; import android.media.AudioManager; import android.net.ConnectivityManager; import android.os.Debug; -import android.os.Handler; -import android.os.HandlerThread; import android.os.IBinder; import android.os.Message; -import android.os.SystemClock; -import android.preference.PreferenceManager; import android.text.InputType; import android.text.TextUtils; -import android.text.style.SuggestionSpan; import android.util.Log; -import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Printer; -import android.view.KeyCharacterMap; +import android.util.SparseArray; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; 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.InputMethodSubtype; import com.android.inputmethod.accessibility.AccessibilityUtils; -import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy; import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.compat.AppWorkaroundsUtils; import com.android.inputmethod.compat.InputMethodServiceCompatUtils; -import com.android.inputmethod.compat.SuggestionSpanUtils; import com.android.inputmethod.dictionarypack.DictionaryPackConstants; -import com.android.inputmethod.event.EventInterpreter; -import com.android.inputmethod.keyboard.KeyDetector; +import com.android.inputmethod.event.Event; +import com.android.inputmethod.event.HardwareEventDecoder; +import com.android.inputmethod.event.HardwareKeyboardEventDecoder; +import com.android.inputmethod.event.InputTransaction; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardActionListener; import com.android.inputmethod.keyboard.KeyboardId; @@ -77,63 +68,53 @@ import com.android.inputmethod.keyboard.MainKeyboardView; import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.define.ProductionFlag; +import com.android.inputmethod.latin.inputlogic.InputLogic; +import com.android.inputmethod.latin.personalization.ContextualDictionaryUpdater; import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever; -import com.android.inputmethod.latin.personalization.PersonalizationDictionary; -import com.android.inputmethod.latin.personalization.PersonalizationDictionarySessionRegister; +import com.android.inputmethod.latin.personalization.PersonalizationDictionaryUpdater; import com.android.inputmethod.latin.personalization.PersonalizationHelper; -import com.android.inputmethod.latin.personalization.PersonalizationPredictionDictionary; -import com.android.inputmethod.latin.personalization.UserHistoryDictionary; import com.android.inputmethod.latin.settings.Settings; import com.android.inputmethod.latin.settings.SettingsActivity; import com.android.inputmethod.latin.settings.SettingsValues; import com.android.inputmethod.latin.suggestions.SuggestionStripView; +import com.android.inputmethod.latin.suggestions.SuggestionStripViewAccessor; import com.android.inputmethod.latin.utils.ApplicationUtils; -import com.android.inputmethod.latin.utils.AsyncResultHolder; -import com.android.inputmethod.latin.utils.AutoCorrectionUtils; import com.android.inputmethod.latin.utils.CapsModeUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.CompletionInfoUtils; -import com.android.inputmethod.latin.utils.InputTypeUtils; +import com.android.inputmethod.latin.utils.CoordinateUtils; +import com.android.inputmethod.latin.utils.DialogUtils; +import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatches; +import com.android.inputmethod.latin.utils.ImportantNoticeUtils; import com.android.inputmethod.latin.utils.IntentUtils; import com.android.inputmethod.latin.utils.JniUtils; -import com.android.inputmethod.latin.utils.LatinImeLoggerUtils; -import com.android.inputmethod.latin.utils.RecapitalizeStatus; -import com.android.inputmethod.latin.utils.StaticInnerHandlerWrapper; -import com.android.inputmethod.latin.utils.StringUtils; -import com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask; -import com.android.inputmethod.latin.utils.TextRange; -import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils; -import com.android.inputmethod.research.ResearchLogger; +import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; +import com.android.inputmethod.latin.utils.StatsUtils; +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.List; import java.util.Locale; -import java.util.TreeSet; +import java.util.concurrent.TimeUnit; /** * Input method implementation for Qwerty'ish keyboard. */ public class LatinIME extends InputMethodService implements KeyboardActionListener, - SuggestionStripView.Listener, TargetPackageInfoGetterTask.OnTargetPackageInfoKnownListener, - Suggest.SuggestInitializationListener { + SuggestionStripView.Listener, SuggestionStripViewAccessor, + DictionaryFacilitator.DictionaryInitializationListener, + ImportantNoticeDialog.ImportantNoticeDialogListener { private static final String TAG = LatinIME.class.getSimpleName(); private static final boolean TRACE = false; - private static boolean DEBUG; + private static boolean DEBUG = false; 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; - private static final int PENDING_IMS_CALLBACK_DURATION = 800; - private static final int PERIOD_FOR_AUDIO_AND_HAPTIC_FEEDBACK_IN_KEY_REPEAT = 2; + private static final int DELAY_WAIT_FOR_DICTIONARY_LOAD = 2000; // 2s - // TODO: Set this value appropriately. - private static final int GET_SUGGESTED_WORDS_TIMEOUT = 200; + private static final int PERIOD_FOR_AUDIO_AND_HAPTIC_FEEDBACK_IN_KEY_REPEAT = 2; /** * The name of the scheme used by the Package Manager to warn of a new package installation, @@ -141,168 +122,142 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen */ private static final String SCHEME_PACKAGE = "package"; - private static final int SPACE_STATE_NONE = 0; - // Double space: the state where the user pressed space twice quickly, which LatinIME - // resolved as period-space. Undoing this converts the period to a space. - private static final int SPACE_STATE_DOUBLE = 1; - // Swap punctuation: the state where a weak space and a punctuation from the suggestion strip - // have just been swapped. Undoing this swaps them back; the space is still considered weak. - private static final int SPACE_STATE_SWAP_PUNCTUATION = 2; - // Weak space: a space that should be swapped only by suggestion strip punctuation. Weak - // spaces happen when the user presses space, accepting the current suggestion (whether - // it's an auto-correction or not). - private static final int SPACE_STATE_WEAK = 3; - // Phantom space: a not-yet-inserted space that should get inserted on the next input, - // character provided it's not a separator. If it's a separator, the phantom space is dropped. - // Phantom spaces happen when a user chooses a word from the suggestion strip. - private static final int SPACE_STATE_PHANTOM = 4; - - // Current space state of the input method. This can be any of the above constants. - private int mSpaceState; - private final Settings mSettings; + private final DictionaryFacilitator mDictionaryFacilitator = + new DictionaryFacilitator(new DistracterFilterCheckingExactMatches(this /* context */)); + // TODO: Move from LatinIME. + private final PersonalizationDictionaryUpdater mPersonalizationDictionaryUpdater = + new PersonalizationDictionaryUpdater(this /* context */, mDictionaryFacilitator); + private final ContextualDictionaryUpdater mContextualDictionaryUpdater = + new ContextualDictionaryUpdater(this /* context */, mDictionaryFacilitator, + new Runnable() { + @Override + public void run() { + mHandler.postUpdateSuggestionStrip(); + } + }); + private final InputLogic mInputLogic = new InputLogic(this /* LatinIME */, + this /* SuggestionStripViewAccessor */, mDictionaryFacilitator); + // We expect to have only one decoder in almost all cases, hence the default capacity of 1. + // If it turns out we need several, it will get grown seamlessly. + final SparseArray<HardwareEventDecoder> mHardwareEventDecoders = new SparseArray<>(1); private View mExtractArea; private View mKeyPreviewBackingView; private SuggestionStripView mSuggestionStripView; - // Never null - private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; - private Suggest mSuggest; - private CompletionInfo[] mApplicationSpecifiedCompletions; - private AppWorkaroundsUtils mAppWorkAroundsUtils = new AppWorkaroundsUtils(); private RichInputMethodManager mRichImm; @UsedForTesting final KeyboardSwitcher mKeyboardSwitcher; private final SubtypeSwitcher mSubtypeSwitcher; private final SubtypeState mSubtypeState = new SubtypeState(); - // At start, create a default event interpreter that does nothing by passing it no decoder spec. - // The event interpreter should never be null. - private EventInterpreter mEventInterpreter = new EventInterpreter(this); - - private boolean mIsMainDictionaryAvailable; - private UserBinaryDictionary mUserDictionary; - private UserHistoryDictionary mUserHistoryDictionary; - private PersonalizationPredictionDictionary mPersonalizationPredictionDictionary; - private PersonalizationDictionary mPersonalizationDictionary; - private boolean mIsUserDictionaryAvailable; - - private LastComposedWord mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; - private final WordComposer mWordComposer = new WordComposer(); - private final RichInputConnection mConnection = new RichInputConnection(this); - private final RecapitalizeStatus mRecapitalizeStatus = new RecapitalizeStatus(); - - // Keep track of the last selection range to decide if we need to show word alternatives - private static final int NOT_A_CURSOR_POSITION = -1; - private int mLastSelectionStart = NOT_A_CURSOR_POSITION; - private int mLastSelectionEnd = NOT_A_CURSOR_POSITION; - - // Whether we are expecting an onUpdateSelection event to fire. If it does when we don't - // "expect" it, it means the user actually moved the cursor. - private boolean mExpectingUpdateSelection; - private int mDeleteCount; - private long mLastKeyTime; - private final TreeSet<Long> mCurrentlyPressedHardwareKeys = CollectionUtils.newTreeSet(); - // Personalization debugging params - private boolean mUseOnlyPersonalizationDictionaryForDebug = false; - private boolean mBoostPersonalizationDictionaryForDebug = false; - - // Member variables for remembering the current device orientation. - private int mDisplayOrientation; // Object for reacting to adding/removing a dictionary pack. - private BroadcastReceiver mDictionaryPackInstallReceiver = + private final BroadcastReceiver mDictionaryPackInstallReceiver = new DictionaryPackInstallBroadcastReceiver(this); - // Keeps track of most recently inserted text (multi-character key) for reverting - private String mEnteredText; - - // TODO: This boolean is persistent state and causes large side effects at unexpected times. - // Find a way to remove it for readability. - private boolean mIsAutoCorrectionIndicatorOn; + private final BroadcastReceiver mDictionaryDumpBroadcastReceiver = + new DictionaryDumpBroadcastReceiver(this); private AlertDialog mOptionsDialog; private final boolean mIsHardwareAcceleratedDrawingEnabled; public final UIHandler mHandler = new UIHandler(this); - private InputUpdater mInputUpdater; - public static final class UIHandler extends StaticInnerHandlerWrapper<LatinIME> { + public static final class UIHandler extends LeakGuardHandlerWrapper<LatinIME> { private static final int MSG_UPDATE_SHIFT_STATE = 0; private static final int MSG_PENDING_IMS_CALLBACK = 1; private static final int MSG_UPDATE_SUGGESTION_STRIP = 2; private static final int MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP = 3; private static final int MSG_RESUME_SUGGESTIONS = 4; private static final int MSG_REOPEN_DICTIONARIES = 5; - private static final int MSG_ON_END_BATCH_INPUT = 6; + private static final int MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED = 6; private static final int MSG_RESET_CACHES = 7; + private static final int MSG_WAIT_FOR_DICTIONARY_LOAD = 8; + // Update this when adding new messages + private static final int MSG_LAST = MSG_WAIT_FOR_DICTIONARY_LOAD; private static final int ARG1_NOT_GESTURE_INPUT = 0; private static final int ARG1_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1; private static final int ARG1_SHOW_GESTURE_FLOATING_PREVIEW_TEXT = 2; - private static final int ARG2_WITHOUT_TYPED_WORD = 0; - private static final int ARG2_WITH_TYPED_WORD = 1; + private static final int ARG2_UNUSED = 0; + private static final int ARG1_FALSE = 0; + private static final int ARG1_TRUE = 1; private int mDelayUpdateSuggestions; private int mDelayUpdateShiftState; - private long mDoubleSpacePeriodTimeout; - private long mDoubleSpacePeriodTimerStart; - public UIHandler(final LatinIME outerInstance) { - super(outerInstance); + public UIHandler(final LatinIME ownerInstance) { + super(ownerInstance); } public void onCreate() { - final Resources res = getOuterInstance().getResources(); - mDelayUpdateSuggestions = - res.getInteger(R.integer.config_delay_update_suggestions); - mDelayUpdateShiftState = - res.getInteger(R.integer.config_delay_update_shift_state); - mDoubleSpacePeriodTimeout = - res.getInteger(R.integer.config_double_space_period_timeout); + final LatinIME latinIme = getOwnerInstance(); + if (latinIme == null) { + return; + } + final Resources res = latinIme.getResources(); + mDelayUpdateSuggestions = res.getInteger(R.integer.config_delay_update_suggestions); + mDelayUpdateShiftState = res.getInteger(R.integer.config_delay_update_shift_state); } @Override public void handleMessage(final Message msg) { - final LatinIME latinIme = getOuterInstance(); + final LatinIME latinIme = getOwnerInstance(); + if (latinIme == null) { + return; + } final KeyboardSwitcher switcher = latinIme.mKeyboardSwitcher; switch (msg.what) { case MSG_UPDATE_SUGGESTION_STRIP: - latinIme.updateSuggestionStrip(); + cancelUpdateSuggestionStrip(); + latinIme.mInputLogic.performUpdateSuggestionStripSync( + latinIme.mSettings.getCurrent()); break; case MSG_UPDATE_SHIFT_STATE: - switcher.updateShiftState(); + switcher.requestUpdatingShiftState(latinIme.getCurrentAutoCapsState(), + latinIme.getCurrentRecapitalizeState()); break; case MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP: if (msg.arg1 == ARG1_NOT_GESTURE_INPUT) { - if (msg.arg2 == ARG2_WITH_TYPED_WORD) { - final Pair<SuggestedWords, String> p = - (Pair<SuggestedWords, String>) msg.obj; - latinIme.showSuggestionStripWithTypedWord(p.first, p.second); - } else { - latinIme.showSuggestionStrip((SuggestedWords) msg.obj); - } + final SuggestedWords suggestedWords = (SuggestedWords) msg.obj; + latinIme.showSuggestionStrip(suggestedWords); } else { latinIme.showGesturePreviewAndSuggestionStrip((SuggestedWords) msg.obj, msg.arg1 == ARG1_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT); } break; case MSG_RESUME_SUGGESTIONS: - latinIme.restartSuggestionsOnWordTouchedByCursor(); + latinIme.mInputLogic.restartSuggestionsOnWordTouchedByCursor( + latinIme.mSettings.getCurrent(), + msg.arg1 == ARG1_TRUE /* shouldIncludeResumedWordInSuggestions */, + latinIme.mKeyboardSwitcher.getCurrentKeyboardScriptId()); break; case MSG_REOPEN_DICTIONARIES: - latinIme.initSuggest(); - // In theory we could call latinIme.updateSuggestionStrip() right away, but - // in the practice, the dictionary is not finished opening yet so we wouldn't - // get any suggestions. Wait one frame. - postUpdateSuggestionStrip(); + latinIme.resetSuggest(); + // We need to re-evaluate the currently composing word in case the script has + // changed. + postWaitForDictionaryLoad(); break; - case MSG_ON_END_BATCH_INPUT: - latinIme.onEndBatchInputAsyncInternal((SuggestedWords) msg.obj); + case MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED: + latinIme.mInputLogic.onUpdateTailBatchInputCompleted( + latinIme.mSettings.getCurrent(), + (SuggestedWords) msg.obj, latinIme.mKeyboardSwitcher); break; case MSG_RESET_CACHES: - latinIme.retryResetCaches(msg.arg1 == 1 /* tryResumeSuggestions */, - msg.arg2 /* remainingTries */); + final SettingsValues settingsValues = latinIme.mSettings.getCurrent(); + if (latinIme.mInputLogic.retryResetCachesAndReturnSuccess(settingsValues, + msg.arg1 == 1 /* tryResumeSuggestions */, + msg.arg2 /* remainingTries */, this /* handler */)) { + // If we were able to reset the caches, then we can reload the keyboard. + // Otherwise, we'll do it when we can. + latinIme.mKeyboardSwitcher.loadKeyboard(latinIme.getCurrentInputEditorInfo(), + settingsValues, latinIme.getCurrentAutoCapsState(), + latinIme.getCurrentRecapitalizeState()); + } + break; + case MSG_WAIT_FOR_DICTIONARY_LOAD: + Log.i(TAG, "Timeout waiting for dictionary load"); break; } } @@ -315,9 +270,27 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen sendMessage(obtainMessage(MSG_REOPEN_DICTIONARIES)); } - public void postResumeSuggestions() { + public void postResumeSuggestions(final boolean shouldIncludeResumedWordInSuggestions, + final boolean shouldDelay) { + final LatinIME latinIme = getOwnerInstance(); + if (latinIme == null) { + return; + } + if (!latinIme.mSettings.getCurrent() + .isCurrentOrientationAllowingSuggestionsPerUserSettings()) { + return; + } removeMessages(MSG_RESUME_SUGGESTIONS); - sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS), mDelayUpdateSuggestions); + if (shouldDelay) { + sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS, + shouldIncludeResumedWordInSuggestions ? ARG1_TRUE : ARG1_FALSE, + 0 /* ignored */), + mDelayUpdateSuggestions); + } else { + sendMessage(obtainMessage(MSG_RESUME_SUGGESTIONS, + shouldIncludeResumedWordInSuggestions ? ARG1_TRUE : ARG1_FALSE, + 0 /* ignored */)); + } } public void postResetCaches(final boolean tryResumeSuggestions, final int remainingTries) { @@ -326,6 +299,19 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen remainingTries, null)); } + public void postWaitForDictionaryLoad() { + sendMessageDelayed(obtainMessage(MSG_WAIT_FOR_DICTIONARY_LOAD), + DELAY_WAIT_FOR_DICTIONARY_LOAD); + } + + public void cancelWaitForDictionaryLoad() { + removeMessages(MSG_WAIT_FOR_DICTIONARY_LOAD); + } + + public boolean hasPendingWaitForDictionaryLoad() { + return hasMessages(MSG_WAIT_FOR_DICTIONARY_LOAD); + } + public void cancelUpdateSuggestionStrip() { removeMessages(MSG_UPDATE_SUGGESTION_STRIP); } @@ -343,8 +329,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), mDelayUpdateShiftState); } - public void cancelUpdateShiftState() { - removeMessages(MSG_UPDATE_SHIFT_STATE); + @UsedForTesting + public void removeAllMessages() { + for (int i = 0; i <= MSG_LAST; ++i) { + removeMessages(i); + } } public void showGesturePreviewAndSuggestionStrip(final SuggestedWords suggestedWords, @@ -354,39 +343,17 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen ? ARG1_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT : ARG1_SHOW_GESTURE_FLOATING_PREVIEW_TEXT; obtainMessage(MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP, arg1, - ARG2_WITHOUT_TYPED_WORD, suggestedWords).sendToTarget(); + ARG2_UNUSED, suggestedWords).sendToTarget(); } public void showSuggestionStrip(final SuggestedWords suggestedWords) { removeMessages(MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP); obtainMessage(MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP, - ARG1_NOT_GESTURE_INPUT, ARG2_WITHOUT_TYPED_WORD, suggestedWords).sendToTarget(); - } - - // TODO: Remove this method. - public void showSuggestionStripWithTypedWord(final SuggestedWords suggestedWords, - final String typedWord) { - removeMessages(MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP); - obtainMessage(MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP, ARG1_NOT_GESTURE_INPUT, - ARG2_WITH_TYPED_WORD, - new Pair<SuggestedWords, String>(suggestedWords, typedWord)).sendToTarget(); - } - - public void onEndBatchInput(final SuggestedWords suggestedWords) { - obtainMessage(MSG_ON_END_BATCH_INPUT, suggestedWords).sendToTarget(); - } - - public void startDoubleSpacePeriodTimer() { - mDoubleSpacePeriodTimerStart = SystemClock.uptimeMillis(); + ARG1_NOT_GESTURE_INPUT, ARG2_UNUSED, suggestedWords).sendToTarget(); } - public void cancelDoubleSpacePeriodTimer() { - mDoubleSpacePeriodTimerStart = 0; - } - - public boolean isAcceptingDoubleSpacePeriod() { - return SystemClock.uptimeMillis() - mDoubleSpacePeriodTimerStart - < mDoubleSpacePeriodTimeout; + public void showTailBatchInputResult(final SuggestedWords suggestedWords) { + obtainMessage(MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED, suggestedWords).sendToTarget(); } // Working variables for the following methods. @@ -401,7 +368,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen removeMessages(MSG_PENDING_IMS_CALLBACK); resetPendingImsCallback(); mIsOrientationChanging = true; - final LatinIME latinIme = getOuterInstance(); + final LatinIME latinIme = getOwnerInstance(); + if (latinIme == null) { + return; + } if (latinIme.isInputViewShown()) { latinIme.mKeyboardSwitcher.saveKeyboardState(); } @@ -415,12 +385,15 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void executePendingImsCallback(final LatinIME latinIme, final EditorInfo editorInfo, boolean restarting) { - if (mHasPendingFinishInputView) + if (mHasPendingFinishInputView) { latinIme.onFinishInputViewInternal(mHasPendingFinishInput); - if (mHasPendingFinishInput) + } + if (mHasPendingFinishInput) { latinIme.onFinishInputInternal(); - if (mHasPendingStartInput) + } + if (mHasPendingStartInput) { latinIme.onStartInputInternal(editorInfo, restarting); + } resetPendingImsCallback(); } @@ -434,9 +407,17 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mIsOrientationChanging = false; mPendingSuccessiveImsCallback = true; } - final LatinIME latinIme = getOuterInstance(); - executePendingImsCallback(latinIme, editorInfo, restarting); - latinIme.onStartInputInternal(editorInfo, restarting); + final LatinIME latinIme = getOwnerInstance(); + if (latinIme != null) { + executePendingImsCallback(latinIme, editorInfo, restarting); + latinIme.onStartInputInternal(editorInfo, restarting); + if (ProductionFlag.USES_CURSOR_ANCHOR_MONITOR) { + // Currently we need to call this every time when the IME is attached to + // new application. + // TODO: Consider if we can do this automatically in the framework. + InputMethodServiceCompatUtils.setCursorAnchorMonitorMode(latinIme, 1); + } + } } } @@ -453,10 +434,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen sendMessageDelayed(obtainMessage(MSG_PENDING_IMS_CALLBACK), PENDING_IMS_CALLBACK_DURATION); } - final LatinIME latinIme = getOuterInstance(); - executePendingImsCallback(latinIme, editorInfo, restarting); - latinIme.onStartInputViewInternal(editorInfo, restarting); - mAppliedEditorInfo = editorInfo; + final LatinIME latinIme = getOwnerInstance(); + if (latinIme != null) { + executePendingImsCallback(latinIme, editorInfo, restarting); + latinIme.onStartInputViewInternal(editorInfo, restarting); + mAppliedEditorInfo = editorInfo; + } } } @@ -465,9 +448,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Typically this is the first onFinishInputView after orientation changed. mHasPendingFinishInputView = true; } else { - final LatinIME latinIme = getOuterInstance(); - latinIme.onFinishInputViewInternal(finishingInput); - mAppliedEditorInfo = null; + final LatinIME latinIme = getOwnerInstance(); + if (latinIme != null) { + latinIme.onFinishInputViewInternal(finishingInput); + mAppliedEditorInfo = null; + } } } @@ -476,31 +461,33 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Typically this is the first onFinishInput after orientation changed. mHasPendingFinishInput = true; } else { - final LatinIME latinIme = getOuterInstance(); - executePendingImsCallback(latinIme, null, false); - latinIme.onFinishInputInternal(); + final LatinIME latinIme = getOwnerInstance(); + if (latinIme != null) { + executePendingImsCallback(latinIme, null, false); + latinIme.onFinishInputInternal(); + } } } } static final class SubtypeState { private InputMethodSubtype mLastActiveSubtype; - private boolean mCurrentSubtypeUsed; + private boolean mCurrentSubtypeHasBeenUsed; - public void currentSubtypeUsed() { - mCurrentSubtypeUsed = true; + public void setCurrentSubtypeHasBeenUsed() { + mCurrentSubtypeHasBeenUsed = true; } public void switchSubtype(final IBinder token, final RichInputMethodManager richImm) { final InputMethodSubtype currentSubtype = richImm.getInputMethodManager() .getCurrentInputMethodSubtype(); final InputMethodSubtype lastActiveSubtype = mLastActiveSubtype; - final boolean currentSubtypeUsed = mCurrentSubtypeUsed; - if (currentSubtypeUsed) { + final boolean currentSubtypeHasBeenUsed = mCurrentSubtypeHasBeenUsed; + if (currentSubtypeHasBeenUsed) { mLastActiveSubtype = currentSubtype; - mCurrentSubtypeUsed = false; + mCurrentSubtypeHasBeenUsed = false; } - if (currentSubtypeUsed + if (currentSubtypeHasBeenUsed && richImm.checkIfSubtypeBelongsToThisImeAndEnabled(lastActiveSubtype) && !currentSubtype.equals(lastActiveSubtype)) { richImm.setInputMethodAndSubtype(token, lastActiveSubtype); @@ -536,7 +523,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen KeyboardSwitcher.init(this); AudioAndHapticFeedbackManager.init(this); AccessibilityUtils.init(this); - PersonalizationDictionarySessionRegister.init(this); + StatsUtils.init(this); super.onCreate(); @@ -545,19 +532,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // TODO: Resolve mutual dependencies of {@link #loadSettings()} and {@link #initSuggest()}. loadSettings(); - initSuggest(); - - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().init(this, mKeyboardSwitcher, mSuggest); - } - mDisplayOrientation = getResources().getConfiguration().orientation; + resetSuggest(); // Register to receive ringer mode change and network state change. // Also receive installation and removal of a dictionary pack. final IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); - registerReceiver(mReceiver, filter); + registerReceiver(mConnectivityAndRingerModeChangeReceiver, filter); final IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); @@ -569,47 +551,74 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen newDictFilter.addAction(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION); registerReceiver(mDictionaryPackInstallReceiver, newDictFilter); + final IntentFilter dictDumpFilter = new IntentFilter(); + dictDumpFilter.addAction(DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION); + registerReceiver(mDictionaryDumpBroadcastReceiver, dictDumpFilter); + DictionaryDecayBroadcastReciever.setUpIntervalAlarmForDictionaryDecaying(this); - mInputUpdater = new InputUpdater(this); + StatsUtils.onCreate(mSettings.getCurrent()); } // Has to be package-visible for unit tests @UsedForTesting void loadSettings() { final Locale locale = mSubtypeSwitcher.getCurrentSubtypeLocale(); - final InputAttributes inputAttributes = - new InputAttributes(getCurrentInputEditorInfo(), isFullscreenMode()); - mSettings.loadSettings(locale, inputAttributes); - AudioAndHapticFeedbackManager.getInstance().onSettingsChanged(mSettings.getCurrent()); - // To load the keyboard we need to load all the settings once, but resetting the - // contacts dictionary should be deferred until after the new layout has been displayed - // to improve responsivity. In the language switching process, we post a reopenDictionaries - // message, then come here to read the settings for the new language before we change - // the layout; at this time, we need to skip resetting the contacts dictionary. It will - // be done later inside {@see #initSuggest()} when the reopenDictionaries message is - // processed. + final EditorInfo editorInfo = getCurrentInputEditorInfo(); + final InputAttributes inputAttributes = new InputAttributes( + editorInfo, isFullscreenMode(), getPackageName()); + mSettings.loadSettings(this, locale, inputAttributes); + final SettingsValues currentSettingsValues = mSettings.getCurrent(); + AudioAndHapticFeedbackManager.getInstance().onSettingsChanged(currentSettingsValues); + // This method is called on startup and language switch, before the new layout has + // been displayed. Opening dictionaries never affects responsivity as dictionaries are + // asynchronously loaded. if (!mHandler.hasPendingReopenDictionaries()) { - // May need to reset the contacts dictionary depending on the user settings. - resetContactsDictionary(null == mSuggest ? null : mSuggest.getContactsDictionary()); + resetSuggestForLocale(locale); + } + mDictionaryFacilitator.updateEnabledSubtypes(mRichImm.getMyEnabledInputMethodSubtypeList( + true /* allowsImplicitlySelectedSubtypes */)); + refreshPersonalizationDictionarySession(currentSettingsValues); + StatsUtils.onLoadSettings(currentSettingsValues); + } + + private void refreshPersonalizationDictionarySession( + final SettingsValues currentSettingsValues) { + mPersonalizationDictionaryUpdater.onLoadSettings( + currentSettingsValues.mUsePersonalizedDicts, + mSubtypeSwitcher.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes()); + mContextualDictionaryUpdater.onLoadSettings(currentSettingsValues.mUsePersonalizedDicts); + final boolean shouldKeepUserHistoryDictionaries; + if (currentSettingsValues.mUsePersonalizedDicts) { + shouldKeepUserHistoryDictionaries = true; + } else { + shouldKeepUserHistoryDictionaries = false; + } + if (!shouldKeepUserHistoryDictionaries) { + // Remove user history dictionaries. + PersonalizationHelper.removeAllUserHistoryDictionaries(this); + mDictionaryFacilitator.clearUserHistoryDictionary(); } } // Note that this method is called from a non-UI thread. @Override public void onUpdateMainDictionaryAvailability(final boolean isMainDictionaryAvailable) { - mIsMainDictionaryAvailable = isMainDictionaryAvailable; final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); if (mainKeyboardView != null) { mainKeyboardView.setMainDictionaryAvailability(isMainDictionaryAvailable); } + if (mHandler.hasPendingWaitForDictionaryLoad()) { + mHandler.cancelWaitForDictionaryLoad(); + mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, + false /* shouldDelay */); + } } - private void initSuggest() { + private void resetSuggest() { final Locale switcherSubtypeLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); final String switcherLocaleStr = switcherSubtypeLocale.toString(); final Locale subtypeLocale; - final String localeStr; if (TextUtils.isEmpty(switcherLocaleStr)) { // This happens in very rare corner cases - for example, immediately after a switch // to LatinIME has been requested, about a frame later another switch happens. In this @@ -619,132 +628,70 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // of knowing anyway. Log.e(TAG, "System is reporting no current subtype."); subtypeLocale = getResources().getConfiguration().locale; - localeStr = subtypeLocale.toString(); } else { subtypeLocale = switcherSubtypeLocale; - localeStr = switcherLocaleStr; - } - - final Suggest newSuggest = new Suggest(this /* Context */, subtypeLocale, - this /* SuggestInitializationListener */); - final SettingsValues settingsValues = mSettings.getCurrent(); - if (settingsValues.mCorrectionEnabled) { - newSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold); - } - - mIsMainDictionaryAvailable = DictionaryFactory.isDictionaryAvailable(this, subtypeLocale); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().initSuggest(newSuggest); } - - mUserDictionary = new UserBinaryDictionary(this, localeStr); - mIsUserDictionaryAvailable = mUserDictionary.isEnabled(); - newSuggest.setUserDictionary(mUserDictionary); - - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - - mUserHistoryDictionary = PersonalizationHelper.getUserHistoryDictionary( - this, localeStr, prefs); - newSuggest.setUserHistoryDictionary(mUserHistoryDictionary); - mPersonalizationDictionary = PersonalizationHelper - .getPersonalizationDictionary(this, localeStr, prefs); - newSuggest.setPersonalizationDictionary(mPersonalizationDictionary); - mPersonalizationPredictionDictionary = PersonalizationHelper - .getPersonalizationPredictionDictionary(this, localeStr, prefs); - newSuggest.setPersonalizationPredictionDictionary(mPersonalizationPredictionDictionary); - - final Suggest oldSuggest = mSuggest; - resetContactsDictionary(null != oldSuggest ? oldSuggest.getContactsDictionary() : null); - mSuggest = newSuggest; - if (oldSuggest != null) oldSuggest.close(); + resetSuggestForLocale(subtypeLocale); } /** - * Resets the contacts dictionary in mSuggest according to the user settings. + * Reset suggest by loading dictionaries for the locale and the current settings values. * - * This method takes an optional contacts dictionary to use when the locale hasn't changed - * since the contacts dictionary can be opened or closed as necessary depending on the settings. - * - * @param oldContactsDictionary an optional dictionary to use, or null + * @param locale the locale */ - private void resetContactsDictionary(final ContactsBinaryDictionary oldContactsDictionary) { - final Suggest suggest = mSuggest; - final boolean shouldSetDictionary = - (null != suggest && mSettings.getCurrent().mUseContactsDict); - - final ContactsBinaryDictionary dictionaryToUse; - if (!shouldSetDictionary) { - // Make sure the dictionary is closed. If it is already closed, this is a no-op, - // so it's safe to call it anyways. - if (null != oldContactsDictionary) oldContactsDictionary.close(); - dictionaryToUse = null; - } else { - final Locale locale = mSubtypeSwitcher.getCurrentSubtypeLocale(); - if (null != oldContactsDictionary) { - if (!oldContactsDictionary.mLocale.equals(locale)) { - // If the locale has changed then recreate the contacts dictionary. This - // allows locale dependent rules for handling bigram name predictions. - oldContactsDictionary.close(); - dictionaryToUse = new ContactsBinaryDictionary(this, locale); - } else { - // Make sure the old contacts dictionary is opened. If it is already open, - // this is a no-op, so it's safe to call it anyways. - oldContactsDictionary.reopen(this); - dictionaryToUse = oldContactsDictionary; - } - } else { - dictionaryToUse = new ContactsBinaryDictionary(this, locale); - } - } - - if (null != suggest) { - suggest.setContactsDictionary(dictionaryToUse); + private void resetSuggestForLocale(final Locale locale) { + final SettingsValues settingsValues = mSettings.getCurrent(); + mDictionaryFacilitator.resetDictionaries(this /* context */, locale, + settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts, + false /* forceReloadMainDictionary */, this); + if (settingsValues.mAutoCorrectionEnabled) { + mInputLogic.mSuggest.setAutoCorrectionThreshold( + settingsValues.mAutoCorrectionThreshold); } } + /** + * Reset suggest by loading the main dictionary of the current locale. + */ /* package private */ void resetSuggestMainDict() { - final Locale subtypeLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); - mSuggest.resetMainDict(this, subtypeLocale, this /* SuggestInitializationListener */); - mIsMainDictionaryAvailable = DictionaryFactory.isDictionaryAvailable(this, subtypeLocale); + final SettingsValues settingsValues = mSettings.getCurrent(); + mDictionaryFacilitator.resetDictionaries(this /* context */, + mDictionaryFacilitator.getLocale(), settingsValues.mUseContactsDict, + settingsValues.mUsePersonalizedDicts, true /* forceReloadMainDictionary */, this); } @Override public void onDestroy() { - final Suggest suggest = mSuggest; - if (suggest != null) { - suggest.close(); - mSuggest = null; - } + mDictionaryFacilitator.closeDictionaries(); + mPersonalizationDictionaryUpdater.onDestroy(); + mContextualDictionaryUpdater.onDestroy(); mSettings.onDestroy(); - unregisterReceiver(mReceiver); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().onDestroy(); - } + unregisterReceiver(mConnectivityAndRingerModeChangeReceiver); unregisterReceiver(mDictionaryPackInstallReceiver); - PersonalizationDictionarySessionRegister.onDestroy(this); - LatinImeLogger.commit(); - LatinImeLogger.onDestroy(); - if (mInputUpdater != null) { - mInputUpdater.quitLooper(); - } + unregisterReceiver(mDictionaryDumpBroadcastReceiver); + StatsUtils.onDestroy(); super.onDestroy(); } + @UsedForTesting + public void recycle() { + unregisterReceiver(mDictionaryPackInstallReceiver); + unregisterReceiver(mDictionaryDumpBroadcastReceiver); + unregisterReceiver(mConnectivityAndRingerModeChangeReceiver); + mInputLogic.recycle(); + } + @Override public void onConfigurationChanged(final Configuration conf) { - // If orientation changed while predicting, commit the change - if (mDisplayOrientation != conf.orientation) { - mDisplayOrientation = conf.orientation; + final SettingsValues settingsValues = mSettings.getCurrent(); + if (settingsValues.mDisplayOrientation != conf.orientation) { mHandler.startOrientationChanging(); - mConnection.beginBatchEdit(); - commitTyped(LastComposedWord.NOT_A_SEPARATOR); - mConnection.finishComposingText(); - mConnection.endBatchEdit(); - if (isShowingOptionDialog()) { - mOptionsDialog.dismiss(); - } + mInputLogic.onOrientationChange(mSettings.getCurrent()); + } + // TODO: Remove this test. + if (!conf.locale.equals(mPersonalizationDictionaryUpdater.getLocale())) { + refreshPersonalizationDictionarySession(settingsValues); } - PersonalizationDictionarySessionRegister.onConfigurationChanged(this, conf); super.onConfigurationChanged(conf); } @@ -760,10 +707,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen .findViewById(android.R.id.extractArea); mKeyPreviewBackingView = view.findViewById(R.id.key_preview_backing); mSuggestionStripView = (SuggestionStripView)view.findViewById(R.id.suggestion_strip_view); - if (mSuggestionStripView != null) + if (hasSuggestionStripView()) { mSuggestionStripView.setListener(this, view); - if (LatinImeLogger.sVISUALDEBUG) { - mKeyPreviewBackingView.setBackgroundColor(0x10FF0000); } } @@ -798,6 +743,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged() // is not guaranteed. It may even be called at the same time on a different thread. mSubtypeSwitcher.onSubtypeChanged(subtype); + mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype)); loadKeyboard(); } @@ -834,30 +780,18 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + ", word caps = " + ((editorInfo.inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0)); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - ResearchLogger.latinIME_onStartInputViewInternal(editorInfo, prefs); - } + Log.i(TAG, "Starting input. Cursor position = " + + editorInfo.initialSelStart + "," + editorInfo.initialSelEnd); + // TODO: Consolidate these checks with {@link InputAttributes}. if (InputAttributes.inPrivateImeOptions(null, NO_MICROPHONE_COMPAT, editorInfo)) { - Log.w(TAG, "Deprecated private IME option specified: " - + editorInfo.privateImeOptions); + Log.w(TAG, "Deprecated private IME option specified: " + editorInfo.privateImeOptions); Log.w(TAG, "Use " + getPackageName() + "." + NO_MICROPHONE + " instead"); } if (InputAttributes.inPrivateImeOptions(getPackageName(), FORCE_ASCII, editorInfo)) { - Log.w(TAG, "Deprecated private IME option specified: " - + editorInfo.privateImeOptions); + Log.w(TAG, "Deprecated private IME option specified: " + editorInfo.privateImeOptions); Log.w(TAG, "Use EditorInfo.IME_FLAG_FORCE_ASCII flag instead"); } - final PackageInfo packageInfo = - TargetPackageInfoGetterTask.getCachedPackageInfo(editorInfo.packageName); - mAppWorkAroundsUtils.setPackageInfo(packageInfo); - if (null == packageInfo) { - new TargetPackageInfoGetterTask(this /* context */, this /* listener */) - .execute(editorInfo.packageName); - } - - LatinImeLogger.onStartInputView(editorInfo); // In landscape mode, this method gets called without the input view being created. if (mainKeyboardView == null) { return; @@ -878,57 +812,57 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // The EditorInfo might have a flag that affects fullscreen mode. // Note: This call should be done by InputMethodService? updateFullscreenMode(); - mApplicationSpecifiedCompletions = null; // The app calling setText() has the effect of clearing the composing // span, so we should reset our state unconditionally, even if restarting is true. - mEnteredText = null; - resetComposingState(true /* alsoResetLastComposedWord */); - mDeleteCount = 0; - mSpaceState = SPACE_STATE_NONE; - mRecapitalizeStatus.deactivate(); - mCurrentlyPressedHardwareKeys.clear(); + // We also tell the input logic about the combining rules for the current subtype, so + // it can adjust its combiners if needed. + mInputLogic.startInput(mSubtypeSwitcher.getCombiningRulesExtraValueOfCurrentSubtype()); // Note: the following does a round-trip IPC on the main thread: be careful final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); - final Suggest suggest = mSuggest; - if (null != suggest && null != currentLocale && !currentLocale.equals(suggest.mLocale)) { - initSuggest(); - } - if (mSuggestionStripView != null) { - // This will set the punctuation suggestions if next word suggestion is off; - // otherwise it will clear the suggestion strip. - setPunctuationSuggestions(); + final Suggest suggest = mInputLogic.mSuggest; + if (null != currentLocale && !currentLocale.equals(suggest.getLocale())) { + // TODO: Do this automatically. + resetSuggest(); } - mSuggestedWords = SuggestedWords.EMPTY; - // Sometimes, while rotating, for some reason the framework tells the app we are not - // connected to it and that means we can't refresh the cache. In this case, schedule a - // refresh later. + // TODO[IL]: Can the following be moved to InputLogic#startInput? final boolean canReachInputConnection; - if (!mConnection.resetCachesUponCursorMoveAndReturnSuccess(editorInfo.initialSelStart, + if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess( + editorInfo.initialSelStart, editorInfo.initialSelEnd, false /* shouldFinishComposition */)) { + // Sometimes, while rotating, for some reason the framework tells the app we are not + // connected to it and that means we can't refresh the cache. In this case, schedule a + // refresh later. // We try resetting the caches up to 5 times before giving up. mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */); // mLastSelection{Start,End} are reset later in this method, don't need to do it here canReachInputConnection = false; } else { - if (isDifferentTextField) { - mHandler.postResumeSuggestions(); - } + // When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best + // effort to work around this bug. + mInputLogic.mConnection.tryFixLyingCursorPosition(); + mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, + true /* shouldDelay */); canReachInputConnection = true; } + if (isDifferentTextField || + !currentSettingsValues.hasSameOrientation(getResources().getConfiguration())) { + loadSettings(); + } if (isDifferentTextField) { mainKeyboardView.closing(); - loadSettings(); currentSettingsValues = mSettings.getCurrent(); - if (suggest != null && currentSettingsValues.mCorrectionEnabled) { - suggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold); + if (currentSettingsValues.mAutoCorrectionEnabled) { + suggest.setAutoCorrectionThreshold( + currentSettingsValues.mAutoCorrectionThreshold); } - switcher.loadKeyboard(editorInfo, currentSettingsValues); + switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); if (!canReachInputConnection) { // If we can't reach the input connection, we will call loadKeyboard again later, // so we need to save its state now. The call will be done in #retryResetCaches. @@ -937,26 +871,23 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } else if (restarting) { // TODO: Come up with a more comprehensive way to reset the keyboard layout when // a keyboard layout set doesn't get reloaded in this method. - switcher.resetKeyboardStateToAlphabet(); + switcher.resetKeyboardStateToAlphabet(getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); // In apps like Talk, we come here when the text is sent and the field gets emptied and // we need to re-evaluate the shift state, but not the whole layout which would be // disruptive. // Space state must be updated before calling updateShiftState - switcher.updateShiftState(); + switcher.requestUpdatingShiftState(getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); } - setSuggestionStripShownInternal( - isSuggestionsStripVisible(), /* needsInputViewShown */ false); - - mLastSelectionStart = editorInfo.initialSelStart; - mLastSelectionEnd = editorInfo.initialSelEnd; - // In some cases (namely, after rotation of the device) editorInfo.initialSelStart is lying - // so we try using some heuristics to find out about these and fix them. - tryFixLyingCursorPosition(); + // This will set the punctuation suggestions if next word suggestion is off; + // otherwise it will clear the suggestion strip. + setNeutralSuggestionStrip(); mHandler.cancelUpdateSuggestionStrip(); - mHandler.cancelDoubleSpacePeriodTimer(); - mainKeyboardView.setMainDictionaryAvailability(mIsMainDictionaryAvailable); + mainKeyboardView.setMainDictionaryAvailability( + mDictionaryFacilitator.hasInitializedMainDictionary()); mainKeyboardView.setKeyPreviewPopupEnabled(currentSettingsValues.mKeyPreviewPopupOn, currentSettingsValues.mKeyPreviewPopupDismissDelay); mainKeyboardView.setSlidingKeyInputPreviewEnabled( @@ -966,76 +897,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen currentSettingsValues.mGestureTrailEnabled, currentSettingsValues.mGestureFloatingPreviewTextEnabled); - initPersonalizationDebugSettings(currentSettingsValues); - + // Contextual dictionary should be updated for the current application. + mContextualDictionaryUpdater.onStartInputView(editorInfo.packageName); if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); } - /** - * Try to get the text from the editor to expose lies the framework may have been - * telling us. Concretely, when the device rotates, the frameworks tells us about where the - * cursor used to be initially in the editor at the time it first received the focus; this - * may be completely different from the place it is upon rotation. Since we don't have any - * means to get the real value, try at least to ask the text view for some characters and - * detect the most damaging cases: when the cursor position is declared to be much smaller - * than it really is. - */ - private void tryFixLyingCursorPosition() { - final CharSequence textBeforeCursor = - mConnection.getTextBeforeCursor(Constants.EDITOR_CONTENTS_CACHE_SIZE, 0); - if (null == textBeforeCursor) { - mLastSelectionStart = mLastSelectionEnd = NOT_A_CURSOR_POSITION; - } else { - final int textLength = textBeforeCursor.length(); - if (textLength > mLastSelectionStart - || (textLength < Constants.EDITOR_CONTENTS_CACHE_SIZE - && mLastSelectionStart < Constants.EDITOR_CONTENTS_CACHE_SIZE)) { - // It should not be possible to have only one of those variables be - // NOT_A_CURSOR_POSITION, so if they are equal, either the selection is zero-sized - // (simple cursor, no selection) or there is no cursor/we don't know its pos - final boolean wasEqual = mLastSelectionStart == mLastSelectionEnd; - mLastSelectionStart = textLength; - // We can't figure out the value of mLastSelectionEnd :( - // But at least if it's smaller than mLastSelectionStart something is wrong, - // and if they used to be equal we also don't want to make it look like there is a - // selection. - if (wasEqual || mLastSelectionStart > mLastSelectionEnd) { - mLastSelectionEnd = mLastSelectionStart; - } - } - } - } - - // Initialization of personalization debug settings. This must be called inside - // onStartInputView. - private void initPersonalizationDebugSettings(SettingsValues currentSettingsValues) { - if (mUseOnlyPersonalizationDictionaryForDebug - != currentSettingsValues.mUseOnlyPersonalizationDictionaryForDebug) { - // Only for debug - initSuggest(); - mUseOnlyPersonalizationDictionaryForDebug = - currentSettingsValues.mUseOnlyPersonalizationDictionaryForDebug; - } - - if (mBoostPersonalizationDictionaryForDebug != - currentSettingsValues.mBoostPersonalizationDictionaryForDebug) { - // Only for debug - mBoostPersonalizationDictionaryForDebug = - currentSettingsValues.mBoostPersonalizationDictionaryForDebug; - if (mBoostPersonalizationDictionaryForDebug) { - UserHistoryForgettingCurveUtils.boostMaxFreqForDebug(); - } else { - UserHistoryForgettingCurveUtils.resetMaxFreqForDebug(); - } - } - } - - // Callback for the TargetPackageInfoGetterTask - @Override - public void onTargetPackageInfoKnown(final PackageInfo info) { - mAppWorkAroundsUtils.setPackageInfo(info); - } - @Override public void onWindowHidden() { super.onWindowHidden(); @@ -1048,7 +914,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void onFinishInputInternal() { super.onFinishInput(); - LatinImeLogger.commit(); final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); if (mainKeyboardView != null) { mainKeyboardView.closing(); @@ -1057,18 +922,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void onFinishInputViewInternal(final boolean finishingInput) { super.onFinishInputView(finishingInput); - mKeyboardSwitcher.onFinishInputView(); mKeyboardSwitcher.deallocateMemory(); // Remove pending messages related to update suggestions mHandler.cancelUpdateSuggestionStrip(); // Should do the following in onFinishInputInternal but until JB MR2 it's not called :( - if (mWordComposer.isComposingWord()) mConnection.finishComposingText(); - resetComposingState(true /* alsoResetLastComposedWord */); - // Notify ResearchLogger - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onFinishInputViewInternal(finishingInput, mLastSelectionStart, - mLastSelectionEnd, getCurrentInputConnection()); - } + mInputLogic.finishInput(); } @Override @@ -1078,102 +936,29 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, composingSpanEnd); if (DEBUG) { - Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart - + ", ose=" + oldSelEnd - + ", lss=" + mLastSelectionStart - + ", lse=" + mLastSelectionEnd - + ", nss=" + newSelStart - + ", nse=" + newSelEnd - + ", cs=" + composingSpanStart - + ", ce=" + composingSpanEnd); - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final boolean expectingUpdateSelectionFromLogger = - ResearchLogger.getAndClearLatinIMEExpectingUpdateSelection(); - ResearchLogger.latinIME_onUpdateSelection(mLastSelectionStart, mLastSelectionEnd, - oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, - composingSpanEnd, mExpectingUpdateSelection, - expectingUpdateSelectionFromLogger, mConnection); - if (expectingUpdateSelectionFromLogger) { - // TODO: Investigate. Quitting now sounds wrong - we won't do the resetting work - return; - } + Log.i(TAG, "onUpdateSelection: oss=" + oldSelStart + ", ose=" + oldSelEnd + + ", nss=" + newSelStart + ", nse=" + newSelEnd + + ", cs=" + composingSpanStart + ", ce=" + composingSpanEnd); } - final boolean selectionChanged = mLastSelectionStart != newSelStart - || mLastSelectionEnd != newSelEnd; - - // if composingSpanStart and composingSpanEnd are -1, it means there is no composing - // span in the view - we can use that to narrow down whether the cursor was moved - // by us or not. If we are composing a word but there is no composing span, then - // we know for sure the cursor moved while we were composing and we should reset - // the state. TODO: rescind this policy: the framework never removes the composing - // span on its own accord while editing. This test is useless. - final boolean noComposingSpan = composingSpanStart == -1 && composingSpanEnd == -1; - // If the keyboard is not visible, we don't need to do all the housekeeping work, as it // will be reset when the keyboard shows up anyway. // TODO: revisit this when LatinIME supports hardware keyboards. // NOTE: the test harness subclasses LatinIME and overrides isInputViewShown(). // TODO: find a better way to simulate actual execution. - if (isInputViewShown() && !mExpectingUpdateSelection - && !mConnection.isBelatedExpectedUpdate(oldSelStart, newSelStart)) { - // TAKE CARE: there is a race condition when we enter this test even when the user - // did not explicitly move the cursor. This happens when typing fast, where two keys - // turn this flag on in succession and both onUpdateSelection() calls arrive after - // the second one - the first call successfully avoids this test, but the second one - // enters. For the moment we rely on noComposingSpan to further reduce the impact. - - // TODO: the following is probably better done in resetEntireInputState(). - // it should only happen when the cursor moved, and the very purpose of the - // test below is to narrow down whether this happened or not. Likewise with - // the call to updateShiftState. - // We set this to NONE because after a cursor move, we don't want the space - // state-related special processing to kick in. - mSpaceState = SPACE_STATE_NONE; - - // TODO: is it still necessary to test for composingSpan related stuff? - final boolean selectionChangedOrSafeToReset = selectionChanged - || (!mWordComposer.isComposingWord()) || noComposingSpan; - final boolean hasOrHadSelection = (oldSelStart != oldSelEnd - || newSelStart != newSelEnd); - final int moveAmount = newSelStart - oldSelStart; - if (selectionChangedOrSafeToReset && (hasOrHadSelection - || !mWordComposer.moveCursorByAndReturnIfInsideComposingWord(moveAmount))) { - // If we are composing a word and moving the cursor, we would want to set a - // suggestion span for recorrection to work correctly. Unfortunately, that - // would involve the keyboard committing some new text, which would move the - // cursor back to where it was. Latin IME could then fix the position of the cursor - // again, but the asynchronous nature of the calls results in this wreaking havoc - // with selection on double tap and the like. - // Another option would be to send suggestions each time we set the composing - // text, but that is probably too expensive to do, so we decided to leave things - // as is. - resetEntireInputState(newSelStart); - } else { - // resetEntireInputState calls resetCachesUponCursorMove, but with the second - // argument as true. But in all cases where we don't reset the entire input state, - // we still want to tell the rich input connection about the new cursor position so - // that it can update its caches. - mConnection.resetCachesUponCursorMoveAndReturnSuccess(newSelStart, - false /* shouldFinishComposition */); - } - - // We moved the cursor. If we are touching a word, we need to resume suggestion, - // unless suggestions are off. - if (isSuggestionsStripVisible()) { - mHandler.postResumeSuggestions(); - } - // Reset the last recapitalization. - mRecapitalizeStatus.deactivate(); - mKeyboardSwitcher.updateShiftState(); + if (isInputViewShown() && + mInputLogic.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd)) { + mKeyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); } - mExpectingUpdateSelection = false; + } - // Make a note of the cursor position - mLastSelectionStart = newSelStart; - mLastSelectionEnd = newSelEnd; - mSubtypeState.currentSubtypeUsed(); + @Override + public void onUpdateCursor(final Rect rect) { + if (DEBUG) { + Log.i(TAG, "onUpdateCursor:" + rect.toShortString()); + } + super.onUpdateCursor(rect); } /** @@ -1186,7 +971,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen */ @Override public void onExtractedTextClicked() { - if (mSettings.getCurrent().isSuggestionsRequested(mDisplayOrientation)) return; + if (mSettings.getCurrent().isSuggestionsRequested()) { + return; + } super.onExtractedTextClicked(); } @@ -1202,22 +989,19 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen */ @Override public void onExtractedCursorMovement(final int dx, final int dy) { - if (mSettings.getCurrent().isSuggestionsRequested(mDisplayOrientation)) return; + if (mSettings.getCurrent().isSuggestionsRequested()) { + return; + } super.onExtractedCursorMovement(dx, dy); } @Override public void hideWindow() { - LatinImeLogger.commit(); mKeyboardSwitcher.onHideWindow(); - if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) { - AccessibleKeyboardViewProxy.getInstance().onHideWindow(); - } - if (TRACE) Debug.stopMethodTracing(); - if (mOptionsDialog != null && mOptionsDialog.isShowing()) { + if (isShowingOptionDialog()) { mOptionsDialog.dismiss(); mOptionsDialog = null; } @@ -1234,56 +1018,25 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } } - if (!mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) return; + if (!mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) { + return; + } + // If we have an update request in flight, we need to cancel it so it does not override + // these completions. + mHandler.cancelUpdateSuggestionStrip(); if (applicationSpecifiedCompletions == null) { - clearSuggestionStrip(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onDisplayCompletions(null); - } + setNeutralSuggestionStrip(); return; } - mApplicationSpecifiedCompletions = - CompletionInfoUtils.removeNulls(applicationSpecifiedCompletions); final ArrayList<SuggestedWords.SuggestedWordInfo> applicationSuggestedWords = SuggestedWords.getFromApplicationSpecifiedCompletions( applicationSpecifiedCompletions); - final SuggestedWords suggestedWords = new SuggestedWords( - applicationSuggestedWords, - false /* typedWordValid */, - false /* hasAutoCorrectionCandidate */, - false /* isPunctuationSuggestions */, - false /* isObsoleteSuggestions */, - false /* isPrediction */); - // When in fullscreen mode, show completions generated by the application - final boolean isAutoCorrection = false; - setSuggestedWords(suggestedWords, isAutoCorrection); - setAutoCorrectionIndicator(isAutoCorrection); - setSuggestionStripShown(true); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onDisplayCompletions(applicationSpecifiedCompletions); - } - } - - private void setSuggestionStripShownInternal(final boolean shown, - final boolean needsInputViewShown) { - // TODO: Modify this if we support suggestions with hard keyboard - if (onEvaluateInputViewShown() && mSuggestionStripView != null) { - final boolean inputViewShown = mKeyboardSwitcher.isShowingMainKeyboardOrEmojiPalettes(); - final boolean shouldShowSuggestions = shown - && (needsInputViewShown ? inputViewShown : true); - if (isFullscreenMode()) { - mSuggestionStripView.setVisibility( - shouldShowSuggestions ? View.VISIBLE : View.GONE); - } else { - mSuggestionStripView.setVisibility( - shouldShowSuggestions ? View.VISIBLE : View.INVISIBLE); - } - } - } - - private void setSuggestionStripShown(final boolean shown) { - setSuggestionStripShownInternal(shown, /* needsInputViewShown */true); + final SuggestedWords suggestedWords = new SuggestedWords(applicationSuggestedWords, + null /* rawSuggestions */, false /* typedWordValid */, false /* willAutoCorrect */, + false /* isObsoleteSuggestions */, false /* isPrediction */); + // When in fullscreen mode, show completions generated by the application forcibly + setSuggestedWords(suggestedWords); } private int getAdjustedBackingViewHeight() { @@ -1317,7 +1070,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen public void onComputeInsets(final InputMethodService.Insets outInsets) { super.onComputeInsets(outInsets); final View visibleKeyboardView = mKeyboardSwitcher.getVisibleKeyboardView(); - if (visibleKeyboardView == null || mSuggestionStripView == null) { + if (visibleKeyboardView == null || !hasSuggestionStripView()) { return; } final int adjustedBackingHeight = getAdjustedBackingViewHeight(); @@ -1353,9 +1106,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @Override public boolean onEvaluateFullscreenMode() { - // Reread resource value here, because this method is called by framework anytime as needed. - final boolean isFullscreenModeAllowed = - Settings.readUseFullscreenMode(getResources()); + // Reread resource value here, because this method is called by the framework as needed. + final boolean isFullscreenModeAllowed = Settings.readUseFullscreenMode(getResources()); if (super.onEvaluateFullscreenMode() && isFullscreenModeAllowed) { // TODO: Remove this hack. Actually we should not really assume NO_EXTRACT_UI // implies NO_FULLSCREEN. However, the framework mistakenly does. i.e. NO_EXTRACT_UI @@ -1378,138 +1130,30 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mKeyPreviewBackingView.setVisibility(isFullscreenMode() ? View.GONE : View.VISIBLE); } - // This will reset the whole input state to the starting state. It will clear - // the composing word, reset the last composed word, tell the inputconnection about it. - private void resetEntireInputState(final int newCursorPosition) { - final boolean shouldFinishComposition = mWordComposer.isComposingWord(); - resetComposingState(true /* alsoResetLastComposedWord */); - final SettingsValues settingsValues = mSettings.getCurrent(); - if (settingsValues.mBigramPredictionEnabled) { - clearSuggestionStrip(); - } else { - setSuggestedWords(settingsValues.mSuggestPuncList, false); - } - mConnection.resetCachesUponCursorMoveAndReturnSuccess(newCursorPosition, - shouldFinishComposition); + private int getCurrentAutoCapsState() { + return mInputLogic.getCurrentAutoCapsState(mSettings.getCurrent()); } - private void resetComposingState(final boolean alsoResetLastComposedWord) { - mWordComposer.reset(); - if (alsoResetLastComposedWord) - mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; + private int getCurrentRecapitalizeState() { + return mInputLogic.getCurrentRecapitalizeState(); } - private void commitTyped(final String separatorString) { - if (!mWordComposer.isComposingWord()) return; - final String typedWord = mWordComposer.getTypedWord(); - if (typedWord.length() > 0) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().onWordFinished(typedWord, mWordComposer.isBatchMode()); - } - commitChosenWord(typedWord, LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, - separatorString); - } - } - - // Called from the KeyboardSwitcher which needs to know auto caps state to display - // the right layout. - public int getCurrentAutoCapsState() { - final SettingsValues currentSettingsValues = mSettings.getCurrent(); - if (!currentSettingsValues.mAutoCap) return Constants.TextUtils.CAP_MODE_OFF; - - final EditorInfo ei = getCurrentInputEditorInfo(); - if (ei == null) return Constants.TextUtils.CAP_MODE_OFF; - final int inputType = ei.inputType; - // Warning: this depends on mSpaceState, which may not be the most current value. If - // mSpaceState gets updated later, whoever called this may need to be told about it. - return mConnection.getCursorCapsMode(inputType, currentSettingsValues, - SPACE_STATE_PHANTOM == mSpaceState); - } - - public int getCurrentRecapitalizeState() { - if (!mRecapitalizeStatus.isActive() - || !mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) { - // Not recapitalizing at the moment - return RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; - } - return mRecapitalizeStatus.getCurrentMode(); - } - - // Factor in auto-caps and manual caps and compute the current caps mode. - private int getActualCapsMode() { - final int keyboardShiftMode = mKeyboardSwitcher.getKeyboardShiftMode(); - if (keyboardShiftMode != WordComposer.CAPS_MODE_AUTO_SHIFTED) return keyboardShiftMode; - final int auto = getCurrentAutoCapsState(); - if (0 != (auto & TextUtils.CAP_MODE_CHARACTERS)) { - return WordComposer.CAPS_MODE_AUTO_SHIFT_LOCKED; - } - if (0 != auto) return WordComposer.CAPS_MODE_AUTO_SHIFTED; - return WordComposer.CAPS_MODE_OFF; - } - - private void swapSwapperAndSpace() { - final CharSequence lastTwo = mConnection.getTextBeforeCursor(2, 0); - // It is guaranteed lastTwo.charAt(1) is a swapper - else this method is not called. - if (lastTwo != null && lastTwo.length() == 2 - && lastTwo.charAt(0) == Constants.CODE_SPACE) { - mConnection.deleteSurroundingText(2, 0); - final String text = lastTwo.charAt(1) + " "; - mConnection.commitText(text, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_swapSwapperAndSpace(lastTwo, text); - } - mKeyboardSwitcher.updateShiftState(); - } + public Locale getCurrentSubtypeLocale() { + return mSubtypeSwitcher.getCurrentSubtypeLocale(); } - private boolean maybeDoubleSpacePeriod() { - final SettingsValues currentSettingsValues = mSettings.getCurrent(); - if (!currentSettingsValues.mUseDoubleSpacePeriod) return false; - if (!mHandler.isAcceptingDoubleSpacePeriod()) return false; - // We only do this when we see two spaces and an accepted code point before the cursor. - // The code point may be a surrogate pair but the two spaces may not, so we need 4 chars. - final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0); - if (null == lastThree) return false; - final int length = lastThree.length(); - if (length < 3) return false; - if (lastThree.charAt(length - 1) != Constants.CODE_SPACE) return false; - if (lastThree.charAt(length - 2) != Constants.CODE_SPACE) return false; - // We know there are spaces in pos -1 and -2, and we have at least three chars. - // If we have only three chars, isSurrogatePairs can't return true as charAt(1) is a space, - // so this is fine. - final int firstCodePoint = - Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ? - Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3); - if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) { - mHandler.cancelDoubleSpacePeriodTimer(); - mConnection.deleteSurroundingText(2, 0); - final String textToInsert = new String( - new int[] { currentSettingsValues.mSentenceSeparator, Constants.CODE_SPACE }, - 0, 2); - mConnection.commitText(textToInsert, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_maybeDoubleSpacePeriod(textToInsert, - false /* isBatchMode */); - } - mKeyboardSwitcher.updateShiftState(); - return true; + /** + * @param codePoints code points to get coordinates for. + * @return x,y coordinates for this keyboard, as a flattened array. + */ + public int[] getCoordinatesForCurrentKeyboard(final int[] codePoints) { + final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); + if (null == keyboard) { + return CoordinateUtils.newCoordinateArray(codePoints.length, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); + } else { + return keyboard.getCoordinates(codePoints); } - return false; - } - - private static boolean canBeFollowedByDoubleSpacePeriod(final int codePoint) { - // TODO: Check again whether there really ain't a better way to check this. - // TODO: This should probably be language-dependant... - return Character.isLetterOrDigit(codePoint) - || codePoint == Constants.CODE_SINGLE_QUOTE - || codePoint == Constants.CODE_DOUBLE_QUOTE - || codePoint == Constants.CODE_CLOSING_PARENTHESIS - || codePoint == Constants.CODE_CLOSING_SQUARE_BRACKET - || codePoint == Constants.CODE_CLOSING_CURLY_BRACKET - || codePoint == Constants.CODE_CLOSING_ANGLE_BRACKET - || codePoint == Constants.CODE_PLUS - || codePoint == Constants.CODE_PERCENT - || Character.getType(codePoint) == Character.OTHER_SYMBOL; } // Callback for the {@link SuggestionStripView}, to call when the "add to dictionary" hint is @@ -1521,16 +1165,37 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen return; } final String wordToEdit; - if (CapsModeUtils.isAutoCapsMode(mLastComposedWord.mCapitalizedMode)) { - wordToEdit = word.toLowerCase(mSubtypeSwitcher.getCurrentSubtypeLocale()); + if (CapsModeUtils.isAutoCapsMode(mInputLogic.mLastComposedWord.mCapitalizedMode)) { + wordToEdit = word.toLowerCase(getCurrentSubtypeLocale()); } else { wordToEdit = word; } - mUserDictionary.addWordToUserDictionary(wordToEdit); + mDictionaryFacilitator.addWordToUserDictionary(this /* context */, wordToEdit); + } + + // Callback for the {@link SuggestionStripView}, to call when the important notice strip is + // pressed. + @Override + public void showImportantNoticeContents() { + showOptionDialog(new ImportantNoticeDialog(this /* context */, this /* listener */)); + } + + // Implement {@link ImportantNoticeDialog.ImportantNoticeDialogListener} + @Override + public void onClickSettingsOfImportantNoticeDialog(final int nextVersion) { + launchSettings(); } - private void onSettingsKeyPressed() { - if (isShowingOptionDialog()) return; + // Implement {@link ImportantNoticeDialog.ImportantNoticeDialogListener} + @Override + public void onUserAcknowledgmentOfImportantNoticeDialog(final int nextVersion) { + setNeutralSuggestionStrip(); + } + + public void displaySettingsDialog() { + if (isShowingOptionDialog()) { + return; + } showSubtypeSelectorAndSettings(); } @@ -1552,408 +1217,105 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen return mOptionsDialog != null && mOptionsDialog.isShowing(); } - private void performEditorAction(final int actionId) { - mConnection.performEditorAction(actionId); - } - // TODO: Revise the language switch key behavior to make it much smarter and more reasonable. - private void handleLanguageSwitchKey() { + public void switchToNextSubtype() { final IBinder token = getWindow().getWindow().getAttributes().token; - if (mSettings.getCurrent().mIncludesOtherImesInLanguageSwitchList) { + if (shouldSwitchToOtherInputMethods()) { mRichImm.switchToNextInputMethod(token, false /* onlyCurrentIme */); return; } mSubtypeState.switchSubtype(token, mRichImm); } - private void sendDownUpKeyEvent(final int code) { - final long eventTime = SystemClock.uptimeMillis(); - mConnection.sendKeyEvent(new KeyEvent(eventTime, eventTime, - KeyEvent.ACTION_DOWN, code, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, - KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); - mConnection.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime, - KeyEvent.ACTION_UP, code, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, - KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); - } - - private void sendKeyCodePoint(final int code) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_sendKeyCodePoint(code); - } - // TODO: Remove this special handling of digit letters. - // For backward compatibility. See {@link InputMethodService#sendKeyChar(char)}. - if (code >= '0' && code <= '9') { - sendDownUpKeyEvent(code - '0' + KeyEvent.KEYCODE_0); - return; - } - - if (Constants.CODE_ENTER == code && mAppWorkAroundsUtils.isBeforeJellyBean()) { - // Backward compatibility mode. Before Jelly bean, the keyboard would simulate - // a hardware keyboard event on pressing enter or delete. This is bad for many - // reasons (there are race conditions with commits) but some applications are - // relying on this behavior so we continue to support it for older apps. - sendDownUpKeyEvent(KeyEvent.KEYCODE_ENTER); - } else { - mConnection.commitText(StringUtils.newSingleCodePointString(code), 1); - } - } - // Implementation of {@link KeyboardActionListener}. @Override - public void onCodeInput(final int primaryCode, final int x, final int y) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onCodeInput(primaryCode, x, y); - } - final long when = SystemClock.uptimeMillis(); - if (primaryCode != Constants.CODE_DELETE || when > mLastKeyTime + QUICK_PRESS) { - mDeleteCount = 0; - } - mLastKeyTime = when; - mConnection.beginBatchEdit(); - final KeyboardSwitcher switcher = mKeyboardSwitcher; - // The space state depends only on the last character pressed and its own previous - // state. Here, we revert the space state to neutral if the key is actually modifying - // the input contents (any non-shift key), which is what we should do for - // all inputs that do not result in a special state. Each character handling is then - // free to override the state as they see fit. - final int spaceState = mSpaceState; - if (!mWordComposer.isComposingWord()) mIsAutoCorrectionIndicatorOn = false; - - // TODO: Consolidate the double-space period timer, mLastKeyTime, and the space state. - if (primaryCode != Constants.CODE_SPACE) { - mHandler.cancelDoubleSpacePeriodTimer(); - } - - boolean didAutoCorrect = false; - switch (primaryCode) { - case Constants.CODE_DELETE: - mSpaceState = SPACE_STATE_NONE; - handleBackspace(spaceState); - LatinImeLogger.logOnDelete(x, y); - break; - case Constants.CODE_SHIFT: - // Note: Calling back to the keyboard on Shift key is handled in - // {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. - final Keyboard currentKeyboard = switcher.getKeyboard(); + public void onCodeInput(final int codePoint, final int x, final int y, + final boolean isKeyRepeat) { + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + // x and y include some padding, but everything down the line (especially native + // code) needs the coordinates in the keyboard frame. + // TODO: We should reconsider which coordinate system should be used to represent + // keyboard event. Also we should pull this up -- LatinIME has no business doing + // this transformation, it should be done already before calling onCodeInput. + final int keyX = mainKeyboardView.getKeyX(x); + final int keyY = mainKeyboardView.getKeyY(y); + final int codeToSend; + if (Constants.CODE_SHIFT == codePoint) { + // TODO: Instead of checking for alphabetic keyboard here, separate keycodes for + // alphabetic shift and shift while in symbol layout. + final Keyboard currentKeyboard = mKeyboardSwitcher.getKeyboard(); if (null != currentKeyboard && currentKeyboard.mId.isAlphabetKeyboard()) { - // TODO: Instead of checking for alphabetic keyboard here, separate keycodes for - // alphabetic shift and shift while in symbol layout. - handleRecapitalize(); - } - break; - case Constants.CODE_CAPSLOCK: - // Note: Changing keyboard to shift lock state is handled in - // {@link KeyboardSwitcher#onCodeInput(int)}. - break; - case Constants.CODE_SWITCH_ALPHA_SYMBOL: - // Note: Calling back to the keyboard on symbol key is handled in - // {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. - break; - case Constants.CODE_SETTINGS: - onSettingsKeyPressed(); - break; - case Constants.CODE_SHORTCUT: - mSubtypeSwitcher.switchToShortcutIME(this); - break; - case Constants.CODE_ACTION_NEXT: - performEditorAction(EditorInfo.IME_ACTION_NEXT); - break; - case Constants.CODE_ACTION_PREVIOUS: - performEditorAction(EditorInfo.IME_ACTION_PREVIOUS); - break; - case Constants.CODE_LANGUAGE_SWITCH: - handleLanguageSwitchKey(); - break; - case Constants.CODE_EMOJI: - // Note: Switching emoji keyboard is being handled in - // {@link KeyboardState#onCodeInput(int,int)}. - break; - case Constants.CODE_ENTER: - final EditorInfo editorInfo = getCurrentInputEditorInfo(); - final int imeOptionsActionId = - InputTypeUtils.getImeOptionsActionIdFromEditorInfo(editorInfo); - if (InputTypeUtils.IME_ACTION_CUSTOM_LABEL == imeOptionsActionId) { - // Either we have an actionLabel and we should performEditorAction with actionId - // regardless of its value. - performEditorAction(editorInfo.actionId); - } else if (EditorInfo.IME_ACTION_NONE != imeOptionsActionId) { - // We didn't have an actionLabel, but we had another action to execute. - // EditorInfo.IME_ACTION_NONE explicitly means no action. In contrast, - // EditorInfo.IME_ACTION_UNSPECIFIED is the default value for an action, so it - // means there should be an action and the app didn't bother to set a specific - // code for it - presumably it only handles one. It does not have to be treated - // in any specific way: anything that is not IME_ACTION_NONE should be sent to - // performEditorAction. - performEditorAction(imeOptionsActionId); + codeToSend = codePoint; } else { - // No action label, and the action from imeOptions is NONE: this is a regular - // enter key that should input a carriage return. - didAutoCorrect = handleNonSpecialCharacter(Constants.CODE_ENTER, x, y, spaceState); + codeToSend = Constants.CODE_SYMBOL_SHIFT; } - break; - case Constants.CODE_SHIFT_ENTER: - didAutoCorrect = handleNonSpecialCharacter(Constants.CODE_ENTER, x, y, spaceState); - break; - default: - didAutoCorrect = handleNonSpecialCharacter(primaryCode, x, y, spaceState); - break; - } - switcher.onCodeInput(primaryCode); - // Reset after any single keystroke, except shift, capslock, and symbol-shift - if (!didAutoCorrect && primaryCode != Constants.CODE_SHIFT - && primaryCode != Constants.CODE_CAPSLOCK - && primaryCode != Constants.CODE_SWITCH_ALPHA_SYMBOL) - mLastComposedWord.deactivate(); - if (Constants.CODE_DELETE != primaryCode) { - mEnteredText = null; + } else { + codeToSend = codePoint; } - mConnection.endBatchEdit(); - } - - private boolean handleNonSpecialCharacter(final int primaryCode, final int x, final int y, - final int spaceState) { - mSpaceState = SPACE_STATE_NONE; - final boolean didAutoCorrect; - final SettingsValues settingsValues = mSettings.getCurrent(); - if (settingsValues.isWordSeparator(primaryCode) - || Character.getType(primaryCode) == Character.OTHER_SYMBOL) { - didAutoCorrect = handleSeparator(primaryCode, x, y, spaceState); + if (Constants.CODE_SHORTCUT == codePoint) { + mSubtypeSwitcher.switchToShortcutIME(this); + // Still call the *#onCodeInput methods for readability. + } + final Event event = createSoftwareKeypressEvent(codeToSend, keyX, keyY, isKeyRepeat); + final InputTransaction completeInputTransaction = + mInputLogic.onCodeInput(mSettings.getCurrent(), event, + mKeyboardSwitcher.getKeyboardShiftMode(), + mKeyboardSwitcher.getCurrentKeyboardScriptId(), mHandler); + updateStateAfterInputTransaction(completeInputTransaction); + mKeyboardSwitcher.onCodeInput(codePoint, getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); + } + + // A helper method to split the code point and the key code. Ultimately, they should not be + // squashed into the same variable, and this method should be removed. + private static Event createSoftwareKeypressEvent(final int keyCodeOrCodePoint, final int keyX, + final int keyY, final boolean isKeyRepeat) { + final int keyCode; + final int codePoint; + if (keyCodeOrCodePoint <= 0) { + keyCode = keyCodeOrCodePoint; + codePoint = Event.NOT_A_CODE_POINT; } else { - didAutoCorrect = false; - if (SPACE_STATE_PHANTOM == spaceState) { - if (settingsValues.mIsInternal) { - if (mWordComposer.isComposingWord() && mWordComposer.isBatchMode()) { - LatinImeLoggerUtils.onAutoCorrection( - "", mWordComposer.getTypedWord(), " ", mWordComposer); - } - } - if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { - // If we are in the middle of a recorrection, we need to commit the recorrection - // first so that we can insert the character at the current cursor position. - resetEntireInputState(mLastSelectionStart); - } else { - commitTyped(LastComposedWord.NOT_A_SEPARATOR); - } - } - final int keyX, keyY; - final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); - if (keyboard != null && keyboard.hasProximityCharsCorrection(primaryCode)) { - keyX = x; - keyY = y; - } else { - keyX = Constants.NOT_A_COORDINATE; - keyY = Constants.NOT_A_COORDINATE; - } - handleCharacter(primaryCode, keyX, keyY, spaceState); + keyCode = Event.NOT_A_KEY_CODE; + codePoint = keyCodeOrCodePoint; } - mExpectingUpdateSelection = true; - return didAutoCorrect; + return Event.createSoftwareKeypressEvent(codePoint, keyCode, keyX, keyY, isKeyRepeat); } // Called from PointerTracker through the KeyboardActionListener interface @Override public void onTextInput(final String rawText) { - mConnection.beginBatchEdit(); - if (mWordComposer.isComposingWord()) { - commitCurrentAutoCorrection(rawText); - } else { - resetComposingState(true /* alsoResetLastComposedWord */); - } - mHandler.postUpdateSuggestionStrip(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS - && ResearchLogger.RESEARCH_KEY_OUTPUT_TEXT.equals(rawText)) { - ResearchLogger.getInstance().onResearchKeySelected(this); - return; - } - final String text = specificTldProcessingOnTextInput(rawText); - if (SPACE_STATE_PHANTOM == mSpaceState) { - promotePhantomSpace(); - } - mConnection.commitText(text, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onTextInput(text, false /* isBatchMode */); - } - mConnection.endBatchEdit(); - // Space state must be updated before calling updateShiftState - mSpaceState = SPACE_STATE_NONE; - mKeyboardSwitcher.updateShiftState(); - mKeyboardSwitcher.onCodeInput(Constants.CODE_OUTPUT_TEXT); - mEnteredText = text; + // TODO: have the keyboard pass the correct key code when we need it. + final Event event = Event.createSoftwareTextEvent(rawText, Event.NOT_A_KEY_CODE); + final InputTransaction completeInputTransaction = + mInputLogic.onTextInput(mSettings.getCurrent(), event, + mKeyboardSwitcher.getKeyboardShiftMode(), mHandler); + updateStateAfterInputTransaction(completeInputTransaction); + mKeyboardSwitcher.onCodeInput(Constants.CODE_OUTPUT_TEXT, getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); } @Override public void onStartBatchInput() { - mInputUpdater.onStartBatchInput(); - mHandler.cancelUpdateSuggestionStrip(); - mConnection.beginBatchEdit(); - final SettingsValues settingsValues = mSettings.getCurrent(); - if (mWordComposer.isComposingWord()) { - if (settingsValues.mIsInternal) { - if (mWordComposer.isBatchMode()) { - LatinImeLoggerUtils.onAutoCorrection( - "", mWordComposer.getTypedWord(), " ", mWordComposer); - } - } - final int wordComposerSize = mWordComposer.size(); - // Since isComposingWord() is true, the size is at least 1. - if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { - // If we are in the middle of a recorrection, we need to commit the recorrection - // first so that we can insert the batch input at the current cursor position. - resetEntireInputState(mLastSelectionStart); - } else if (wordComposerSize <= 1) { - // We auto-correct the previous (typed, not gestured) string iff it's one character - // long. The reason for this is, even in the middle of gesture typing, you'll still - // tap one-letter words and you want them auto-corrected (typically, "i" in English - // should become "I"). However for any longer word, we assume that the reason for - // tapping probably is that the word you intend to type is not in the dictionary, - // so we do not attempt to correct, on the assumption that if that was a dictionary - // word, the user would probably have gestured instead. - commitCurrentAutoCorrection(LastComposedWord.NOT_A_SEPARATOR); - } else { - commitTyped(LastComposedWord.NOT_A_SEPARATOR); - } - mExpectingUpdateSelection = true; - } - final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); - if (Character.isLetterOrDigit(codePointBeforeCursor) - || settingsValues.isUsuallyFollowedBySpace(codePointBeforeCursor)) { - mSpaceState = SPACE_STATE_PHANTOM; - } - mConnection.endBatchEdit(); - mWordComposer.setCapitalizedModeAtStartComposingTime(getActualCapsMode()); + mInputLogic.onStartBatchInput(mSettings.getCurrent(), mKeyboardSwitcher, mHandler); } - static final class InputUpdater implements Handler.Callback { - private final Handler mHandler; - private final LatinIME mLatinIme; - private final Object mLock = new Object(); - private boolean mInBatchInput; // synchronized using {@link #mLock}. - - InputUpdater(final LatinIME latinIme) { - final HandlerThread handlerThread = new HandlerThread( - InputUpdater.class.getSimpleName()); - handlerThread.start(); - mHandler = new Handler(handlerThread.getLooper(), this); - mLatinIme = latinIme; - } - - private static final int MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP = 1; - private static final int MSG_GET_SUGGESTED_WORDS = 2; - - @Override - public boolean handleMessage(final Message msg) { - // TODO: straighten message passing - we don't need two kinds of messages calling - // each other. - switch (msg.what) { - case MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP: - updateBatchInput((InputPointers)msg.obj, msg.arg2 /* sequenceNumber */); - break; - case MSG_GET_SUGGESTED_WORDS: - mLatinIme.getSuggestedWords(msg.arg1 /* sessionId */, - msg.arg2 /* sequenceNumber */, (OnGetSuggestedWordsCallback) msg.obj); - break; - } - return true; - } - - // Run in the UI thread. - public void onStartBatchInput() { - synchronized (mLock) { - mHandler.removeMessages(MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP); - mInBatchInput = true; - mLatinIme.mHandler.showGesturePreviewAndSuggestionStrip( - SuggestedWords.EMPTY, false /* dismissGestureFloatingPreviewText */); - } - } - - // Run in the Handler thread. - private void updateBatchInput(final InputPointers batchPointers, final int sequenceNumber) { - synchronized (mLock) { - if (!mInBatchInput) { - // Batch input has ended or canceled while the message was being delivered. - return; - } - - getSuggestedWordsGestureLocked(batchPointers, sequenceNumber, - new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(final SuggestedWords suggestedWords) { - mLatinIme.mHandler.showGesturePreviewAndSuggestionStrip( - suggestedWords, false /* dismissGestureFloatingPreviewText */); - } - }); - } - } - - // Run in the UI thread. - public void onUpdateBatchInput(final InputPointers batchPointers, - final int sequenceNumber) { - if (mHandler.hasMessages(MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP)) { - return; - } - mHandler.obtainMessage(MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP, 0 /* arg1 */, - sequenceNumber /* arg2 */, batchPointers /* obj */).sendToTarget(); - } - - public void onCancelBatchInput() { - synchronized (mLock) { - mInBatchInput = false; - mLatinIme.mHandler.showGesturePreviewAndSuggestionStrip( - SuggestedWords.EMPTY, true /* dismissGestureFloatingPreviewText */); - } - } - - // Run in the UI thread. - public void onEndBatchInput(final InputPointers batchPointers) { - synchronized(mLock) { - getSuggestedWordsGestureLocked(batchPointers, SuggestedWords.NOT_A_SEQUENCE_NUMBER, - new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(final SuggestedWords suggestedWords) { - mInBatchInput = false; - mLatinIme.mHandler.showGesturePreviewAndSuggestionStrip(suggestedWords, - true /* dismissGestureFloatingPreviewText */); - mLatinIme.mHandler.onEndBatchInput(suggestedWords); - } - }); - } - } - - // {@link LatinIME#getSuggestedWords(int)} method calls with same session id have to - // be synchronized. - private void getSuggestedWordsGestureLocked(final InputPointers batchPointers, - final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - mLatinIme.mWordComposer.setBatchInputPointers(batchPointers); - mLatinIme.getSuggestedWordsOrOlderSuggestionsAsync(Suggest.SESSION_GESTURE, - sequenceNumber, new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(SuggestedWords suggestedWords) { - final int suggestionCount = suggestedWords.size(); - if (suggestionCount <= 1) { - final String mostProbableSuggestion = (suggestionCount == 0) ? null - : suggestedWords.getWord(0); - callback.onGetSuggestedWords( - mLatinIme.getOlderSuggestions(mostProbableSuggestion)); - } - callback.onGetSuggestedWords(suggestedWords); - } - }); - } + @Override + public void onUpdateBatchInput(final InputPointers batchPointers) { + mInputLogic.onUpdateBatchInput(mSettings.getCurrent(), batchPointers, mKeyboardSwitcher); + } - public void getSuggestedWords(final int sessionId, final int sequenceNumber, - final OnGetSuggestedWordsCallback callback) { - mHandler.obtainMessage(MSG_GET_SUGGESTED_WORDS, sessionId, sequenceNumber, callback) - .sendToTarget(); - } + @Override + public void onEndBatchInput(final InputPointers batchPointers) { + mInputLogic.onEndBatchInput(batchPointers); + } - void quitLooper() { - mHandler.removeMessages(MSG_GET_SUGGESTED_WORDS); - mHandler.removeMessages(MSG_UPDATE_GESTURE_PREVIEW_AND_SUGGESTION_STRIP); - mHandler.getLooper().quit(); - } + @Override + public void onCancelBatchInput() { + mInputLogic.onCancelBatchInput(mHandler); } - // This method must run in UI Thread. + // This method must run on the UI Thread. private void showGesturePreviewAndSuggestionStrip(final SuggestedWords suggestedWords, final boolean dismissGestureFloatingPreviewText) { showSuggestionStrip(suggestedWords); @@ -1964,107 +1326,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } - /* The sequence number member is only used in onUpdateBatchInput. It is increased each time - * auto-commit happens. The reason we need this is, when auto-commit happens we trim the - * input pointers that are held in a singleton, and to know how much to trim we rely on the - * results of the suggestion process that is held in mSuggestedWords. - * However, the suggestion process is asynchronous, and sometimes we may enter the - * onUpdateBatchInput method twice without having recomputed suggestions yet, or having - * received new suggestions generated from not-yet-trimmed input pointers. In this case, the - * mIndexOfTouchPointOfSecondWords member will be out of date, and we must not use it lest we - * remove an unrelated number of pointers (possibly even more than are left in the input - * pointers, leading to a crash). - * To avoid that, we increase the sequence number each time we auto-commit and trim the - * input pointers, and we do not use any suggested words that have been generated with an - * earlier sequence number. - */ - private int mAutoCommitSequenceNumber = 1; - @Override - public void onUpdateBatchInput(final InputPointers batchPointers) { - if (mSettings.getCurrent().mPhraseGestureEnabled) { - final SuggestedWordInfo candidate = mSuggestedWords.getAutoCommitCandidate(); - // If these suggested words have been generated with out of date input pointers, then - // we skip auto-commit (see comments above on the mSequenceNumber member). - if (null != candidate && mSuggestedWords.mSequenceNumber >= mAutoCommitSequenceNumber) { - if (candidate.mSourceDict.shouldAutoCommit(candidate)) { - final String[] commitParts = candidate.mWord.split(" ", 2); - batchPointers.shift(candidate.mIndexOfTouchPointOfSecondWord); - promotePhantomSpace(); - mConnection.commitText(commitParts[0], 0); - mSpaceState = SPACE_STATE_PHANTOM; - mKeyboardSwitcher.updateShiftState(); - mWordComposer.setCapitalizedModeAtStartComposingTime(getActualCapsMode()); - ++mAutoCommitSequenceNumber; - } - } - } - mInputUpdater.onUpdateBatchInput(batchPointers, mAutoCommitSequenceNumber); - } - - // This method must run in UI Thread. - public void onEndBatchInputAsyncInternal(final SuggestedWords suggestedWords) { - final String batchInputText = suggestedWords.isEmpty() - ? null : suggestedWords.getWord(0); - if (TextUtils.isEmpty(batchInputText)) { - return; - } - mConnection.beginBatchEdit(); - if (SPACE_STATE_PHANTOM == mSpaceState) { - promotePhantomSpace(); - } - if (mSettings.getCurrent().mPhraseGestureEnabled) { - // Find the last space - final int indexOfLastSpace = batchInputText.lastIndexOf(Constants.CODE_SPACE) + 1; - if (0 != indexOfLastSpace) { - mConnection.commitText(batchInputText.substring(0, indexOfLastSpace), 1); - showSuggestionStrip(suggestedWords.getSuggestedWordsForLastWordOfPhraseGesture()); - } - final String lastWord = batchInputText.substring(indexOfLastSpace); - mWordComposer.setBatchInputWord(lastWord); - mConnection.setComposingText(lastWord, 1); - } else { - mWordComposer.setBatchInputWord(batchInputText); - mConnection.setComposingText(batchInputText, 1); - } - mExpectingUpdateSelection = true; - mConnection.endBatchEdit(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onEndBatchInput(batchInputText, 0, suggestedWords); - } - // Space state must be updated before calling updateShiftState - mSpaceState = SPACE_STATE_PHANTOM; - mKeyboardSwitcher.updateShiftState(); - } - - @Override - public void onEndBatchInput(final InputPointers batchPointers) { - mInputUpdater.onEndBatchInput(batchPointers); - } - - private String specificTldProcessingOnTextInput(final String text) { - if (text.length() <= 1 || text.charAt(0) != Constants.CODE_PERIOD - || !Character.isLetter(text.charAt(1))) { - // Not a tld: do nothing. - return text; - } - // We have a TLD (or something that looks like this): make sure we don't add - // a space even if currently in phantom mode. - mSpaceState = SPACE_STATE_NONE; - // TODO: use getCodePointBeforeCursor instead to improve performance and simplify the code - final CharSequence lastOne = mConnection.getTextBeforeCursor(1, 0); - if (lastOne != null && lastOne.length() == 1 - && lastOne.charAt(0) == Constants.CODE_PERIOD) { - return text.substring(1); - } else { - return text; - } - } - // Called from PointerTracker through the KeyboardActionListener interface @Override public void onFinishSlidingInput() { // User finished sliding input. - mKeyboardSwitcher.onFinishSlidingInput(); + mKeyboardSwitcher.onFinishSlidingInput(getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); } // Called from PointerTracker through the KeyboardActionListener interface @@ -2074,1006 +1341,126 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Nothing to do so far. } - @Override - public void onCancelBatchInput() { - mInputUpdater.onCancelBatchInput(); - } - - private void handleBackspace(final int spaceState) { - // We revert these in this method if the deletion doesn't happen. - mDeleteCount++; - mExpectingUpdateSelection = true; - - // In many cases, we may have to put the keyboard in auto-shift state again. However - // we want to wait a few milliseconds before doing it to avoid the keyboard flashing - // during key repeat. - mHandler.postUpdateShiftState(); - - if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { - // If we are in the middle of a recorrection, we need to commit the recorrection - // first so that we can remove the character at the current cursor position. - resetEntireInputState(mLastSelectionStart); - // When we exit this if-clause, mWordComposer.isComposingWord() will return false. - } - if (mWordComposer.isComposingWord()) { - if (mWordComposer.isBatchMode()) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final String word = mWordComposer.getTypedWord(); - ResearchLogger.latinIME_handleBackspace_batch(word, 1); - } - final String rejectedSuggestion = mWordComposer.getTypedWord(); - mWordComposer.reset(); - mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); - } else { - mWordComposer.deleteLast(); - } - mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1); - mHandler.postUpdateSuggestionStrip(); - if (!mWordComposer.isComposingWord()) { - // If we just removed the last character, auto-caps mode may have changed so we - // need to re-evaluate. - mKeyboardSwitcher.updateShiftState(); - } - } else { - final SettingsValues currentSettings = mSettings.getCurrent(); - if (mLastComposedWord.canRevertCommit()) { - if (currentSettings.mIsInternal) { - LatinImeLoggerUtils.onAutoCorrectionCancellation(); - } - revertCommit(); - return; - } - if (mEnteredText != null && mConnection.sameAsTextBeforeCursor(mEnteredText)) { - // Cancel multi-character input: remove the text we just entered. - // This is triggered on backspace after a key that inputs multiple characters, - // like the smiley key or the .com key. - mConnection.deleteSurroundingText(mEnteredText.length(), 0); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleBackspace_cancelTextInput(mEnteredText); - } - mEnteredText = null; - // If we have mEnteredText, then we know that mHasUncommittedTypedChars == false. - // In addition we know that spaceState is false, and that we should not be - // reverting any autocorrect at this point. So we can safely return. - return; - } - if (SPACE_STATE_DOUBLE == spaceState) { - mHandler.cancelDoubleSpacePeriodTimer(); - if (mConnection.revertDoubleSpacePeriod()) { - // No need to reset mSpaceState, it has already be done (that's why we - // receive it as a parameter) - return; - } - } else if (SPACE_STATE_SWAP_PUNCTUATION == spaceState) { - if (mConnection.revertSwapPunctuation()) { - // Likewise - return; - } - } - - // No cancelling of commit/double space/swap: we have a regular backspace. - // We should backspace one char and restart suggestion if at the end of a word. - if (mLastSelectionStart != mLastSelectionEnd) { - // If there is a selection, remove it. - final int numCharsDeleted = mLastSelectionEnd - mLastSelectionStart; - mConnection.setSelection(mLastSelectionEnd, mLastSelectionEnd); - // Reset mLastSelectionEnd to mLastSelectionStart. This is what is supposed to - // happen, and if it's wrong, the next call to onUpdateSelection will correct it, - // but we want to set it right away to avoid it being used with the wrong values - // later (typically, in a subsequent press on backspace). - mLastSelectionEnd = mLastSelectionStart; - mConnection.deleteSurroundingText(numCharsDeleted, 0); - } else { - // There is no selection, just delete one character. - if (NOT_A_CURSOR_POSITION == mLastSelectionEnd) { - // This should never happen. - Log.e(TAG, "Backspace when we don't know the selection position"); - } - if (mAppWorkAroundsUtils.isBeforeJellyBean() || - currentSettings.mInputAttributes.isTypeNull()) { - // There are two possible reasons to send a key event: either the field has - // type TYPE_NULL, in which case the keyboard should send events, or we are - // running in backward compatibility mode. Before Jelly bean, the keyboard - // would simulate a hardware keyboard event on pressing enter or delete. This - // is bad for many reasons (there are race conditions with commits) but some - // applications are relying on this behavior so we continue to support it for - // older apps, so we retain this behavior if the app has target SDK < JellyBean. - sendDownUpKeyEvent(KeyEvent.KEYCODE_DEL); - if (mDeleteCount > DELETE_ACCELERATE_AT) { - sendDownUpKeyEvent(KeyEvent.KEYCODE_DEL); - } - } else { - final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); - if (codePointBeforeCursor == Constants.NOT_A_CODE) { - // Nothing to delete before the cursor. We have to revert the deletion - // states that were updated at the beginning of this method. - mDeleteCount--; - mExpectingUpdateSelection = false; - return; - } - final int lengthToDelete = - Character.isSupplementaryCodePoint(codePointBeforeCursor) ? 2 : 1; - mConnection.deleteSurroundingText(lengthToDelete, 0); - if (mDeleteCount > DELETE_ACCELERATE_AT) { - final int codePointBeforeCursorToDeleteAgain = - mConnection.getCodePointBeforeCursor(); - if (codePointBeforeCursorToDeleteAgain != Constants.NOT_A_CODE) { - final int lengthToDeleteAgain = Character.isSupplementaryCodePoint( - codePointBeforeCursorToDeleteAgain) ? 2 : 1; - mConnection.deleteSurroundingText(lengthToDeleteAgain, 0); - } - } - } - } - if (currentSettings.isSuggestionsRequested(mDisplayOrientation) - && currentSettings.mCurrentLanguageHasSpaces) { - restartSuggestionsOnWordBeforeCursorIfAtEndOfWord(); - } - // We just removed a character. We need to update the auto-caps state. - mKeyboardSwitcher.updateShiftState(); - } - } - - /* - * Strip a trailing space if necessary and returns whether it's a swap weak space situation. - */ - private boolean maybeStripSpace(final int code, - final int spaceState, final boolean isFromSuggestionStrip) { - if (Constants.CODE_ENTER == code && SPACE_STATE_SWAP_PUNCTUATION == spaceState) { - mConnection.removeTrailingSpace(); - return false; - } - if ((SPACE_STATE_WEAK == spaceState || SPACE_STATE_SWAP_PUNCTUATION == spaceState) - && isFromSuggestionStrip) { - final SettingsValues currentSettings = mSettings.getCurrent(); - if (currentSettings.isUsuallyPrecededBySpace(code)) return false; - if (currentSettings.isUsuallyFollowedBySpace(code)) return true; - mConnection.removeTrailingSpace(); - } - return false; - } - - private void handleCharacter(final int primaryCode, final int x, - final int y, final int spaceState) { - // TODO: refactor this method to stop flipping isComposingWord around all the time, and - // make it shorter (possibly cut into several pieces). Also factor handleNonSpecialCharacter - // which has the same name as other handle* methods but is not the same. - boolean isComposingWord = mWordComposer.isComposingWord(); - - // TODO: remove isWordConnector() and use isUsuallyFollowedBySpace() instead. - // See onStartBatchInput() to see how to do it. - final SettingsValues currentSettings = mSettings.getCurrent(); - if (SPACE_STATE_PHANTOM == spaceState && !currentSettings.isWordConnector(primaryCode)) { - if (isComposingWord) { - // Sanity check - throw new RuntimeException("Should not be composing here"); - } - promotePhantomSpace(); - } - - if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { - // If we are in the middle of a recorrection, we need to commit the recorrection - // first so that we can insert the character at the current cursor position. - resetEntireInputState(mLastSelectionStart); - isComposingWord = false; - } - // We want to find out whether to start composing a new word with this character. If so, - // we need to reset the composing state and switch isComposingWord. The order of the - // tests is important for good performance. - // We only start composing if we're not already composing. - if (!isComposingWord - // We only start composing if this is a word code point. Essentially that means it's a - // a letter or a word connector. - && currentSettings.isWordCodePoint(primaryCode) - // We never go into composing state if suggestions are not requested. - && currentSettings.isSuggestionsRequested(mDisplayOrientation) && - // In languages with spaces, we only start composing a word when we are not already - // touching a word. In languages without spaces, the above conditions are sufficient. - (!mConnection.isCursorTouchingWord(currentSettings) - || !currentSettings.mCurrentLanguageHasSpaces)) { - // Reset entirely the composing state anyway, then start composing a new word unless - // the character is a single quote or a dash. The idea here is, single quote and dash - // are not separators and they should be treated as normal characters, except in the - // first position where they should not start composing a word. - isComposingWord = (Constants.CODE_SINGLE_QUOTE != primaryCode - && Constants.CODE_DASH != primaryCode); - // Here we don't need to reset the last composed word. It will be reset - // when we commit this one, if we ever do; if on the other hand we backspace - // it entirely and resume suggestions on the previous word, we'd like to still - // have touch coordinates for it. - resetComposingState(false /* alsoResetLastComposedWord */); - } - if (isComposingWord) { - final int keyX, keyY; - if (Constants.isValidCoordinate(x) && Constants.isValidCoordinate(y)) { - final KeyDetector keyDetector = - mKeyboardSwitcher.getMainKeyboardView().getKeyDetector(); - keyX = keyDetector.getTouchX(x); - keyY = keyDetector.getTouchY(y); - } else { - keyX = x; - keyY = y; - } - mWordComposer.add(primaryCode, keyX, keyY); - // If it's the first letter, make note of auto-caps state - if (mWordComposer.size() == 1) { - mWordComposer.setCapitalizedModeAtStartComposingTime(getActualCapsMode()); - } - mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1); - } else { - final boolean swapWeakSpace = maybeStripSpace(primaryCode, - spaceState, Constants.SUGGESTION_STRIP_COORDINATE == x); - - sendKeyCodePoint(primaryCode); - - if (swapWeakSpace) { - swapSwapperAndSpace(); - mSpaceState = SPACE_STATE_WEAK; - } - // In case the "add to dictionary" hint was still displayed. - if (null != mSuggestionStripView) mSuggestionStripView.dismissAddToDictionaryHint(); - } - mHandler.postUpdateSuggestionStrip(); - if (currentSettings.mIsInternal) { - LatinImeLoggerUtils.onNonSeparator((char)primaryCode, x, y); - } - } - - private void handleRecapitalize() { - if (mLastSelectionStart == mLastSelectionEnd) return; // No selection - // If we have a recapitalize in progress, use it; otherwise, create a new one. - if (!mRecapitalizeStatus.isActive() - || !mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) { - final CharSequence selectedText = - mConnection.getSelectedText(0 /* flags, 0 for no styles */); - if (TextUtils.isEmpty(selectedText)) return; // Race condition with the input connection - final SettingsValues currentSettings = mSettings.getCurrent(); - mRecapitalizeStatus.initialize(mLastSelectionStart, mLastSelectionEnd, - selectedText.toString(), currentSettings.mLocale, - currentSettings.mWordSeparators); - // We trim leading and trailing whitespace. - mRecapitalizeStatus.trim(); - // Trimming the object may have changed the length of the string, and we need to - // reposition the selection handles accordingly. As this result in an IPC call, - // only do it if it's actually necessary, in other words if the recapitalize status - // is not set at the same place as before. - if (!mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) { - mLastSelectionStart = mRecapitalizeStatus.getNewCursorStart(); - mLastSelectionEnd = mRecapitalizeStatus.getNewCursorEnd(); - } - } - mConnection.finishComposingText(); - mRecapitalizeStatus.rotate(); - final int numCharsDeleted = mLastSelectionEnd - mLastSelectionStart; - mConnection.setSelection(mLastSelectionEnd, mLastSelectionEnd); - mConnection.deleteSurroundingText(numCharsDeleted, 0); - mConnection.commitText(mRecapitalizeStatus.getRecapitalizedString(), 0); - mLastSelectionStart = mRecapitalizeStatus.getNewCursorStart(); - mLastSelectionEnd = mRecapitalizeStatus.getNewCursorEnd(); - mConnection.setSelection(mLastSelectionStart, mLastSelectionEnd); - // Match the keyboard to the new state. - mKeyboardSwitcher.updateShiftState(); - } - - // Returns true if we do an autocorrection, false otherwise. - private boolean handleSeparator(final int primaryCode, final int x, final int y, - final int spaceState) { - boolean didAutoCorrect = false; - final SettingsValues currentSettings = mSettings.getCurrent(); - // We avoid sending spaces in languages without spaces if we were composing. - final boolean shouldAvoidSendingCode = Constants.CODE_SPACE == primaryCode - && !currentSettings.mCurrentLanguageHasSpaces && mWordComposer.isComposingWord(); - if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { - // If we are in the middle of a recorrection, we need to commit the recorrection - // first so that we can insert the separator at the current cursor position. - resetEntireInputState(mLastSelectionStart); - } - if (mWordComposer.isComposingWord()) { // May have changed since we stored wasComposing - if (currentSettings.mCorrectionEnabled) { - final String separator = shouldAvoidSendingCode ? LastComposedWord.NOT_A_SEPARATOR - : StringUtils.newSingleCodePointString(primaryCode); - commitCurrentAutoCorrection(separator); - didAutoCorrect = true; - } else { - commitTyped(StringUtils.newSingleCodePointString(primaryCode)); - } - } - - final boolean swapWeakSpace = maybeStripSpace(primaryCode, spaceState, - Constants.SUGGESTION_STRIP_COORDINATE == x); - - if (SPACE_STATE_PHANTOM == spaceState && - currentSettings.isUsuallyPrecededBySpace(primaryCode)) { - promotePhantomSpace(); - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleSeparator(primaryCode, mWordComposer.isComposingWord()); - } - - if (!shouldAvoidSendingCode) { - sendKeyCodePoint(primaryCode); - } - - if (Constants.CODE_SPACE == primaryCode) { - if (currentSettings.isSuggestionsRequested(mDisplayOrientation)) { - if (maybeDoubleSpacePeriod()) { - mSpaceState = SPACE_STATE_DOUBLE; - } else if (!isShowingPunctuationList()) { - mSpaceState = SPACE_STATE_WEAK; - } - } - - mHandler.startDoubleSpacePeriodTimer(); - mHandler.postUpdateSuggestionStrip(); - } else { - if (swapWeakSpace) { - swapSwapperAndSpace(); - mSpaceState = SPACE_STATE_SWAP_PUNCTUATION; - } else if (SPACE_STATE_PHANTOM == spaceState - && currentSettings.isUsuallyFollowedBySpace(primaryCode)) { - // If we are in phantom space state, and the user presses a separator, we want to - // stay in phantom space state so that the next keypress has a chance to add the - // space. For example, if I type "Good dat", pick "day" from the suggestion strip - // then insert a comma and go on to typing the next word, I want the space to be - // inserted automatically before the next word, the same way it is when I don't - // input the comma. - // The case is a little different if the separator is a space stripper. Such a - // separator does not normally need a space on the right (that's the difference - // between swappers and strippers), so we should not stay in phantom space state if - // the separator is a stripper. Hence the additional test above. - mSpaceState = SPACE_STATE_PHANTOM; - } - - // Set punctuation right away. onUpdateSelection will fire but tests whether it is - // already displayed or not, so it's okay. - setPunctuationSuggestions(); - } - if (currentSettings.mIsInternal) { - LatinImeLoggerUtils.onSeparator((char)primaryCode, x, y); - } - - mKeyboardSwitcher.updateShiftState(); - return didAutoCorrect; - } - - private CharSequence getTextWithUnderline(final String text) { - return mIsAutoCorrectionIndicatorOn - ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(this, text) - : text; + public boolean hasSuggestionStripView() { + return null != mSuggestionStripView; } - private void handleClose() { - // TODO: Verify that words are logged properly when IME is closed. - commitTyped(LastComposedWord.NOT_A_SEPARATOR); - requestHideSelf(0); - final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); - if (mainKeyboardView != null) { - mainKeyboardView.closing(); - } - } - - // TODO: make this private - // Outside LatinIME, only used by the test suite. - @UsedForTesting - boolean isShowingPunctuationList() { - if (mSuggestedWords == null) return false; - return mSettings.getCurrent().mSuggestPuncList == mSuggestedWords; - } - - private boolean isSuggestionsStripVisible() { - final SettingsValues currentSettings = mSettings.getCurrent(); - if (mSuggestionStripView == null) - return false; - if (mSuggestionStripView.isShowingAddToDictionaryHint()) - return true; - if (null == currentSettings) - return false; - if (!currentSettings.isSuggestionStripVisibleInOrientation(mDisplayOrientation)) - return false; - if (currentSettings.isApplicationSpecifiedCompletionsOn()) - return true; - return currentSettings.isSuggestionsRequested(mDisplayOrientation); - } - - private void clearSuggestionStrip() { - setSuggestedWords(SuggestedWords.EMPTY, false); - setAutoCorrectionIndicator(false); + @Override + public boolean isShowingAddToDictionaryHint() { + return hasSuggestionStripView() && mSuggestionStripView.isShowingAddToDictionaryHint(); } - private void setSuggestedWords(final SuggestedWords words, final boolean isAutoCorrection) { - mSuggestedWords = words; - if (mSuggestionStripView != null) { - mSuggestionStripView.setSuggestions(words); - mKeyboardSwitcher.onAutoCorrectionStateChanged(isAutoCorrection); + @Override + public void dismissAddToDictionaryHint() { + if (!hasSuggestionStripView()) { + return; } + mSuggestionStripView.dismissAddToDictionaryHint(); } - private void setAutoCorrectionIndicator(final boolean newAutoCorrectionIndicator) { - // Put a blue underline to a word in TextView which will be auto-corrected. - if (mIsAutoCorrectionIndicatorOn != newAutoCorrectionIndicator - && mWordComposer.isComposingWord()) { - mIsAutoCorrectionIndicatorOn = newAutoCorrectionIndicator; - final CharSequence textWithUnderline = - getTextWithUnderline(mWordComposer.getTypedWord()); - // TODO: when called from an updateSuggestionStrip() call that results from a posted - // message, this is called outside any batch edit. Potentially, this may result in some - // janky flickering of the screen, although the display speed makes it unlikely in - // the practice. - mConnection.setComposingText(textWithUnderline, 1); + private void setSuggestedWords(final SuggestedWords suggestedWords) { + mInputLogic.setSuggestedWords(suggestedWords); + // TODO: Modify this when we support suggestions with hard keyboard + if (!hasSuggestionStripView()) { + return; } - } - - private void updateSuggestionStrip() { - mHandler.cancelUpdateSuggestionStrip(); - final SettingsValues currentSettings = mSettings.getCurrent(); - - // Check if we have a suggestion engine attached. - if (mSuggest == null - || !currentSettings.isSuggestionsRequested(mDisplayOrientation)) { - if (mWordComposer.isComposingWord()) { - Log.w(TAG, "Called updateSuggestionsOrPredictions but suggestions were not " - + "requested!"); - } + if (!onEvaluateInputViewShown()) { return; } - if (!mWordComposer.isComposingWord() && !currentSettings.mBigramPredictionEnabled) { - setPunctuationSuggestions(); + final SettingsValues currentSettingsValues = mSettings.getCurrent(); + final boolean shouldShowImportantNotice = + ImportantNoticeUtils.shouldShowImportantNotice(this); + final boolean shouldShowSuggestionCandidates = + currentSettingsValues.mInputAttributes.mShouldShowSuggestions + && currentSettingsValues.isCurrentOrientationAllowingSuggestionsPerUserSettings(); + final boolean shouldShowSuggestionsStripUnlessPassword = shouldShowImportantNotice + || currentSettingsValues.mShowsVoiceInputKey + || shouldShowSuggestionCandidates + || currentSettingsValues.isApplicationSpecifiedCompletionsOn(); + final boolean shouldShowSuggestionsStrip = shouldShowSuggestionsStripUnlessPassword + && !currentSettingsValues.mInputAttributes.mIsPasswordField; + mSuggestionStripView.updateVisibility(shouldShowSuggestionsStrip, isFullscreenMode()); + if (!shouldShowSuggestionsStrip) { return; } - final AsyncResultHolder<SuggestedWords> holder = new AsyncResultHolder<SuggestedWords>(); - getSuggestedWordsOrOlderSuggestionsAsync(Suggest.SESSION_TYPING, - SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(final SuggestedWords suggestedWords) { - holder.set(suggestedWords); - } - } - ); + final boolean isEmptyApplicationSpecifiedCompletions = + currentSettingsValues.isApplicationSpecifiedCompletionsOn() + && suggestedWords.isEmpty(); + final boolean noSuggestionsToShow = (SuggestedWords.EMPTY == suggestedWords) + || suggestedWords.isPunctuationSuggestions() + || isEmptyApplicationSpecifiedCompletions; + if (shouldShowImportantNotice && noSuggestionsToShow) { + if (mSuggestionStripView.maybeShowImportantNoticeTitle()) { + return; + } + } - // This line may cause the current thread to wait. - final SuggestedWords suggestedWords = holder.get(null, GET_SUGGESTED_WORDS_TIMEOUT); - if (suggestedWords != null) { - showSuggestionStrip(suggestedWords); + if (currentSettingsValues.isCurrentOrientationAllowingSuggestionsPerUserSettings() + // We should clear suggestions if there is no suggestion to show. + || noSuggestionsToShow + || currentSettingsValues.isApplicationSpecifiedCompletionsOn()) { + mSuggestionStripView.setSuggestions(suggestedWords, + SubtypeLocaleUtils.isRtlLanguage(mSubtypeSwitcher.getCurrentSubtype())); } } - private void getSuggestedWords(final int sessionId, final int sequenceNumber, + // TODO[IL]: Move this out of LatinIME. + public void getSuggestedWords(final int sessionId, final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); - final Suggest suggest = mSuggest; - if (keyboard == null || suggest == null) { + if (keyboard == null) { callback.onGetSuggestedWords(SuggestedWords.EMPTY); return; } - // Get the word on which we should search the bigrams. If we are composing a word, it's - // whatever is *before* the half-committed word in the buffer, hence 2; if we aren't, we - // should just skip whitespace if any, so 1. - final SettingsValues currentSettings = mSettings.getCurrent(); - final int[] additionalFeaturesOptions = currentSettings.mAdditionalFeaturesSettingValues; - final String prevWord; - if (currentSettings.mCurrentLanguageHasSpaces) { - // If we are typing in a language with spaces we can just look up the previous - // word from textview. - prevWord = mConnection.getNthPreviousWord(currentSettings.mWordSeparators, - mWordComposer.isComposingWord() ? 2 : 1); - } else { - prevWord = LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ? null - : mLastComposedWord.mCommittedWord; - } - suggest.getSuggestedWords(mWordComposer, prevWord, keyboard.getProximityInfo(), - currentSettings.mBlockPotentiallyOffensive, currentSettings.mCorrectionEnabled, - additionalFeaturesOptions, sessionId, sequenceNumber, callback); - } - - private void getSuggestedWordsOrOlderSuggestionsAsync(final int sessionId, - final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - mInputUpdater.getSuggestedWords(sessionId, sequenceNumber, - new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(SuggestedWords suggestedWords) { - callback.onGetSuggestedWords(maybeRetrieveOlderSuggestions( - mWordComposer.getTypedWord(), suggestedWords)); - } - }); - } - - private SuggestedWords maybeRetrieveOlderSuggestions(final String typedWord, - final SuggestedWords suggestedWords) { - // TODO: consolidate this into getSuggestedWords - // We update the suggestion strip only when we have some suggestions to show, i.e. when - // the suggestion count is > 1; else, we leave the old suggestions, with the typed word - // replaced with the new one. However, when the word is a dictionary word, or when the - // length of the typed word is 1 or 0 (after a deletion typically), we do want to remove the - // old suggestions. Also, if we are showing the "add to dictionary" hint, we need to - // revert to suggestions - although it is unclear how we can come here if it's displayed. - if (suggestedWords.size() > 1 || typedWord.length() <= 1 - || suggestedWords.mTypedWordValid || null == mSuggestionStripView - || mSuggestionStripView.isShowingAddToDictionaryHint()) { - return suggestedWords; - } else { - return getOlderSuggestions(typedWord); - } - } - - private SuggestedWords getOlderSuggestions(final String typedWord) { - SuggestedWords previousSuggestedWords = mSuggestedWords; - if (previousSuggestedWords == mSettings.getCurrent().mSuggestPuncList) { - previousSuggestedWords = SuggestedWords.EMPTY; - } - if (typedWord == null) { - return previousSuggestedWords; - } - final ArrayList<SuggestedWords.SuggestedWordInfo> typedWordAndPreviousSuggestions = - SuggestedWords.getTypedWordAndPreviousSuggestions(typedWord, - previousSuggestedWords); - return new SuggestedWords(typedWordAndPreviousSuggestions, - false /* typedWordValid */, - false /* hasAutoCorrectionCandidate */, - false /* isPunctuationSuggestions */, - true /* isObsoleteSuggestions */, - false /* isPrediction */); + mInputLogic.getSuggestedWords(mSettings.getCurrent(), keyboard.getProximityInfo(), + mKeyboardSwitcher.getKeyboardShiftMode(), sessionId, sequenceNumber, callback); } - private void setAutoCorrection(final SuggestedWords suggestedWords, final String typedWord) { - if (suggestedWords.isEmpty()) return; - final String autoCorrection; - if (suggestedWords.mWillAutoCorrect) { - autoCorrection = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION); + @Override + public void showSuggestionStrip(final SuggestedWords sourceSuggestedWords) { + final SuggestedWords suggestedWords = + sourceSuggestedWords.isEmpty() ? SuggestedWords.EMPTY : sourceSuggestedWords; + if (SuggestedWords.EMPTY == suggestedWords) { + setNeutralSuggestionStrip(); } else { - // We can't use suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD) - // because it may differ from mWordComposer.mTypedWord. - autoCorrection = typedWord; - } - mWordComposer.setAutoCorrection(autoCorrection); - } - - private void showSuggestionStripWithTypedWord(final SuggestedWords suggestedWords, - final String typedWord) { - if (suggestedWords.isEmpty()) { - // No auto-correction is available, clear the cached values. - AccessibilityUtils.getInstance().setAutoCorrection(null, null); - clearSuggestionStrip(); - return; - } - setAutoCorrection(suggestedWords, typedWord); - final boolean isAutoCorrection = suggestedWords.willAutoCorrect(); - setSuggestedWords(suggestedWords, isAutoCorrection); - setAutoCorrectionIndicator(isAutoCorrection); - setSuggestionStripShown(isSuggestionsStripVisible()); - // An auto-correction is available, cache it in accessibility code so - // we can be speak it if the user touches a key that will insert it. - AccessibilityUtils.getInstance().setAutoCorrection(suggestedWords, typedWord); - } - - private void showSuggestionStrip(final SuggestedWords suggestedWords) { - if (suggestedWords.isEmpty()) { - clearSuggestionStrip(); - return; - } - showSuggestionStripWithTypedWord(suggestedWords, - suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD)); - } - - private void commitCurrentAutoCorrection(final String separator) { - // Complete any pending suggestions query first - if (mHandler.hasPendingUpdateSuggestions()) { - updateSuggestionStrip(); - } - final String typedAutoCorrection = mWordComposer.getAutoCorrectionOrNull(); - final String typedWord = mWordComposer.getTypedWord(); - final String autoCorrection = (typedAutoCorrection != null) - ? typedAutoCorrection : typedWord; - if (autoCorrection != null) { - if (TextUtils.isEmpty(typedWord)) { - throw new RuntimeException("We have an auto-correction but the typed word " - + "is empty? Impossible! I must commit suicide."); - } - if (mSettings.isInternal()) { - LatinImeLoggerUtils.onAutoCorrection( - typedWord, autoCorrection, separator, mWordComposer); - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final SuggestedWords suggestedWords = mSuggestedWords; - ResearchLogger.latinIme_commitCurrentAutoCorrection(typedWord, autoCorrection, - separator, mWordComposer.isBatchMode(), suggestedWords); - } - mExpectingUpdateSelection = true; - commitChosenWord(autoCorrection, LastComposedWord.COMMIT_TYPE_DECIDED_WORD, - separator); - if (!typedWord.equals(autoCorrection)) { - // This will make the correction flash for a short while as a visual clue - // to the user that auto-correction happened. It has no other effect; in particular - // note that this won't affect the text inside the text field AT ALL: it only makes - // the segment of text starting at the supplied index and running for the length - // of the auto-correction flash. At this moment, the "typedWord" argument is - // ignored by TextView. - mConnection.commitCorrection( - new CorrectionInfo(mLastSelectionEnd - typedWord.length(), - typedWord, autoCorrection)); - } + setSuggestedWords(suggestedWords); } + // Cache the auto-correction in accessibility code so we can speak it if the user + // touches a key that will insert it. + AccessibilityUtils.getInstance().setAutoCorrection(suggestedWords, + sourceSuggestedWords.mTypedWord); } // Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener} // interface @Override - public void pickSuggestionManually(final int index, final SuggestedWordInfo suggestionInfo) { - final SuggestedWords suggestedWords = mSuggestedWords; - final String suggestion = suggestionInfo.mWord; - // If this is a punctuation picked from the suggestion strip, pass it to onCodeInput - if (suggestion.length() == 1 && isShowingPunctuationList()) { - // Word separators are suggested before the user inputs something. - // So, LatinImeLogger logs "" as a user's input. - LatinImeLogger.logOnManualSuggestion("", suggestion, index, suggestedWords); - // Rely on onCodeInput to do the complicated swapping/stripping logic consistently. - final int primaryCode = suggestion.charAt(0); - onCodeInput(primaryCode, - Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_punctuationSuggestion(index, suggestion, - false /* isBatchMode */, suggestedWords.mIsPrediction); - } - return; - } - - mConnection.beginBatchEdit(); - final SettingsValues currentSettings = mSettings.getCurrent(); - if (SPACE_STATE_PHANTOM == mSpaceState && suggestion.length() > 0 - // In the batch input mode, a manually picked suggested word should just replace - // the current batch input text and there is no need for a phantom space. - && !mWordComposer.isBatchMode()) { - final int firstChar = Character.codePointAt(suggestion, 0); - if (!currentSettings.isWordSeparator(firstChar) - || currentSettings.isUsuallyPrecededBySpace(firstChar)) { - promotePhantomSpace(); - } - } - - if (currentSettings.isApplicationSpecifiedCompletionsOn() - && mApplicationSpecifiedCompletions != null - && index >= 0 && index < mApplicationSpecifiedCompletions.length) { - mSuggestedWords = SuggestedWords.EMPTY; - if (mSuggestionStripView != null) { - mSuggestionStripView.clear(); - } - mKeyboardSwitcher.updateShiftState(); - resetComposingState(true /* alsoResetLastComposedWord */); - final CompletionInfo completionInfo = mApplicationSpecifiedCompletions[index]; - mConnection.commitCompletion(completionInfo); - mConnection.endBatchEdit(); - return; - } - - // We need to log before we commit, because the word composer will store away the user - // typed word. - final String replacedWord = mWordComposer.getTypedWord(); - LatinImeLogger.logOnManualSuggestion(replacedWord, suggestion, index, suggestedWords); - mExpectingUpdateSelection = true; - commitChosenWord(suggestion, LastComposedWord.COMMIT_TYPE_MANUAL_PICK, - LastComposedWord.NOT_A_SEPARATOR); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_pickSuggestionManually(replacedWord, index, suggestion, - mWordComposer.isBatchMode(), suggestionInfo.mScore, suggestionInfo.mKind, - suggestionInfo.mSourceDict.mDictType); - } - mConnection.endBatchEdit(); - // Don't allow cancellation of manual pick - mLastComposedWord.deactivate(); - // Space state must be updated before calling updateShiftState - mSpaceState = SPACE_STATE_PHANTOM; - mKeyboardSwitcher.updateShiftState(); - - // We should show the "Touch again to save" hint if the user pressed the first entry - // AND it's in none of our current dictionaries (main, user or otherwise). - // Please note that if mSuggest is null, it means that everything is off: suggestion - // and correction, so we shouldn't try to show the hint - final Suggest suggest = mSuggest; - final boolean showingAddToDictionaryHint = - (SuggestedWordInfo.KIND_TYPED == suggestionInfo.mKind - || SuggestedWordInfo.KIND_OOV_CORRECTION == suggestionInfo.mKind) - && suggest != null - // If the suggestion is not in the dictionary, the hint should be shown. - && !AutoCorrectionUtils.isValidWord(suggest, suggestion, true); - - if (currentSettings.mIsInternal) { - LatinImeLoggerUtils.onSeparator((char)Constants.CODE_SPACE, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); - } - if (showingAddToDictionaryHint && mIsUserDictionaryAvailable) { - mSuggestionStripView.showAddToDictionaryHint( - suggestion, currentSettings.mHintToSaveText); - } else { - // If we're not showing the "Touch again to save", then update the suggestion strip. - mHandler.postUpdateSuggestionStrip(); - } - } - - /** - * Commits the chosen word to the text field and saves it for later retrieval. - */ - private void commitChosenWord(final String chosenWord, final int commitType, - final String separatorString) { - final SuggestedWords suggestedWords = mSuggestedWords; - mConnection.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan( - this, chosenWord, suggestedWords, mIsMainDictionaryAvailable), 1); - // Add the word to the user history dictionary - final String prevWord = addToUserHistoryDictionary(chosenWord); - // TODO: figure out here if this is an auto-correct or if the best word is actually - // what user typed. Note: currently this is done much later in - // LastComposedWord#didCommitTypedWord by string equality of the remembered - // strings. - mLastComposedWord = mWordComposer.commitWord(commitType, chosenWord, separatorString, - prevWord); - } - - private void setPunctuationSuggestions() { - final SettingsValues currentSettings = mSettings.getCurrent(); - if (currentSettings.mBigramPredictionEnabled) { - clearSuggestionStrip(); - } else { - setSuggestedWords(currentSettings.mSuggestPuncList, false); - } - setAutoCorrectionIndicator(false); - setSuggestionStripShown(isSuggestionsStripVisible()); - } - - private String addToUserHistoryDictionary(final String suggestion) { - if (TextUtils.isEmpty(suggestion)) return null; - final Suggest suggest = mSuggest; - if (suggest == null) return null; - - // If correction is not enabled, we don't add words to the user history dictionary. - // That's to avoid unintended additions in some sensitive fields, or fields that - // expect to receive non-words. - final SettingsValues currentSettings = mSettings.getCurrent(); - if (!currentSettings.mCorrectionEnabled) return null; - - final UserHistoryDictionary userHistoryDictionary = mUserHistoryDictionary; - if (userHistoryDictionary == null) return null; - - final String prevWord = mConnection.getNthPreviousWord(currentSettings.mWordSeparators, 2); - final String secondWord; - if (mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps()) { - secondWord = suggestion.toLowerCase(mSubtypeSwitcher.getCurrentSubtypeLocale()); - } else { - secondWord = suggestion; - } - // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid". - // We don't add words with 0-frequency (assuming they would be profanity etc.). - final int maxFreq = AutoCorrectionUtils.getMaxFrequency( - suggest.getUnigramDictionaries(), suggestion); - if (maxFreq == 0) return null; - userHistoryDictionary.addToDictionary(prevWord, secondWord, maxFreq > 0); - return prevWord; - } - - private boolean isResumableWord(final String word, final SettingsValues settings) { - final int firstCodePoint = word.codePointAt(0); - return settings.isWordCodePoint(firstCodePoint) - && Constants.CODE_SINGLE_QUOTE != firstCodePoint - && Constants.CODE_DASH != firstCodePoint; - } - - /** - * Check if the cursor is touching a word. If so, restart suggestions on this word, else - * do nothing. - */ - private void restartSuggestionsOnWordTouchedByCursor() { - // HACK: We may want to special-case some apps that exhibit bad behavior in case of - // recorrection. This is a temporary, stopgap measure that will be removed later. - // TODO: remove this. - if (mAppWorkAroundsUtils.isBrokenByRecorrection()) return; - // A simple way to test for support from the TextView. - if (!isSuggestionsStripVisible()) return; - // Recorrection is not supported in languages without spaces because we don't know - // how to segment them yet. - if (!mSettings.getCurrent().mCurrentLanguageHasSpaces) return; - // If the cursor is not touching a word, or if there is a selection, return right away. - if (mLastSelectionStart != mLastSelectionEnd) return; - // If we don't know the cursor location, return. - if (mLastSelectionStart < 0) return; - final SettingsValues currentSettings = mSettings.getCurrent(); - if (!mConnection.isCursorTouchingWord(currentSettings)) return; - final TextRange range = mConnection.getWordRangeAtCursor(currentSettings.mWordSeparators, - 0 /* additionalPrecedingWordsCount */); - if (null == range) return; // Happens if we don't have an input connection at all - if (range.length() <= 0) return; // Race condition. No text to resume on, so bail out. - // If for some strange reason (editor bug or so) we measure the text before the cursor as - // longer than what the entire text is supposed to be, the safe thing to do is bail out. - final int numberOfCharsInWordBeforeCursor = range.getNumberOfCharsInWordBeforeCursor(); - if (numberOfCharsInWordBeforeCursor > mLastSelectionStart) return; - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); - final String typedWord = range.mWord.toString(); - if (!isResumableWord(typedWord, currentSettings)) return; - int i = 0; - for (final SuggestionSpan span : range.getSuggestionSpansAtWord()) { - for (final String s : span.getSuggestions()) { - ++i; - if (!TextUtils.equals(s, typedWord)) { - suggestions.add(new SuggestedWordInfo(s, - SuggestionStripView.MAX_SUGGESTIONS - i, - SuggestedWordInfo.KIND_RESUMED, Dictionary.DICTIONARY_RESUMED, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE - /* autoCommitFirstWordConfidence */)); - } - } - } - mWordComposer.setComposingWord(typedWord, mKeyboardSwitcher.getKeyboard()); - mWordComposer.setCursorPositionWithinWord( - typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor)); - mConnection.setComposingRegion( - mLastSelectionStart - numberOfCharsInWordBeforeCursor, - mLastSelectionEnd + range.getNumberOfCharsInWordAfterCursor()); - if (suggestions.isEmpty()) { - // We come here if there weren't any suggestion spans on this word. We will try to - // compute suggestions for it instead. - mInputUpdater.getSuggestedWords(Suggest.SESSION_TYPING, - SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords( - final SuggestedWords suggestedWordsIncludingTypedWord) { - final SuggestedWords suggestedWords; - if (suggestedWordsIncludingTypedWord.size() > 1) { - // We were able to compute new suggestions for this word. - // Remove the typed word, since we don't want to display it in this - // case. The #getSuggestedWordsExcludingTypedWord() method sets - // willAutoCorrect to false. - suggestedWords = suggestedWordsIncludingTypedWord - .getSuggestedWordsExcludingTypedWord(); - } else { - // No saved suggestions, and we were unable to compute any good one - // either. Rather than displaying an empty suggestion strip, we'll - // display the original word alone in the middle. - // Since there is only one word, willAutoCorrect is false. - suggestedWords = suggestedWordsIncludingTypedWord; - } - // We need to pass typedWord because mWordComposer.mTypedWord may - // differ from typedWord. - unsetIsAutoCorrectionIndicatorOnAndCallShowSuggestionStrip( - suggestedWords, typedWord); - }}); - } else { - // We found suggestion spans in the word. We'll create the SuggestedWords out of - // them, and make willAutoCorrect false. - final SuggestedWords suggestedWords = new SuggestedWords(suggestions, - true /* typedWordValid */, false /* willAutoCorrect */, - false /* isPunctuationSuggestions */, false /* isObsoleteSuggestions */, - false /* isPrediction */); - // We need to pass typedWord because mWordComposer.mTypedWord may differ from typedWord. - unsetIsAutoCorrectionIndicatorOnAndCallShowSuggestionStrip(suggestedWords, typedWord); - } - } - - public void unsetIsAutoCorrectionIndicatorOnAndCallShowSuggestionStrip( - final SuggestedWords suggestedWords, final String typedWord) { - // Note that it's very important here that suggestedWords.mWillAutoCorrect is false. - // We never want to auto-correct on a resumed suggestion. Please refer to the three places - // above in restartSuggestionsOnWordTouchedByCursor() where suggestedWords is affected. - // We also need to unset mIsAutoCorrectionIndicatorOn to avoid showSuggestionStrip touching - // the text to adapt it. - // TODO: remove mIsAutoCorrectionIndicatorOn (see comment on definition) - mIsAutoCorrectionIndicatorOn = false; - mHandler.showSuggestionStripWithTypedWord(suggestedWords, typedWord); - } - - /** - * Check if the cursor is actually at the end of a word. If so, restart suggestions on this - * word, else do nothing. - */ - private void restartSuggestionsOnWordBeforeCursorIfAtEndOfWord() { - final CharSequence word = - mConnection.getWordBeforeCursorIfAtEndOfWord(mSettings.getCurrent()); - if (null != word) { - final String wordString = word.toString(); - restartSuggestionsOnWordBeforeCursor(wordString); - // TODO: Handle the case where the user manually moves the cursor and then backs up over - // a separator. In that case, the current log unit should not be uncommitted. - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().uncommitCurrentLogUnit(wordString, - true /* dumpCurrentLogUnit */); - } - } + public void pickSuggestionManually(final SuggestedWordInfo suggestionInfo) { + final InputTransaction completeInputTransaction = mInputLogic.onPickSuggestionManually( + mSettings.getCurrent(), suggestionInfo, + mKeyboardSwitcher.getKeyboardShiftMode(), + mKeyboardSwitcher.getCurrentKeyboardScriptId(), + mHandler); + updateStateAfterInputTransaction(completeInputTransaction); } - private void restartSuggestionsOnWordBeforeCursor(final String word) { - mWordComposer.setComposingWord(word, mKeyboardSwitcher.getKeyboard()); - final int length = word.length(); - mConnection.deleteSurroundingText(length, 0); - mConnection.setComposingText(word, 1); - mHandler.postUpdateSuggestionStrip(); - } - - /** - * Retry resetting caches in the rich input connection. - * - * When the editor can't be accessed we can't reset the caches, so we schedule a retry. - * This method handles the retry, and re-schedules a new retry if we still can't access. - * We only retry up to 5 times before giving up. - * - * @param tryResumeSuggestions Whether we should resume suggestions or not. - * @param remainingTries How many times we may try again before giving up. - */ - private void retryResetCaches(final boolean tryResumeSuggestions, final int remainingTries) { - if (!mConnection.resetCachesUponCursorMoveAndReturnSuccess(mLastSelectionStart, false)) { - if (0 < remainingTries) { - mHandler.postResetCaches(tryResumeSuggestions, remainingTries - 1); - return; - } - // If remainingTries is 0, we should stop waiting for new tries, but it's still - // better to load the keyboard (less things will be broken). - } - tryFixLyingCursorPosition(); - mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mSettings.getCurrent()); - if (tryResumeSuggestions) mHandler.postResumeSuggestions(); - } - - private void revertCommit() { - final String previousWord = mLastComposedWord.mPrevWord; - final String originallyTypedWord = mLastComposedWord.mTypedWord; - final String committedWord = mLastComposedWord.mCommittedWord; - final int cancelLength = committedWord.length(); - // We want java chars, not codepoints for the following. - final int separatorLength = mLastComposedWord.mSeparatorString.length(); - // TODO: should we check our saved separator against the actual contents of the text view? - final int deleteLength = cancelLength + separatorLength; - if (DEBUG) { - if (mWordComposer.isComposingWord()) { - throw new RuntimeException("revertCommit, but we are composing a word"); - } - final CharSequence wordBeforeCursor = - mConnection.getTextBeforeCursor(deleteLength, 0) - .subSequence(0, cancelLength); - if (!TextUtils.equals(committedWord, wordBeforeCursor)) { - throw new RuntimeException("revertCommit check failed: we thought we were " - + "reverting \"" + committedWord - + "\", but before the cursor we found \"" + wordBeforeCursor + "\""); - } - } - mConnection.deleteSurroundingText(deleteLength, 0); - if (!TextUtils.isEmpty(previousWord) && !TextUtils.isEmpty(committedWord)) { - mUserHistoryDictionary.cancelAddingUserHistory(previousWord, committedWord); - } - final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; - if (mSettings.getCurrent().mCurrentLanguageHasSpaces) { - // For languages with spaces, we revert to the typed string, but the cursor is still - // after the separator so we don't resume suggestions. If the user wants to correct - // the word, they have to press backspace again. - mConnection.commitText(stringToCommit, 1); - } else { - // For languages without spaces, we revert the typed string but the cursor is flush - // with the typed word, so we need to resume suggestions right away. - mWordComposer.setComposingWord(stringToCommit, mKeyboardSwitcher.getKeyboard()); - mConnection.setComposingText(stringToCommit, 1); - } - if (mSettings.isInternal()) { - LatinImeLoggerUtils.onSeparator(mLastComposedWord.mSeparatorString, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_revertCommit(committedWord, originallyTypedWord, - mWordComposer.isBatchMode(), mLastComposedWord.mSeparatorString); + @Override + public void showAddToDictionaryHint(final String word) { + if (!hasSuggestionStripView()) { + return; } - // Don't restart suggestion yet. We'll restart if the user deletes the - // separator. - mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; - // We have a separator between the word and the cursor: we should show predictions. - mHandler.postUpdateSuggestionStrip(); + mSuggestionStripView.showAddToDictionaryHint(word); } - // This essentially inserts a space, and that's it. - public void promotePhantomSpace() { + // This will show either an empty suggestion strip (if prediction is enabled) or + // punctuation suggestions (if it's disabled). + @Override + public void setNeutralSuggestionStrip() { final SettingsValues currentSettings = mSettings.getCurrent(); - if (currentSettings.shouldInsertSpacesAutomatically() - && currentSettings.mCurrentLanguageHasSpaces - && !mConnection.textBeforeCursorLooksLikeURL()) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_promotePhantomSpace(); - } - sendKeyCodePoint(Constants.CODE_SPACE); - } + final SuggestedWords neutralSuggestions = currentSettings.mBigramPredictionEnabled + ? SuggestedWords.EMPTY : currentSettings.mSpacingAndPunctuations.mSuggestPuncList; + setSuggestedWords(neutralSuggestions); } // TODO: Make this private @@ -3089,18 +1476,44 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen loadSettings(); if (mKeyboardSwitcher.getMainKeyboardView() != null) { // Reload keyboard because the current language has been changed. - mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mSettings.getCurrent()); + mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mSettings.getCurrent(), + getCurrentAutoCapsState(), getCurrentRecapitalizeState()); + } + } + + /** + * After an input transaction has been executed, some state must be updated. This includes + * the shift state of the keyboard and suggestions. This method looks at the finished + * inputTransaction to find out what is necessary and updates the state accordingly. + * @param inputTransaction The transaction that has been executed. + */ + private void updateStateAfterInputTransaction(final InputTransaction inputTransaction) { + switch (inputTransaction.getRequiredShiftUpdate()) { + case InputTransaction.SHIFT_UPDATE_LATER: + mHandler.postUpdateShiftState(); + break; + case InputTransaction.SHIFT_UPDATE_NOW: + mKeyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); + break; + default: // SHIFT_NO_UPDATE + } + if (inputTransaction.requiresUpdateSuggestions()) { + mHandler.postUpdateSuggestionStrip(); + } + if (inputTransaction.didAffectContents()) { + mSubtypeState.setCurrentSubtypeHasBeenUsed(); } } private void hapticAndAudioFeedback(final int code, final int repeatCount) { final MainKeyboardView keyboardView = mKeyboardSwitcher.getMainKeyboardView(); - if (keyboardView != null && keyboardView.isInSlidingKeyInput()) { - // No need to feedback while sliding input. + if (keyboardView != null && keyboardView.isInDraggingFinger()) { + // No need to feedback while finger is dragging. return; } if (repeatCount > 0) { - if (code == Constants.CODE_DELETE && !mConnection.canDeleteCharacters()) { + if (code == Constants.CODE_DELETE && !mInputLogic.mConnection.canDeleteCharacters()) { // No need to feedback when repeat delete key will have no effect. return; } @@ -3124,7 +1537,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @Override public void onPressKey(final int primaryCode, final int repeatCount, final boolean isSinglePointer) { - mKeyboardSwitcher.onPressKey(primaryCode, isSinglePointer); + mKeyboardSwitcher.onPressKey(primaryCode, isSinglePointer, getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); hapticAndAudioFeedback(primaryCode, repeatCount); } @@ -3132,40 +1546,44 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // press matching call is {@link #onPressKey(int,int,boolean)} above. @Override public void onReleaseKey(final int primaryCode, final boolean withSliding) { - mKeyboardSwitcher.onReleaseKey(primaryCode, withSliding); + mKeyboardSwitcher.onReleaseKey(primaryCode, withSliding, getCurrentAutoCapsState(), + getCurrentRecapitalizeState()); + } - // If accessibility is on, ensure the user receives keyboard state updates. - if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { - switch (primaryCode) { - case Constants.CODE_SHIFT: - AccessibleKeyboardViewProxy.getInstance().notifyShiftState(); - break; - case Constants.CODE_SWITCH_ALPHA_SYMBOL: - AccessibleKeyboardViewProxy.getInstance().notifySymbolsState(); - break; - } - } + private HardwareEventDecoder getHardwareKeyEventDecoder(final int deviceId) { + final HardwareEventDecoder decoder = mHardwareEventDecoders.get(deviceId); + if (null != decoder) return decoder; + // TODO: create the decoder according to the specification + final HardwareEventDecoder newDecoder = new HardwareKeyboardEventDecoder(deviceId); + mHardwareEventDecoders.put(deviceId, newDecoder); + return newDecoder; } // Hooks for hardware keyboard @Override - public boolean onKeyDown(final int keyCode, final KeyEvent event) { - if (!ProductionFlag.IS_HARDWARE_KEYBOARD_SUPPORTED) return super.onKeyDown(keyCode, event); - // onHardwareKeyEvent, like onKeyDown returns true if it handled the event, false if - // it doesn't know what to do with it and leave it to the application. For example, - // hardware key events for adjusting the screen's brightness are passed as is. - if (mEventInterpreter.onHardwareKeyEvent(event)) { - final long keyIdentifier = event.getDeviceId() << 32 + event.getKeyCode(); - mCurrentlyPressedHardwareKeys.add(keyIdentifier); + public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) { + if (!ProductionFlag.IS_HARDWARE_KEYBOARD_SUPPORTED) { + return super.onKeyDown(keyCode, keyEvent); + } + final Event event = getHardwareKeyEventDecoder( + keyEvent.getDeviceId()).decodeHardwareKey(keyEvent); + // If the event is not handled by LatinIME, we just pass it to the parent implementation. + // If it's handled, we return true because we did handle it. + if (event.isHandled()) { + mInputLogic.onCodeInput(mSettings.getCurrent(), event, + mKeyboardSwitcher.getKeyboardShiftMode(), + // TODO: this is not necessarily correct for a hardware keyboard right now + mKeyboardSwitcher.getCurrentKeyboardScriptId(), + mHandler); return true; } - return super.onKeyDown(keyCode, event); + return super.onKeyDown(keyCode, keyEvent); } @Override public boolean onKeyUp(final int keyCode, final KeyEvent event) { final long keyIdentifier = event.getDeviceId() << 32 + event.getKeyCode(); - if (mCurrentlyPressedHardwareKeys.remove(keyIdentifier)) { + if (mInputLogic.mCurrentlyPressedHardwareKeys.remove(keyIdentifier)) { return true; } return super.onKeyUp(keyCode, event); @@ -3177,7 +1595,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // boolean onKeyMultiple(final int keyCode, final int count, final KeyEvent event); // receive ringer mode change and network state change. - private BroadcastReceiver mReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mConnectivityAndRingerModeChangeReceiver = + new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); @@ -3190,17 +1609,15 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen }; private void launchSettings() { - handleClose(); + mInputLogic.commitTyped(mSettings.getCurrent(), LastComposedWord.NOT_A_SEPARATOR); + requestHideSelf(0); + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { + mainKeyboardView.closing(); + } launchSubActivity(SettingsActivity.class); } - public void launchKeyboardedDialogActivity(final Class<? extends Activity> activityClass) { - // Put the text in the attached EditText into a safe, saved state before switching to a - // new activity that will also use the soft keyboard. - commitTyped(LastComposedWord.NOT_A_SEPARATOR); - launchSubActivity(activityClass); - } - private void launchSubActivity(final Class<? extends Activity> activityClass) { Intent intent = new Intent(); intent.setClass(LatinIME.this, activityClass); @@ -3215,9 +1632,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final CharSequence[] items = new CharSequence[] { // TODO: Should use new string "Select active input modes". getString(R.string.language_selection_title), - getString(ApplicationUtils.getAcitivityTitleResId(this, SettingsActivity.class)), + getString(ApplicationUtils.getActivityTitleResId(this, SettingsActivity.class)), }; - final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + final OnClickListener listener = new OnClickListener() { @Override public void onClick(DialogInterface di, int position) { di.dismiss(); @@ -3226,8 +1643,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final Intent intent = IntentUtils.getInputLanguageSelectionIntent( mRichImm.getInputMethodIdOfThisIme(), Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - | Intent.FLAG_ACTIVITY_CLEAR_TOP); + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); break; case 1: @@ -3236,21 +1653,22 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } }; - final AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setItems(items, listener) - .setTitle(title); - showOptionDialog(builder.create()); + final AlertDialog.Builder builder = new AlertDialog.Builder( + DialogUtils.getPlatformDialogThemeContext(this)); + builder.setItems(items, listener).setTitle(title); + final AlertDialog dialog = builder.create(); + dialog.setCancelable(true /* cancelable */); + dialog.setCanceledOnTouchOutside(true /* cancelable */); + showOptionDialog(dialog); } - public void showOptionDialog(final AlertDialog dialog) { + // TODO: Move this method out of {@link LatinIME}. + private void showOptionDialog(final AlertDialog dialog) { final IBinder windowToken = mKeyboardSwitcher.getMainKeyboardView().getWindowToken(); if (windowToken == null) { return; } - dialog.setCancelable(true); - dialog.setCanceledOnTouchOutside(true); - final Window window = dialog.getWindow(); final WindowManager.LayoutParams lp = window.getAttributes(); lp.token = windowToken; @@ -3264,31 +1682,51 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // TODO: can this be removed somehow without breaking the tests? @UsedForTesting - /* package for test */ String getFirstSuggestedWord() { - return mSuggestedWords.size() > 0 ? mSuggestedWords.getWord(0) : null; + /* package for test */ SuggestedWords getSuggestedWordsForTest() { + // You may not use this method for anything else than debug + return DEBUG ? mInputLogic.mSuggestedWords : null; } // DO NOT USE THIS for any other purpose than testing. This is information private to LatinIME. @UsedForTesting - /* package for test */ boolean isCurrentlyWaitingForMainDictionary() { - return mSuggest.isCurrentlyWaitingForMainDictionary(); + /* package for test */ void waitForLoadingDictionaries(final long timeout, final TimeUnit unit) + throws InterruptedException { + mDictionaryFacilitator.waitForLoadingDictionariesForTesting(timeout, unit); } - // DO NOT USE THIS for any other purpose than testing. This is information private to LatinIME. + // DO NOT USE THIS for any other purpose than testing. This can break the keyboard badly. @UsedForTesting - /* package for test */ boolean hasMainDictionary() { - return mSuggest.hasMainDictionary(); + /* package for test */ void replaceDictionariesForTest(final Locale locale) { + final SettingsValues settingsValues = mSettings.getCurrent(); + mDictionaryFacilitator.resetDictionaries(this, locale, + settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts, + false /* forceReloadMainDictionary */, this /* listener */); + } + + // DO NOT USE THIS for any other purpose than testing. + @UsedForTesting + /* package for test */ void clearPersonalizedDictionariesForTest() { + mDictionaryFacilitator.clearUserHistoryDictionary(); + mDictionaryFacilitator.clearPersonalizationDictionary(); } - // DO NOT USE THIS for any other purpose than testing. This can break the keyboard badly. @UsedForTesting - /* package for test */ void replaceMainDictionaryForTest(final Locale locale) { - mSuggest.resetMainDict(this, locale, null); + /* package for test */ List<InputMethodSubtype> getEnabledSubtypesForTest() { + return (mRichImm != null) ? mRichImm.getMyEnabledInputMethodSubtypeList( + true /* allowsImplicitlySelectedSubtypes */) : new ArrayList<InputMethodSubtype>(); + } + + public void dumpDictionaryForDebug(final String dictName) { + if (mDictionaryFacilitator.getLocale() == null) { + resetSuggest(); + } + mDictionaryFacilitator.dumpDictionaryForDebug(dictName); } public void debugDumpStateAndCrashWithException(final String context) { - final StringBuilder s = new StringBuilder(mAppWorkAroundsUtils.toString()); - s.append("\nAttributes : ").append(mSettings.getCurrent().mInputAttributes) + final SettingsValues settingsValues = mSettings.getCurrent(); + final StringBuilder s = new StringBuilder(settingsValues.toString()); + s.append("\nAttributes : ").append(settingsValues.mInputAttributes) .append("\nContext : ").append(context); throw new RuntimeException(s.toString()); } @@ -3299,17 +1737,37 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); + p.println(" VersionCode = " + ApplicationUtils.getVersionCode(this)); + p.println(" VersionName = " + ApplicationUtils.getVersionName(this)); final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); final int keyboardMode = keyboard != null ? keyboard.mId.mMode : -1; p.println(" Keyboard mode = " + keyboardMode); final SettingsValues settingsValues = mSettings.getCurrent(); - p.println(" mIsSuggestionsSuggestionsRequested = " - + settingsValues.isSuggestionsRequested(mDisplayOrientation)); - p.println(" mCorrectionEnabled=" + settingsValues.mCorrectionEnabled); - p.println(" isComposingWord=" + mWordComposer.isComposingWord()); - p.println(" mSoundOn=" + settingsValues.mSoundOn); - p.println(" mVibrateOn=" + settingsValues.mVibrateOn); - p.println(" mKeyPreviewPopupOn=" + settingsValues.mKeyPreviewPopupOn); - p.println(" inputAttributes=" + settingsValues.mInputAttributes); + p.println(settingsValues.dump()); + // TODO: Dump all settings values + } + + public boolean shouldSwitchToOtherInputMethods() { + // TODO: Revisit here to reorganize the settings. Probably we can/should use different + // strategy once the implementation of + // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} is defined well. + final boolean fallbackValue = mSettings.getCurrent().mIncludesOtherImesInLanguageSwitchList; + final IBinder token = getWindow().getWindow().getAttributes().token; + if (token == null) { + return fallbackValue; + } + return mRichImm.shouldOfferSwitchingToNextInputMethod(token, fallbackValue); + } + + public boolean shouldShowLanguageSwitchKey() { + // TODO: Revisit here to reorganize the settings. Probably we can/should use different + // strategy once the implementation of + // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} is defined well. + final boolean fallbackValue = mSettings.getCurrent().isLanguageSwitchKeyEnabled(); + final IBinder token = getWindow().getWindow().getAttributes().token; + if (token == null) { + return fallbackValue; + } + return mRichImm.shouldOfferSwitchingToNextInputMethod(token, fallbackValue); } } diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java index 3f2b0a3f4..8fd36b937 100644 --- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java +++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java @@ -16,76 +16,12 @@ package com.android.inputmethod.latin; -import android.content.SharedPreferences; -import android.view.inputmethod.EditorInfo; +import android.content.Context; -import com.android.inputmethod.keyboard.Keyboard; +// TODO: Rename this class name to make it more relevant. +public final class LatinImeLogger { + public static final boolean sDBG = false; -public final class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener { - - public static boolean sDBG = false; - public static boolean sVISUALDEBUG = false; - public static boolean sUsabilityStudy = false; - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - } - - public static void init(LatinIME context) { - } - - public static void commit() { - } - - public static boolean getUsabilityStudyMode(final SharedPreferences prefs) { - return false; - } - - public static void onDestroy() { - } - - public static void logOnManualSuggestion( - String before, String after, int position, SuggestedWords suggestedWords) { - } - - public static void logOnAutoCorrectionForTyping( - String before, String after, int separatorCode) { - } - - public static void logOnAutoCorrectionForGeometric(String before, String after, - int separatorCode, InputPointers inputPointers) { - } - - public static void logOnAutoCorrectionCancelled() { - } - - public static void logOnDelete(int x, int y) { - } - - public static void logOnInputChar() { - } - - public static void logOnInputSeparator() { - } - - public static void logOnException(String metaData, Throwable e) { - } - - public static void logOnWarning(String warning) { - } - - public static void onStartInputView(EditorInfo editorInfo) { - } - - public static void onStartSuggestion(CharSequence previousWords) { - } - - public static void onAddSuggestedWord(String word, String sourceDictionaryId) { - } - - public static void onSetKeyboard(Keyboard kb) { - } - - public static void onPrintAllUsabilityStudyLogs() { + public static void init(Context context) { } } diff --git a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java new file mode 100644 index 000000000..f45c73f53 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2014 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.Arrays; + +import com.android.inputmethod.latin.utils.StringUtils; + +/** + * Class to represent information of previous words. This class is used to add n-gram entries + * into binary dictionaries, to get predictions, and to get suggestions. + */ +public class PrevWordsInfo { + public static final PrevWordsInfo EMPTY_PREV_WORDS_INFO = + new PrevWordsInfo(WordInfo.EMPTY_WORD_INFO); + public static final PrevWordsInfo BEGINNING_OF_SENTENCE = + new PrevWordsInfo(WordInfo.BEGINNING_OF_SENTENCE); + + /** + * Word information used to represent previous words information. + */ + public static class WordInfo { + public static final WordInfo EMPTY_WORD_INFO = new WordInfo(null); + public static final WordInfo BEGINNING_OF_SENTENCE = new WordInfo(); + + // This is an empty string when mIsBeginningOfSentence is true. + public final String mWord; + // TODO: Have sentence separator. + // Whether the current context is beginning of sentence or not. This is true when composing + // at the beginning of an input field or composing a word after a sentence separator. + public final boolean mIsBeginningOfSentence; + + // Beginning of sentence. + public WordInfo() { + mWord = ""; + mIsBeginningOfSentence = true; + } + + public WordInfo(final String word) { + mWord = word; + mIsBeginningOfSentence = false; + } + + public boolean isValid() { + return mWord != null; + } + + @Override + public int hashCode() { + return Arrays.hashCode(new Object[] { mWord, mIsBeginningOfSentence } ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof WordInfo)) return false; + final WordInfo wordInfo = (WordInfo)o; + if (mWord == null || wordInfo.mWord == null) { + return mWord == wordInfo.mWord + && mIsBeginningOfSentence == wordInfo.mIsBeginningOfSentence; + } + return mWord.equals(wordInfo.mWord) + && mIsBeginningOfSentence == wordInfo.mIsBeginningOfSentence; + } + } + + // The words immediately before the considered word. EMPTY_WORD_INFO element means we don't + // have any context for that previous word including the "beginning of sentence context" - we + // just don't know what to predict using the information. An example of that is after a comma. + // For simplicity of implementation, elements may also be EMPTY_WORD_INFO transiently after the + // WordComposer was reset and before starting a new composing word, but we should never be + // calling getSuggetions* in this situation. + public WordInfo[] mPrevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + + // Construct from the previous word information. + public PrevWordsInfo(final WordInfo prevWordInfo) { + mPrevWordsInfo[0] = prevWordInfo; + } + + // Construct from WordInfo array. n-th element represents (n+1)-th previous word's information. + public PrevWordsInfo(final WordInfo[] prevWordsInfo) { + for (int i = 0; i < Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM; i++) { + mPrevWordsInfo[i] = + (prevWordsInfo.length > i) ? prevWordsInfo[i] : WordInfo.EMPTY_WORD_INFO; + } + } + + // Create next prevWordsInfo using current prevWordsInfo. + public PrevWordsInfo getNextPrevWordsInfo(final WordInfo wordInfo) { + final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + prevWordsInfo[0] = wordInfo; + for (int i = 1; i < prevWordsInfo.length; i++) { + prevWordsInfo[i] = mPrevWordsInfo[i - 1]; + } + return new PrevWordsInfo(prevWordsInfo); + } + + public boolean isValid() { + return mPrevWordsInfo[0].isValid(); + } + + public void outputToArray(final int[][] codePointArrays, + final boolean[] isBeginningOfSentenceArray) { + for (int i = 0; i < mPrevWordsInfo.length; i++) { + final WordInfo wordInfo = mPrevWordsInfo[i]; + if (wordInfo == null || !wordInfo.isValid()) { + codePointArrays[i] = new int[0]; + isBeginningOfSentenceArray[i] = false; + continue; + } + codePointArrays[i] = StringUtils.toCodePointArray(wordInfo.mWord); + isBeginningOfSentenceArray[i] = wordInfo.mIsBeginningOfSentence; + } + } + + @Override + public int hashCode() { + return Arrays.hashCode(mPrevWordsInfo); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PrevWordsInfo)) return false; + final PrevWordsInfo prevWordsInfo = (PrevWordsInfo)o; + return Arrays.equals(mPrevWordsInfo, prevWordsInfo.mPrevWordsInfo); + } + + @Override + public String toString() { + final StringBuffer builder = new StringBuffer(); + for (int i = 0; i < mPrevWordsInfo.length; i++) { + final WordInfo wordInfo = mPrevWordsInfo[i]; + builder.append("PrevWord["); + builder.append(i); + builder.append("]: "); + if (wordInfo == null || !wordInfo.isValid()) { + builder.append("Empty. "); + continue; + } + builder.append(wordInfo.mWord); + builder.append(", isBeginningOfSentence: "); + builder.append(wordInfo.mIsBeginningOfSentence); + builder.append(". "); + } + return builder.toString(); + } +} diff --git a/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java b/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java new file mode 100644 index 000000000..0fba37c8a --- /dev/null +++ b/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2014 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.internal.KeySpecParser; +import com.android.inputmethod.latin.utils.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * The extended {@link SuggestedWords} class to represent punctuation suggestions. + * + * Each punctuation specification string is the key specification that can be parsed by + * {@link KeySpecParser}. + */ +public final class PunctuationSuggestions extends SuggestedWords { + private PunctuationSuggestions(final ArrayList<SuggestedWordInfo> punctuationsList) { + super(punctuationsList, + null /* rawSuggestions */, + false /* typedWordValid */, + false /* hasAutoCorrectionCandidate */, + false /* isObsoleteSuggestions */, + false /* isPrediction */); + } + + /** + * Create new instance of {@link PunctuationSuggestions} from the array of punctuation key + * specifications. + * + * @param punctuationSpecs The array of punctuation key specifications. + * @return The {@link PunctuationSuggestions} object. + */ + public static PunctuationSuggestions newPunctuationSuggestions( + final String[] punctuationSpecs) { + final ArrayList<SuggestedWordInfo> puncuationsList = new ArrayList<>(); + for (final String puncSpec : punctuationSpecs) { + puncuationsList.add(newHardCodedWordInfo(puncSpec)); + } + return new PunctuationSuggestions(puncuationsList); + } + + /** + * {@inheritDoc} + * Note that {@link super#getWord(int)} returns a punctuation key specification text. + * The suggested punctuation should be gotten by parsing the key specification. + */ + @Override + public String getWord(final int index) { + final String keySpec = super.getWord(index); + final int code = KeySpecParser.getCode(keySpec); + return (code == Constants.CODE_OUTPUT_TEXT) + ? KeySpecParser.getOutputText(keySpec) + : StringUtils.newSingleCodePointString(code); + } + + /** + * {@inheritDoc} + * Note that {@link super#getWord(int)} returns a punctuation key specification text. + * The displayed text should be gotten by parsing the key specification. + */ + @Override + public String getLabel(final int index) { + final String keySpec = super.getWord(index); + return KeySpecParser.getLabel(keySpec); + } + + /** + * {@inheritDoc} + * Note that {@link #getWord(int)} returns a suggested punctuation. We should create a + * {@link SuggestedWordInfo} object that represents a hard coded word. + */ + @Override + public SuggestedWordInfo getInfo(final int index) { + return newHardCodedWordInfo(getWord(index)); + } + + /** + * The predicator to tell whether this object represents punctuation suggestions. + * @return true if this object represents punctuation suggestions. + */ + @Override + public boolean isPunctuationSuggestions() { + return true; + } + + @Override + public String toString() { + return "PunctuationSuggestions: " + + " words=" + Arrays.toString(mSuggestedWordInfoList.toArray()); + } + + private static SuggestedWordInfo newHardCodedWordInfo(final String keySpec) { + return new SuggestedWordInfo(keySpec, SuggestedWordInfo.MAX_SCORE, + SuggestedWordInfo.KIND_HARDCODED, + Dictionary.DICTIONARY_HARDCODED, + SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, + SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */); + } +} diff --git a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java index 68505ce38..e59ef7563 100644 --- a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java @@ -50,21 +50,14 @@ public final class ReadOnlyBinaryDictionary extends Dictionary { @Override public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - return getSuggestionsWithSessionId(composer, prevWord, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, 0 /* sessionId */); - } - - @Override - public ArrayList<SuggestedWordInfo> getSuggestionsWithSessionId(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, - final int sessionId) { + final int sessionId, final float[] inOutLanguageWeight) { if (mLock.readLock().tryLock()) { try { - return mBinaryDictionary.getSuggestions(composer, prevWord, proximityInfo, - blockOffensiveWords, additionalFeaturesOptions); + return mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo, + blockOffensiveWords, additionalFeaturesOptions, sessionId, + inOutLanguageWeight); } finally { mLock.readLock().unlock(); } @@ -73,10 +66,10 @@ public final class ReadOnlyBinaryDictionary extends Dictionary { } @Override - public boolean isValidWord(final String word) { + public boolean isInDictionary(final String word) { if (mLock.readLock().tryLock()) { try { - return mBinaryDictionary.isValidWord(word); + return mBinaryDictionary.isInDictionary(word); } finally { mLock.readLock().unlock(); } @@ -109,6 +102,18 @@ public final class ReadOnlyBinaryDictionary extends Dictionary { } @Override + public int getMaxFrequencyOfExactMatches(final String word) { + if (mLock.readLock().tryLock()) { + try { + return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); + } finally { + mLock.readLock().unlock(); + } + } + return NOT_A_PROBABILITY; + } + + @Override public void close() { mLock.writeLock().lock(); try { diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java index 673d1b4c2..a6b3b710b 100644 --- a/java/src/com/android/inputmethod/latin/RichInputConnection.java +++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java @@ -26,17 +26,16 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; -import com.android.inputmethod.latin.define.ProductionFlag; -import com.android.inputmethod.latin.settings.SettingsValues; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; import com.android.inputmethod.latin.utils.CapsModeUtils; import com.android.inputmethod.latin.utils.DebugLogUtils; +import com.android.inputmethod.latin.utils.PrevWordsInfoUtils; +import com.android.inputmethod.latin.utils.ScriptUtils; import com.android.inputmethod.latin.utils.SpannableStringUtils; import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.TextRange; -import com.android.inputmethod.research.ResearchLogger; -import java.util.Locale; -import java.util.regex.Pattern; +import java.util.Arrays; /** * Enrichment class for InputConnection to simplify interaction and add functionality. @@ -51,20 +50,26 @@ public final class RichInputConnection { private static final boolean DBG = false; private static final boolean DEBUG_PREVIOUS_TEXT = false; private static final boolean DEBUG_BATCH_NESTING = false; - // Provision for a long word pair and a separator - private static final int LOOKBACK_CHARACTER_NUM = Constants.DICTIONARY_MAX_WORD_LENGTH * 2 + 1; - private static final Pattern spaceRegex = Pattern.compile("\\s+"); + // Provision for long words and separators between the words. + private static final int LOOKBACK_CHARACTER_NUM = Constants.DICTIONARY_MAX_WORD_LENGTH + * (Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM + 1) /* words */ + + Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM /* separators */; private static final int INVALID_CURSOR_POSITION = -1; /** - * This variable contains an expected value for the cursor position. This is where the - * cursor may end up after all the keyboard-triggered updates have passed. We keep this to - * compare it to the actual cursor position to guess whether the move was caused by a - * keyboard command or not. - * It's not really the cursor position: the cursor may not be there yet, and it's also expected - * there be cases where it never actually comes to be there. + * This variable contains an expected value for the selection start position. This is where the + * cursor or selection start may end up after all the keyboard-triggered updates have passed. We + * keep this to compare it to the actual selection start to guess whether the move was caused by + * a keyboard command or not. + * It's not really the selection start position: the selection start may not be there yet, and + * in some cases, it may never arrive there. */ - private int mExpectedCursorPosition = INVALID_CURSOR_POSITION; // in chars, not code points + private int mExpectedSelStart = INVALID_CURSOR_POSITION; // in chars, not code points + /** + * The expected selection end. Only differs from mExpectedSelStart if a non-empty selection is + * expected. The same caveats as mExpectedSelStart apply. + */ + private int mExpectedSelEnd = INVALID_CURSOR_POSITION; // in chars, not code points /** * This contains the committed text immediately preceding the cursor and the composing * text if any. It is refreshed when the cursor moves by calling upon the TextView. @@ -93,7 +98,7 @@ public final class RichInputConnection { final ExtractedText et = mIC.getExtractedText(r, 0); final CharSequence beforeCursor = getTextBeforeCursor(Constants.EDITOR_CONTENTS_CACHE_SIZE, 0); - final StringBuilder internal = new StringBuilder().append(mCommittedTextBeforeComposingText) + final StringBuilder internal = new StringBuilder(mCommittedTextBeforeComposingText) .append(mComposingText); if (null == et || null == beforeCursor) return; final int actualLength = Math.min(beforeCursor.length(), internal.length()); @@ -103,16 +108,16 @@ public final class RichInputConnection { final String reference = (beforeCursor.length() <= actualLength) ? beforeCursor.toString() : beforeCursor.subSequence(beforeCursor.length() - actualLength, beforeCursor.length()).toString(); - if (et.selectionStart != mExpectedCursorPosition + if (et.selectionStart != mExpectedSelStart || !(reference.equals(internal.toString()))) { - final String context = "Expected cursor position = " + mExpectedCursorPosition - + "\nActual cursor position = " + et.selectionStart + final String context = "Expected selection start = " + mExpectedSelStart + + "\nActual selection start = " + et.selectionStart + "\nExpected text = " + internal.length() + " " + internal + "\nActual text = " + reference.length() + " " + reference; ((LatinIME)mParent).debugDumpStateAndCrashWithException(context); } else { Log.e(TAG, DebugLogUtils.getStackTrace(2)); - Log.e(TAG, "Exp <> Actual : " + mExpectedCursorPosition + " <> " + et.selectionStart); + Log.e(TAG, "Exp <> Actual : " + mExpectedSelStart + " <> " + et.selectionStart); } } @@ -150,16 +155,35 @@ public final class RichInputConnection { * data, so we empty the cache and note that we don't know the new cursor position, and we * return false so that the caller knows about this and can retry later. * - * @param newCursorPosition The new position of the cursor, as received from the system. - * @param shouldFinishComposition Whether we should finish the composition in progress. + * @param newSelStart the new position of the selection start, as received from the system. + * @param newSelEnd the new position of the selection end, as received from the system. + * @param shouldFinishComposition whether we should finish the composition in progress. * @return true if we were able to connect to the editor successfully, false otherwise. When * this method returns false, the caches could not be correctly refreshed so they were only * reset: the caller should try again later to return to normal operation. */ - public boolean resetCachesUponCursorMoveAndReturnSuccess(final int newCursorPosition, - final boolean shouldFinishComposition) { - mExpectedCursorPosition = newCursorPosition; + public boolean resetCachesUponCursorMoveAndReturnSuccess(final int newSelStart, + final int newSelEnd, final boolean shouldFinishComposition) { + mExpectedSelStart = newSelStart; + mExpectedSelEnd = newSelEnd; mComposingText.setLength(0); + final boolean didReloadTextSuccessfully = reloadTextCache(); + if (!didReloadTextSuccessfully) { + Log.d(TAG, "Will try to retrieve text later."); + return false; + } + if (null != mIC && shouldFinishComposition) { + mIC.finishComposingText(); + } + return true; + } + + /** + * Reload the cached text from the InputConnection. + * + * @return true if successful + */ + private boolean reloadTextCache() { mCommittedTextBeforeComposingText.setLength(0); mIC = mParent.getCurrentInputConnection(); // Call upon the inputconnection directly since our own method is using the cache, and @@ -169,27 +193,12 @@ public final class RichInputConnection { if (null == textBeforeCursor) { // For some reason the app thinks we are not connected to it. This looks like a // framework bug... Fall back to ground state and return false. - mExpectedCursorPosition = INVALID_CURSOR_POSITION; - Log.e(TAG, "Unable to connect to the editor to retrieve text... will retry later"); + mExpectedSelStart = INVALID_CURSOR_POSITION; + mExpectedSelEnd = INVALID_CURSOR_POSITION; + Log.e(TAG, "Unable to connect to the editor to retrieve text."); return false; } mCommittedTextBeforeComposingText.append(textBeforeCursor); - final int lengthOfTextBeforeCursor = textBeforeCursor.length(); - if (lengthOfTextBeforeCursor > newCursorPosition - || (lengthOfTextBeforeCursor < Constants.EDITOR_CONTENTS_CACHE_SIZE - && newCursorPosition < Constants.EDITOR_CONTENTS_CACHE_SIZE)) { - // newCursorPosition may be lying -- when rotating the device (probably a framework - // bug). If we have less chars than we asked for, then we know how many chars we have, - // and if we got more than newCursorPosition says, then we know it was lying. In both - // cases the length is more reliable - mExpectedCursorPosition = lengthOfTextBeforeCursor; - } - if (null != mIC && shouldFinishComposition) { - mIC.finishComposingText(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_finishComposingText(); - } - } return true; } @@ -204,13 +213,13 @@ public final class RichInputConnection { public void finishComposingText() { if (DEBUG_BATCH_NESTING) checkBatchEdit(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); + // TODO: this is not correct! The cursor is not necessarily after the composing text. + // In the practice right now this is only called when input ends so it will be reset so + // it works, but it's wrong and should be fixed. mCommittedTextBeforeComposingText.append(mComposingText); mComposingText.setLength(0); if (null != mIC) { mIC.finishComposingText(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_finishComposingText(); - } } } @@ -218,7 +227,11 @@ public final class RichInputConnection { if (DEBUG_BATCH_NESTING) checkBatchEdit(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); mCommittedTextBeforeComposingText.append(text); - mExpectedCursorPosition += text.length() - mComposingText.length(); + // TODO: the following is exceedingly error-prone. Right now when the cursor is in the + // middle of the composing word mComposingText only holds the part of the composing text + // that is before the cursor, so this actually works, but it's terribly confusing. Fix this. + mExpectedSelStart += text.length() - mComposingText.length(); + mExpectedSelEnd = mExpectedSelStart; mComposingText.setLength(0); if (null != mIC) { mIC.commitText(text, i); @@ -226,12 +239,11 @@ public final class RichInputConnection { } public CharSequence getSelectedText(final int flags) { - if (null == mIC) return null; - return mIC.getSelectedText(flags); + return (null == mIC) ? null : mIC.getSelectedText(flags); } public boolean canDeleteCharacters() { - return mExpectedCursorPosition > 0; + return mExpectedSelStart > 0; } /** @@ -245,12 +257,12 @@ public final class RichInputConnection { * American English, it's just the most common set of rules for English). * * @param inputType a mask of the caps modes to test for. - * @param settingsValues the values of the settings to use for locale and separators. + * @param spacingAndPunctuations the values of the settings to use for locale and separators. * @param hasSpaceBefore if we should consider there should be a space after the string. * @return the caps modes that should be on as a set of bits */ - public int getCursorCapsMode(final int inputType, final SettingsValues settingsValues, - final boolean hasSpaceBefore) { + public int getCursorCapsMode(final int inputType, + final SpacingAndPunctuations spacingAndPunctuations, final boolean hasSpaceBefore) { mIC = mParent.getCurrentInputConnection(); if (null == mIC) return Constants.TextUtils.CAP_MODE_OFF; if (!TextUtils.isEmpty(mComposingText)) { @@ -268,23 +280,22 @@ public final class RichInputConnection { // heavy pressing of delete, for example DEFAULT_TEXT_CACHE_SIZE - 5 times or so. // getCapsMode should be updated to be able to return a "not enough info" result so that // we can get more context only when needed. - if (TextUtils.isEmpty(mCommittedTextBeforeComposingText) && 0 != mExpectedCursorPosition) { - final CharSequence textBeforeCursor = getTextBeforeCursor( - Constants.EDITOR_CONTENTS_CACHE_SIZE, 0); - if (!TextUtils.isEmpty(textBeforeCursor)) { - mCommittedTextBeforeComposingText.append(textBeforeCursor); + if (TextUtils.isEmpty(mCommittedTextBeforeComposingText) && 0 != mExpectedSelStart) { + if (!reloadTextCache()) { + Log.w(TAG, "Unable to connect to the editor. " + + "Setting caps mode without knowing text."); } } // This never calls InputConnection#getCapsMode - in fact, it's a static method that // never blocks or initiates IPC. return CapsModeUtils.getCapsMode(mCommittedTextBeforeComposingText, inputType, - settingsValues, hasSpaceBefore); + spacingAndPunctuations, hasSpaceBefore); } public int getCodePointBeforeCursor() { - if (mCommittedTextBeforeComposingText.length() < 1) return Constants.NOT_A_CODE; - return Character.codePointBefore(mCommittedTextBeforeComposingText, - mCommittedTextBeforeComposingText.length()); + final int length = mCommittedTextBeforeComposingText.length(); + if (length < 1) return Constants.NOT_A_CODE; + return Character.codePointBefore(mCommittedTextBeforeComposingText, length); } public CharSequence getTextBeforeCursor(final int n, final int flags) { @@ -295,8 +306,8 @@ public final class RichInputConnection { // However, if we don't have an expected cursor position, then we should always // go fetch the cache again (as it happens, INVALID_CURSOR_POSITION < 0, so we need to // test for this explicitly) - if (INVALID_CURSOR_POSITION != mExpectedCursorPosition - && (cachedLength >= n || cachedLength >= mExpectedCursorPosition)) { + if (INVALID_CURSOR_POSITION != mExpectedSelStart + && (cachedLength >= n || cachedLength >= mExpectedSelStart)) { final StringBuilder s = new StringBuilder(mCommittedTextBeforeComposingText); // We call #toString() here to create a temporary object. // In some situations, this method is called on a worker thread, and it's possible @@ -312,20 +323,19 @@ public final class RichInputConnection { return s; } mIC = mParent.getCurrentInputConnection(); - if (null != mIC) { - return mIC.getTextBeforeCursor(n, flags); - } - return null; + return (null == mIC) ? null : mIC.getTextBeforeCursor(n, flags); } public CharSequence getTextAfterCursor(final int n, final int flags) { mIC = mParent.getCurrentInputConnection(); - if (null != mIC) return mIC.getTextAfterCursor(n, flags); - return null; + return (null == mIC) ? null : mIC.getTextAfterCursor(n, flags); } public void deleteSurroundingText(final int beforeLength, final int afterLength) { if (DEBUG_BATCH_NESTING) checkBatchEdit(); + // TODO: the following is incorrect if the cursor is not immediately after the composition. + // Right now we never come here in this case because we reset the composing state before we + // come here in this case, but we need to fix this. final int remainingChars = mComposingText.length() - beforeLength; if (remainingChars >= 0) { mComposingText.setLength(remainingChars); @@ -336,16 +346,17 @@ public final class RichInputConnection { + remainingChars, 0); mCommittedTextBeforeComposingText.setLength(len); } - if (mExpectedCursorPosition > beforeLength) { - mExpectedCursorPosition -= beforeLength; + if (mExpectedSelStart > beforeLength) { + mExpectedSelStart -= beforeLength; + mExpectedSelEnd -= beforeLength; } else { - mExpectedCursorPosition = 0; + // There are fewer characters before the cursor in the buffer than we are being asked to + // delete. Only delete what is there, and update the end with the amount deleted. + mExpectedSelEnd -= mExpectedSelStart; + mExpectedSelStart = 0; } if (null != mIC) { mIC.deleteSurroundingText(beforeLength, afterLength); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_deleteSurroundingText(beforeLength, afterLength); - } } if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); } @@ -354,9 +365,6 @@ public final class RichInputConnection { mIC = mParent.getCurrentInputConnection(); if (null != mIC) { mIC.performEditorAction(actionId); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_performEditorAction(actionId); - } } } @@ -373,7 +381,8 @@ public final class RichInputConnection { switch (keyEvent.getKeyCode()) { case KeyEvent.KEYCODE_ENTER: mCommittedTextBeforeComposingText.append("\n"); - mExpectedCursorPosition += 1; + mExpectedSelStart += 1; + mExpectedSelEnd = mExpectedSelStart; break; case KeyEvent.KEYCODE_DEL: if (0 == mComposingText.length()) { @@ -385,26 +394,29 @@ public final class RichInputConnection { } else { mComposingText.delete(mComposingText.length() - 1, mComposingText.length()); } - if (mExpectedCursorPosition > 0) mExpectedCursorPosition -= 1; + if (mExpectedSelStart > 0 && mExpectedSelStart == mExpectedSelEnd) { + // TODO: Handle surrogate pairs. + mExpectedSelStart -= 1; + } + mExpectedSelEnd = mExpectedSelStart; break; case KeyEvent.KEYCODE_UNKNOWN: if (null != keyEvent.getCharacters()) { mCommittedTextBeforeComposingText.append(keyEvent.getCharacters()); - mExpectedCursorPosition += keyEvent.getCharacters().length(); + mExpectedSelStart += keyEvent.getCharacters().length(); + mExpectedSelEnd = mExpectedSelStart; } break; default: - final String text = new String(new int[] { keyEvent.getUnicodeChar() }, 0, 1); + final String text = StringUtils.newSingleCodePointString(keyEvent.getUnicodeChar()); mCommittedTextBeforeComposingText.append(text); - mExpectedCursorPosition += text.length(); + mExpectedSelStart += text.length(); + mExpectedSelEnd = mExpectedSelStart; break; } } if (null != mIC) { mIC.sendKeyEvent(keyEvent); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_sendKeyEvent(keyEvent); - } } } @@ -415,8 +427,12 @@ public final class RichInputConnection { getTextBeforeCursor(Constants.EDITOR_CONTENTS_CACHE_SIZE + (end - start), 0); mCommittedTextBeforeComposingText.setLength(0); if (!TextUtils.isEmpty(textBeforeCursor)) { + // The cursor is not necessarily at the end of the composing text, but we have its + // position in mExpectedSelStart and mExpectedSelEnd. In this case we want the start + // of the text, so we should use mExpectedSelStart. In other words, the composing + // text starts (mExpectedSelStart - start) characters before the end of textBeforeCursor final int indexOfStartOfComposingText = - Math.max(textBeforeCursor.length() - (end - start), 0); + Math.max(textBeforeCursor.length() - (mExpectedSelStart - start), 0); mComposingText.append(textBeforeCursor.subSequence(indexOfStartOfComposingText, textBeforeCursor.length())); mCommittedTextBeforeComposingText.append( @@ -430,32 +446,44 @@ public final class RichInputConnection { public void setComposingText(final CharSequence text, final int newCursorPosition) { if (DEBUG_BATCH_NESTING) checkBatchEdit(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); - mExpectedCursorPosition += text.length() - mComposingText.length(); + mExpectedSelStart += text.length() - mComposingText.length(); + mExpectedSelEnd = mExpectedSelStart; mComposingText.setLength(0); mComposingText.append(text); - // TODO: support values of i != 1. At this time, this is never called with i != 1. + // TODO: support values of newCursorPosition != 1. At this time, this is never called with + // newCursorPosition != 1. if (null != mIC) { mIC.setComposingText(text, newCursorPosition); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_setComposingText(text, newCursorPosition); - } } if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); } - public void setSelection(final int start, final int end) { + /** + * Set the selection of the text editor. + * + * Calls through to {@link InputConnection#setSelection(int, int)}. + * + * @param start the character index where the selection should start. + * @param end the character index where the selection should end. + * @return Returns true on success, false on failure: either the input connection is no longer + * valid when setting the selection or when retrieving the text cache at that point, or + * invalid arguments were passed. + */ + public boolean setSelection(final int start, final int end) { if (DEBUG_BATCH_NESTING) checkBatchEdit(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); + if (start < 0 || end < 0) { + return false; + } + mExpectedSelStart = start; + mExpectedSelEnd = end; if (null != mIC) { - mIC.setSelection(start, end); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_setSelection(start, end); + final boolean isIcValid = mIC.setSelection(start, end); + if (!isIcValid) { + return false; } } - mExpectedCursorPosition = start; - mCommittedTextBeforeComposingText.setLength(0); - mCommittedTextBeforeComposingText.append( - getTextBeforeCursor(Constants.EDITOR_CONTENTS_CACHE_SIZE, 0)); + return reloadTextCache(); } public void commitCorrection(final CorrectionInfo correctionInfo) { @@ -476,26 +504,30 @@ public final class RichInputConnection { // text should never be null, but just in case, it's better to insert nothing than to crash if (null == text) text = ""; mCommittedTextBeforeComposingText.append(text); - mExpectedCursorPosition += text.length() - mComposingText.length(); + mExpectedSelStart += text.length() - mComposingText.length(); + mExpectedSelEnd = mExpectedSelStart; mComposingText.setLength(0); if (null != mIC) { mIC.commitCompletion(completionInfo); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_commitCompletion(completionInfo); - } } if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); } @SuppressWarnings("unused") - public String getNthPreviousWord(final String sentenceSeperators, final int n) { + public PrevWordsInfo getPrevWordsInfoFromNthPreviousWord( + final SpacingAndPunctuations spacingAndPunctuations, final int n) { mIC = mParent.getCurrentInputConnection(); - if (null == mIC) return null; + if (null == mIC) { + return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; + } final CharSequence prev = getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); if (DEBUG_PREVIOUS_TEXT && null != prev) { final int checkLength = LOOKBACK_CHARACTER_NUM - 1; final String reference = prev.length() <= checkLength ? prev.toString() : prev.subSequence(prev.length() - checkLength, prev.length()).toString(); + // TODO: right now the following works because mComposingText holds the part of the + // composing text that is before the cursor, but this is very confusing. We should + // fix it. final StringBuilder internal = new StringBuilder() .append(mCommittedTextBeforeComposingText).append(mComposingText); if (internal.length() > checkLength) { @@ -507,71 +539,24 @@ public final class RichInputConnection { } } } - return getNthPreviousWord(prev, sentenceSeperators, n); - } - - private static boolean isSeparator(int code, String sep) { - return sep.indexOf(code) != -1; + return PrevWordsInfoUtils.getPrevWordsInfoFromNthPreviousWord( + prev, spacingAndPunctuations, n); } - // Get the nth word before cursor. n = 1 retrieves the word immediately before the cursor, - // n = 2 retrieves the word before that, and so on. This splits on whitespace only. - // Also, it won't return words that end in a separator (if the nth word before the cursor - // ends in a separator, it returns null). - // Example : - // (n = 1) "abc def|" -> def - // (n = 1) "abc def |" -> def - // (n = 1) "abc def. |" -> null - // (n = 1) "abc def . |" -> null - // (n = 2) "abc def|" -> abc - // (n = 2) "abc def |" -> abc - // (n = 2) "abc def. |" -> abc - // (n = 2) "abc def . |" -> def - // (n = 2) "abc|" -> null - // (n = 2) "abc |" -> null - // (n = 2) "abc. def|" -> null - public static String getNthPreviousWord(final CharSequence prev, - final String sentenceSeperators, final int n) { - if (prev == null) return null; - final String[] w = spaceRegex.split(prev); - - // If we can't find n words, or we found an empty word, return null. - if (w.length < n) return null; - final String nthPrevWord = w[w.length - n]; - final int length = nthPrevWord.length(); - if (length <= 0) return null; - - // If ends in a separator, return null - final char lastChar = nthPrevWord.charAt(length - 1); - if (sentenceSeperators.contains(String.valueOf(lastChar))) return null; - - return nthPrevWord; - } - - /** - * @param separators characters which may separate words - * @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 CharSequence getWordAtCursor(String separators) { - // getWordRangeAtCursor returns null if the connection is null - TextRange r = getWordRangeAtCursor(separators, 0); - return (r == null) ? null : r.mWord; + private static boolean isSeparator(final int code, final int[] sortedSeparators) { + return Arrays.binarySearch(sortedSeparators, code) >= 0; } /** * Returns the text surrounding the cursor. * - * @param sep a string of characters that split words. - * @param additionalPrecedingWordsCount the number of words before the current word that should - * be included in the returned range + * @param sortedSeparators a sorted array of code points that split words. + * @param scriptId the script we consider to be writing words, as one of ScriptUtils.SCRIPT_* * @return a range containing the text surrounding the cursor */ - public TextRange getWordRangeAtCursor(final String sep, - final int additionalPrecedingWordsCount) { + public TextRange getWordRangeAtCursor(final int[] sortedSeparators, final int scriptId) { mIC = mParent.getCurrentInputConnection(); - if (mIC == null || sep == null) { + if (mIC == null) { return null; } final CharSequence before = mIC.getTextBeforeCursor(Constants.EDITOR_CONTENTS_CACHE_SIZE, @@ -582,36 +567,26 @@ public final class RichInputConnection { return null; } - // Going backward, alternate skipping non-separators and separators until enough words - // have been read. - int count = additionalPrecedingWordsCount; + // Going backward, find the first breaking point (separator) int startIndexInBefore = before.length(); - boolean isStoppingAtWhitespace = true; // toggles to indicate what to stop at - while (true) { // see comments below for why this is guaranteed to halt - while (startIndexInBefore > 0) { - final int codePoint = Character.codePointBefore(before, startIndexInBefore); - if (isStoppingAtWhitespace == isSeparator(codePoint, sep)) { - break; // inner loop - } - --startIndexInBefore; - if (Character.isSupplementaryCodePoint(codePoint)) { - --startIndexInBefore; - } + while (startIndexInBefore > 0) { + final int codePoint = Character.codePointBefore(before, startIndexInBefore); + if (isSeparator(codePoint, sortedSeparators) + || !ScriptUtils.isLetterPartOfScript(codePoint, scriptId)) { + break; } - // isStoppingAtWhitespace is true every other time through the loop, - // so additionalPrecedingWordsCount is guaranteed to become < 0, which - // guarantees outer loop termination - if (isStoppingAtWhitespace && (--count < 0)) { - break; // outer loop + --startIndexInBefore; + if (Character.isSupplementaryCodePoint(codePoint)) { + --startIndexInBefore; } - isStoppingAtWhitespace = !isStoppingAtWhitespace; } // Find last word separator after the cursor int endIndexInAfter = -1; while (++endIndexInAfter < after.length()) { final int codePoint = Character.codePointAt(after, endIndexInAfter); - if (isSeparator(codePoint, sep)) { + if (isSeparator(codePoint, sortedSeparators) + || !ScriptUtils.isLetterPartOfScript(codePoint, scriptId)) { break; } if (Character.isSupplementaryCodePoint(codePoint)) { @@ -619,27 +594,50 @@ public final class RichInputConnection { } } + final boolean hasUrlSpans = + SpannableStringUtils.hasUrlSpans(before, startIndexInBefore, before.length()) + || SpannableStringUtils.hasUrlSpans(after, 0, endIndexInAfter); // We don't use TextUtils#concat because it copies all spans without respect to their // nature. If the text includes a PARAGRAPH span and it has been split, then // TextUtils#concat will crash when it tries to concat both sides of it. return new TextRange( SpannableStringUtils.concatWithNonParagraphSuggestionSpansOnly(before, after), - startIndexInBefore, before.length() + endIndexInAfter, before.length()); + startIndexInBefore, before.length() + endIndexInAfter, before.length(), + hasUrlSpans); } - public boolean isCursorTouchingWord(final SettingsValues settingsValues) { - final int codePointBeforeCursor = getCodePointBeforeCursor(); - if (Constants.NOT_A_CODE != codePointBeforeCursor - && !settingsValues.isWordSeparator(codePointBeforeCursor) - && !settingsValues.isWordConnector(codePointBeforeCursor)) { + public boolean isCursorTouchingWord(final SpacingAndPunctuations spacingAndPunctuations) { + if (isCursorFollowedByWordCharacter(spacingAndPunctuations)) { + // If what's after the cursor is a word character, then we're touching a word. return true; } + final String textBeforeCursor = mCommittedTextBeforeComposingText.toString(); + int indexOfCodePointInJavaChars = textBeforeCursor.length(); + int consideredCodePoint = 0 == indexOfCodePointInJavaChars ? Constants.NOT_A_CODE + : textBeforeCursor.codePointBefore(indexOfCodePointInJavaChars); + // Search for the first non word-connector char + if (spacingAndPunctuations.isWordConnector(consideredCodePoint)) { + indexOfCodePointInJavaChars -= Character.charCount(consideredCodePoint); + consideredCodePoint = 0 == indexOfCodePointInJavaChars ? Constants.NOT_A_CODE + : textBeforeCursor.codePointBefore(indexOfCodePointInJavaChars); + } + return !(Constants.NOT_A_CODE == consideredCodePoint + || spacingAndPunctuations.isWordSeparator(consideredCodePoint) + || spacingAndPunctuations.isWordConnector(consideredCodePoint)); + } + + public boolean isCursorFollowedByWordCharacter( + final SpacingAndPunctuations spacingAndPunctuations) { final CharSequence after = getTextAfterCursor(1, 0); - if (!TextUtils.isEmpty(after) && !settingsValues.isWordSeparator(after.charAt(0)) - && !settingsValues.isWordConnector(after.charAt(0))) { - return true; + if (TextUtils.isEmpty(after)) { + return false; + } + final int codePointAfterCursor = Character.codePointAt(after, 0); + if (spacingAndPunctuations.isWordSeparator(codePointAfterCursor) + || spacingAndPunctuations.isWordConnector(codePointAfterCursor)) { + return false; } - return false; + return true; } public void removeTrailingSpace() { @@ -655,57 +653,17 @@ public final class RichInputConnection { return TextUtils.equals(text, beforeText); } - /* (non-javadoc) - * Returns the word before the cursor if the cursor is at the end of a word, null otherwise - */ - public CharSequence getWordBeforeCursorIfAtEndOfWord(final SettingsValues settings) { - // Bail out if the cursor is in the middle of a word (cursor must be followed by whitespace, - // separator or end of line/text) - // Example: "test|"<EOL> "te|st" get rejected here - final CharSequence textAfterCursor = getTextAfterCursor(1, 0); - if (!TextUtils.isEmpty(textAfterCursor) - && !settings.isWordSeparator(textAfterCursor.charAt(0))) return null; - - // Bail out if word before cursor is 0-length or a single non letter (like an apostrophe) - // Example: " -|" gets rejected here but "e-|" and "e|" are okay - CharSequence word = getWordAtCursor(settings.mWordSeparators); - // We don't suggest on leading single quotes, so we have to remove them from the word if - // it starts with single quotes. - while (!TextUtils.isEmpty(word) && Constants.CODE_SINGLE_QUOTE == word.charAt(0)) { - word = word.subSequence(1, word.length()); - } - if (TextUtils.isEmpty(word)) return null; - // Find the last code point of the string - final int lastCodePoint = Character.codePointBefore(word, word.length()); - // If for some reason the text field contains non-unicode binary data, or if the - // charsequence is exactly one char long and the contents is a low surrogate, return null. - if (!Character.isDefined(lastCodePoint)) return null; - // Bail out if the cursor is not at the end of a word (cursor must be preceded by - // non-whitespace, non-separator, non-start-of-text) - // Example ("|" is the cursor here) : <SOL>"|a" " |a" " | " all get rejected here. - if (settings.isWordSeparator(lastCodePoint)) return null; - final char firstChar = word.charAt(0); // we just tested that word is not empty - if (word.length() == 1 && !Character.isLetter(firstChar)) return null; - - // We don't restart suggestion if the first character is not a letter, because we don't - // start composing when the first character is not a letter. - if (!Character.isLetter(firstChar)) return null; - - return word; - } - public boolean revertDoubleSpacePeriod() { if (DEBUG_BATCH_NESTING) checkBatchEdit(); // Here we test whether we indeed have a period and a space before us. This should not // be needed, but it's there just in case something went wrong. final CharSequence textBeforeCursor = getTextBeforeCursor(2, 0); - final String periodSpace = ". "; - if (!TextUtils.equals(periodSpace, textBeforeCursor)) { + if (!TextUtils.equals(Constants.STRING_PERIOD_AND_SPACE, textBeforeCursor)) { // Theoretically we should not be coming here if there isn't ". " before the // cursor, but the application may be changing the text while we are typing, so // anything goes. We should not crash. Log.d(TAG, "Tried to revert double-space combo but we didn't find " - + "\"" + periodSpace + "\" just before the cursor."); + + "\"" + Constants.STRING_PERIOD_AND_SPACE + "\" just before the cursor."); return false; } // Double-space results in ". ". A backspace to cancel this should result in a single @@ -713,9 +671,6 @@ public final class RichInputConnection { deleteSurroundingText(2, 0); final String singleSpace = " "; commitText(singleSpace, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_revertDoubleSpacePeriod(); - } return true; } @@ -738,9 +693,6 @@ public final class RichInputConnection { deleteSurroundingText(2, 0); final String text = " " + textBeforeCursor.subSequence(0, 1); commitText(text, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_revertSwapPunctuation(); - } return true; } @@ -758,20 +710,30 @@ public final class RichInputConnection { * this update and not the ones in-between. This is almost impossible to achieve even trying * very very hard. * - * @param oldSelStart The value of the old cursor position in the update. - * @param newSelStart The value of the new cursor position in the update. + * @param oldSelStart The value of the old selection in the update. + * @param newSelStart The value of the new selection in the update. + * @param oldSelEnd The value of the old selection end in the update. + * @param newSelEnd The value of the new selection end in the update. * @return whether this is a belated expected update or not. */ - public boolean isBelatedExpectedUpdate(final int oldSelStart, final int newSelStart) { - // If this is an update that arrives at our expected position, it's a belated update. - if (newSelStart == mExpectedCursorPosition) return true; - // If this is an update that moves the cursor from our expected position, it must be - // an explicit move. - if (oldSelStart == mExpectedCursorPosition) return false; - // The following returns true if newSelStart is between oldSelStart and - // mCurrentCursorPosition. We assume that if the updated position is between the old - // position and the expected position, then it must be a belated update. - return (newSelStart - oldSelStart) * (mExpectedCursorPosition - newSelStart) >= 0; + public boolean isBelatedExpectedUpdate(final int oldSelStart, final int newSelStart, + final int oldSelEnd, final int newSelEnd) { + // This update is "belated" if we are expecting it. That is, mExpectedSelStart and + // mExpectedSelEnd match the new values that the TextView is updating TO. + if (mExpectedSelStart == newSelStart && mExpectedSelEnd == newSelEnd) return true; + // This update is not belated if mExpectedSelStart and mExpectedSelEnd match the old + // values, and one of newSelStart or newSelEnd is updated to a different value. In this + // case, it is likely that something other than the IME has moved the selection endpoint + // to the new value. + if (mExpectedSelStart == oldSelStart && mExpectedSelEnd == oldSelEnd + && (oldSelStart != newSelStart || oldSelEnd != newSelEnd)) return false; + // If neither of the above two cases hold, then the system may be having trouble keeping up + // with updates. If 1) the selection is a cursor, 2) newSelStart is between oldSelStart + // and mExpectedSelStart, and 3) newSelEnd is between oldSelEnd and mExpectedSelEnd, then + // assume a belated update. + return (newSelStart == newSelEnd) + && (newSelStart - oldSelStart) * (mExpectedSelStart - newSelStart) >= 0 + && (newSelEnd - oldSelEnd) * (mExpectedSelEnd - newSelEnd) >= 0; } /** @@ -784,4 +746,69 @@ public final class RichInputConnection { public boolean textBeforeCursorLooksLikeURL() { return StringUtils.lastPartLooksLikeURL(mCommittedTextBeforeComposingText); } + + /** + * Looks at the text just before the cursor to find out if we are inside a double quote. + * + * As with #textBeforeCursorLooksLikeURL, this is dependent on how much text we have cached. + * However this won't be a concrete problem in most situations, as the cache is almost always + * long enough for this use. + */ + public boolean isInsideDoubleQuoteOrAfterDigit() { + return StringUtils.isInsideDoubleQuoteOrAfterDigit(mCommittedTextBeforeComposingText); + } + + /** + * Try to get the text from the editor to expose lies the framework may have been + * telling us. Concretely, when the device rotates, the frameworks tells us about where the + * cursor used to be initially in the editor at the time it first received the focus; this + * may be completely different from the place it is upon rotation. Since we don't have any + * means to get the real value, try at least to ask the text view for some characters and + * detect the most damaging cases: when the cursor position is declared to be much smaller + * than it really is. + */ + public void tryFixLyingCursorPosition() { + final CharSequence textBeforeCursor = getTextBeforeCursor( + Constants.EDITOR_CONTENTS_CACHE_SIZE, 0); + if (null == textBeforeCursor) { + mExpectedSelStart = mExpectedSelEnd = Constants.NOT_A_CURSOR_POSITION; + } else { + final int textLength = textBeforeCursor.length(); + if (textLength < Constants.EDITOR_CONTENTS_CACHE_SIZE + && (textLength > mExpectedSelStart + || mExpectedSelStart < Constants.EDITOR_CONTENTS_CACHE_SIZE)) { + // It should not be possible to have only one of those variables be + // NOT_A_CURSOR_POSITION, so if they are equal, either the selection is zero-sized + // (simple cursor, no selection) or there is no cursor/we don't know its pos + final boolean wasEqual = mExpectedSelStart == mExpectedSelEnd; + mExpectedSelStart = textLength; + // We can't figure out the value of mLastSelectionEnd :( + // But at least if it's smaller than mLastSelectionStart something is wrong, + // and if they used to be equal we also don't want to make it look like there is a + // selection. + if (wasEqual || mExpectedSelStart > mExpectedSelEnd) { + mExpectedSelEnd = mExpectedSelStart; + } + } + } + } + + public int getExpectedSelectionStart() { + return mExpectedSelStart; + } + + public int getExpectedSelectionEnd() { + return mExpectedSelEnd; + } + + /** + * @return whether there is a selection currently active. + */ + public boolean hasSelection() { + return mExpectedSelEnd != mExpectedSelStart; + } + + public boolean isCursorPositionKnown() { + return INVALID_CURSOR_POSITION != mExpectedSelStart; + } } diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java index 6b6bbf3a7..7cf4eff92 100644 --- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java +++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java @@ -20,6 +20,7 @@ import static com.android.inputmethod.latin.Constants.Subtype.KEYBOARD_MODE; import android.content.Context; import android.content.SharedPreferences; +import android.os.Build; import android.os.IBinder; import android.preference.PreferenceManager; import android.util.Log; @@ -30,7 +31,6 @@ import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.compat.InputMethodManagerCompatWrapper; import com.android.inputmethod.latin.settings.Settings; import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import java.util.Collections; @@ -50,11 +50,11 @@ public final class RichInputMethodManager { private static final RichInputMethodManager sInstance = new RichInputMethodManager(); private InputMethodManagerCompatWrapper mImmWrapper; - private InputMethodInfo mInputMethodInfoOfThisIme; + private InputMethodInfoCache mInputMethodInfoCache; final HashMap<InputMethodInfo, List<InputMethodSubtype>> - mSubtypeListCacheWithImplicitlySelectedSubtypes = CollectionUtils.newHashMap(); + mSubtypeListCacheWithImplicitlySelectedSubtypes = new HashMap<>(); final HashMap<InputMethodInfo, List<InputMethodSubtype>> - mSubtypeListCacheWithoutImplicitlySelectedSubtypes = CollectionUtils.newHashMap(); + mSubtypeListCacheWithoutImplicitlySelectedSubtypes = new HashMap<>(); private static final int INDEX_NOT_FOUND = -1; @@ -64,8 +64,7 @@ public final class RichInputMethodManager { } public static void init(final Context context) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - sInstance.initInternal(context, prefs); + sInstance.initInternal(context); } private boolean isInitialized() { @@ -78,20 +77,26 @@ public final class RichInputMethodManager { } } - private void initInternal(final Context context, final SharedPreferences prefs) { + private void initInternal(final Context context) { if (isInitialized()) { return; } mImmWrapper = new InputMethodManagerCompatWrapper(context); - mInputMethodInfoOfThisIme = getInputMethodInfoOfThisIme(context); + mInputMethodInfoCache = new InputMethodInfoCache( + mImmWrapper.mImm, context.getPackageName()); // Initialize additional subtypes. SubtypeLocaleUtils.init(context); + final InputMethodSubtype[] additionalSubtypes = getAdditionalSubtypes(context); + setAdditionalInputMethodSubtypes(additionalSubtypes); + } + + public InputMethodSubtype[] getAdditionalSubtypes(final Context context) { + SubtypeLocaleUtils.init(context); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final String prefAdditionalSubtypes = Settings.readPrefAdditionalSubtypes( prefs, context.getResources()); - final InputMethodSubtype[] additionalSubtypes = - AdditionalSubtypeUtils.createAdditionalSubtypesArray(prefAdditionalSubtypes); - setAdditionalInputMethodSubtypes(additionalSubtypes); + return AdditionalSubtypeUtils.createAdditionalSubtypesArray(prefAdditionalSubtypes); } public InputMethodManager getInputMethodManager() { @@ -99,20 +104,10 @@ public final class RichInputMethodManager { return mImmWrapper.mImm; } - private InputMethodInfo getInputMethodInfoOfThisIme(final Context context) { - final String packageName = context.getPackageName(); - for (final InputMethodInfo imi : mImmWrapper.mImm.getInputMethodList()) { - if (imi.getPackageName().equals(packageName)) { - return imi; - } - } - throw new RuntimeException("Input method id for " + packageName + " not found."); - } - public List<InputMethodSubtype> getMyEnabledInputMethodSubtypeList( boolean allowsImplicitlySelectedSubtypes) { - return getEnabledInputMethodSubtypeList(mInputMethodInfoOfThisIme, - allowsImplicitlySelectedSubtypes); + return getEnabledInputMethodSubtypeList( + getInputMethodInfoOfThisIme(), allowsImplicitlySelectedSubtypes); } public boolean switchToNextInputMethod(final IBinder token, final boolean onlyCurrentIme) { @@ -153,10 +148,10 @@ public final class RichInputMethodManager { private boolean switchToNextInputMethodAndSubtype(final IBinder token) { final InputMethodManager imm = mImmWrapper.mImm; final List<InputMethodInfo> enabledImis = imm.getEnabledInputMethodList(); - final int currentIndex = getImiIndexInList(mInputMethodInfoOfThisIme, enabledImis); + final int currentIndex = getImiIndexInList(getInputMethodInfoOfThisIme(), enabledImis); if (currentIndex == INDEX_NOT_FOUND) { Log.w(TAG, "Can't find current IME in enabled IMEs: IME package=" - + mInputMethodInfoOfThisIme.getPackageName()); + + getInputMethodInfoOfThisIme().getPackageName()); return false; } final InputMethodInfo nextImi = getNextNonAuxiliaryIme(currentIndex, enabledImis); @@ -213,16 +208,45 @@ public final class RichInputMethodManager { return true; } + private static class InputMethodInfoCache { + private final InputMethodManager mImm; + private final String mImePackageName; + + private InputMethodInfo mCachedValue; + + public InputMethodInfoCache(final InputMethodManager imm, final String imePackageName) { + mImm = imm; + mImePackageName = imePackageName; + } + + public synchronized InputMethodInfo get() { + if (mCachedValue != null) { + return mCachedValue; + } + for (final InputMethodInfo imi : mImm.getInputMethodList()) { + if (imi.getPackageName().equals(mImePackageName)) { + mCachedValue = imi; + return imi; + } + } + throw new RuntimeException("Input method id for " + mImePackageName + " not found."); + } + + public synchronized void clear() { + mCachedValue = null; + } + } + public InputMethodInfo getInputMethodInfoOfThisIme() { - return mInputMethodInfoOfThisIme; + return mInputMethodInfoCache.get(); } public String getInputMethodIdOfThisIme() { - return mInputMethodInfoOfThisIme.getId(); + return getInputMethodInfoOfThisIme().getId(); } public boolean checkIfSubtypeBelongsToThisImeAndEnabled(final InputMethodSubtype subtype) { - return checkIfSubtypeBelongsToImeAndEnabled(mInputMethodInfoOfThisIme, subtype); + return checkIfSubtypeBelongsToImeAndEnabled(getInputMethodInfoOfThisIme(), subtype); } public boolean checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled( @@ -258,7 +282,7 @@ public final class RichInputMethodManager { } public boolean checkIfSubtypeBelongsToThisIme(final InputMethodSubtype subtype) { - return getSubtypeIndexInIme(subtype, mInputMethodInfoOfThisIme) != INDEX_NOT_FOUND; + return getSubtypeIndexInIme(subtype, getInputMethodInfoOfThisIme()) != INDEX_NOT_FOUND; } private static int getSubtypeIndexInIme(final InputMethodSubtype subtype, @@ -286,7 +310,8 @@ public final class RichInputMethodManager { public boolean hasMultipleEnabledSubtypesInThisIme( final boolean shouldIncludeAuxiliarySubtypes) { - final List<InputMethodInfo> imiList = Collections.singletonList(mInputMethodInfoOfThisIme); + final List<InputMethodInfo> imiList = Collections.singletonList( + getInputMethodInfoOfThisIme()); return hasMultipleEnabledSubtypes(shouldIncludeAuxiliarySubtypes, imiList); } @@ -340,7 +365,7 @@ public final class RichInputMethodManager { public InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(final String localeString, final String keyboardLayoutSetName) { - final InputMethodInfo myImi = mInputMethodInfoOfThisIme; + final InputMethodInfo myImi = getInputMethodInfoOfThisIme(); final int count = myImi.getSubtypeCount(); for (int i = 0; i < count; i++) { final InputMethodSubtype subtype = myImi.getSubtypeAt(i); @@ -355,13 +380,14 @@ public final class RichInputMethodManager { public void setInputMethodAndSubtype(final IBinder token, final InputMethodSubtype subtype) { mImmWrapper.mImm.setInputMethodAndSubtype( - token, mInputMethodInfoOfThisIme.getId(), subtype); + token, getInputMethodIdOfThisIme(), subtype); } public void setAdditionalInputMethodSubtypes(final InputMethodSubtype[] subtypes) { mImmWrapper.mImm.setAdditionalInputMethodSubtypes( - mInputMethodInfoOfThisIme.getId(), subtypes); - // Clear the cache so that we go read the subtypes again next time. + getInputMethodIdOfThisIme(), subtypes); + // Clear the cache so that we go read the {@link InputMethodInfo} of this IME and list of + // subtypes again next time. clearSubtypeCaches(); } @@ -382,5 +408,17 @@ public final class RichInputMethodManager { public void clearSubtypeCaches() { mSubtypeListCacheWithImplicitlySelectedSubtypes.clear(); mSubtypeListCacheWithoutImplicitlySelectedSubtypes.clear(); + mInputMethodInfoCache.clear(); + } + + public boolean shouldOfferSwitchingToNextInputMethod(final IBinder binder, + boolean defaultValue) { + // Use the default value instead on Jelly Bean MR2 and previous where + // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} isn't yet available + // and on KitKat where the API is still just a stub to return true always. + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + return defaultValue; + } + return mImmWrapper.shouldOfferSwitchingToNextInputMethod(binder); } } diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java index cd9c89f04..a3d09565c 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -32,12 +32,17 @@ import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils; import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.internal.LanguageOnSpacebarHelper; +import com.android.inputmethod.latin.utils.LocaleUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; public final class SubtypeSwitcher { private static boolean DBG = LatinImeLogger.sDBG; @@ -47,49 +52,43 @@ public final class SubtypeSwitcher { private /* final */ RichInputMethodManager mRichImm; private /* final */ Resources mResources; - private /* final */ ConnectivityManager mConnectivityManager; - private final NeedsToDisplayLanguage mNeedsToDisplayLanguage = new NeedsToDisplayLanguage(); + private final LanguageOnSpacebarHelper mLanguageOnSpacebarHelper = + new LanguageOnSpacebarHelper(); private InputMethodInfo mShortcutInputMethodInfo; private InputMethodSubtype mShortcutSubtype; private InputMethodSubtype mNoLanguageSubtype; private InputMethodSubtype mEmojiSubtype; private boolean mIsNetworkConnected; + private static final String KEYBOARD_MODE = "keyboard"; // Dummy no language QWERTY subtype. See {@link R.xml.method}. - private static final InputMethodSubtype DUMMY_NO_LANGUAGE_SUBTYPE = new InputMethodSubtype( - R.string.subtype_no_language_qwerty, R.drawable.ic_ime_switcher_dark, - SubtypeLocaleUtils.NO_LANGUAGE, "keyboard", "KeyboardLayoutSet=" - + SubtypeLocaleUtils.QWERTY - + "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE - + ",EnabledWhenDefaultIsNotAsciiCapable," - + Constants.Subtype.ExtraValue.EMOJI_CAPABLE, - false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */); + private static final int SUBTYPE_ID_OF_DUMMY_NO_LANGUAGE_SUBTYPE = 0xdde0bfd3; + private static final String EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE = + "KeyboardLayoutSet=" + SubtypeLocaleUtils.QWERTY + + "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE + + "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE + + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE; + private static final InputMethodSubtype DUMMY_NO_LANGUAGE_SUBTYPE = + InputMethodSubtypeCompatUtils.newInputMethodSubtype( + R.string.subtype_no_language_qwerty, R.drawable.ic_ime_switcher_dark, + SubtypeLocaleUtils.NO_LANGUAGE, KEYBOARD_MODE, + EXTRA_VALUE_OF_DUMMY_NO_LANGUAGE_SUBTYPE, + false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */, + SUBTYPE_ID_OF_DUMMY_NO_LANGUAGE_SUBTYPE); // Caveat: We probably should remove this when we add an Emoji subtype in {@link R.xml.method}. // Dummy Emoji subtype. See {@link R.xml.method}. - private static final InputMethodSubtype DUMMY_EMOJI_SUBTYPE = new InputMethodSubtype( - R.string.subtype_emoji, R.drawable.ic_ime_switcher_dark, - SubtypeLocaleUtils.NO_LANGUAGE, "keyboard", "KeyboardLayoutSet=" - + SubtypeLocaleUtils.EMOJI + "," - + Constants.Subtype.ExtraValue.EMOJI_CAPABLE, - false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */); - - static final class NeedsToDisplayLanguage { - private int mEnabledSubtypeCount; - private boolean mIsSystemLanguageSameAsInputLanguage; - - public boolean getValue() { - return mEnabledSubtypeCount >= 2 || !mIsSystemLanguageSameAsInputLanguage; - } - - public void updateEnabledSubtypeCount(final int count) { - mEnabledSubtypeCount = count; - } - - public void updateIsSystemLanguageSameAsInputLanguage(final boolean isSame) { - mIsSystemLanguageSameAsInputLanguage = isSame; - } - } + private static final int SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE = 0xd78b2ed0; + private static final String EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE = + "KeyboardLayoutSet=" + SubtypeLocaleUtils.EMOJI + + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE; + private static final InputMethodSubtype DUMMY_EMOJI_SUBTYPE = + InputMethodSubtypeCompatUtils.newInputMethodSubtype( + R.string.subtype_emoji, R.drawable.ic_ime_switcher_dark, + SubtypeLocaleUtils.NO_LANGUAGE, KEYBOARD_MODE, + EXTRA_VALUE_OF_DUMMY_EMOJI_SUBTYPE, + false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */, + SUBTYPE_ID_OF_DUMMY_EMOJI_SUBTYPE); public static SubtypeSwitcher getInstance() { return sInstance; @@ -111,10 +110,10 @@ public final class SubtypeSwitcher { } mResources = context.getResources(); mRichImm = RichInputMethodManager.getInstance(); - mConnectivityManager = (ConnectivityManager) context.getSystemService( + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); - final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); + final NetworkInfo info = connectivityManager.getActiveNetworkInfo(); mIsNetworkConnected = (info != null && info.isConnected()); onSubtypeChanged(getCurrentSubtype()); @@ -128,7 +127,7 @@ public final class SubtypeSwitcher { public void updateParametersOnStartInputView() { final List<InputMethodSubtype> enabledSubtypesOfThisIme = mRichImm.getMyEnabledInputMethodSubtypeList(true); - mNeedsToDisplayLanguage.updateEnabledSubtypeCount(enabledSubtypesOfThisIme.size()); + mLanguageOnSpacebarHelper.updateEnabledSubtypes(enabledSubtypesOfThisIme); updateShortcutIME(); } @@ -177,7 +176,7 @@ public final class SubtypeSwitcher { final boolean sameLanguage = systemLocale.getLanguage().equals(newLocale.getLanguage()); final boolean implicitlyEnabled = mRichImm.checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype); - mNeedsToDisplayLanguage.updateIsSystemLanguageSameAsInputLanguage( + mLanguageOnSpacebarHelper.updateIsSystemLanguageSameAsInputLanguage( sameLocale || (sameLanguage && implicitlyEnabled)); updateShortcutIME(); @@ -213,6 +212,7 @@ public final class SubtypeSwitcher { } public boolean isShortcutImeEnabled() { + updateShortcutIME(); if (mShortcutInputMethodInfo == null) { return false; } @@ -224,10 +224,13 @@ public final class SubtypeSwitcher { } public boolean isShortcutImeReady() { - if (mShortcutInputMethodInfo == null) + updateShortcutIME(); + if (mShortcutInputMethodInfo == null) { return false; - if (mShortcutSubtype == null) + } + if (mShortcutSubtype == null) { return true; + } if (mShortcutSubtype.containsExtraValueKey(REQ_NETWORK_CONNECTIVITY)) { return mIsNetworkConnected; } @@ -246,28 +249,52 @@ public final class SubtypeSwitcher { // Subtype Switching functions // ////////////////////////////////// - public boolean needsToDisplayLanguage(final Locale keyboardLocale) { - if (keyboardLocale.toString().equals(SubtypeLocaleUtils.NO_LANGUAGE)) { - return true; + public int getLanguageOnSpacebarFormatType(final InputMethodSubtype subtype) { + return mLanguageOnSpacebarHelper.getLanguageOnSpacebarFormatType(subtype); + } + + public boolean isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes() { + final Locale systemLocale = mResources.getConfiguration().locale; + final Set<InputMethodSubtype> enabledSubtypesOfEnabledImes = new HashSet<>(); + final InputMethodManager inputMethodManager = mRichImm.getInputMethodManager(); + final List<InputMethodInfo> enabledInputMethodInfoList = + inputMethodManager.getEnabledInputMethodList(); + for (final InputMethodInfo info : enabledInputMethodInfoList) { + final List<InputMethodSubtype> enabledSubtypes = + inputMethodManager.getEnabledInputMethodSubtypeList( + info, true /* allowsImplicitlySelectedSubtypes */); + if (enabledSubtypes.isEmpty()) { + // An IME with no subtypes is found. + return false; + } + enabledSubtypesOfEnabledImes.addAll(enabledSubtypes); } - if (!keyboardLocale.equals(getCurrentSubtypeLocale())) { - return false; + for (final InputMethodSubtype subtype : enabledSubtypesOfEnabledImes) { + if (!subtype.isAuxiliary() && !subtype.getLocale().isEmpty() + && !systemLocale.equals(SubtypeLocaleUtils.getSubtypeLocale(subtype))) { + return false; + } } - return mNeedsToDisplayLanguage.getValue(); + return true; } - private static Locale sForcedLocaleForTesting = null; + private static InputMethodSubtype sForcedSubtypeForTesting = null; @UsedForTesting - void forceLocale(final Locale locale) { - sForcedLocaleForTesting = locale; + void forceSubtype(final InputMethodSubtype subtype) { + sForcedSubtypeForTesting = subtype; } public Locale getCurrentSubtypeLocale() { - if (null != sForcedLocaleForTesting) return sForcedLocaleForTesting; + if (null != sForcedSubtypeForTesting) { + return LocaleUtils.constructLocaleFromString(sForcedSubtypeForTesting.getLocale()); + } return SubtypeLocaleUtils.getSubtypeLocale(getCurrentSubtype()); } public InputMethodSubtype getCurrentSubtype() { + if (null != sForcedSubtypeForTesting) { + return sForcedSubtypeForTesting; + } return mRichImm.getCurrentInputMethodSubtype(getNoLanguageSubtype()); } @@ -279,8 +306,8 @@ public final class SubtypeSwitcher { if (mNoLanguageSubtype != null) { return mNoLanguageSubtype; } - Log.w(TAG, "Can't find no lanugage with QWERTY subtype"); - Log.w(TAG, "No input method subtype found; return dummy subtype: " + Log.w(TAG, "Can't find any language with QWERTY subtype"); + Log.w(TAG, "No input method subtype found; returning dummy subtype: " + DUMMY_NO_LANGUAGE_SUBTYPE); return DUMMY_NO_LANGUAGE_SUBTYPE; } @@ -293,8 +320,13 @@ public final class SubtypeSwitcher { if (mEmojiSubtype != null) { return mEmojiSubtype; } - Log.w(TAG, "Can't find Emoji subtype"); - Log.w(TAG, "No input method subtype found; return dummy subtype: " + DUMMY_EMOJI_SUBTYPE); + Log.w(TAG, "Can't find emoji subtype"); + Log.w(TAG, "No input method subtype found; returning dummy subtype: " + + DUMMY_EMOJI_SUBTYPE); return DUMMY_EMOJI_SUBTYPE; } + + public String getCombiningRulesExtraValueOfCurrentSubtype() { + return SubtypeLocaleUtils.getCombiningRulesExtraValue(getCurrentSubtype()); + } } diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 0a4c7a55d..c347f69a9 100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -16,28 +16,18 @@ package com.android.inputmethod.latin; -import android.content.Context; -import android.preference.PreferenceManager; import android.text.TextUtils; -import android.util.Log; -import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.personalization.PersonalizationDictionary; -import com.android.inputmethod.latin.personalization.PersonalizationPredictionDictionary; -import com.android.inputmethod.latin.personalization.UserHistoryDictionary; -import com.android.inputmethod.latin.settings.Settings; +import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.utils.AutoCorrectionUtils; -import com.android.inputmethod.latin.utils.BoundedTreeSet; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.StringUtils; +import com.android.inputmethod.latin.utils.SuggestionResults; import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashSet; import java.util.Locale; -import java.util.concurrent.ConcurrentHashMap; /** * This class loads a dictionary and provides a list of suggestions for a given sequence of @@ -60,153 +50,20 @@ public final class Suggest { // Close to -2**31 private static final int SUPPRESS_SUGGEST_THRESHOLD = -2000000000; - public static final int MAX_SUGGESTIONS = 18; - - public interface SuggestInitializationListener { - public void onUpdateMainDictionaryAvailability(boolean isMainDictionaryAvailable); - } - private static final boolean DBG = LatinImeLogger.sDBG; - - private final ConcurrentHashMap<String, Dictionary> mDictionaries = - CollectionUtils.newConcurrentHashMap(); - private HashSet<String> mOnlyDictionarySetForDebug = null; - private Dictionary mMainDictionary; - private ContactsBinaryDictionary mContactsDict; - @UsedForTesting - private boolean mIsCurrentlyWaitingForMainDictionary = false; + private final DictionaryFacilitator mDictionaryFacilitator; private float mAutoCorrectionThreshold; - // Locale used for upper- and title-casing words - public final Locale mLocale; - - public Suggest(final Context context, final Locale locale, - final SuggestInitializationListener listener) { - initAsynchronously(context, locale, listener); - mLocale = locale; - // initialize a debug flag for the personalization - if (Settings.readUseOnlyPersonalizationDictionaryForDebug( - PreferenceManager.getDefaultSharedPreferences(context))) { - mOnlyDictionarySetForDebug = new HashSet<String>(); - mOnlyDictionarySetForDebug.add(Dictionary.TYPE_PERSONALIZATION); - mOnlyDictionarySetForDebug.add(Dictionary.TYPE_PERSONALIZATION_PREDICTION_IN_JAVA); - } - } - - @UsedForTesting - Suggest(final AssetFileAddress[] dictionaryList, final Locale locale) { - final Dictionary mainDict = DictionaryFactory.createDictionaryForTest(dictionaryList, - false /* useFullEditDistance */, locale); - mLocale = locale; - mMainDictionary = mainDict; - addOrReplaceDictionaryInternal(Dictionary.TYPE_MAIN, mainDict); - } - - private void initAsynchronously(final Context context, final Locale locale, - final SuggestInitializationListener listener) { - resetMainDict(context, locale, listener); - } - - private void addOrReplaceDictionaryInternal(final String key, final Dictionary dict) { - if (mOnlyDictionarySetForDebug != null && !mOnlyDictionarySetForDebug.contains(key)) { - Log.w(TAG, "Ignore add " + key + " dictionary for debug."); - return; - } - addOrReplaceDictionary(mDictionaries, key, dict); - } - - private static void addOrReplaceDictionary( - final ConcurrentHashMap<String, Dictionary> dictionaries, - final String key, final Dictionary dict) { - final Dictionary oldDict = (dict == null) - ? dictionaries.remove(key) - : dictionaries.put(key, dict); - if (oldDict != null && dict != oldDict) { - oldDict.close(); - } + public Suggest(final DictionaryFacilitator dictionaryFacilitator) { + mDictionaryFacilitator = dictionaryFacilitator; } - public void resetMainDict(final Context context, final Locale locale, - final SuggestInitializationListener listener) { - mIsCurrentlyWaitingForMainDictionary = true; - mMainDictionary = null; - if (listener != null) { - listener.onUpdateMainDictionaryAvailability(hasMainDictionary()); - } - new Thread("InitializeBinaryDictionary") { - @Override - public void run() { - final DictionaryCollection newMainDict = - DictionaryFactory.createMainDictionaryFromManager(context, locale); - addOrReplaceDictionaryInternal(Dictionary.TYPE_MAIN, newMainDict); - mMainDictionary = newMainDict; - if (listener != null) { - listener.onUpdateMainDictionaryAvailability(hasMainDictionary()); - } - mIsCurrentlyWaitingForMainDictionary = false; - } - }.start(); + public Locale getLocale() { + return mDictionaryFacilitator.getLocale(); } - // The main dictionary could have been loaded asynchronously. Don't cache the return value - // of this method. - public boolean hasMainDictionary() { - return null != mMainDictionary && mMainDictionary.isInitialized(); - } - - @UsedForTesting - public boolean isCurrentlyWaitingForMainDictionary() { - return mIsCurrentlyWaitingForMainDictionary; - } - - public Dictionary getMainDictionary() { - return mMainDictionary; - } - - public ContactsBinaryDictionary getContactsDictionary() { - return mContactsDict; - } - - public ConcurrentHashMap<String, Dictionary> getUnigramDictionaries() { - return mDictionaries; - } - - /** - * Sets an optional user dictionary resource to be loaded. The user dictionary is consulted - * before the main dictionary, if set. This refers to the system-managed user dictionary. - */ - public void setUserDictionary(final UserBinaryDictionary userDictionary) { - addOrReplaceDictionaryInternal(Dictionary.TYPE_USER, userDictionary); - } - - /** - * Sets an optional contacts dictionary resource to be loaded. It is also possible to remove - * the contacts dictionary by passing null to this method. In this case no contacts dictionary - * won't be used. - */ - public void setContactsDictionary(final ContactsBinaryDictionary contactsDictionary) { - mContactsDict = contactsDictionary; - addOrReplaceDictionaryInternal(Dictionary.TYPE_CONTACTS, contactsDictionary); - } - - public void setUserHistoryDictionary(final UserHistoryDictionary userHistoryDictionary) { - addOrReplaceDictionaryInternal(Dictionary.TYPE_USER_HISTORY, userHistoryDictionary); - } - - public void setPersonalizationPredictionDictionary( - final PersonalizationPredictionDictionary personalizationPredictionDictionary) { - addOrReplaceDictionaryInternal(Dictionary.TYPE_PERSONALIZATION_PREDICTION_IN_JAVA, - personalizationPredictionDictionary); - } - - public void setPersonalizationDictionary( - final PersonalizationDictionary personalizationDictionary) { - addOrReplaceDictionaryInternal(Dictionary.TYPE_PERSONALIZATION, - personalizationDictionary); - } - - public void setAutoCorrectionThreshold(float threshold) { + public void setAutoCorrectionThreshold(final float threshold) { mAutoCorrectionThreshold = threshold; } @@ -215,71 +72,84 @@ public final class Suggest { } public void getSuggestedWords(final WordComposer wordComposer, - final String prevWordForBigram, final ProximityInfo proximityInfo, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final boolean isCorrectionEnabled, final int[] additionalFeaturesOptions, final int sessionId, final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - LatinImeLogger.onStartSuggestion(prevWordForBigram); if (wordComposer.isBatchMode()) { - getSuggestedWordsForBatchInput(wordComposer, prevWordForBigram, proximityInfo, + getSuggestedWordsForBatchInput(wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId, sequenceNumber, callback); } else { - getSuggestedWordsForTypingInput(wordComposer, prevWordForBigram, proximityInfo, + getSuggestedWordsForTypingInput(wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, isCorrectionEnabled, additionalFeaturesOptions, sequenceNumber, callback); } } + private static ArrayList<SuggestedWordInfo> getTransformedSuggestedWordInfoList( + final WordComposer wordComposer, final SuggestionResults results, + final int trailingSingleQuotesCount) { + final boolean shouldMakeSuggestionsAllUpperCase = wordComposer.isAllUpperCase() + && !wordComposer.isResumed(); + final boolean isOnlyFirstCharCapitalized = + wordComposer.isOrWillBeOnlyFirstCharCapitalized(); + + final ArrayList<SuggestedWordInfo> suggestionsContainer = new ArrayList<>(results); + final int suggestionsCount = suggestionsContainer.size(); + if (isOnlyFirstCharCapitalized || shouldMakeSuggestionsAllUpperCase + || 0 != trailingSingleQuotesCount) { + for (int i = 0; i < suggestionsCount; ++i) { + final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); + final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo( + wordInfo, results.mLocale, shouldMakeSuggestionsAllUpperCase, + isOnlyFirstCharCapitalized, trailingSingleQuotesCount); + suggestionsContainer.set(i, transformedWordInfo); + } + } + return suggestionsContainer; + } + + private static String getWhitelistedWordOrNull(final ArrayList<SuggestedWordInfo> suggestions) { + if (suggestions.isEmpty()) { + return null; + } + final SuggestedWordInfo firstSuggestedWordInfo = suggestions.get(0); + if (!firstSuggestedWordInfo.isKindOf(SuggestedWordInfo.KIND_WHITELIST)) { + return null; + } + return firstSuggestedWordInfo.mWord; + } + // Retrieves suggestions for the typing input // and calls the callback function with the suggestions. private void getSuggestedWordsForTypingInput(final WordComposer wordComposer, - final String prevWordForBigram, final ProximityInfo proximityInfo, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final boolean isCorrectionEnabled, final int[] additionalFeaturesOptions, final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - final int trailingSingleQuotesCount = wordComposer.trailingSingleQuotesCount(); - final BoundedTreeSet suggestionsSet = new BoundedTreeSet(sSuggestedWordInfoComparator, - MAX_SUGGESTIONS); - final String typedWord = wordComposer.getTypedWord(); + final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(typedWord); final String consideredWord = trailingSingleQuotesCount > 0 ? typedWord.substring(0, typedWord.length() - trailingSingleQuotesCount) : typedWord; - LatinImeLogger.onAddSuggestedWord(typedWord, Dictionary.TYPE_USER_TYPED); - final WordComposer wordComposerForLookup; - if (trailingSingleQuotesCount > 0) { - wordComposerForLookup = new WordComposer(wordComposer); - for (int i = trailingSingleQuotesCount - 1; i >= 0; --i) { - wordComposerForLookup.deleteLast(); - } - } else { - wordComposerForLookup = wordComposer; - } - - for (final String key : mDictionaries.keySet()) { - final Dictionary dictionary = mDictionaries.get(key); - suggestionsSet.addAll(dictionary.getSuggestions(wordComposerForLookup, - prevWordForBigram, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions)); - } + final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults( + wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, + additionalFeaturesOptions, SESSION_TYPING); + final ArrayList<SuggestedWordInfo> suggestionsContainer = + getTransformedSuggestedWordInfoList(wordComposer, suggestionResults, + trailingSingleQuotesCount); + final boolean didRemoveTypedWord = + SuggestedWordInfo.removeDups(wordComposer.getTypedWord(), suggestionsContainer); - final String whitelistedWord; - if (suggestionsSet.isEmpty()) { - whitelistedWord = null; - } else if (SuggestedWordInfo.KIND_WHITELIST != suggestionsSet.first().mKind) { - whitelistedWord = null; - } else { - whitelistedWord = suggestionsSet.first().mWord; - } + final String whitelistedWord = getWhitelistedWordOrNull(suggestionsContainer); + final boolean resultsArePredictions = !wordComposer.isComposingWord(); - // The word can be auto-corrected if it has a whitelist entry that is not itself, - // or if it's a 2+ characters non-word (i.e. it's not in the dictionary). - final boolean allowsToBeAutoCorrected = (null != whitelistedWord - && !whitelistedWord.equals(consideredWord)) - || (consideredWord.length() > 1 && !AutoCorrectionUtils.isValidWord(this, - consideredWord, wordComposer.isFirstCharCapitalized())); + // We allow auto-correction if we have a whitelisted word, or if the word had more than + // one char and was not suggested. + final boolean allowsToBeAutoCorrected = (null != whitelistedWord) + || (consideredWord.length() > 1 && !didRemoveTypedWord); final boolean hasAutoCorrection; // TODO: using isCorrectionEnabled here is not very good. It's probably useless, because @@ -287,10 +157,11 @@ public final class Suggest { // same time, it feels wrong that the SuggestedWord object includes information about // the current settings. It may also be useful to know, when the setting is off, whether // the word *would* have been auto-corrected. - if (!isCorrectionEnabled || !allowsToBeAutoCorrected || !wordComposer.isComposingWord() - || suggestionsSet.isEmpty() || wordComposer.hasDigits() - || wordComposer.isMostlyCaps() || wordComposer.isResumed() || !hasMainDictionary() - || SuggestedWordInfo.KIND_SHORTCUT == suggestionsSet.first().mKind) { + if (!isCorrectionEnabled || !allowsToBeAutoCorrected || resultsArePredictions + || suggestionResults.isEmpty() || wordComposer.hasDigits() + || wordComposer.isMostlyCaps() || wordComposer.isResumed() + || !mDictionaryFacilitator.hasInitializedMainDictionary() + || suggestionResults.first().isKindOf(SuggestedWordInfo.KIND_SHORTCUT)) { // If we don't have a main dictionary, we never want to auto-correct. The reason for // this is, the user may have a contact whose name happens to match a valid word in // their language, and it will unexpectedly auto-correct. For example, if the user @@ -302,28 +173,7 @@ public final class Suggest { hasAutoCorrection = false; } else { hasAutoCorrection = AutoCorrectionUtils.suggestionExceedsAutoCorrectionThreshold( - suggestionsSet.first(), consideredWord, mAutoCorrectionThreshold); - } - - final ArrayList<SuggestedWordInfo> suggestionsContainer = - CollectionUtils.newArrayList(suggestionsSet); - final int suggestionsCount = suggestionsContainer.size(); - final boolean isFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); - final boolean isAllUpperCase = wordComposer.isAllUpperCase(); - if (isFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) { - for (int i = 0; i < suggestionsCount; ++i) { - final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); - final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo( - wordInfo, mLocale, isAllUpperCase, isFirstCharCapitalized, - trailingSingleQuotesCount); - suggestionsContainer.set(i, transformedWordInfo); - } - } - - for (int i = 0; i < suggestionsCount; ++i) { - final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); - LatinImeLogger.onAddSuggestedWord(wordInfo.mWord.toString(), - wordInfo.mSourceDict.mDictType); + suggestionResults.first(), consideredWord, mAutoCorrectionThreshold); } if (!TextUtils.isEmpty(typedWord)) { @@ -333,7 +183,6 @@ public final class Suggest { SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); } - SuggestedWordInfo.removeDups(suggestionsContainer); final ArrayList<SuggestedWordInfo> suggestionsList; if (DBG && !suggestionsContainer.isEmpty()) { @@ -343,40 +192,27 @@ public final class Suggest { } callback.onGetSuggestedWords(new SuggestedWords(suggestionsList, + suggestionResults.mRawSuggestions, // TODO: this first argument is lying. If this is a whitelisted word which is an // actual word, it says typedWordValid = false, which looks wrong. We should either // rename the attribute or change the value. - !allowsToBeAutoCorrected /* typedWordValid */, - hasAutoCorrection, /* willAutoCorrect */ - false /* isPunctuationSuggestions */, - false /* isObsoleteSuggestions */, - !wordComposer.isComposingWord() /* isPrediction */, sequenceNumber)); + !resultsArePredictions && !allowsToBeAutoCorrected /* typedWordValid */, + hasAutoCorrection /* willAutoCorrect */, + false /* isObsoleteSuggestions */, resultsArePredictions, sequenceNumber)); } // Retrieves suggestions for the batch input // and calls the callback function with the suggestions. private void getSuggestedWordsForBatchInput(final WordComposer wordComposer, - final String prevWordForBigram, final ProximityInfo proximityInfo, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, final int sessionId, final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - final BoundedTreeSet suggestionsSet = new BoundedTreeSet(sSuggestedWordInfoComparator, - MAX_SUGGESTIONS); - - // At second character typed, search the unigrams (scores being affected by bigrams) - for (final String key : mDictionaries.keySet()) { - final Dictionary dictionary = mDictionaries.get(key); - suggestionsSet.addAll(dictionary.getSuggestionsWithSessionId(wordComposer, - prevWordForBigram, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions, sessionId)); - } - - for (SuggestedWordInfo wordInfo : suggestionsSet) { - LatinImeLogger.onAddSuggestedWord(wordInfo.mWord, wordInfo.mSourceDict.mDictType); - } - + final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults( + wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, + additionalFeaturesOptions, sessionId); final ArrayList<SuggestedWordInfo> suggestionsContainer = - CollectionUtils.newArrayList(suggestionsSet); + new ArrayList<>(suggestionResults); final int suggestionsCount = suggestionsContainer.size(); final boolean isFirstCharCapitalized = wordComposer.wasShiftedNoLock(); final boolean isAllUpperCase = wordComposer.isAllUpperCase(); @@ -384,7 +220,7 @@ public final class Suggest { for (int i = 0; i < suggestionsCount; ++i) { final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo( - wordInfo, mLocale, isAllUpperCase, isFirstCharCapitalized, + wordInfo, suggestionResults.mLocale, isAllUpperCase, isFirstCharCapitalized, 0 /* trailingSingleQuotesCount */); suggestionsContainer.set(i, transformedWordInfo); } @@ -395,7 +231,7 @@ public final class Suggest { final SuggestedWordInfo rejected = suggestionsContainer.remove(0); suggestionsContainer.add(1, rejected); } - SuggestedWordInfo.removeDups(suggestionsContainer); + SuggestedWordInfo.removeDups(null /* typedWord */, suggestionsContainer); // For some reason some suggestions with MIN_VALUE are making their way here. // TODO: Find a more robust way to detect distractors. @@ -408,9 +244,9 @@ public final class Suggest { // In the batch input mode, the most relevant suggested word should act as a "typed word" // (typedWordValid=true), not as an "auto correct word" (willAutoCorrect=false). callback.onGetSuggestedWords(new SuggestedWords(suggestionsContainer, + suggestionResults.mRawSuggestions, true /* typedWordValid */, false /* willAutoCorrect */, - false /* isPunctuationSuggestions */, false /* isObsoleteSuggestions */, false /* isPrediction */, sequenceNumber)); } @@ -420,19 +256,19 @@ public final class Suggest { final SuggestedWordInfo typedWordInfo = suggestions.get(0); typedWordInfo.setDebugString("+"); final int suggestionsSize = suggestions.size(); - final ArrayList<SuggestedWordInfo> suggestionsList = - CollectionUtils.newArrayList(suggestionsSize); + final ArrayList<SuggestedWordInfo> suggestionsList = new ArrayList<>(suggestionsSize); suggestionsList.add(typedWordInfo); // Note: i here is the index in mScores[], but the index in mSuggestions is one more // than i because we added the typed word to mSuggestions without touching mScores. for (int i = 0; i < suggestionsSize - 1; ++i) { final SuggestedWordInfo cur = suggestions.get(i + 1); - final float normalizedScore = BinaryDictionary.calcNormalizedScore( + final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore( typedWord, cur.toString(), cur.mScore); final String scoreInfoString; if (normalizedScore > 0) { scoreInfoString = String.format( - Locale.ROOT, "%d (%4.2f)", cur.mScore, normalizedScore); + Locale.ROOT, "%d (%4.2f), %s", cur.mScore, normalizedScore, + cur.mSourceDict.mDictType); } else { scoreInfoString = Integer.toString(cur.mScore); } @@ -442,29 +278,13 @@ public final class Suggest { return suggestionsList; } - private static final class SuggestedWordInfoComparator - implements Comparator<SuggestedWordInfo> { - // This comparator ranks the word info with the higher frequency first. That's because - // that's the order we want our elements in. - @Override - public int compare(final SuggestedWordInfo o1, final SuggestedWordInfo o2) { - if (o1.mScore > o2.mScore) return -1; - if (o1.mScore < o2.mScore) return 1; - if (o1.mCodePointCount < o2.mCodePointCount) return -1; - if (o1.mCodePointCount > o2.mCodePointCount) return 1; - return o1.mWord.compareTo(o2.mWord); - } - } - private static final SuggestedWordInfoComparator sSuggestedWordInfoComparator = - new SuggestedWordInfoComparator(); - /* package for test */ static SuggestedWordInfo getTransformedSuggestedWordInfo( final SuggestedWordInfo wordInfo, final Locale locale, final boolean isAllUpperCase, - final boolean isFirstCharCapitalized, final int trailingSingleQuotesCount) { + final boolean isOnlyFirstCharCapitalized, final int trailingSingleQuotesCount) { final StringBuilder sb = new StringBuilder(wordInfo.mWord.length()); if (isAllUpperCase) { sb.append(wordInfo.mWord.toUpperCase(locale)); - } else if (isFirstCharCapitalized) { + } else if (isOnlyFirstCharCapitalized) { sb.append(StringUtils.capitalizeFirstCodePoint(wordInfo.mWord, locale)); } else { sb.append(wordInfo.mWord); @@ -477,17 +297,8 @@ public final class Suggest { for (int i = quotesToAppend - 1; i >= 0; --i) { sb.appendCodePoint(Constants.CODE_SINGLE_QUOTE); } - return new SuggestedWordInfo(sb.toString(), wordInfo.mScore, wordInfo.mKind, + return new SuggestedWordInfo(sb.toString(), wordInfo.mScore, wordInfo.mKindAndFlags, wordInfo.mSourceDict, wordInfo.mIndexOfTouchPointOfSecondWord, wordInfo.mAutoCommitFirstWordConfidence); } - - public void close() { - final HashSet<Dictionary> dictionaries = CollectionUtils.newHashSet(); - dictionaries.addAll(mDictionaries.values()); - for (final Dictionary dictionary : dictionaries) { - dictionary.close(); - } - mMainDictionary = null; - } } diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java index 97c89dd4e..e587b18c9 100644 --- a/java/src/com/android/inputmethod/latin/SuggestedWords.java +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -19,58 +19,76 @@ package com.android.inputmethod.latin; import android.text.TextUtils; import android.view.inputmethod.CompletionInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.StringUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; -public final class SuggestedWords { +public class SuggestedWords { public static final int INDEX_OF_TYPED_WORD = 0; public static final int INDEX_OF_AUTO_CORRECTION = 1; public static final int NOT_A_SEQUENCE_NUMBER = -1; - private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = - CollectionUtils.newArrayList(0); + // The maximum number of suggestions available. + public static final int MAX_SUGGESTIONS = 18; + + private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = new ArrayList<>(0); public static final SuggestedWords EMPTY = new SuggestedWords( - EMPTY_WORD_INFO_LIST, false, false, false, false, false); + EMPTY_WORD_INFO_LIST, null /* rawSuggestions */, false, false, false, false); + public final String mTypedWord; public final boolean mTypedWordValid; // Note: this INCLUDES cases where the word will auto-correct to itself. A good definition // of what this flag means would be "the top suggestion is strong enough to auto-correct", // whether this exactly matches the user entry or not. public final boolean mWillAutoCorrect; - public final boolean mIsPunctuationSuggestions; public final boolean mIsObsoleteSuggestions; public final boolean mIsPrediction; public final int mSequenceNumber; // Sequence number for auto-commit. - private final ArrayList<SuggestedWordInfo> mSuggestedWordInfoList; + protected final ArrayList<SuggestedWordInfo> mSuggestedWordInfoList; + public final ArrayList<SuggestedWordInfo> mRawSuggestions; public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList, + final ArrayList<SuggestedWordInfo> rawSuggestions, final boolean typedWordValid, final boolean willAutoCorrect, - final boolean isPunctuationSuggestions, final boolean isObsoleteSuggestions, final boolean isPrediction) { - this(suggestedWordInfoList, typedWordValid, willAutoCorrect, isPunctuationSuggestions, + this(suggestedWordInfoList, rawSuggestions, typedWordValid, willAutoCorrect, isObsoleteSuggestions, isPrediction, NOT_A_SEQUENCE_NUMBER); } public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList, + final ArrayList<SuggestedWordInfo> rawSuggestions, + final boolean typedWordValid, + final boolean willAutoCorrect, + final boolean isObsoleteSuggestions, + final boolean isPrediction, + final int sequenceNumber) { + this(suggestedWordInfoList, rawSuggestions, + (suggestedWordInfoList.isEmpty() || isPrediction) ? null + : suggestedWordInfoList.get(INDEX_OF_TYPED_WORD).mWord, + typedWordValid, willAutoCorrect, isObsoleteSuggestions, isPrediction, + sequenceNumber); + } + + public SuggestedWords(final ArrayList<SuggestedWordInfo> suggestedWordInfoList, + final ArrayList<SuggestedWordInfo> rawSuggestions, + final String typedWord, final boolean typedWordValid, final boolean willAutoCorrect, - final boolean isPunctuationSuggestions, final boolean isObsoleteSuggestions, final boolean isPrediction, final int sequenceNumber) { mSuggestedWordInfoList = suggestedWordInfoList; + mRawSuggestions = rawSuggestions; mTypedWordValid = typedWordValid; mWillAutoCorrect = willAutoCorrect; - mIsPunctuationSuggestions = isPunctuationSuggestions; mIsObsoleteSuggestions = isObsoleteSuggestions; mIsPrediction = isPrediction; mSequenceNumber = sequenceNumber; + mTypedWord = typedWord; } public boolean isEmpty() { @@ -81,10 +99,32 @@ public final class SuggestedWords { return mSuggestedWordInfoList.size(); } + /** + * Get suggested word at <code>index</code>. + * @param index The index of the suggested word. + * @return The suggested word. + */ public String getWord(final int index) { return mSuggestedWordInfoList.get(index).mWord; } + /** + * Get displayed text at <code>index</code>. + * In RTL languages, the displayed text on the suggestion strip may be different from the + * suggested word that is returned from {@link #getWord(int)}. For example the displayed text + * of punctuation suggestion "(" should be ")". + * @param index The index of the text to display. + * @return The text to be displayed. + */ + public String getLabel(final int index) { + return mSuggestedWordInfoList.get(index).mWord; + } + + /** + * Get {@link SuggestedWordInfo} object at <code>index</code>. + * @param index The index of the {@link SuggestedWordInfo}. + * @return The {@link SuggestedWordInfo} object. + */ public SuggestedWordInfo getInfo(final int index) { return mSuggestedWordInfoList.get(index); } @@ -104,8 +144,12 @@ public final class SuggestedWords { return debugString; } - public boolean willAutoCorrect() { - return mWillAutoCorrect; + /** + * The predicator to tell whether this object represents punctuation suggestions. + * @return false if this object desn't represent punctuation suggestions. + */ + public boolean isPunctuationSuggestions() { + return false; } @Override @@ -114,23 +158,17 @@ public final class SuggestedWords { return "SuggestedWords:" + " mTypedWordValid=" + mTypedWordValid + " mWillAutoCorrect=" + mWillAutoCorrect - + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions + " words=" + Arrays.toString(mSuggestedWordInfoList.toArray()); } public static ArrayList<SuggestedWordInfo> getFromApplicationSpecifiedCompletions( final CompletionInfo[] infos) { - final ArrayList<SuggestedWordInfo> result = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> result = new ArrayList<>(); for (final CompletionInfo info : infos) { - if (info == null) continue; - final CharSequence text = info.getText(); - if (null == text) continue; - final SuggestedWordInfo suggestedWordInfo = new SuggestedWordInfo(text.toString(), - SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_APP_DEFINED, - Dictionary.DICTIONARY_APPLICATION_DEFINED, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */); - result.add(suggestedWordInfo); + if (null == info || null == info.getText()) { + continue; + } + result.add(new SuggestedWordInfo(info)); } return result; } @@ -139,8 +177,8 @@ public final class SuggestedWords { // and replace it with what the user currently typed. public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions( final String typedWord, final SuggestedWords previousSuggestions) { - final ArrayList<SuggestedWordInfo> suggestionsList = CollectionUtils.newArrayList(); - final HashSet<String> alreadySeen = CollectionUtils.newHashSet(); + final ArrayList<SuggestedWordInfo> suggestionsList = new ArrayList<>(); + final HashSet<String> alreadySeen = new HashSet<>(); suggestionsList.add(new SuggestedWordInfo(typedWord, SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_TYPED, Dictionary.DICTIONARY_USER_TYPED, SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, @@ -150,7 +188,7 @@ public final class SuggestedWords { for (int index = 1; index < previousSize; index++) { final SuggestedWordInfo prevWordInfo = previousSuggestions.getInfo(index); final String prevWord = prevWordInfo.mWord; - // Filter out duplicate suggestion. + // Filter out duplicate suggestions. if (!alreadySeen.contains(prevWord)) { suggestionsList.add(prevWordInfo); alreadySeen.add(prevWord); @@ -169,7 +207,8 @@ public final class SuggestedWords { public static final int NOT_AN_INDEX = -1; public static final int NOT_A_CONFIDENCE = -1; public static final int MAX_SCORE = Integer.MAX_VALUE; - public static final int KIND_MASK_KIND = 0xFF; // Mask to get only the kind + + private static final int KIND_MASK_KIND = 0xFF; // Mask to get only the kind public static final int KIND_TYPED = 0; // What user typed public static final int KIND_CORRECTION = 1; // Simple correction/suggestion public static final int KIND_COMPLETION = 2; // Completion (suggestion with appended chars) @@ -184,13 +223,16 @@ public final class SuggestedWords { public static final int KIND_RESUMED = 9; public static final int KIND_OOV_CORRECTION = 10; // Most probable string correction - public static final int KIND_MASK_FLAGS = 0xFFFFFF00; // Mask to get the flags public static final int KIND_FLAG_POSSIBLY_OFFENSIVE = 0x80000000; public static final int KIND_FLAG_EXACT_MATCH = 0x40000000; + public static final int KIND_FLAG_EXACT_MATCH_WITH_INTENTIONAL_OMISSION = 0x20000000; public final String mWord; + // The completion info from the application. Null for suggestions that don't come from + // the application (including keyboard-computed ones, so this is almost always null) + public final CompletionInfo mApplicationSpecifiedCompletionInfo; public final int mScore; - public final int mKind; // one of the KIND_* constants above + public final int mKindAndFlags; public final int mCodePointCount; public final Dictionary mSourceDict; // For auto-commit. This keeps track of the index inside the touch coordinates array @@ -206,25 +248,63 @@ public final class SuggestedWords { * Create a new suggested word info. * @param word The string to suggest. * @param score A measure of how likely this suggestion is. - * @param kind The kind of suggestion, as one of the above KIND_* constants. + * @param kindAndFlags The kind of suggestion, as one of the above KIND_* constants with + * flags. * @param sourceDict What instance of Dictionary produced this suggestion. * @param indexOfTouchPointOfSecondWord See mIndexOfTouchPointOfSecondWord. * @param autoCommitFirstWordConfidence See mAutoCommitFirstWordConfidence. */ - public SuggestedWordInfo(final String word, final int score, final int kind, + public SuggestedWordInfo(final String word, final int score, final int kindAndFlags, final Dictionary sourceDict, final int indexOfTouchPointOfSecondWord, final int autoCommitFirstWordConfidence) { mWord = word; + mApplicationSpecifiedCompletionInfo = null; mScore = score; - mKind = kind; + mKindAndFlags = kindAndFlags; mSourceDict = sourceDict; mCodePointCount = StringUtils.codePointCount(mWord); mIndexOfTouchPointOfSecondWord = indexOfTouchPointOfSecondWord; mAutoCommitFirstWordConfidence = autoCommitFirstWordConfidence; } + /** + * Create a new suggested word info from an application-specified completion. + * If the passed argument or its contained text is null, this throws a NPE. + * @param applicationSpecifiedCompletion The application-specified completion info. + */ + public SuggestedWordInfo(final CompletionInfo applicationSpecifiedCompletion) { + mWord = applicationSpecifiedCompletion.getText().toString(); + mApplicationSpecifiedCompletionInfo = applicationSpecifiedCompletion; + mScore = SuggestedWordInfo.MAX_SCORE; + mKindAndFlags = SuggestedWordInfo.KIND_APP_DEFINED; + mSourceDict = Dictionary.DICTIONARY_APPLICATION_DEFINED; + mCodePointCount = StringUtils.codePointCount(mWord); + mIndexOfTouchPointOfSecondWord = SuggestedWordInfo.NOT_AN_INDEX; + mAutoCommitFirstWordConfidence = SuggestedWordInfo.NOT_A_CONFIDENCE; + } + public boolean isEligibleForAutoCommit() { - return (KIND_CORRECTION == mKind && NOT_AN_INDEX != mIndexOfTouchPointOfSecondWord); + return (isKindOf(KIND_CORRECTION) && NOT_AN_INDEX != mIndexOfTouchPointOfSecondWord); + } + + public int getKind() { + return (mKindAndFlags & KIND_MASK_KIND); + } + + public boolean isKindOf(final int kind) { + return getKind() == kind; + } + + public boolean isPossiblyOffensive() { + return (mKindAndFlags & KIND_FLAG_POSSIBLY_OFFENSIVE) != 0; + } + + public boolean isExactMatch() { + return (mKindAndFlags & KIND_FLAG_EXACT_MATCH) != 0; + } + + public boolean isExactMatchWithIntentionalOmission() { + return (mKindAndFlags & KIND_FLAG_EXACT_MATCH_WITH_INTENTIONAL_OMISSION) != 0; } public void setDebugString(final String str) { @@ -236,10 +316,6 @@ public final class SuggestedWords { return mDebugString; } - public int codePointCount() { - return mCodePointCount; - } - public int codePointAt(int i) { return mWord.codePointAt(i); } @@ -253,42 +329,60 @@ public final class SuggestedWords { } } - // TODO: Consolidate this method and StringUtils.removeDupes() in the future. - public static void removeDups(ArrayList<SuggestedWordInfo> candidates) { - if (candidates.size() <= 1) { - return; + // This will always remove the higher index if a duplicate is found. + public static boolean removeDups(final String typedWord, + ArrayList<SuggestedWordInfo> candidates) { + if (candidates.isEmpty()) { + return false; + } + final boolean didRemoveTypedWord; + if (!TextUtils.isEmpty(typedWord)) { + didRemoveTypedWord = removeSuggestedWordInfoFrom(typedWord, candidates, + -1 /* startIndexExclusive */); + } else { + didRemoveTypedWord = false; } - int i = 1; - while (i < candidates.size()) { - final SuggestedWordInfo cur = candidates.get(i); - for (int j = 0; j < i; ++j) { - final SuggestedWordInfo previous = candidates.get(j); - if (cur.mWord.equals(previous.mWord)) { - candidates.remove(cur.mScore < previous.mScore ? i : j); - --i; - break; - } + for (int i = 0; i < candidates.size(); ++i) { + removeSuggestedWordInfoFrom(candidates.get(i).mWord, candidates, + i /* startIndexExclusive */); + } + return didRemoveTypedWord; + } + + private static boolean removeSuggestedWordInfoFrom(final String word, + final ArrayList<SuggestedWordInfo> candidates, final int startIndexExclusive) { + boolean didRemove = false; + for (int i = startIndexExclusive + 1; i < candidates.size(); ++i) { + final SuggestedWordInfo previous = candidates.get(i); + if (word.equals(previous.mWord)) { + didRemove = true; + candidates.remove(i); + --i; } - ++i; } + return didRemove; } } // SuggestedWords is an immutable object, as much as possible. We must not just remove // words from the member ArrayList as some other parties may expect the object to never change. public SuggestedWords getSuggestedWordsExcludingTypedWord() { - final ArrayList<SuggestedWordInfo> newSuggestions = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> newSuggestions = new ArrayList<>(); + String typedWord = null; for (int i = 0; i < mSuggestedWordInfoList.size(); ++i) { final SuggestedWordInfo info = mSuggestedWordInfoList.get(i); - if (SuggestedWordInfo.KIND_TYPED != info.mKind) { + if (!info.isKindOf(SuggestedWordInfo.KIND_TYPED)) { newSuggestions.add(info); + } else { + assert(null == typedWord); + typedWord = info.mWord; } } // We should never autocorrect, so we say the typed word is valid. Also, in this case, // no auto-correction should take place hence willAutoCorrect = false. - return new SuggestedWords(newSuggestions, true /* typedWordValid */, - false /* willAutoCorrect */, mIsPunctuationSuggestions, mIsObsoleteSuggestions, - mIsPrediction); + return new SuggestedWords(newSuggestions, null /* rawSuggestions */, typedWord, + true /* typedWordValid */, false /* willAutoCorrect */, mIsObsoleteSuggestions, + mIsPrediction, NOT_A_SEQUENCE_NUMBER); } // Creates a new SuggestedWordInfo from the currently suggested words that removes all but the @@ -297,17 +391,16 @@ public final class SuggestedWords { // we should only suggest replacements for this last word. // TODO: make this work with languages without spaces. public SuggestedWords getSuggestedWordsForLastWordOfPhraseGesture() { - final ArrayList<SuggestedWordInfo> newSuggestions = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> newSuggestions = new ArrayList<>(); for (int i = 0; i < mSuggestedWordInfoList.size(); ++i) { final SuggestedWordInfo info = mSuggestedWordInfoList.get(i); final int indexOfLastSpace = info.mWord.lastIndexOf(Constants.CODE_SPACE) + 1; final String lastWord = info.mWord.substring(indexOfLastSpace); - newSuggestions.add(new SuggestedWordInfo(lastWord, info.mScore, info.mKind, + newSuggestions.add(new SuggestedWordInfo(lastWord, info.mScore, info.mKindAndFlags, info.mSourceDict, SuggestedWordInfo.NOT_AN_INDEX, SuggestedWordInfo.NOT_A_CONFIDENCE)); } - return new SuggestedWords(newSuggestions, mTypedWordValid, - mWillAutoCorrect, mIsPunctuationSuggestions, mIsObsoleteSuggestions, - mIsPrediction); + return new SuggestedWords(newSuggestions, null /* rawSuggestions */, mTypedWordValid, + mWillAutoCorrect, mIsObsoleteSuggestions, mIsPrediction); } } diff --git a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java new file mode 100644 index 000000000..e4ee42660 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014 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.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Process; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.compat.IntentCompatUtils; +import com.android.inputmethod.latin.settings.Settings; +import com.android.inputmethod.latin.setup.LauncherIconVisibilityManager; +import com.android.inputmethod.latin.setup.SetupActivity; +import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils; + +/** + * This class detects the {@link Intent#ACTION_MY_PACKAGE_REPLACED} broadcast intent when this IME + * package has been replaced by a newer version of the same package. This class also detects + * {@link Intent#ACTION_BOOT_COMPLETED} and {@link Intent#ACTION_USER_INITIALIZE} broadcast intent. + * + * If this IME has already been installed in the system image and a new version of this IME has + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver and it + * will hide the setup wizard's icon. + * + * If this IME has already been installed in the data partition and a new version of this IME has + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver but it + * will not hide the setup wizard's icon, and the icon will appear on the launcher. + * + * If this IME hasn't been installed yet and has been newly installed, no + * {@link Intent#ACTION_MY_PACKAGE_REPLACED} will be sent and the setup wizard's icon will appear + * on the launcher. + * + * When the device has been booted, {@link Intent#ACTION_BOOT_COMPLETED} is received by this + * receiver and it checks whether the setup wizard's icon should be appeared or not on the launcher + * depending on which partition this IME is installed. + * + * When a multiuser account has been created, {@link Intent#ACTION_USER_INITIALIZE} is received + * by this receiver and it checks the whether the setup wizard's icon should be appeared or not on + * the launcher depending on which partition this IME is installed. + */ +public final class SystemBroadcastReceiver extends BroadcastReceiver { + private static final String TAG = SystemBroadcastReceiver.class.getSimpleName(); + + @Override + public void onReceive(final Context context, final Intent intent) { + final String intentAction = intent.getAction(); + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intentAction)) { + Log.i(TAG, "Package has been replaced: " + context.getPackageName()); + } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) { + Log.i(TAG, "Boot has been completed"); + } else if (IntentCompatUtils.is_ACTION_USER_INITIALIZE(intentAction)) { + Log.i(TAG, "User initialize"); + } + + LauncherIconVisibilityManager.onReceiveGlobalIntent(intentAction, context); + + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intentAction)) { + // Need to restore additional subtypes because system always clears additional + // subtypes when the package is replaced. + RichInputMethodManager.init(context); + final RichInputMethodManager richImm = RichInputMethodManager.getInstance(); + final InputMethodSubtype[] additionalSubtypes = richImm.getAdditionalSubtypes(context); + richImm.setAdditionalInputMethodSubtypes(additionalSubtypes); + } + + // The process that hosts this broadcast receiver is invoked and remains alive even after + // 1) the package has been re-installed, 2) the device has just booted, + // 3) a new user has been created. + // There is no good reason to keep the process alive if this IME isn't a current IME. + final InputMethodManager imm = + (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); + // Called to check whether this IME has been triggered by the current user or not + final boolean isInputMethodManagerValidForUserOfThisProcess = + !imm.getInputMethodList().isEmpty(); + final boolean isCurrentImeOfCurrentUser = isInputMethodManagerValidForUserOfThisProcess + && UncachedInputMethodManagerUtils.isThisImeCurrent(context, imm); + if (!isCurrentImeOfCurrentUser) { + final int myPid = Process.myPid(); + Log.i(TAG, "Killing my process: pid=" + myPid); + Process.killProcess(myPid); + } + } +} diff --git a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java index 15b3d8d02..debaad13e 100644 --- a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java @@ -18,7 +18,6 @@ package com.android.inputmethod.latin; import android.content.ContentProviderClient; import android.content.ContentResolver; -import android.content.ContentUris; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; @@ -29,10 +28,11 @@ import android.provider.UserDictionary.Words; import android.text.TextUtils; import android.util.Log; +import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.UserDictionaryCompatUtils; -import com.android.inputmethod.latin.utils.LocaleUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; +import java.io.File; import java.util.Arrays; import java.util.Locale; @@ -51,23 +51,15 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { // to auto-correct, so we set this to the highest frequency that won't, i.e. 14. private static final int USER_DICT_SHORTCUT_FREQUENCY = 14; - // TODO: use Words.SHORTCUT when we target JellyBean or above - final static String SHORTCUT = "shortcut"; - private static final String[] PROJECTION_QUERY; - static { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - PROJECTION_QUERY = new String[] { - Words.WORD, - SHORTCUT, - Words.FREQUENCY, - }; - } else { - PROJECTION_QUERY = new String[] { - Words.WORD, - Words.FREQUENCY, - }; - } - } + private static final String[] PROJECTION_QUERY_WITH_SHORTCUT = new String[] { + Words.WORD, + Words.SHORTCUT, + Words.FREQUENCY, + }; + private static final String[] PROJECTION_QUERY_WITHOUT_SHORTCUT = new String[] { + Words.WORD, + Words.FREQUENCY, + }; private static final String NAME = "userunigram"; @@ -75,24 +67,18 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { final private String mLocale; final private boolean mAlsoUseMoreRestrictiveLocales; - public UserBinaryDictionary(final Context context, final String locale) { - this(context, locale, false); - } - - public UserBinaryDictionary(final Context context, final String locale, - final boolean alsoUseMoreRestrictiveLocales) { - super(context, getFilenameWithLocale(NAME, locale), Dictionary.TYPE_USER, - false /* isUpdatable */); + protected UserBinaryDictionary(final Context context, final Locale locale, + final boolean alsoUseMoreRestrictiveLocales, final File dictFile, final String name) { + super(context, getDictName(name, locale, dictFile), locale, Dictionary.TYPE_USER, dictFile); if (null == locale) throw new NullPointerException(); // Catch the error earlier - if (SubtypeLocaleUtils.NO_LANGUAGE.equals(locale)) { + final String localeStr = locale.toString(); + if (SubtypeLocaleUtils.NO_LANGUAGE.equals(localeStr)) { // If we don't have a locale, insert into the "all locales" user dictionary. mLocale = USER_DICTIONARY_ALL_LANGUAGES; } else { - mLocale = locale; + mLocale = localeStr; } mAlsoUseMoreRestrictiveLocales = alsoUseMoreRestrictiveLocales; - // Perform a managed query. The Activity will handle closing and re-querying the cursor - // when needed. ContentResolver cres = context.getContentResolver(); mObserver = new ContentObserver(null) { @@ -108,12 +94,18 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { // devices. On older versions of the platform, the hook above will be called instead. @Override public void onChange(final boolean self, final Uri uri) { - setRequiresReload(true); + setNeedsToRecreate(); } }; cres.registerContentObserver(Words.CONTENT_URI, true, mObserver); + reloadDictionaryIfRequired(); + } - loadDictionary(); + @UsedForTesting + public static UserBinaryDictionary getDictionary(final Context context, final Locale locale, + final File dictFile, final String dictNamePrefix) { + return new UserBinaryDictionary(context, locale, false /* alsoUseMoreRestrictiveLocales */, + dictFile, dictNamePrefix + NAME); } @Override @@ -126,7 +118,7 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { } @Override - public void loadDictionaryAsync() { + public void loadInitialContentsLocked() { // Split the locale. For example "en" => ["en"], "de_DE" => ["de", "DE"], // "en_US_foo_bar_qux" => ["en", "US", "foo_bar_qux"] because of the limit of 3. // This is correct for locale processing. @@ -174,11 +166,30 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { } else { requestArguments = localeElements; } + final String requestString = request.toString(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + try { + addWordsFromProjectionLocked(PROJECTION_QUERY_WITH_SHORTCUT, requestString, + requestArguments); + } catch (IllegalArgumentException e) { + // This may happen on some non-compliant devices where the declared API is JB+ but + // the SHORTCUT column is not present for some reason. + addWordsFromProjectionLocked(PROJECTION_QUERY_WITHOUT_SHORTCUT, requestString, + requestArguments); + } + } else { + addWordsFromProjectionLocked(PROJECTION_QUERY_WITHOUT_SHORTCUT, requestString, + requestArguments); + } + } + + private void addWordsFromProjectionLocked(final String[] query, String request, + final String[] requestArguments) throws IllegalArgumentException { Cursor cursor = null; try { cursor = mContext.getContentResolver().query( - Words.CONTENT_URI, PROJECTION_QUERY, request.toString(), requestArguments, null); - addWords(cursor); + Words.CONTENT_URI, query, request, requestArguments, null); + addWordsLocked(cursor); } catch (final SQLiteException e) { Log.e(TAG, "SQLiteException in the remote User dictionary process.", e); } finally { @@ -190,8 +201,8 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { } } - public boolean isEnabled() { - final ContentResolver cr = mContext.getContentResolver(); + public static boolean isEnabled(final Context context) { + final ContentResolver cr = context.getContentResolver(); final ContentProviderClient client = cr.acquireContentProviderClient(Words.CONTENT_URI); if (client != null) { client.release(); @@ -204,18 +215,15 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { /** * Adds a word to the user dictionary and makes it persistent. * + * @param context the context + * @param locale the locale * @param word the word to add. If the word is capitalized, then the dictionary will * recognize it as a capitalized word when searched. */ - public synchronized void addWordToUserDictionary(final String word) { + public static void addWordToUserDictionary(final Context context, final Locale locale, + final String word) { // Update the user dictionary provider - final Locale locale; - if (USER_DICTIONARY_ALL_LANGUAGES == mLocale) { - locale = null; - } else { - locale = LocaleUtils.constructLocaleFromString(mLocale); - } - UserDictionaryCompatUtils.addWord(mContext, word, + UserDictionaryCompatUtils.addWord(context, word, HISTORICAL_DEFAULT_USER_DICTIONARY_FREQUENCY, null, locale); } @@ -232,12 +240,12 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { } } - private void addWords(final Cursor cursor) { + private void addWordsLocked(final Cursor cursor) { final boolean hasShortcutColumn = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; if (cursor == null) return; if (cursor.moveToFirst()) { final int indexWord = cursor.getColumnIndex(Words.WORD); - final int indexShortcut = hasShortcutColumn ? cursor.getColumnIndex(SHORTCUT) : 0; + final int indexShortcut = hasShortcutColumn ? cursor.getColumnIndex(Words.SHORTCUT) : 0; final int indexFrequency = cursor.getColumnIndex(Words.FREQUENCY); while (!cursor.isAfterLast()) { final String word = cursor.getString(indexWord); @@ -246,25 +254,19 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { final int adjustedFrequency = scaleFrequencyFromDefaultToLatinIme(frequency); // Safeguard against adding really long words. if (word.length() < MAX_WORD_LENGTH) { - super.addWord(word, null, adjustedFrequency, 0 /* shortcutFreq */, - false /* isNotAWord */); - } - if (null != shortcut && shortcut.length() < MAX_WORD_LENGTH) { - super.addWord(shortcut, word, adjustedFrequency, USER_DICT_SHORTCUT_FREQUENCY, - true /* isNotAWord */); + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, adjustedFrequency, null /* shortcutTarget */, + 0 /* shortcutFreq */, false /* isNotAWord */, + false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP); + if (null != shortcut && shortcut.length() < MAX_WORD_LENGTH) { + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(shortcut, adjustedFrequency, word, + USER_DICT_SHORTCUT_FREQUENCY, true /* isNotAWord */, + false /* isBlacklisted */, BinaryDictionary.NOT_A_VALID_TIMESTAMP); + } } cursor.moveToNext(); } } } - - @Override - protected boolean hasContentChanged() { - return true; - } - - @Override - protected boolean needsToReloadBeforeWriting() { - return true; - } } diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 039dadc66..21fe7e0eb 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -16,11 +16,13 @@ package com.android.inputmethod.latin; -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.event.CombinerChain; +import com.android.inputmethod.event.Event; +import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.StringUtils; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; /** * A place to store the currently composing word with information such as adjacent key codes as well @@ -37,17 +39,12 @@ public final class WordComposer { public static final int CAPS_MODE_AUTO_SHIFTED = 0x5; public static final int CAPS_MODE_AUTO_SHIFT_LOCKED = 0x7; - // An array of code points representing the characters typed so far. - // The array is limited to MAX_WORD_LENGTH code points, but mTypedWord extends past that - // and mCodePointSize can go past that. If mCodePointSize is greater than MAX_WORD_LENGTH, - // this just does not contain the associated code points past MAX_WORD_LENGTH. - private int[] mPrimaryKeyCodes; + private CombinerChain mCombinerChain; + private String mCombiningSpec; // Memory so that we don't uselessly recreate the combiner chain + + // The list of events that served to compose this string. + private final ArrayList<Event> mEvents; private final InputPointers mInputPointers = new InputPointers(MAX_WORD_LENGTH); - // This is the typed word, as a StringBuilder. This has the same contents as mPrimaryKeyCodes - // but under a StringBuilder representation for ease of use, depending on what is more useful - // at any given time. However this is not limited in size, while mPrimaryKeyCodes is limited - // to MAX_WORD_LENGTH code points. - private final StringBuilder mTypedWord; private String mAutoCorrection; private boolean mIsResumed; private boolean mIsBatchMode; @@ -60,10 +57,10 @@ public final class WordComposer { private String mRejectedBatchModeSuggestion; // Cache these values for performance + private CharSequence mTypedWordCache; private int mCapsCount; private int mDigitsCount; private int mCapitalizedMode; - private int mTrailingSingleQuotesCount; // This is the number of code points entered so far. This is not limited to MAX_WORD_LENGTH. // In general, this contains the size of mPrimaryKeyCodes, except when this is greater than // MAX_WORD_LENGTH in which case mPrimaryKeyCodes only contain the first MAX_WORD_LENGTH @@ -72,129 +69,156 @@ public final class WordComposer { private int mCursorPositionWithinWord; /** - * Whether the user chose to capitalize the first char of the word. + * Whether the composing word has the only first char capitalized. */ - private boolean mIsFirstCharCapitalized; + private boolean mIsOnlyFirstCharCapitalized; public WordComposer() { - mPrimaryKeyCodes = new int[MAX_WORD_LENGTH]; - mTypedWord = new StringBuilder(MAX_WORD_LENGTH); + mCombinerChain = new CombinerChain(""); + mEvents = new ArrayList<>(); mAutoCorrection = null; - mTrailingSingleQuotesCount = 0; mIsResumed = false; mIsBatchMode = false; mCursorPositionWithinWord = 0; mRejectedBatchModeSuggestion = null; - refreshSize(); + refreshTypedWordCache(); } - public WordComposer(final WordComposer source) { - mPrimaryKeyCodes = Arrays.copyOf(source.mPrimaryKeyCodes, source.mPrimaryKeyCodes.length); - mTypedWord = new StringBuilder(source.mTypedWord); - mInputPointers.copy(source.mInputPointers); - mCapsCount = source.mCapsCount; - mDigitsCount = source.mDigitsCount; - mIsFirstCharCapitalized = source.mIsFirstCharCapitalized; - mCapitalizedMode = source.mCapitalizedMode; - mTrailingSingleQuotesCount = source.mTrailingSingleQuotesCount; - mIsResumed = source.mIsResumed; - mIsBatchMode = source.mIsBatchMode; - mCursorPositionWithinWord = source.mCursorPositionWithinWord; - mRejectedBatchModeSuggestion = source.mRejectedBatchModeSuggestion; - refreshSize(); + /** + * Restart the combiners, possibly with a new spec. + * @param combiningSpec The spec string for combining. This is found in the extra value. + */ + public void restartCombining(final String combiningSpec) { + final String nonNullCombiningSpec = null == combiningSpec ? "" : combiningSpec; + if (!nonNullCombiningSpec.equals(mCombiningSpec)) { + mCombinerChain = new CombinerChain( + mCombinerChain.getComposingWordWithCombiningFeedback().toString(), + CombinerChain.createCombiners(nonNullCombiningSpec)); + mCombiningSpec = nonNullCombiningSpec; + } } /** * Clear out the keys registered so far. */ public void reset() { - mTypedWord.setLength(0); + mCombinerChain.reset(); + mEvents.clear(); mAutoCorrection = null; mCapsCount = 0; mDigitsCount = 0; - mIsFirstCharCapitalized = false; - mTrailingSingleQuotesCount = 0; + mIsOnlyFirstCharCapitalized = false; mIsResumed = false; mIsBatchMode = false; mCursorPositionWithinWord = 0; mRejectedBatchModeSuggestion = null; - refreshSize(); + refreshTypedWordCache(); } - private final void refreshSize() { - mCodePointSize = mTypedWord.codePointCount(0, mTypedWord.length()); + private final void refreshTypedWordCache() { + mTypedWordCache = mCombinerChain.getComposingWordWithCombiningFeedback(); + mCodePointSize = Character.codePointCount(mTypedWordCache, 0, mTypedWordCache.length()); } /** * Number of keystrokes in the composing word. * @return the number of keystrokes */ - public final int size() { + // This may be made public if need be, but right now it's not used anywhere + /* package for tests */ int size() { return mCodePointSize; } - public final boolean isComposingWord() { - return size() > 0; - } + /** + * Copy the code points in the typed word to a destination array of ints. + * + * If the array is too small to hold the code points in the typed word, nothing is copied and + * -1 is returned. + * + * @param destination the array of ints. + * @return the number of copied code points. + */ + public int copyCodePointsExceptTrailingSingleQuotesAndReturnCodePointCount( + final int[] destination) { + // This method can be called on a separate thread and mTypedWordCache can change while we + // are executing this method. + final String typedWord = mTypedWordCache.toString(); + // lastIndex is exclusive + final int lastIndex = typedWord.length() + - StringUtils.getTrailingSingleQuotesCount(typedWord); + if (lastIndex <= 0) { + // The string is empty or contains only single quotes. + return 0; + } - // TODO: make sure that the index should not exceed MAX_WORD_LENGTH - public int getCodeAt(int index) { - if (index >= MAX_WORD_LENGTH) { + // The following function counts the number of code points in the text range which begins + // at index 0 and extends to the character at lastIndex. + final int codePointSize = Character.codePointCount(typedWord, 0, lastIndex); + if (codePointSize > destination.length) { return -1; } - return mPrimaryKeyCodes[index]; + return StringUtils.copyCodePointsAndReturnCodePointCount(destination, typedWord, 0, + lastIndex, true /* downCase */); } - public int getCodeBeforeCursor() { - if (mCursorPositionWithinWord < 1 || mCursorPositionWithinWord > mPrimaryKeyCodes.length) { - return Constants.NOT_A_CODE; - } - return mPrimaryKeyCodes[mCursorPositionWithinWord - 1]; + public boolean isSingleLetter() { + return size() == 1; } - public InputPointers getInputPointers() { - return mInputPointers; + public final boolean isComposingWord() { + return size() > 0; } - private static boolean isFirstCharCapitalized(final int index, final int codePoint, - final boolean previous) { - if (index == 0) return Character.isUpperCase(codePoint); - return previous && !Character.isUpperCase(codePoint); + public InputPointers getInputPointers() { + return mInputPointers; } /** - * Add a new keystroke, with the pressed key's code point with the touch point coordinates. + * Process an input event. + * + * All input events should be supported, including software/hardware events, characters as well + * as deletions, multiple inputs and gestures. + * + * @param event the event to process. */ - public void add(final int primaryCode, final int keyX, final int keyY) { + public void processEvent(final Event event) { + final int primaryCode = event.mCodePoint; + final int keyX = event.mX; + final int keyY = event.mY; final int newIndex = size(); - mTypedWord.appendCodePoint(primaryCode); - refreshSize(); + mCombinerChain.processEvent(mEvents, event); + mEvents.add(event); + refreshTypedWordCache(); mCursorPositionWithinWord = mCodePointSize; - if (newIndex < MAX_WORD_LENGTH) { - mPrimaryKeyCodes[newIndex] = primaryCode >= Constants.CODE_SPACE - ? Character.toLowerCase(primaryCode) : primaryCode; - // In the batch input mode, the {@code mInputPointers} holds batch input points and - // shouldn't be overridden by the "typed key" coordinates - // (See {@link #setBatchInputWord}). - if (!mIsBatchMode) { - // TODO: Set correct pointer id and time - mInputPointers.addPointer(newIndex, keyX, keyY, 0, 0); - } + // We may have deleted the last one. + if (0 == mCodePointSize) { + mIsOnlyFirstCharCapitalized = false; } - mIsFirstCharCapitalized = isFirstCharCapitalized( - newIndex, primaryCode, mIsFirstCharCapitalized); - if (Character.isUpperCase(primaryCode)) mCapsCount++; - if (Character.isDigit(primaryCode)) mDigitsCount++; - if (Constants.CODE_SINGLE_QUOTE == primaryCode) { - ++mTrailingSingleQuotesCount; - } else { - mTrailingSingleQuotesCount = 0; + if (Constants.CODE_DELETE != event.mKeyCode) { + if (newIndex < MAX_WORD_LENGTH) { + // In the batch input mode, the {@code mInputPointers} holds batch input points and + // shouldn't be overridden by the "typed key" coordinates + // (See {@link #setBatchInputWord}). + if (!mIsBatchMode) { + // TODO: Set correct pointer id and time + mInputPointers.addPointerAt(newIndex, keyX, keyY, 0, 0); + } + } + if (0 == newIndex) { + mIsOnlyFirstCharCapitalized = Character.isUpperCase(primaryCode); + } else { + mIsOnlyFirstCharCapitalized = mIsOnlyFirstCharCapitalized + && !Character.isUpperCase(primaryCode); + } + if (Character.isUpperCase(primaryCode)) mCapsCount++; + if (Character.isDigit(primaryCode)) mDigitsCount++; } mAutoCorrection = null; } public void setCursorPositionWithinWord(final int posWithinWord) { mCursorPositionWithinWord = posWithinWord; + // TODO: compute where that puts us inside the events } public boolean isCursorFrontOrMiddleOfComposingWord() { @@ -215,17 +239,12 @@ public final class WordComposer { * @return true if the cursor is still inside the composing word, false otherwise. */ public boolean moveCursorByAndReturnIfInsideComposingWord(final int expectedMoveAmount) { + // TODO: should uncommit the composing feedback + mCombinerChain.reset(); int actualMoveAmountWithinWord = 0; int cursorPos = mCursorPositionWithinWord; - final int[] codePoints; - if (mCodePointSize >= MAX_WORD_LENGTH) { - // If we have more than MAX_WORD_LENGTH characters, we don't have everything inside - // mPrimaryKeyCodes. This should be rare enough that we can afford to just compute - // the array on the fly when this happens. - codePoints = StringUtils.toCodePointArray(mTypedWord.toString()); - } else { - codePoints = mPrimaryKeyCodes; - } + // TODO: Don't make that copy. We can do this directly from mTypedWordCache. + final int[] codePoints = StringUtils.toCodePointArray(mTypedWordCache); if (expectedMoveAmount >= 0) { // Moving the cursor forward for the expected amount or until the end of the word has // been reached, whichever comes first. @@ -261,98 +280,48 @@ public final class WordComposer { final int codePoint = Character.codePointAt(word, i); // We don't want to override the batch input points that are held in mInputPointers // (See {@link #add(int,int,int)}). - add(codePoint, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); + processEvent(Event.createEventForCodePointFromUnknownSource(codePoint)); } } /** - * Add a dummy key by retrieving reasonable coordinates - */ - public void addKeyInfo(final int codePoint, final Keyboard keyboard) { - final int x, y; - final Key key; - if (keyboard != null && (key = keyboard.getKey(codePoint)) != null) { - x = key.getX() + key.getWidth() / 2; - y = key.getY() + key.getHeight() / 2; - } else { - x = Constants.NOT_A_COORDINATE; - y = Constants.NOT_A_COORDINATE; - } - add(codePoint, x, y); - } - - /** * Set the currently composing word to the one passed as an argument. * This will register NOT_A_COORDINATE for X and Ys, and use the passed keyboard for proximity. + * @param codePoints the code points to set as the composing word. + * @param coordinates the x, y coordinates of the key in the CoordinateUtils format */ - public void setComposingWord(final CharSequence word, final Keyboard keyboard) { + public void setComposingWord(final int[] codePoints, final int[] coordinates) { reset(); - final int length = word.length(); - for (int i = 0; i < length; i = Character.offsetByCodePoints(word, i, 1)) { - final int codePoint = Character.codePointAt(word, i); - addKeyInfo(codePoint, keyboard); + final int length = codePoints.length; + for (int i = 0; i < length; ++i) { + processEvent(Event.createEventForCodePointFromAlreadyTypedText(codePoints[i], + CoordinateUtils.xFromArray(coordinates, i), + CoordinateUtils.yFromArray(coordinates, i))); } mIsResumed = true; } /** - * Delete the last keystroke as a result of hitting backspace. - */ - public void deleteLast() { - final int size = size(); - if (size > 0) { - // Note: mTypedWord.length() and mCodes.length differ when there are surrogate pairs - final int stringBuilderLength = mTypedWord.length(); - if (stringBuilderLength < size) { - throw new RuntimeException( - "In WordComposer: mCodes and mTypedWords have non-matching lengths"); - } - final int lastChar = mTypedWord.codePointBefore(stringBuilderLength); - if (Character.isSupplementaryCodePoint(lastChar)) { - mTypedWord.delete(stringBuilderLength - 2, stringBuilderLength); - } else { - mTypedWord.deleteCharAt(stringBuilderLength - 1); - } - if (Character.isUpperCase(lastChar)) mCapsCount--; - if (Character.isDigit(lastChar)) mDigitsCount--; - refreshSize(); - } - // We may have deleted the last one. - if (0 == size()) { - mIsFirstCharCapitalized = false; - } - if (mTrailingSingleQuotesCount > 0) { - --mTrailingSingleQuotesCount; - } else { - int i = mTypedWord.length(); - while (i > 0) { - i = mTypedWord.offsetByCodePoints(i, -1); - if (Constants.CODE_SINGLE_QUOTE != mTypedWord.codePointAt(i)) break; - ++mTrailingSingleQuotesCount; - } - } - mCursorPositionWithinWord = mCodePointSize; - mAutoCorrection = null; - } - - /** * Returns the word as it was typed, without any correction applied. * @return the word that was typed so far. Never returns null. */ public String getTypedWord() { - return mTypedWord.toString(); + return mTypedWordCache.toString(); } /** - * Whether or not the user typed a capital letter as the first letter in the word + * Whether this composer is composing or about to compose a word in which only the first letter + * is a capital. + * + * If we do have a composing word, we just return whether the word has indeed only its first + * character capitalized. If we don't, then we return a value based on the capitalized mode, + * which tell us what is likely to happen for the next composing word. + * * @return capitalization preference */ - public boolean isFirstCharCapitalized() { - return mIsFirstCharCapitalized; - } - - public int trailingSingleQuotesCount() { - return mTrailingSingleQuotesCount; + public boolean isOrWillBeOnlyFirstCharCapitalized() { + return isComposingWord() ? mIsOnlyFirstCharCapitalized + : (CAPS_MODE_OFF != mCapitalizedMode); } /** @@ -390,10 +359,10 @@ public final class WordComposer { /** * Saves the caps mode at the start of composing. * - * WordComposer needs to know about this for several reasons. The first is, we need to know - * after the fact what the reason was, to register the correct form into the user history - * dictionary: if the word was automatically capitalized, we should insert it in all-lower - * case but if it's a manual pressing of shift, then it should be inserted as is. + * WordComposer needs to know about the caps mode for several reasons. The first is, we need + * to know after the fact what the reason was, to register the correct form into the user + * history dictionary: if the word was automatically capitalized, we should insert it in + * all-lower case but if it's a manual pressing of shift, then it should be inserted as is. * Also, batch input needs to know about the current caps mode to display correctly * capitalized suggestions. * @param mode the mode at the time of start @@ -403,6 +372,20 @@ public final class WordComposer { } /** + * Before fetching suggestions, we don't necessarily know about the capitalized mode yet. + * + * If we don't have a composing word yet, we take a note of this mode so that we can then + * supply this information to the suggestion process. If we have a composing word, then + * the previous mode has priority over this. + * @param mode the mode just before fetching suggestions + */ + public void adviseCapitalizedModeBeforeFetchingSuggestions(final int mode) { + if (!isComposingWord()) { + mCapitalizedMode = mode; + } + } + + /** * Returns whether the word was automatically capitalized. * @return whether the word was automatically capitalized */ @@ -433,16 +416,15 @@ public final class WordComposer { } // `type' should be one of the LastComposedWord.COMMIT_TYPE_* constants above. - public LastComposedWord commitWord(final int type, final String committedWord, - final String separatorString, final String prevWord) { + // committedWord should contain suggestion spans if applicable. + public LastComposedWord commitWord(final int type, final CharSequence committedWord, + final String separatorString, final PrevWordsInfo prevWordsInfo) { // Note: currently, we come here whenever we commit a word. If it's a MANUAL_PICK // or a DECIDED_WORD we may cancel the commit later; otherwise, we should deactivate // the last composed word to ensure this does not happen. - final int[] primaryKeyCodes = mPrimaryKeyCodes; - mPrimaryKeyCodes = new int[MAX_WORD_LENGTH]; - final LastComposedWord lastComposedWord = new LastComposedWord(primaryKeyCodes, - mInputPointers, mTypedWord.toString(), committedWord, separatorString, - prevWord, mCapitalizedMode); + final LastComposedWord lastComposedWord = new LastComposedWord(mEvents, + mInputPointers, mTypedWordCache.toString(), committedWord, separatorString, + prevWordsInfo, mCapitalizedMode); mInputPointers.reset(); if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD && type != LastComposedWord.COMMIT_TYPE_MANUAL_PICK) { @@ -451,12 +433,12 @@ public final class WordComposer { mCapsCount = 0; mDigitsCount = 0; mIsBatchMode = false; - mTypedWord.setLength(0); + mCombinerChain.reset(); + mEvents.clear(); mCodePointSize = 0; - mTrailingSingleQuotesCount = 0; - mIsFirstCharCapitalized = false; + mIsOnlyFirstCharCapitalized = false; mCapitalizedMode = CAPS_MODE_OFF; - refreshSize(); + refreshTypedWordCache(); mAutoCorrection = null; mCursorPositionWithinWord = 0; mIsResumed = false; @@ -465,11 +447,11 @@ public final class WordComposer { } public void resumeSuggestionOnLastComposedWord(final LastComposedWord lastComposedWord) { - mPrimaryKeyCodes = lastComposedWord.mPrimaryKeyCodes; + mEvents.clear(); + Collections.copy(mEvents, lastComposedWord.mEvents); mInputPointers.set(lastComposedWord.mInputPointers); - mTypedWord.setLength(0); - mTypedWord.append(lastComposedWord.mTypedWord); - refreshSize(); + mCombinerChain.reset(); + refreshTypedWordCache(); mCapitalizedMode = lastComposedWord.mCapitalizedMode; mAutoCorrection = null; // This will be filled by the next call to updateSuggestion. mCursorPositionWithinWord = mCodePointSize; diff --git a/java/src/com/android/inputmethod/latin/WordListInfo.java b/java/src/com/android/inputmethod/latin/WordListInfo.java index 5ac806a0c..268fe9818 100644 --- a/java/src/com/android/inputmethod/latin/WordListInfo.java +++ b/java/src/com/android/inputmethod/latin/WordListInfo.java @@ -22,8 +22,10 @@ package com.android.inputmethod.latin; public final class WordListInfo { public final String mId; public final String mLocale; - public WordListInfo(final String id, final String locale) { + public final String mRawChecksum; + public WordListInfo(final String id, final String locale, final String rawChecksum) { mId = id; mLocale = locale; + mRawChecksum = rawChecksum; } } diff --git a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java b/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java index 028f78a87..7071d8689 100644 --- a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java +++ b/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java @@ -26,8 +26,8 @@ import android.os.Environment; import com.android.inputmethod.latin.BinaryDictionaryFileDumper; import com.android.inputmethod.latin.BinaryDictionaryGetter; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.makedict.DictionaryHeader; +import com.android.inputmethod.latin.utils.DialogUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.LocaleUtils; @@ -49,9 +49,9 @@ public class ExternalDictionaryGetterForDebug { private static String[] findDictionariesInTheDownloadedFolder() { final File[] files = new File(SOURCE_FOLDER).listFiles(); - final ArrayList<String> eligibleList = CollectionUtils.newArrayList(); + final ArrayList<String> eligibleList = new ArrayList<>(); for (File f : files) { - final FileHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(f); + final DictionaryHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(f); if (null == header) continue; eligibleList.add(f.getName()); } @@ -70,7 +70,7 @@ public class ExternalDictionaryGetterForDebug { } private static void showNoFileDialog(final Context context) { - new AlertDialog.Builder(context) + new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context)) .setMessage(R.string.read_external_dictionary_no_files_message) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override @@ -81,8 +81,8 @@ public class ExternalDictionaryGetterForDebug { } private static void showChooseFileDialog(final Context context, final String[] fileNames) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.read_external_dictionary_multiple_files_title) + new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context)) + .setTitle(R.string.read_external_dictionary_multiple_files_title) .setItems(fileNames, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { @@ -99,7 +99,7 @@ public class ExternalDictionaryGetterForDebug { public static void askInstallFile(final Context context, final String dirPath, final String fileName, final Runnable completeRunnable) { final File file = new File(dirPath, fileName.toString()); - final FileHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(file); + final DictionaryHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(file); final StringBuilder message = new StringBuilder(); final String locale = header.getLocaleString(); for (String key : header.mDictionaryOptions.mAttributes.keySet()) { @@ -111,7 +111,7 @@ public class ExternalDictionaryGetterForDebug { final String title = String.format( context.getString(R.string.read_external_dictionary_confirm_install_message), languageName); - new AlertDialog.Builder(context) + new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context)) .setTitle(title) .setMessage(message) .setNegativeButton(android.R.string.cancel, new OnClickListener() { @@ -143,7 +143,7 @@ public class ExternalDictionaryGetterForDebug { } private static void installFile(final Context context, final File file, - final FileHeader header) { + final DictionaryHeader header) { BufferedOutputStream outputStream = null; File tempFile = null; try { @@ -167,7 +167,7 @@ public class ExternalDictionaryGetterForDebug { } } catch (IOException e) { // There was an error: show a dialog - new AlertDialog.Builder(context) + new AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(context)) .setTitle(R.string.error) .setMessage(e.toString()) .setPositiveButton(android.R.string.ok, new OnClickListener() { diff --git a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java index dc937fb25..972580298 100644 --- a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java +++ b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java @@ -21,12 +21,17 @@ public final class ProductionFlag { // This class is not publicly instantiable. } - public static final boolean USES_DEVELOPMENT_ONLY_DIAGNOSTICS = false; + public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false; - // When false, USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG suggests that all guarded - // class-private DEBUG flags should be false, and any privacy controls should be enforced. - // USES_DEVELOPMENT_ONLY_DIAGNOSTICS must be false for any production build. - public static final boolean USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG = false; + // When true, enable {@link InputMethodService#onUpdateCursor} callback with + // {@link InputMethodService#setCursorAnchorMonitorMode}, which is not yet available in + // API level 19. Do not turn this on in production until the new API becomes publicly + // available. + public static final boolean USES_CURSOR_ANCHOR_MONITOR = false; - public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false; + // Include all suggestions from all dictionaries in {@link SuggestedWords#mRawSuggestions}. + public static final boolean INCLUDE_RAW_SUGGESTIONS = false; + + // When false, the metrics logging is not yet ready to be enabled. + public static final boolean IS_METRICS_LOGGING_SUPPORTED = false; } diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java new file mode 100644 index 000000000..5ab7db8ce --- /dev/null +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -0,0 +1,2006 @@ +/* + * Copyright (C) 2013 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.inputlogic; + +import android.os.SystemClock; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.SuggestionSpan; +import android.util.Log; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.inputmethod.CorrectionInfo; +import android.view.inputmethod.EditorInfo; + +import com.android.inputmethod.compat.SuggestionSpanUtils; +import com.android.inputmethod.event.Event; +import com.android.inputmethod.event.InputTransaction; +import com.android.inputmethod.keyboard.KeyboardSwitcher; +import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.DictionaryFacilitator; +import com.android.inputmethod.latin.InputPointers; +import com.android.inputmethod.latin.LastComposedWord; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.PrevWordsInfo; +import com.android.inputmethod.latin.RichInputConnection; +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.WordComposer; +import com.android.inputmethod.latin.settings.SettingsValues; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; +import com.android.inputmethod.latin.suggestions.SuggestionStripViewAccessor; +import com.android.inputmethod.latin.utils.AsyncResultHolder; +import com.android.inputmethod.latin.utils.InputTypeUtils; +import com.android.inputmethod.latin.utils.RecapitalizeStatus; +import com.android.inputmethod.latin.utils.StringUtils; +import com.android.inputmethod.latin.utils.TextRange; + +import java.util.ArrayList; +import java.util.TreeSet; +import java.util.concurrent.TimeUnit; + +/** + * This class manages the input logic. + */ +public final class InputLogic { + private static final String TAG = InputLogic.class.getSimpleName(); + + // TODO : Remove this member when we can. + private final LatinIME mLatinIME; + private final SuggestionStripViewAccessor mSuggestionStripViewAccessor; + + // Never null. + private InputLogicHandler mInputLogicHandler = InputLogicHandler.NULL_HANDLER; + + // TODO : make all these fields private as soon as possible. + // Current space state of the input method. This can be any of the above constants. + private int mSpaceState; + // Never null + public SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; + public final Suggest mSuggest; + private final DictionaryFacilitator mDictionaryFacilitator; + + public LastComposedWord mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; + // This has package visibility so it can be accessed from InputLogicHandler. + /* package */ final WordComposer mWordComposer; + public final RichInputConnection mConnection; + private final RecapitalizeStatus mRecapitalizeStatus = new RecapitalizeStatus(); + + private int mDeleteCount; + private long mLastKeyTime; + public final TreeSet<Long> mCurrentlyPressedHardwareKeys = new TreeSet<>(); + + // Keeps track of most recently inserted text (multi-character key) for reverting + private String mEnteredText; + + // TODO: This boolean is persistent state and causes large side effects at unexpected times. + // Find a way to remove it for readability. + private boolean mIsAutoCorrectionIndicatorOn; + private long mDoubleSpacePeriodCountdownStart; + + /** + * Create a new instance of the input logic. + * @param latinIME the instance of the parent LatinIME. We should remove this when we can. + * @param suggestionStripViewAccessor an object to access the suggestion strip view. + * @param dictionaryFacilitator facilitator for getting suggestions and updating user history + * dictionary. + */ + public InputLogic(final LatinIME latinIME, + final SuggestionStripViewAccessor suggestionStripViewAccessor, + final DictionaryFacilitator dictionaryFacilitator) { + mLatinIME = latinIME; + mSuggestionStripViewAccessor = suggestionStripViewAccessor; + mWordComposer = new WordComposer(); + mConnection = new RichInputConnection(latinIME); + mInputLogicHandler = InputLogicHandler.NULL_HANDLER; + mSuggest = new Suggest(dictionaryFacilitator); + mDictionaryFacilitator = dictionaryFacilitator; + } + + /** + * Initializes the input logic for input in an editor. + * + * Call this when input starts or restarts in some editor (typically, in onStartInputView). + * + * @param combiningSpec the combining spec string for this subtype + */ + public void startInput(final String combiningSpec) { + mEnteredText = null; + mWordComposer.restartCombining(combiningSpec); + resetComposingState(true /* alsoResetLastComposedWord */); + mDeleteCount = 0; + mSpaceState = SpaceState.NONE; + mRecapitalizeStatus.disable(); // Do not perform recapitalize until the cursor is moved once + mCurrentlyPressedHardwareKeys.clear(); + mSuggestedWords = SuggestedWords.EMPTY; + // In some cases (namely, after rotation of the device) editorInfo.initialSelStart is lying + // so we try using some heuristics to find out about these and fix them. + mConnection.tryFixLyingCursorPosition(); + cancelDoubleSpacePeriodCountdown(); + if (InputLogicHandler.NULL_HANDLER == mInputLogicHandler) { + mInputLogicHandler = new InputLogicHandler(mLatinIME, this); + } else { + mInputLogicHandler.reset(); + } + } + + /** + * Call this when the subtype changes. + * @param combiningSpec the spec string for the combining rules + */ + public void onSubtypeChanged(final String combiningSpec) { + finishInput(); + startInput(combiningSpec); + } + + /** + * Call this when the orientation changes. + * @param settingsValues the current values of the settings. + */ + public void onOrientationChange(final SettingsValues settingsValues) { + // If !isComposingWord, #commitTyped() is a no-op, but still, it's better to avoid + // the useless IPC of {begin,end}BatchEdit. + if (mWordComposer.isComposingWord()) { + mConnection.beginBatchEdit(); + // If we had a composition in progress, we need to commit the word so that the + // suggestionsSpan will be added. This will allow resuming on the same suggestions + // after rotation is finished. + commitTyped(settingsValues, LastComposedWord.NOT_A_SEPARATOR); + mConnection.endBatchEdit(); + } + } + + /** + * Clean up the input logic after input is finished. + */ + public void finishInput() { + if (mWordComposer.isComposingWord()) { + mConnection.finishComposingText(); + } + resetComposingState(true /* alsoResetLastComposedWord */); + mInputLogicHandler.reset(); + } + + // Normally this class just gets out of scope after the process ends, but in unit tests, we + // create several instances of LatinIME in the same process, which results in several + // instances of InputLogic. This cleans up the associated handler so that tests don't leak + // handlers. + public void recycle() { + final InputLogicHandler inputLogicHandler = mInputLogicHandler; + mInputLogicHandler = InputLogicHandler.NULL_HANDLER; + inputLogicHandler.destroy(); + mDictionaryFacilitator.closeDictionaries(); + } + + /** + * React to a string input. + * + * This is triggered by keys that input many characters at once, like the ".com" key or + * some additional keys for example. + * + * @param settingsValues the current values of the settings. + * @param event the input event containing the data. + * @return the complete transaction object + */ + public InputTransaction onTextInput(final SettingsValues settingsValues, final Event event, + final int keyboardShiftMode, + // TODO: remove this argument + final LatinIME.UIHandler handler) { + final String rawText = event.mText.toString(); + final InputTransaction inputTransaction = new InputTransaction(settingsValues, event, + SystemClock.uptimeMillis(), mSpaceState, + getActualCapsMode(settingsValues, keyboardShiftMode)); + mConnection.beginBatchEdit(); + if (mWordComposer.isComposingWord()) { + commitCurrentAutoCorrection(settingsValues, rawText, handler); + } else { + resetComposingState(true /* alsoResetLastComposedWord */); + } + handler.postUpdateSuggestionStrip(); + final String text = performSpecificTldProcessingOnTextInput(rawText); + if (SpaceState.PHANTOM == mSpaceState) { + promotePhantomSpace(settingsValues); + } + mConnection.commitText(text, 1); + mConnection.endBatchEdit(); + // Space state must be updated before calling updateShiftState + mSpaceState = SpaceState.NONE; + mEnteredText = text; + inputTransaction.setDidAffectContents(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + return inputTransaction; + } + + /** + * A suggestion was picked from the suggestion strip. + * @param settingsValues the current values of the settings. + * @param suggestionInfo the suggestion info. + * @param keyboardShiftState the shift state of the keyboard, as returned by + * {@link com.android.inputmethod.keyboard.KeyboardSwitcher#getKeyboardShiftMode()} + * @return the complete transaction object + */ + // Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener} + // interface + public InputTransaction onPickSuggestionManually(final SettingsValues settingsValues, + final SuggestedWordInfo suggestionInfo, final int keyboardShiftState, + // TODO: remove these arguments + final int currentKeyboardScriptId, final LatinIME.UIHandler handler) { + final SuggestedWords suggestedWords = mSuggestedWords; + final String suggestion = suggestionInfo.mWord; + // If this is a punctuation picked from the suggestion strip, pass it to onCodeInput + if (suggestion.length() == 1 && suggestedWords.isPunctuationSuggestions()) { + // Word separators are suggested before the user inputs something. + // Rely on onCodeInput to do the complicated swapping/stripping logic consistently. + final Event event = Event.createPunctuationSuggestionPickedEvent(suggestionInfo); + return onCodeInput(settingsValues, event, keyboardShiftState, + currentKeyboardScriptId, handler); + } + + final Event event = Event.createSuggestionPickedEvent(suggestionInfo); + final InputTransaction inputTransaction = new InputTransaction(settingsValues, + event, SystemClock.uptimeMillis(), mSpaceState, keyboardShiftState); + // Manual pick affects the contents of the editor, so we take note of this. It's important + // for the sequence of language switching. + inputTransaction.setDidAffectContents(); + mConnection.beginBatchEdit(); + if (SpaceState.PHANTOM == mSpaceState && suggestion.length() > 0 + // In the batch input mode, a manually picked suggested word should just replace + // the current batch input text and there is no need for a phantom space. + && !mWordComposer.isBatchMode()) { + final int firstChar = Character.codePointAt(suggestion, 0); + if (!settingsValues.isWordSeparator(firstChar) + || settingsValues.isUsuallyPrecededBySpace(firstChar)) { + promotePhantomSpace(settingsValues); + } + } + + // TODO: We should not need the following branch. We should be able to take the same + // code path as for other kinds, use commitChosenWord, and do everything normally. We will + // however need to reset the suggestion strip right away, because we know we can't take + // the risk of calling commitCompletion twice because we don't know how the app will react. + if (suggestionInfo.isKindOf(SuggestedWordInfo.KIND_APP_DEFINED)) { + mSuggestedWords = SuggestedWords.EMPTY; + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + resetComposingState(true /* alsoResetLastComposedWord */); + mConnection.commitCompletion(suggestionInfo.mApplicationSpecifiedCompletionInfo); + mConnection.endBatchEdit(); + return inputTransaction; + } + + // We need to log before we commit, because the word composer will store away the user + // typed word. + final String replacedWord = mWordComposer.getTypedWord(); + commitChosenWord(settingsValues, suggestion, + LastComposedWord.COMMIT_TYPE_MANUAL_PICK, LastComposedWord.NOT_A_SEPARATOR); + mConnection.endBatchEdit(); + // Don't allow cancellation of manual pick + mLastComposedWord.deactivate(); + // Space state must be updated before calling updateShiftState + mSpaceState = SpaceState.PHANTOM; + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + + // We should show the "Touch again to save" hint if the user pressed the first entry + // AND it's in none of our current dictionaries (main, user or otherwise). + final boolean showingAddToDictionaryHint = + (suggestionInfo.isKindOf(SuggestedWordInfo.KIND_TYPED) + || suggestionInfo.isKindOf(SuggestedWordInfo.KIND_OOV_CORRECTION)) + && !mDictionaryFacilitator.isValidWord(suggestion, true /* ignoreCase */); + + if (showingAddToDictionaryHint && mDictionaryFacilitator.isUserDictionaryEnabled()) { + mSuggestionStripViewAccessor.showAddToDictionaryHint(suggestion); + } else { + // If we're not showing the "Touch again to save", then update the suggestion strip. + handler.postUpdateSuggestionStrip(); + } + return inputTransaction; + } + + /** + * Consider an update to the cursor position. Evaluate whether this update has happened as + * part of normal typing or whether it was an explicit cursor move by the user. In any case, + * do the necessary adjustments. + * @param oldSelStart old selection start + * @param oldSelEnd old selection end + * @param newSelStart new selection start + * @param newSelEnd new selection end + * @return whether the cursor has moved as a result of user interaction. + */ + public boolean onUpdateSelection(final int oldSelStart, final int oldSelEnd, + final int newSelStart, final int newSelEnd) { + if (mConnection.isBelatedExpectedUpdate(oldSelStart, newSelStart, oldSelEnd, newSelEnd)) { + return false; + } + // TODO: the following is probably better done in resetEntireInputState(). + // it should only happen when the cursor moved, and the very purpose of the + // test below is to narrow down whether this happened or not. Likewise with + // the call to updateShiftState. + // We set this to NONE because after a cursor move, we don't want the space + // state-related special processing to kick in. + mSpaceState = SpaceState.NONE; + + final boolean selectionChangedOrSafeToReset = + oldSelStart != newSelStart || oldSelEnd != newSelEnd // selection changed + || !mWordComposer.isComposingWord(); // safe to reset + final boolean hasOrHadSelection = (oldSelStart != oldSelEnd || newSelStart != newSelEnd); + final int moveAmount = newSelStart - oldSelStart; + // As an added small gift from the framework, it happens upon rotation when there + // is a selection that we get a wrong cursor position delivered to startInput() that + // does not get reflected in the oldSel{Start,End} parameters to the next call to + // onUpdateSelection. In this case, we may have set a composition, and when we're here + // we realize we shouldn't have. In theory, in this case, selectionChangedOrSafeToReset + // should be true, but that is if the framework had taken that wrong cursor position + // into account, which means we have to reset the entire composing state whenever there + // is or was a selection regardless of whether it changed or not. + if (hasOrHadSelection || (selectionChangedOrSafeToReset + && !mWordComposer.moveCursorByAndReturnIfInsideComposingWord(moveAmount))) { + // If we are composing a word and moving the cursor, we would want to set a + // suggestion span for recorrection to work correctly. Unfortunately, that + // would involve the keyboard committing some new text, which would move the + // cursor back to where it was. Latin IME could then fix the position of the cursor + // again, but the asynchronous nature of the calls results in this wreaking havoc + // with selection on double tap and the like. + // Another option would be to send suggestions each time we set the composing + // text, but that is probably too expensive to do, so we decided to leave things + // as is. + // Also, we're posting a resume suggestions message, and this will update the + // suggestions strip in a few milliseconds, so if we cleared the suggestion strip here + // we'd have the suggestion strip noticeably janky. To avoid that, we don't clear + // it here, which means we'll keep outdated suggestions for a split second but the + // visual result is better. + resetEntireInputState(newSelStart, newSelEnd, false /* clearSuggestionStrip */); + } else { + // resetEntireInputState calls resetCachesUponCursorMove, but forcing the + // composition to end. But in all cases where we don't reset the entire input + // state, we still want to tell the rich input connection about the new cursor + // position so that it can update its caches. + mConnection.resetCachesUponCursorMoveAndReturnSuccess( + newSelStart, newSelEnd, false /* shouldFinishComposition */); + } + + // The cursor has been moved : we now accept to perform recapitalization + mRecapitalizeStatus.enable(); + // We moved the cursor. If we are touching a word, we need to resume suggestion. + mLatinIME.mHandler.postResumeSuggestions(false /* shouldIncludeResumedWordInSuggestions */, + true /* shouldDelay */); + // Stop the last recapitalization, if started. + mRecapitalizeStatus.stop(); + return true; + } + + /** + * React to a code input. It may be a code point to insert, or a symbolic value that influences + * the keyboard behavior. + * + * Typically, this is called whenever a key is pressed on the software keyboard. This is not + * the entry point for gesture input; see the onBatchInput* family of functions for this. + * + * @param settingsValues the current settings values. + * @param event the event to handle. + * @param keyboardShiftMode the current shift mode of the keyboard, as returned by + * {@link com.android.inputmethod.keyboard.KeyboardSwitcher#getKeyboardShiftMode()} + * @return the complete transaction object + */ + public InputTransaction onCodeInput(final SettingsValues settingsValues, final Event event, + final int keyboardShiftMode, + // TODO: remove these arguments + final int currentKeyboardScriptId, final LatinIME.UIHandler handler) { + final InputTransaction inputTransaction = new InputTransaction(settingsValues, event, + SystemClock.uptimeMillis(), mSpaceState, + getActualCapsMode(settingsValues, keyboardShiftMode)); + if (event.mKeyCode != Constants.CODE_DELETE + || inputTransaction.mTimestamp > mLastKeyTime + Constants.LONG_PRESS_MILLISECONDS) { + mDeleteCount = 0; + } + mLastKeyTime = inputTransaction.mTimestamp; + mConnection.beginBatchEdit(); + if (!mWordComposer.isComposingWord()) { + mIsAutoCorrectionIndicatorOn = false; + } + + // TODO: Consolidate the double-space period timer, mLastKeyTime, and the space state. + if (event.mCodePoint != Constants.CODE_SPACE) { + cancelDoubleSpacePeriodCountdown(); + } + + boolean didAutoCorrect = false; + if (event.isFunctionalKeyEvent()) { + // A special key, like delete, shift, emoji, or the settings key. + switch (event.mKeyCode) { + case Constants.CODE_DELETE: + handleBackspace(inputTransaction, currentKeyboardScriptId); + // Backspace is a functional key, but it affects the contents of the editor. + inputTransaction.setDidAffectContents(); + break; + case Constants.CODE_SHIFT: + performRecapitalization(inputTransaction.mSettingsValues); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + if (mSuggestedWords.mIsPrediction) { + inputTransaction.setRequiresUpdateSuggestions(); + } + break; + case Constants.CODE_CAPSLOCK: + // Note: Changing keyboard to shift lock state is handled in + // {@link KeyboardSwitcher#onCodeInput(int)}. + break; + case Constants.CODE_SYMBOL_SHIFT: + // Note: Calling back to the keyboard on the symbol Shift key is handled in + // {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. + break; + case Constants.CODE_SWITCH_ALPHA_SYMBOL: + // Note: Calling back to the keyboard on symbol key is handled in + // {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. + break; + case Constants.CODE_SETTINGS: + onSettingsKeyPressed(); + break; + case Constants.CODE_SHORTCUT: + // We need to switch to the shortcut IME. This is handled by LatinIME since the + // input logic has no business with IME switching. + break; + case Constants.CODE_ACTION_NEXT: + performEditorAction(EditorInfo.IME_ACTION_NEXT); + break; + case Constants.CODE_ACTION_PREVIOUS: + performEditorAction(EditorInfo.IME_ACTION_PREVIOUS); + break; + case Constants.CODE_LANGUAGE_SWITCH: + handleLanguageSwitchKey(); + break; + case Constants.CODE_EMOJI: + // Note: Switching emoji keyboard is being handled in + // {@link KeyboardState#onCodeInput(int,int)}. + break; + case Constants.CODE_ALPHA_FROM_EMOJI: + // Note: Switching back from Emoji keyboard to the main keyboard is being + // handled in {@link KeyboardState#onCodeInput(int,int)}. + break; + case Constants.CODE_SHIFT_ENTER: + // TODO: remove this object + final Event tmpEvent = Event.createSoftwareKeypressEvent(Constants.CODE_ENTER, + event.mKeyCode, event.mX, event.mY, event.isKeyRepeat()); + final InputTransaction tmpTransaction = new InputTransaction( + inputTransaction.mSettingsValues, tmpEvent, + inputTransaction.mTimestamp, inputTransaction.mSpaceState, + inputTransaction.mShiftState); + didAutoCorrect = handleNonSpecialCharacter(tmpTransaction, handler); + // Shift + Enter is treated as a functional key but it results in adding a new + // line, so that does affect the contents of the editor. + inputTransaction.setDidAffectContents(); + break; + default: + throw new RuntimeException("Unknown key code : " + event.mKeyCode); + } + } else { + inputTransaction.setDidAffectContents(); + switch (event.mCodePoint) { + case Constants.CODE_ENTER: + final EditorInfo editorInfo = getCurrentInputEditorInfo(); + final int imeOptionsActionId = + InputTypeUtils.getImeOptionsActionIdFromEditorInfo(editorInfo); + if (InputTypeUtils.IME_ACTION_CUSTOM_LABEL == imeOptionsActionId) { + // Either we have an actionLabel and we should performEditorAction with + // actionId regardless of its value. + performEditorAction(editorInfo.actionId); + } else if (EditorInfo.IME_ACTION_NONE != imeOptionsActionId) { + // We didn't have an actionLabel, but we had another action to execute. + // EditorInfo.IME_ACTION_NONE explicitly means no action. In contrast, + // EditorInfo.IME_ACTION_UNSPECIFIED is the default value for an action, so it + // means there should be an action and the app didn't bother to set a specific + // code for it - presumably it only handles one. It does not have to be treated + // in any specific way: anything that is not IME_ACTION_NONE should be sent to + // performEditorAction. + performEditorAction(imeOptionsActionId); + } else { + // No action label, and the action from imeOptions is NONE: this is a regular + // enter key that should input a carriage return. + didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler); + } + break; + default: + didAutoCorrect = handleNonSpecialCharacter(inputTransaction, handler); + break; + } + } + if (!didAutoCorrect && event.mKeyCode != Constants.CODE_SHIFT + && event.mKeyCode != Constants.CODE_CAPSLOCK + && event.mKeyCode != Constants.CODE_SWITCH_ALPHA_SYMBOL) + mLastComposedWord.deactivate(); + if (Constants.CODE_DELETE != event.mKeyCode) { + mEnteredText = null; + } + mConnection.endBatchEdit(); + return inputTransaction; + } + + public void onStartBatchInput(final SettingsValues settingsValues, + // TODO: remove these arguments + final KeyboardSwitcher keyboardSwitcher, final LatinIME.UIHandler handler) { + mInputLogicHandler.onStartBatchInput(); + handler.showGesturePreviewAndSuggestionStrip( + SuggestedWords.EMPTY, false /* dismissGestureFloatingPreviewText */); + handler.cancelUpdateSuggestionStrip(); + ++mAutoCommitSequenceNumber; + mConnection.beginBatchEdit(); + if (mWordComposer.isComposingWord()) { + if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { + // If we are in the middle of a recorrection, we need to commit the recorrection + // first so that we can insert the batch input at the current cursor position. + resetEntireInputState(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd(), true /* clearSuggestionStrip */); + } else if (mWordComposer.isSingleLetter()) { + // We auto-correct the previous (typed, not gestured) string iff it's one character + // long. The reason for this is, even in the middle of gesture typing, you'll still + // tap one-letter words and you want them auto-corrected (typically, "i" in English + // should become "I"). However for any longer word, we assume that the reason for + // tapping probably is that the word you intend to type is not in the dictionary, + // so we do not attempt to correct, on the assumption that if that was a dictionary + // word, the user would probably have gestured instead. + commitCurrentAutoCorrection(settingsValues, LastComposedWord.NOT_A_SEPARATOR, + handler); + } else { + commitTyped(settingsValues, LastComposedWord.NOT_A_SEPARATOR); + } + } + final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); + if (Character.isLetterOrDigit(codePointBeforeCursor) + || settingsValues.isUsuallyFollowedBySpace(codePointBeforeCursor)) { + final boolean autoShiftHasBeenOverriden = keyboardSwitcher.getKeyboardShiftMode() != + getCurrentAutoCapsState(settingsValues); + mSpaceState = SpaceState.PHANTOM; + if (!autoShiftHasBeenOverriden) { + // When we change the space state, we need to update the shift state of the + // keyboard unless it has been overridden manually. This is happening for example + // after typing some letters and a period, then gesturing; the keyboard is not in + // caps mode yet, but since a gesture is starting, it should go in caps mode, + // unless the user explictly said it should not. + keyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(settingsValues), + getCurrentRecapitalizeState()); + } + } + mConnection.endBatchEdit(); + mWordComposer.setCapitalizedModeAtStartComposingTime( + getActualCapsMode(settingsValues, keyboardSwitcher.getKeyboardShiftMode())); + } + + /* The sequence number member is only used in onUpdateBatchInput. It is increased each time + * auto-commit happens. The reason we need this is, when auto-commit happens we trim the + * input pointers that are held in a singleton, and to know how much to trim we rely on the + * results of the suggestion process that is held in mSuggestedWords. + * However, the suggestion process is asynchronous, and sometimes we may enter the + * onUpdateBatchInput method twice without having recomputed suggestions yet, or having + * received new suggestions generated from not-yet-trimmed input pointers. In this case, the + * mIndexOfTouchPointOfSecondWords member will be out of date, and we must not use it lest we + * remove an unrelated number of pointers (possibly even more than are left in the input + * pointers, leading to a crash). + * To avoid that, we increase the sequence number each time we auto-commit and trim the + * input pointers, and we do not use any suggested words that have been generated with an + * earlier sequence number. + */ + private int mAutoCommitSequenceNumber = 1; + public void onUpdateBatchInput(final SettingsValues settingsValues, + final InputPointers batchPointers, + // TODO: remove these arguments + final KeyboardSwitcher keyboardSwitcher) { + if (settingsValues.mPhraseGestureEnabled) { + final SuggestedWordInfo candidate = mSuggestedWords.getAutoCommitCandidate(); + // If these suggested words have been generated with out of date input pointers, then + // we skip auto-commit (see comments above on the mSequenceNumber member). + if (null != candidate + && mSuggestedWords.mSequenceNumber >= mAutoCommitSequenceNumber) { + if (candidate.mSourceDict.shouldAutoCommit(candidate)) { + final String[] commitParts = candidate.mWord.split(Constants.WORD_SEPARATOR, 2); + batchPointers.shift(candidate.mIndexOfTouchPointOfSecondWord); + promotePhantomSpace(settingsValues); + mConnection.commitText(commitParts[0], 0); + mSpaceState = SpaceState.PHANTOM; + keyboardSwitcher.requestUpdatingShiftState( + getCurrentAutoCapsState(settingsValues), getCurrentRecapitalizeState()); + mWordComposer.setCapitalizedModeAtStartComposingTime(getActualCapsMode( + settingsValues, keyboardSwitcher.getKeyboardShiftMode())); + ++mAutoCommitSequenceNumber; + } + } + } + mInputLogicHandler.onUpdateBatchInput(batchPointers, mAutoCommitSequenceNumber); + } + + public void onEndBatchInput(final InputPointers batchPointers) { + mInputLogicHandler.updateTailBatchInput(batchPointers, mAutoCommitSequenceNumber); + ++mAutoCommitSequenceNumber; + } + + // TODO: remove this argument + public void onCancelBatchInput(final LatinIME.UIHandler handler) { + mInputLogicHandler.onCancelBatchInput(); + handler.showGesturePreviewAndSuggestionStrip( + SuggestedWords.EMPTY, true /* dismissGestureFloatingPreviewText */); + } + + // TODO: on the long term, this method should become private, but it will be difficult. + // Especially, how do we deal with InputMethodService.onDisplayCompletions? + public void setSuggestedWords(final SuggestedWords suggestedWords) { + if (SuggestedWords.EMPTY != suggestedWords) { + final String autoCorrection; + if (suggestedWords.mWillAutoCorrect) { + autoCorrection = suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION); + } else { + // We can't use suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD) + // because it may differ from mWordComposer.mTypedWord. + autoCorrection = suggestedWords.mTypedWord; + } + mWordComposer.setAutoCorrection(autoCorrection); + } + mSuggestedWords = suggestedWords; + final boolean newAutoCorrectionIndicator = suggestedWords.mWillAutoCorrect; + // Put a blue underline to a word in TextView which will be auto-corrected. + if (mIsAutoCorrectionIndicatorOn != newAutoCorrectionIndicator + && mWordComposer.isComposingWord()) { + mIsAutoCorrectionIndicatorOn = newAutoCorrectionIndicator; + final CharSequence textWithUnderline = + getTextWithUnderline(mWordComposer.getTypedWord()); + // TODO: when called from an updateSuggestionStrip() call that results from a posted + // message, this is called outside any batch edit. Potentially, this may result in some + // janky flickering of the screen, although the display speed makes it unlikely in + // the practice. + mConnection.setComposingText(textWithUnderline, 1); + } + } + + /** + * Handle inputting a code point to the editor. + * + * Non-special keys are those that generate a single code point. + * This includes all letters, digits, punctuation, separators, emoji. It excludes keys that + * manage keyboard-related stuff like shift, language switch, settings, layout switch, or + * any key that results in multiple code points like the ".com" key. + * + * @param inputTransaction The transaction in progress. + * @return whether this caused an auto-correction to happen. + */ + private boolean handleNonSpecialCharacter(final InputTransaction inputTransaction, + // TODO: remove this argument + final LatinIME.UIHandler handler) { + final int codePoint = inputTransaction.mEvent.mCodePoint; + mSpaceState = SpaceState.NONE; + final boolean didAutoCorrect; + if (inputTransaction.mSettingsValues.isWordSeparator(codePoint) + || Character.getType(codePoint) == Character.OTHER_SYMBOL) { + didAutoCorrect = handleSeparator(inputTransaction, + inputTransaction.mEvent.isSuggestionStripPress(), handler); + } else { + didAutoCorrect = false; + if (SpaceState.PHANTOM == inputTransaction.mSpaceState) { + if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { + // If we are in the middle of a recorrection, we need to commit the recorrection + // first so that we can insert the character at the current cursor position. + resetEntireInputState(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd(), true /* clearSuggestionStrip */); + } else { + commitTyped(inputTransaction.mSettingsValues, LastComposedWord.NOT_A_SEPARATOR); + } + } + handleNonSeparator(inputTransaction.mSettingsValues, inputTransaction); + } + return didAutoCorrect; + } + + /** + * Handle a non-separator. + * @param settingsValues The current settings values. + * @param inputTransaction The transaction in progress. + */ + private void handleNonSeparator(final SettingsValues settingsValues, + final InputTransaction inputTransaction) { + final int codePoint = inputTransaction.mEvent.mCodePoint; + // TODO: refactor this method to stop flipping isComposingWord around all the time, and + // make it shorter (possibly cut into several pieces). Also factor handleNonSpecialCharacter + // which has the same name as other handle* methods but is not the same. + boolean isComposingWord = mWordComposer.isComposingWord(); + + // TODO: remove isWordConnector() and use isUsuallyFollowedBySpace() instead. + // See onStartBatchInput() to see how to do it. + if (SpaceState.PHANTOM == inputTransaction.mSpaceState + && !settingsValues.isWordConnector(codePoint)) { + if (isComposingWord) { + // Sanity check + throw new RuntimeException("Should not be composing here"); + } + promotePhantomSpace(settingsValues); + } + + if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { + // If we are in the middle of a recorrection, we need to commit the recorrection + // first so that we can insert the character at the current cursor position. + resetEntireInputState(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd(), true /* clearSuggestionStrip */); + isComposingWord = false; + } + // We want to find out whether to start composing a new word with this character. If so, + // we need to reset the composing state and switch isComposingWord. The order of the + // tests is important for good performance. + // We only start composing if we're not already composing. + if (!isComposingWord + // We only start composing if this is a word code point. Essentially that means it's a + // a letter or a word connector. + && settingsValues.isWordCodePoint(codePoint) + // We never go into composing state if suggestions are not requested. + && settingsValues.isSuggestionsRequested() && + // In languages with spaces, we only start composing a word when we are not already + // touching a word. In languages without spaces, the above conditions are sufficient. + (!mConnection.isCursorTouchingWord(settingsValues.mSpacingAndPunctuations) + || !settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces)) { + // Reset entirely the composing state anyway, then start composing a new word unless + // the character is a word connector. The idea here is, word connectors are not + // separators and they should be treated as normal characters, except in the first + // position where they should not start composing a word. + isComposingWord = !settingsValues.mSpacingAndPunctuations.isWordConnector(codePoint); + // Here we don't need to reset the last composed word. It will be reset + // when we commit this one, if we ever do; if on the other hand we backspace + // it entirely and resume suggestions on the previous word, we'd like to still + // have touch coordinates for it. + resetComposingState(false /* alsoResetLastComposedWord */); + } + if (isComposingWord) { + mWordComposer.processEvent(inputTransaction.mEvent); + // If it's the first letter, make note of auto-caps state + if (mWordComposer.isSingleLetter()) { + mWordComposer.setCapitalizedModeAtStartComposingTime(inputTransaction.mShiftState); + } + mConnection.setComposingText(getTextWithUnderline( + mWordComposer.getTypedWord()), 1); + } else { + final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead( + inputTransaction, inputTransaction.mEvent.isSuggestionStripPress()); + + if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) { + mSpaceState = SpaceState.WEAK; + } else { + sendKeyCodePoint(settingsValues, codePoint); + } + // In case the "add to dictionary" hint was still displayed. + mSuggestionStripViewAccessor.dismissAddToDictionaryHint(); + } + inputTransaction.setRequiresUpdateSuggestions(); + } + + /** + * Handle input of a separator code point. + * @param inputTransaction The transaction in progress. + * @param isFromSuggestionStrip whether this code point comes from the suggestion strip. + * @return whether this caused an auto-correction to happen. + */ + private boolean handleSeparator(final InputTransaction inputTransaction, + final boolean isFromSuggestionStrip, + // TODO: remove this argument + final LatinIME.UIHandler handler) { + final int codePoint = inputTransaction.mEvent.mCodePoint; + final SettingsValues settingsValues = inputTransaction.mSettingsValues; + boolean didAutoCorrect = false; + final boolean wasComposingWord = mWordComposer.isComposingWord(); + // We avoid sending spaces in languages without spaces if we were composing. + final boolean shouldAvoidSendingCode = Constants.CODE_SPACE == codePoint + && !settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces + && wasComposingWord; + if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { + // If we are in the middle of a recorrection, we need to commit the recorrection + // first so that we can insert the separator at the current cursor position. + resetEntireInputState(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd(), true /* clearSuggestionStrip */); + } + // isComposingWord() may have changed since we stored wasComposing + if (mWordComposer.isComposingWord()) { + if (settingsValues.mAutoCorrectionEnabled) { + final String separator = shouldAvoidSendingCode ? LastComposedWord.NOT_A_SEPARATOR + : StringUtils.newSingleCodePointString(codePoint); + commitCurrentAutoCorrection(settingsValues, separator, handler); + didAutoCorrect = true; + } else { + commitTyped(settingsValues, + StringUtils.newSingleCodePointString(codePoint)); + } + } + + final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead( + inputTransaction, isFromSuggestionStrip); + + final boolean isInsideDoubleQuoteOrAfterDigit = Constants.CODE_DOUBLE_QUOTE == codePoint + && mConnection.isInsideDoubleQuoteOrAfterDigit(); + + final boolean needsPrecedingSpace; + if (SpaceState.PHANTOM != inputTransaction.mSpaceState) { + needsPrecedingSpace = false; + } else if (Constants.CODE_DOUBLE_QUOTE == codePoint) { + // Double quotes behave like they are usually preceded by space iff we are + // not inside a double quote or after a digit. + needsPrecedingSpace = !isInsideDoubleQuoteOrAfterDigit; + } else if (settingsValues.mSpacingAndPunctuations.isClusteringSymbol(codePoint) + && settingsValues.mSpacingAndPunctuations.isClusteringSymbol( + mConnection.getCodePointBeforeCursor())) { + needsPrecedingSpace = false; + } else { + needsPrecedingSpace = settingsValues.isUsuallyPrecededBySpace(codePoint); + } + + if (needsPrecedingSpace) { + promotePhantomSpace(settingsValues); + } + + if (tryPerformDoubleSpacePeriod(inputTransaction)) { + mSpaceState = SpaceState.DOUBLE; + inputTransaction.setRequiresUpdateSuggestions(); + } else if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) { + mSpaceState = SpaceState.SWAP_PUNCTUATION; + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + } else if (Constants.CODE_SPACE == codePoint) { + if (!mSuggestedWords.isPunctuationSuggestions()) { + mSpaceState = SpaceState.WEAK; + } + + startDoubleSpacePeriodCountdown(inputTransaction); + if (wasComposingWord || mSuggestedWords.isEmpty()) { + inputTransaction.setRequiresUpdateSuggestions(); + } + + if (!shouldAvoidSendingCode) { + sendKeyCodePoint(settingsValues, codePoint); + } + } else { + if ((SpaceState.PHANTOM == inputTransaction.mSpaceState + && settingsValues.isUsuallyFollowedBySpace(codePoint)) + || (Constants.CODE_DOUBLE_QUOTE == codePoint + && isInsideDoubleQuoteOrAfterDigit)) { + // If we are in phantom space state, and the user presses a separator, we want to + // stay in phantom space state so that the next keypress has a chance to add the + // space. For example, if I type "Good dat", pick "day" from the suggestion strip + // then insert a comma and go on to typing the next word, I want the space to be + // inserted automatically before the next word, the same way it is when I don't + // input the comma. A double quote behaves like it's usually followed by space if + // we're inside a double quote. + // The case is a little different if the separator is a space stripper. Such a + // separator does not normally need a space on the right (that's the difference + // between swappers and strippers), so we should not stay in phantom space state if + // the separator is a stripper. Hence the additional test above. + mSpaceState = SpaceState.PHANTOM; + } + + sendKeyCodePoint(settingsValues, codePoint); + + // Set punctuation right away. onUpdateSelection will fire but tests whether it is + // already displayed or not, so it's okay. + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + } + + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + return didAutoCorrect; + } + + /** + * Handle a press on the backspace key. + * @param inputTransaction The transaction in progress. + */ + private void handleBackspace(final InputTransaction inputTransaction, + // TODO: remove this argument, put it into settingsValues + final int currentKeyboardScriptId) { + mSpaceState = SpaceState.NONE; + mDeleteCount++; + + // In many cases after backspace, we need to update the shift state. Normally we need + // to do this right away to avoid the shift state being out of date in case the user types + // backspace then some other character very fast. However, in the case of backspace key + // repeat, this can lead to flashiness when the cursor flies over positions where the + // shift state should be updated, so if this is a key repeat, we update after a small delay. + // Then again, even in the case of a key repeat, if the cursor is at start of text, it + // can't go any further back, so we can update right away even if it's a key repeat. + final int shiftUpdateKind = + inputTransaction.mEvent.isKeyRepeat() && mConnection.getExpectedSelectionStart() > 0 + ? InputTransaction.SHIFT_UPDATE_LATER : InputTransaction.SHIFT_UPDATE_NOW; + inputTransaction.requireShiftUpdate(shiftUpdateKind); + + if (mWordComposer.isCursorFrontOrMiddleOfComposingWord()) { + // If we are in the middle of a recorrection, we need to commit the recorrection + // first so that we can remove the character at the current cursor position. + resetEntireInputState(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd(), true /* clearSuggestionStrip */); + // When we exit this if-clause, mWordComposer.isComposingWord() will return false. + } + if (mWordComposer.isComposingWord()) { + if (mWordComposer.isBatchMode()) { + final String rejectedSuggestion = mWordComposer.getTypedWord(); + mWordComposer.reset(); + mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion); + if (!TextUtils.isEmpty(rejectedSuggestion)) { + mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion); + } + } else { + mWordComposer.processEvent(inputTransaction.mEvent); + } + if (mWordComposer.isComposingWord()) { + mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1); + } else { + mConnection.commitText("", 1); + } + inputTransaction.setRequiresUpdateSuggestions(); + } else { + if (mLastComposedWord.canRevertCommit()) { + revertCommit(inputTransaction); + return; + } + if (mEnteredText != null && mConnection.sameAsTextBeforeCursor(mEnteredText)) { + // Cancel multi-character input: remove the text we just entered. + // This is triggered on backspace after a key that inputs multiple characters, + // like the smiley key or the .com key. + mConnection.deleteSurroundingText(mEnteredText.length(), 0); + mEnteredText = null; + // If we have mEnteredText, then we know that mHasUncommittedTypedChars == false. + // In addition we know that spaceState is false, and that we should not be + // reverting any autocorrect at this point. So we can safely return. + return; + } + if (SpaceState.DOUBLE == inputTransaction.mSpaceState) { + cancelDoubleSpacePeriodCountdown(); + if (mConnection.revertDoubleSpacePeriod()) { + // No need to reset mSpaceState, it has already be done (that's why we + // receive it as a parameter) + inputTransaction.setRequiresUpdateSuggestions(); + mWordComposer.setCapitalizedModeAtStartComposingTime( + WordComposer.CAPS_MODE_OFF); + return; + } + } else if (SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) { + if (mConnection.revertSwapPunctuation()) { + // Likewise + return; + } + } + + // No cancelling of commit/double space/swap: we have a regular backspace. + // We should backspace one char and restart suggestion if at the end of a word. + if (mConnection.hasSelection()) { + // If there is a selection, remove it. + final int numCharsDeleted = mConnection.getExpectedSelectionEnd() + - mConnection.getExpectedSelectionStart(); + mConnection.setSelection(mConnection.getExpectedSelectionEnd(), + mConnection.getExpectedSelectionEnd()); + mConnection.deleteSurroundingText(numCharsDeleted, 0); + } else { + // There is no selection, just delete one character. + if (Constants.NOT_A_CURSOR_POSITION == mConnection.getExpectedSelectionEnd()) { + // This should never happen. + Log.e(TAG, "Backspace when we don't know the selection position"); + } + if (inputTransaction.mSettingsValues.isBeforeJellyBean() || + inputTransaction.mSettingsValues.mInputAttributes.isTypeNull()) { + // There are two possible reasons to send a key event: either the field has + // type TYPE_NULL, in which case the keyboard should send events, or we are + // running in backward compatibility mode. Before Jelly bean, the keyboard + // would simulate a hardware keyboard event on pressing enter or delete. This + // is bad for many reasons (there are race conditions with commits) but some + // applications are relying on this behavior so we continue to support it for + // older apps, so we retain this behavior if the app has target SDK < JellyBean. + sendDownUpKeyEvent(KeyEvent.KEYCODE_DEL); + if (mDeleteCount > Constants.DELETE_ACCELERATE_AT) { + sendDownUpKeyEvent(KeyEvent.KEYCODE_DEL); + } + } else { + final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); + if (codePointBeforeCursor == Constants.NOT_A_CODE) { + // HACK for backward compatibility with broken apps that haven't realized + // yet that hardware keyboards are not the only way of inputting text. + // Nothing to delete before the cursor. We should not do anything, but many + // broken apps expect something to happen in this case so that they can + // catch it and have their broken interface react. If you need the keyboard + // to do this, you're doing it wrong -- please fix your app. + mConnection.deleteSurroundingText(1, 0); + return; + } + final int lengthToDelete = + Character.isSupplementaryCodePoint(codePointBeforeCursor) ? 2 : 1; + mConnection.deleteSurroundingText(lengthToDelete, 0); + if (mDeleteCount > Constants.DELETE_ACCELERATE_AT) { + final int codePointBeforeCursorToDeleteAgain = + mConnection.getCodePointBeforeCursor(); + if (codePointBeforeCursorToDeleteAgain != Constants.NOT_A_CODE) { + final int lengthToDeleteAgain = Character.isSupplementaryCodePoint( + codePointBeforeCursorToDeleteAgain) ? 2 : 1; + mConnection.deleteSurroundingText(lengthToDeleteAgain, 0); + } + } + } + } + if (inputTransaction.mSettingsValues + .isCurrentOrientationAllowingSuggestionsPerUserSettings() + && inputTransaction.mSettingsValues.mSpacingAndPunctuations + .mCurrentLanguageHasSpaces + && !mConnection.isCursorFollowedByWordCharacter( + inputTransaction.mSettingsValues.mSpacingAndPunctuations)) { + restartSuggestionsOnWordTouchedByCursor(inputTransaction.mSettingsValues, + true /* shouldIncludeResumedWordInSuggestions */, currentKeyboardScriptId); + } + } + } + + /** + * Handle a press on the language switch key (the "globe key") + */ + private void handleLanguageSwitchKey() { + mLatinIME.switchToNextSubtype(); + } + + /** + * Swap a space with a space-swapping punctuation sign. + * + * This method will check that there are two characters before the cursor and that the first + * one is a space before it does the actual swapping. + * @param inputTransaction The transaction in progress. + * @return true if the swap has been performed, false if it was prevented by preliminary checks. + */ + private boolean trySwapSwapperAndSpace(final InputTransaction inputTransaction) { + final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); + if (Constants.CODE_SPACE != codePointBeforeCursor) { + return false; + } + mConnection.deleteSurroundingText(1, 0); + final String text = inputTransaction.mEvent.getTextToCommit() + " "; + mConnection.commitText(text, 1); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + return true; + } + + /* + * Strip a trailing space if necessary and returns whether it's a swap weak space situation. + * @param inputTransaction The transaction in progress. + * @param isFromSuggestionStrip Whether this code point is coming from the suggestion strip. + * @return whether we should swap the space instead of removing it. + */ + private boolean tryStripSpaceAndReturnWhetherShouldSwapInstead( + final InputTransaction inputTransaction, final boolean isFromSuggestionStrip) { + final int codePoint = inputTransaction.mEvent.mCodePoint; + if (Constants.CODE_ENTER == codePoint && + SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) { + mConnection.removeTrailingSpace(); + return false; + } + if ((SpaceState.WEAK == inputTransaction.mSpaceState + || SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) + && isFromSuggestionStrip) { + if (inputTransaction.mSettingsValues.isUsuallyPrecededBySpace(codePoint)) { + return false; + } + if (inputTransaction.mSettingsValues.isUsuallyFollowedBySpace(codePoint)) { + return true; + } + mConnection.removeTrailingSpace(); + } + return false; + } + + public void startDoubleSpacePeriodCountdown(final InputTransaction inputTransaction) { + mDoubleSpacePeriodCountdownStart = inputTransaction.mTimestamp; + } + + public void cancelDoubleSpacePeriodCountdown() { + mDoubleSpacePeriodCountdownStart = 0; + } + + public boolean isDoubleSpacePeriodCountdownActive(final InputTransaction inputTransaction) { + return inputTransaction.mTimestamp - mDoubleSpacePeriodCountdownStart + < inputTransaction.mSettingsValues.mDoubleSpacePeriodTimeout; + } + + /** + * Apply the double-space-to-period transformation if applicable. + * + * The double-space-to-period transformation means that we replace two spaces with a + * period-space sequence of characters. This typically happens when the user presses space + * twice in a row quickly. + * This method will check that the double-space-to-period is active in settings, that the + * two spaces have been input close enough together, that the typed character is a space + * and that the previous character allows for the transformation to take place. If all of + * these conditions are fulfilled, this method applies the transformation and returns true. + * Otherwise, it does nothing and returns false. + * + * @param inputTransaction The transaction in progress. + * @return true if we applied the double-space-to-period transformation, false otherwise. + */ + private boolean tryPerformDoubleSpacePeriod(final InputTransaction inputTransaction) { + // Check the setting, the typed character and the countdown. If any of the conditions is + // not fulfilled, return false. + if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod + || Constants.CODE_SPACE != inputTransaction.mEvent.mCodePoint + || !isDoubleSpacePeriodCountdownActive(inputTransaction)) { + return false; + } + // We only do this when we see one space and an accepted code point before the cursor. + // The code point may be a surrogate pair but the space may not, so we need 3 chars. + final CharSequence lastTwo = mConnection.getTextBeforeCursor(3, 0); + if (null == lastTwo) return false; + final int length = lastTwo.length(); + if (length < 2) return false; + if (lastTwo.charAt(length - 1) != Constants.CODE_SPACE) return false; + // We know there is a space in pos -1, and we have at least two chars. If we have only two + // chars, isSurrogatePairs can't return true as charAt(1) is a space, so this is fine. + final int firstCodePoint = + Character.isSurrogatePair(lastTwo.charAt(0), lastTwo.charAt(1)) ? + Character.codePointAt(lastTwo, length - 3) : lastTwo.charAt(length - 2); + if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) { + cancelDoubleSpacePeriodCountdown(); + mConnection.deleteSurroundingText(1, 0); + final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations + .mSentenceSeparatorAndSpace; + mConnection.commitText(textToInsert, 1); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + inputTransaction.setRequiresUpdateSuggestions(); + return true; + } + return false; + } + + /** + * Returns whether this code point can be followed by the double-space-to-period transformation. + * + * See #maybeDoubleSpaceToPeriod for details. + * Generally, most word characters can be followed by the double-space-to-period transformation, + * while most punctuation can't. Some punctuation however does allow for this to take place + * after them, like the closing parenthesis for example. + * + * @param codePoint the code point after which we may want to apply the transformation + * @return whether it's fine to apply the transformation after this code point. + */ + private static boolean canBeFollowedByDoubleSpacePeriod(final int codePoint) { + // TODO: This should probably be a blacklist rather than a whitelist. + // TODO: This should probably be language-dependant... + return Character.isLetterOrDigit(codePoint) + || codePoint == Constants.CODE_SINGLE_QUOTE + || codePoint == Constants.CODE_DOUBLE_QUOTE + || codePoint == Constants.CODE_CLOSING_PARENTHESIS + || codePoint == Constants.CODE_CLOSING_SQUARE_BRACKET + || codePoint == Constants.CODE_CLOSING_CURLY_BRACKET + || codePoint == Constants.CODE_CLOSING_ANGLE_BRACKET + || codePoint == Constants.CODE_PLUS + || codePoint == Constants.CODE_PERCENT + || Character.getType(codePoint) == Character.OTHER_SYMBOL; + } + + /** + * Performs a recapitalization event. + * @param settingsValues The current settings values. + */ + private void performRecapitalization(final SettingsValues settingsValues) { + if (!mConnection.hasSelection() || !mRecapitalizeStatus.mIsEnabled()) { + return; // No selection or recapitalize is disabled for now + } + final int selectionStart = mConnection.getExpectedSelectionStart(); + final int selectionEnd = mConnection.getExpectedSelectionEnd(); + final int numCharsSelected = selectionEnd - selectionStart; + if (numCharsSelected > Constants.MAX_CHARACTERS_FOR_RECAPITALIZATION) { + // We bail out if we have too many characters for performance reasons. We don't want + // to suck possibly multiple-megabyte data. + return; + } + // If we have a recapitalize in progress, use it; otherwise, start a new one. + if (!mRecapitalizeStatus.isStarted() + || !mRecapitalizeStatus.isSetAt(selectionStart, selectionEnd)) { + final CharSequence selectedText = + mConnection.getSelectedText(0 /* flags, 0 for no styles */); + if (TextUtils.isEmpty(selectedText)) return; // Race condition with the input connection + mRecapitalizeStatus.start(selectionStart, selectionEnd, selectedText.toString(), + settingsValues.mLocale, + settingsValues.mSpacingAndPunctuations.mSortedWordSeparators); + // We trim leading and trailing whitespace. + mRecapitalizeStatus.trim(); + } + mConnection.finishComposingText(); + mRecapitalizeStatus.rotate(); + mConnection.setSelection(selectionEnd, selectionEnd); + mConnection.deleteSurroundingText(numCharsSelected, 0); + mConnection.commitText(mRecapitalizeStatus.getRecapitalizedString(), 0); + mConnection.setSelection(mRecapitalizeStatus.getNewCursorStart(), + mRecapitalizeStatus.getNewCursorEnd()); + } + + private void performAdditionToUserHistoryDictionary(final SettingsValues settingsValues, + final String suggestion, final PrevWordsInfo prevWordsInfo) { + // If correction is not enabled, we don't add words to the user history dictionary. + // That's to avoid unintended additions in some sensitive fields, or fields that + // expect to receive non-words. + if (!settingsValues.mAutoCorrectionEnabled) return; + + if (TextUtils.isEmpty(suggestion)) return; + final boolean wasAutoCapitalized = + mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps(); + final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds( + System.currentTimeMillis()); + mDictionaryFacilitator.addToUserHistory(suggestion, wasAutoCapitalized, + prevWordsInfo, timeStampInSeconds, settingsValues.mBlockPotentiallyOffensive); + } + + public void performUpdateSuggestionStripSync(final SettingsValues settingsValues) { + // Check if we have a suggestion engine attached. + if (!settingsValues.isSuggestionsRequested()) { + if (mWordComposer.isComposingWord()) { + Log.w(TAG, "Called updateSuggestionsOrPredictions but suggestions were not " + + "requested!"); + } + // Clear the suggestions strip. + mSuggestionStripViewAccessor.showSuggestionStrip(SuggestedWords.EMPTY); + return; + } + + if (!mWordComposer.isComposingWord() && !settingsValues.mBigramPredictionEnabled) { + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + return; + } + + final AsyncResultHolder<SuggestedWords> holder = new AsyncResultHolder<>(); + mInputLogicHandler.getSuggestedWords(Suggest.SESSION_TYPING, + SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() { + @Override + public void onGetSuggestedWords(final SuggestedWords suggestedWords) { + final String typedWord = mWordComposer.getTypedWord(); + // Show new suggestions if we have at least one. Otherwise keep the old + // suggestions with the new typed word. Exception: if the length of the + // typed word is <= 1 (after a deletion typically) we clear old suggestions. + if (suggestedWords.size() > 1 || typedWord.length() <= 1) { + holder.set(suggestedWords); + } else { + holder.set(retrieveOlderSuggestions(typedWord, mSuggestedWords)); + } + } + } + ); + + // This line may cause the current thread to wait. + final SuggestedWords suggestedWords = holder.get(null, + Constants.GET_SUGGESTED_WORDS_TIMEOUT); + if (suggestedWords != null) { + mSuggestionStripViewAccessor.showSuggestionStrip(suggestedWords); + } + } + + /** + * Check if the cursor is touching a word. If so, restart suggestions on this word, else + * do nothing. + * + * @param settingsValues the current values of the settings. + * @param shouldIncludeResumedWordInSuggestions whether to include the word on which we resume + * suggestions in the suggestion list. + */ + // TODO: make this private. + public void restartSuggestionsOnWordTouchedByCursor(final SettingsValues settingsValues, + final boolean shouldIncludeResumedWordInSuggestions, + // TODO: remove this argument, put it into settingsValues + final int currentKeyboardScriptId) { + // HACK: We may want to special-case some apps that exhibit bad behavior in case of + // recorrection. This is a temporary, stopgap measure that will be removed later. + // TODO: remove this. + if (settingsValues.isBrokenByRecorrection() + // Recorrection is not supported in languages without spaces because we don't know + // how to segment them yet. + || !settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces + // If no suggestions are requested, don't try restarting suggestions. + || !settingsValues.isSuggestionsRequested() + // If we are currently in a batch input, we must not resume suggestions, or the result + // of the batch input will replace the new composition. This may happen in the corner case + // that the app moves the cursor on its own accord during a batch input. + || mInputLogicHandler.isInBatchInput() + // If the cursor is not touching a word, or if there is a selection, return right away. + || mConnection.hasSelection() + // If we don't know the cursor location, return. + || mConnection.getExpectedSelectionStart() < 0) { + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + return; + } + final int expectedCursorPosition = mConnection.getExpectedSelectionStart(); + if (!mConnection.isCursorTouchingWord(settingsValues.mSpacingAndPunctuations)) { + // Show predictions. + mWordComposer.setCapitalizedModeAtStartComposingTime(WordComposer.CAPS_MODE_OFF); + mLatinIME.mHandler.postUpdateSuggestionStrip(); + return; + } + final TextRange range = mConnection.getWordRangeAtCursor( + settingsValues.mSpacingAndPunctuations.mSortedWordSeparators, + currentKeyboardScriptId); + if (null == range) return; // Happens if we don't have an input connection at all + if (range.length() <= 0) { + // Race condition, or touching a word in a non-supported script. + mLatinIME.setNeutralSuggestionStrip(); + return; + } + // If for some strange reason (editor bug or so) we measure the text before the cursor as + // longer than what the entire text is supposed to be, the safe thing to do is bail out. + if (range.mHasUrlSpans) return; // If there are links, we don't resume suggestions. Making + // edits to a linkified text through batch commands would ruin the URL spans, and unless + // we take very complicated steps to preserve the whole link, we can't do things right so + // we just do not resume because it's safer. + final int numberOfCharsInWordBeforeCursor = range.getNumberOfCharsInWordBeforeCursor(); + if (numberOfCharsInWordBeforeCursor > expectedCursorPosition) return; + final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>(); + final String typedWord = range.mWord.toString(); + if (shouldIncludeResumedWordInSuggestions) { + suggestions.add(new SuggestedWordInfo(typedWord, + SuggestedWords.MAX_SUGGESTIONS + 1, + SuggestedWordInfo.KIND_TYPED, Dictionary.DICTIONARY_USER_TYPED, + SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, + SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); + } + if (!isResumableWord(settingsValues, typedWord)) { + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + return; + } + int i = 0; + for (final SuggestionSpan span : range.getSuggestionSpansAtWord()) { + for (final String s : span.getSuggestions()) { + ++i; + if (!TextUtils.equals(s, typedWord)) { + suggestions.add(new SuggestedWordInfo(s, + SuggestedWords.MAX_SUGGESTIONS - i, + SuggestedWordInfo.KIND_RESUMED, Dictionary.DICTIONARY_RESUMED, + SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, + SuggestedWordInfo.NOT_A_CONFIDENCE + /* autoCommitFirstWordConfidence */)); + } + } + } + final int[] codePoints = StringUtils.toCodePointArray(typedWord); + // We want the previous word for suggestion. If we have chars in the word + // before the cursor, then we want the word before that, hence 2; otherwise, + // we want the word immediately before the cursor, hence 1. + final PrevWordsInfo prevWordsInfo = getPrevWordsInfoFromNthPreviousWordForSuggestion( + settingsValues.mSpacingAndPunctuations, + 0 == numberOfCharsInWordBeforeCursor ? 1 : 2); + mWordComposer.setComposingWord(codePoints, + mLatinIME.getCoordinatesForCurrentKeyboard(codePoints)); + mWordComposer.setCursorPositionWithinWord( + typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor)); + mConnection.setComposingRegion(expectedCursorPosition - numberOfCharsInWordBeforeCursor, + expectedCursorPosition + range.getNumberOfCharsInWordAfterCursor()); + if (suggestions.size() <= (shouldIncludeResumedWordInSuggestions ? 1 : 0)) { + // If there weren't any suggestion spans on this word, suggestions#size() will be 1 + // if shouldIncludeResumedWordInSuggestions is true, 0 otherwise. In this case, we + // have no useful suggestions, so we will try to compute some for it instead. + mInputLogicHandler.getSuggestedWords(Suggest.SESSION_TYPING, + SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() { + @Override + public void onGetSuggestedWords( + final SuggestedWords suggestedWordsIncludingTypedWord) { + final SuggestedWords suggestedWords; + if (suggestedWordsIncludingTypedWord.size() > 1 + && !shouldIncludeResumedWordInSuggestions) { + // We were able to compute new suggestions for this word. + // Remove the typed word, since we don't want to display it in this + // case. The #getSuggestedWordsExcludingTypedWord() method sets + // willAutoCorrect to false. + suggestedWords = suggestedWordsIncludingTypedWord + .getSuggestedWordsExcludingTypedWord(); + } else { + // No saved suggestions, and we were unable to compute any good one + // either. Rather than displaying an empty suggestion strip, we'll + // display the original word alone in the middle. + // Since there is only one word, willAutoCorrect is false. + suggestedWords = suggestedWordsIncludingTypedWord; + } + mIsAutoCorrectionIndicatorOn = false; + mLatinIME.mHandler.showSuggestionStrip(suggestedWords); + }}); + } else { + // We found suggestion spans in the word. We'll create the SuggestedWords out of + // them, and make willAutoCorrect false. We make typedWordValid false, because the + // color of the word in the suggestion strip changes according to this parameter, + // and false gives the correct color. + final SuggestedWords suggestedWords = new SuggestedWords(suggestions, + null /* rawSuggestions */, typedWord, + false /* typedWordValid */, false /* willAutoCorrect */, + false /* isObsoleteSuggestions */, false /* isPrediction */, + SuggestedWords.NOT_A_SEQUENCE_NUMBER); + mIsAutoCorrectionIndicatorOn = false; + mLatinIME.mHandler.showSuggestionStrip(suggestedWords); + } + } + + /** + * Reverts a previous commit with auto-correction. + * + * This is triggered upon pressing backspace just after a commit with auto-correction. + * + * @param inputTransaction The transaction in progress. + */ + private void revertCommit(final InputTransaction inputTransaction) { + final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord; + final CharSequence committedWord = mLastComposedWord.mCommittedWord; + final String committedWordString = committedWord.toString(); + final int cancelLength = committedWord.length(); + // We want java chars, not codepoints for the following. + final int separatorLength = mLastComposedWord.mSeparatorString.length(); + // TODO: should we check our saved separator against the actual contents of the text view? + final int deleteLength = cancelLength + separatorLength; + if (LatinImeLogger.sDBG) { + if (mWordComposer.isComposingWord()) { + throw new RuntimeException("revertCommit, but we are composing a word"); + } + final CharSequence wordBeforeCursor = + mConnection.getTextBeforeCursor(deleteLength, 0).subSequence(0, cancelLength); + if (!TextUtils.equals(committedWord, wordBeforeCursor)) { + throw new RuntimeException("revertCommit check failed: we thought we were " + + "reverting \"" + committedWord + + "\", but before the cursor we found \"" + wordBeforeCursor + "\""); + } + } + mConnection.deleteSurroundingText(deleteLength, 0); + if (!TextUtils.isEmpty(committedWord)) { + mDictionaryFacilitator.removeWordFromPersonalizedDicts(committedWordString); + } + final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; + final SpannableString textToCommit = new SpannableString(stringToCommit); + if (committedWord instanceof SpannableString) { + final SpannableString committedWordWithSuggestionSpans = (SpannableString)committedWord; + final Object[] spans = committedWordWithSuggestionSpans.getSpans(0, + committedWord.length(), Object.class); + final int lastCharIndex = textToCommit.length() - 1; + // We will collect all suggestions in the following array. + final ArrayList<String> suggestions = new ArrayList<>(); + // First, add the committed word to the list of suggestions. + suggestions.add(committedWordString); + for (final Object span : spans) { + // If this is a suggestion span, we check that the locale is the right one, and + // that the word is not the committed word. That should mostly be the case. + // Given this, we add it to the list of suggestions, otherwise we discard it. + if (span instanceof SuggestionSpan) { + final SuggestionSpan suggestionSpan = (SuggestionSpan)span; + if (!suggestionSpan.getLocale().equals( + inputTransaction.mSettingsValues.mLocale.toString())) { + continue; + } + for (final String suggestion : suggestionSpan.getSuggestions()) { + if (!suggestion.equals(committedWordString)) { + suggestions.add(suggestion); + } + } + } else { + // If this is not a suggestion span, we just add it as is. + textToCommit.setSpan(span, 0 /* start */, lastCharIndex /* end */, + committedWordWithSuggestionSpans.getSpanFlags(span)); + } + } + // Add the suggestion list to the list of suggestions. + textToCommit.setSpan(new SuggestionSpan(inputTransaction.mSettingsValues.mLocale, + suggestions.toArray(new String[suggestions.size()]), 0 /* flags */), + 0 /* start */, lastCharIndex /* end */, 0 /* flags */); + } + if (inputTransaction.mSettingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces) { + // For languages with spaces, we revert to the typed string, but the cursor is still + // after the separator so we don't resume suggestions. If the user wants to correct + // the word, they have to press backspace again. + mConnection.commitText(textToCommit, 1); + } else { + // For languages without spaces, we revert the typed string but the cursor is flush + // with the typed word, so we need to resume suggestions right away. + final int[] codePoints = StringUtils.toCodePointArray(stringToCommit); + mWordComposer.setComposingWord(codePoints, + mLatinIME.getCoordinatesForCurrentKeyboard(codePoints)); + mConnection.setComposingText(textToCommit, 1); + } + // Don't restart suggestion yet. We'll restart if the user deletes the separator. + mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; + // We have a separator between the word and the cursor: we should show predictions. + inputTransaction.setRequiresUpdateSuggestions(); + } + + /** + * Factor in auto-caps and manual caps and compute the current caps mode. + * @param settingsValues the current settings values. + * @param keyboardShiftMode the current shift mode of the keyboard. See + * KeyboardSwitcher#getKeyboardShiftMode() for possible values. + * @return the actual caps mode the keyboard is in right now. + */ + private int getActualCapsMode(final SettingsValues settingsValues, + final int keyboardShiftMode) { + if (keyboardShiftMode != WordComposer.CAPS_MODE_AUTO_SHIFTED) { + return keyboardShiftMode; + } + final int auto = getCurrentAutoCapsState(settingsValues); + if (0 != (auto & TextUtils.CAP_MODE_CHARACTERS)) { + return WordComposer.CAPS_MODE_AUTO_SHIFT_LOCKED; + } + if (0 != auto) { + return WordComposer.CAPS_MODE_AUTO_SHIFTED; + } + return WordComposer.CAPS_MODE_OFF; + } + + /** + * Gets the current auto-caps state, factoring in the space state. + * + * This method tries its best to do this in the most efficient possible manner. It avoids + * getting text from the editor if possible at all. + * This is called from the KeyboardSwitcher (through a trampoline in LatinIME) because it + * needs to know auto caps state to display the right layout. + * + * @param settingsValues the relevant settings values + * @return a caps mode from TextUtils.CAP_MODE_* or Constants.TextUtils.CAP_MODE_OFF. + */ + public int getCurrentAutoCapsState(final SettingsValues settingsValues) { + if (!settingsValues.mAutoCap) return Constants.TextUtils.CAP_MODE_OFF; + + final EditorInfo ei = getCurrentInputEditorInfo(); + if (ei == null) return Constants.TextUtils.CAP_MODE_OFF; + final int inputType = ei.inputType; + // Warning: this depends on mSpaceState, which may not be the most current value. If + // mSpaceState gets updated later, whoever called this may need to be told about it. + return mConnection.getCursorCapsMode(inputType, settingsValues.mSpacingAndPunctuations, + SpaceState.PHANTOM == mSpaceState); + } + + public int getCurrentRecapitalizeState() { + if (!mRecapitalizeStatus.isStarted() + || !mRecapitalizeStatus.isSetAt(mConnection.getExpectedSelectionStart(), + mConnection.getExpectedSelectionEnd())) { + // Not recapitalizing at the moment + return RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; + } + return mRecapitalizeStatus.getCurrentMode(); + } + + /** + * @return the editor info for the current editor + */ + private EditorInfo getCurrentInputEditorInfo() { + return mLatinIME.getCurrentInputEditorInfo(); + } + + /** + * Get information fo previous words from the nth previous word before the cursor as context + * for the suggestion process. + * @param spacingAndPunctuations the current spacing and punctuations settings. + * @param nthPreviousWord reverse index of the word to get (1-indexed) + * @return the information of previous words + */ + // TODO: Make this private + public PrevWordsInfo getPrevWordsInfoFromNthPreviousWordForSuggestion( + final SpacingAndPunctuations spacingAndPunctuations, final int nthPreviousWord) { + if (spacingAndPunctuations.mCurrentLanguageHasSpaces) { + // If we are typing in a language with spaces we can just look up the previous + // word information from textview. + return mConnection.getPrevWordsInfoFromNthPreviousWord( + spacingAndPunctuations, nthPreviousWord); + } else { + return LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ? + PrevWordsInfo.BEGINNING_OF_SENTENCE : + new PrevWordsInfo(new PrevWordsInfo.WordInfo( + mLastComposedWord.mCommittedWord.toString())); + } + } + + /** + * Tests the passed word for resumability. + * + * We can resume suggestions on words whose first code point is a word code point (with some + * nuances: check the code for details). + * + * @param settings the current values of the settings. + * @param word the word to evaluate. + * @return whether it's fine to resume suggestions on this word. + */ + private static boolean isResumableWord(final SettingsValues settings, final String word) { + final int firstCodePoint = word.codePointAt(0); + return settings.isWordCodePoint(firstCodePoint) + && Constants.CODE_SINGLE_QUOTE != firstCodePoint + && Constants.CODE_DASH != firstCodePoint; + } + + /** + * @param actionId the action to perform + */ + private void performEditorAction(final int actionId) { + mConnection.performEditorAction(actionId); + } + + /** + * Perform the processing specific to inputting TLDs. + * + * Some keys input a TLD (specifically, the ".com" key) and this warrants some specific + * processing. First, if this is a TLD, we ignore PHANTOM spaces -- this is done by type + * of character in onCodeInput, but since this gets inputted as a whole string we need to + * do it here specifically. Then, if the last character before the cursor is a period, then + * we cut the dot at the start of ".com". This is because humans tend to type "www.google." + * and then press the ".com" key and instinctively don't expect to get "www.google..com". + * + * @param text the raw text supplied to onTextInput + * @return the text to actually send to the editor + */ + private String performSpecificTldProcessingOnTextInput(final String text) { + if (text.length() <= 1 || text.charAt(0) != Constants.CODE_PERIOD + || !Character.isLetter(text.charAt(1))) { + // Not a tld: do nothing. + return text; + } + // We have a TLD (or something that looks like this): make sure we don't add + // a space even if currently in phantom mode. + mSpaceState = SpaceState.NONE; + final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor(); + // If no code point, #getCodePointBeforeCursor returns NOT_A_CODE_POINT. + if (Constants.CODE_PERIOD == codePointBeforeCursor) { + return text.substring(1); + } else { + return text; + } + } + + /** + * Handle a press on the settings key. + */ + private void onSettingsKeyPressed() { + mLatinIME.displaySettingsDialog(); + } + + /** + * Resets the whole input state to the starting state. + * + * This will clear the composing word, reset the last composed word, clear the suggestion + * strip and tell the input connection about it so that it can refresh its caches. + * + * @param newSelStart the new selection start, in java characters. + * @param newSelEnd the new selection end, in java characters. + * @param clearSuggestionStrip whether this method should clear the suggestion strip. + */ + // TODO: how is this different from startInput ?! + private void resetEntireInputState(final int newSelStart, final int newSelEnd, + final boolean clearSuggestionStrip) { + final boolean shouldFinishComposition = mWordComposer.isComposingWord(); + resetComposingState(true /* alsoResetLastComposedWord */); + if (clearSuggestionStrip) { + mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); + } + mConnection.resetCachesUponCursorMoveAndReturnSuccess(newSelStart, newSelEnd, + shouldFinishComposition); + } + + /** + * Resets only the composing state. + * + * Compare #resetEntireInputState, which also clears the suggestion strip and resets the + * input connection caches. This only deals with the composing state. + * + * @param alsoResetLastComposedWord whether to also reset the last composed word. + */ + private void resetComposingState(final boolean alsoResetLastComposedWord) { + mWordComposer.reset(); + if (alsoResetLastComposedWord) { + mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; + } + } + + /** + * Make a {@link com.android.inputmethod.latin.SuggestedWords} object containing a typed word + * and obsolete suggestions. + * See {@link com.android.inputmethod.latin.SuggestedWords#getTypedWordAndPreviousSuggestions( + * String, com.android.inputmethod.latin.SuggestedWords)}. + * @param typedWord The typed word as a string. + * @param previousSuggestedWords The previously suggested words. + * @return Obsolete suggestions with the newly typed word. + */ + private SuggestedWords retrieveOlderSuggestions(final String typedWord, + final SuggestedWords previousSuggestedWords) { + final SuggestedWords oldSuggestedWords = + previousSuggestedWords.isPunctuationSuggestions() ? SuggestedWords.EMPTY + : previousSuggestedWords; + final ArrayList<SuggestedWords.SuggestedWordInfo> typedWordAndPreviousSuggestions = + SuggestedWords.getTypedWordAndPreviousSuggestions(typedWord, oldSuggestedWords); + return new SuggestedWords(typedWordAndPreviousSuggestions, null /* rawSuggestions */, + false /* typedWordValid */, false /* hasAutoCorrectionCandidate */, + true /* isObsoleteSuggestions */, false /* isPrediction */); + } + + /** + * Gets a chunk of text with or the auto-correction indicator underline span as appropriate. + * + * This method looks at the old state of the auto-correction indicator to put or not put + * the underline span as appropriate. It is important to note that this does not correspond + * exactly to whether this word will be auto-corrected to or not: what's important here is + * to keep the same indication as before. + * When we add a new code point to a composing word, we don't know yet if we are going to + * auto-correct it until the suggestions are computed. But in the mean time, we still need + * to display the character and to extend the previous underline. To avoid any flickering, + * the underline should keep the same color it used to have, even if that's not ultimately + * the correct color for this new word. When the suggestions are finished evaluating, we + * will call this method again to fix the color of the underline. + * + * @param text the text on which to maybe apply the span. + * @return the same text, with the auto-correction underline span if that's appropriate. + */ + // TODO: Shouldn't this go in some *Utils class instead? + private CharSequence getTextWithUnderline(final String text) { + return mIsAutoCorrectionIndicatorOn + ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(mLatinIME, text) + : text; + } + + /** + * Sends a DOWN key event followed by an UP key event to the editor. + * + * If possible at all, avoid using this method. It causes all sorts of race conditions with + * the text view because it goes through a different, asynchronous binder. Also, batch edits + * are ignored for key events. Use the normal software input methods instead. + * + * @param keyCode the key code to send inside the key event. + */ + private void sendDownUpKeyEvent(final int keyCode) { + final long eventTime = SystemClock.uptimeMillis(); + mConnection.sendKeyEvent(new KeyEvent(eventTime, eventTime, + KeyEvent.ACTION_DOWN, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, + KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); + mConnection.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime, + KeyEvent.ACTION_UP, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, + KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE)); + } + + /** + * Sends a code point to the editor, using the most appropriate method. + * + * Normally we send code points with commitText, but there are some cases (where backward + * compatibility is a concern for example) where we want to use deprecated methods. + * + * @param settingsValues the current values of the settings. + * @param codePoint the code point to send. + */ + // TODO: replace these two parameters with an InputTransaction + private void sendKeyCodePoint(final SettingsValues settingsValues, final int codePoint) { + // TODO: Remove this special handling of digit letters. + // For backward compatibility. See {@link InputMethodService#sendKeyChar(char)}. + if (codePoint >= '0' && codePoint <= '9') { + sendDownUpKeyEvent(codePoint - '0' + KeyEvent.KEYCODE_0); + return; + } + + // TODO: we should do this also when the editor has TYPE_NULL + if (Constants.CODE_ENTER == codePoint && settingsValues.isBeforeJellyBean()) { + // Backward compatibility mode. Before Jelly bean, the keyboard would simulate + // a hardware keyboard event on pressing enter or delete. This is bad for many + // reasons (there are race conditions with commits) but some applications are + // relying on this behavior so we continue to support it for older apps. + sendDownUpKeyEvent(KeyEvent.KEYCODE_ENTER); + } else { + mConnection.commitText(StringUtils.newSingleCodePointString(codePoint), 1); + } + } + + /** + * Promote a phantom space to an actual space. + * + * This essentially inserts a space, and that's it. It just checks the options and the text + * before the cursor are appropriate before doing it. + * + * @param settingsValues the current values of the settings. + */ + private void promotePhantomSpace(final SettingsValues settingsValues) { + if (settingsValues.shouldInsertSpacesAutomatically() + && settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces + && !mConnection.textBeforeCursorLooksLikeURL()) { + sendKeyCodePoint(settingsValues, Constants.CODE_SPACE); + } + } + + /** + * Do the final processing after a batch input has ended. This commits the word to the editor. + * @param settingsValues the current values of the settings. + * @param suggestedWords suggestedWords to use. + */ + public void onUpdateTailBatchInputCompleted(final SettingsValues settingsValues, + final SuggestedWords suggestedWords, + // TODO: remove this argument + final KeyboardSwitcher keyboardSwitcher) { + final String batchInputText = suggestedWords.isEmpty() ? null : suggestedWords.getWord(0); + if (TextUtils.isEmpty(batchInputText)) { + return; + } + mConnection.beginBatchEdit(); + if (SpaceState.PHANTOM == mSpaceState) { + promotePhantomSpace(settingsValues); + } + final SuggestedWordInfo autoCommitCandidate = mSuggestedWords.getAutoCommitCandidate(); + // Commit except the last word for phrase gesture if the top suggestion is eligible for auto + // commit. + if (settingsValues.mPhraseGestureEnabled && null != autoCommitCandidate) { + // Find the last space + final int indexOfLastSpace = batchInputText.lastIndexOf(Constants.CODE_SPACE) + 1; + if (0 != indexOfLastSpace) { + mConnection.commitText(batchInputText.substring(0, indexOfLastSpace), 1); + final SuggestedWords suggestedWordsForLastWordOfPhraseGesture = + suggestedWords.getSuggestedWordsForLastWordOfPhraseGesture(); + mLatinIME.showSuggestionStrip(suggestedWordsForLastWordOfPhraseGesture); + } + final String lastWord = batchInputText.substring(indexOfLastSpace); + mWordComposer.setBatchInputWord(lastWord); + mConnection.setComposingText(lastWord, 1); + } else { + mWordComposer.setBatchInputWord(batchInputText); + mConnection.setComposingText(batchInputText, 1); + } + mConnection.endBatchEdit(); + // Space state must be updated before calling updateShiftState + mSpaceState = SpaceState.PHANTOM; + keyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(settingsValues), + getCurrentRecapitalizeState()); + } + + /** + * Commit the typed string to the editor. + * + * This is typically called when we should commit the currently composing word without applying + * auto-correction to it. Typically, we come here upon pressing a separator when the keyboard + * is configured to not do auto-correction at all (because of the settings or the properties of + * the editor). In this case, `separatorString' is set to the separator that was pressed. + * We also come here in a variety of cases with external user action. For example, when the + * cursor is moved while there is a composition, or when the keyboard is closed, or when the + * user presses the Send button for an SMS, we don't auto-correct as that would be unexpected. + * In this case, `separatorString' is set to NOT_A_SEPARATOR. + * + * @param settingsValues the current values of the settings. + * @param separatorString the separator that's causing the commit, or NOT_A_SEPARATOR if none. + */ + // TODO: Make this private + public void commitTyped(final SettingsValues settingsValues, final String separatorString) { + if (!mWordComposer.isComposingWord()) return; + final String typedWord = mWordComposer.getTypedWord(); + if (typedWord.length() > 0) { + commitChosenWord(settingsValues, typedWord, + LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, separatorString); + } + } + + /** + * Commit the current auto-correction. + * + * This will commit the best guess of the keyboard regarding what the user meant by typing + * the currently composing word. The IME computes suggestions and assigns a confidence score + * to each of them; when it's confident enough in one suggestion, it replaces the typed string + * by this suggestion at commit time. When it's not confident enough, or when it has no + * suggestions, or when the settings or environment does not allow for auto-correction, then + * this method just commits the typed string. + * Note that if suggestions are currently being computed in the background, this method will + * block until the computation returns. This is necessary for consistency (it would be very + * strange if pressing space would commit a different word depending on how fast you press). + * + * @param settingsValues the current value of the settings. + * @param separator the separator that's causing the commit to happen. + */ + private void commitCurrentAutoCorrection(final SettingsValues settingsValues, + final String separator, + // TODO: Remove this argument. + final LatinIME.UIHandler handler) { + // Complete any pending suggestions query first + if (handler.hasPendingUpdateSuggestions()) { + handler.cancelUpdateSuggestionStrip(); + performUpdateSuggestionStripSync(settingsValues); + } + final String typedAutoCorrection = mWordComposer.getAutoCorrectionOrNull(); + final String typedWord = mWordComposer.getTypedWord(); + final String autoCorrection = (typedAutoCorrection != null) + ? typedAutoCorrection : typedWord; + if (autoCorrection != null) { + if (TextUtils.isEmpty(typedWord)) { + throw new RuntimeException("We have an auto-correction but the typed word " + + "is empty? Impossible! I must commit suicide."); + } + commitChosenWord(settingsValues, autoCorrection, + LastComposedWord.COMMIT_TYPE_DECIDED_WORD, separator); + if (!typedWord.equals(autoCorrection)) { + // This will make the correction flash for a short while as a visual clue + // to the user that auto-correction happened. It has no other effect; in particular + // note that this won't affect the text inside the text field AT ALL: it only makes + // the segment of text starting at the supplied index and running for the length + // of the auto-correction flash. At this moment, the "typedWord" argument is + // ignored by TextView. + mConnection.commitCorrection(new CorrectionInfo( + mConnection.getExpectedSelectionEnd() - autoCorrection.length(), + typedWord, autoCorrection)); + } + } + } + + /** + * Commits the chosen word to the text field and saves it for later retrieval. + * + * @param settingsValues the current values of the settings. + * @param chosenWord the word we want to commit. + * @param commitType the type of the commit, as one of LastComposedWord.COMMIT_TYPE_* + * @param separatorString the separator that's causing the commit, or NOT_A_SEPARATOR if none. + */ + private void commitChosenWord(final SettingsValues settingsValues, final String chosenWord, + final int commitType, final String separatorString) { + final SuggestedWords suggestedWords = mSuggestedWords; + final CharSequence chosenWordWithSuggestions = + SuggestionSpanUtils.getTextWithSuggestionSpan(mLatinIME, chosenWord, + suggestedWords); + // When we are composing word, get previous words information from the 2nd previous word + // because the 1st previous word is the word to be committed. Otherwise get previous words + // information from the 1st previous word. + final PrevWordsInfo prevWordsInfo = mConnection.getPrevWordsInfoFromNthPreviousWord( + settingsValues.mSpacingAndPunctuations, mWordComposer.isComposingWord() ? 2 : 1); + mConnection.commitText(chosenWordWithSuggestions, 1); + // Add the word to the user history dictionary + performAdditionToUserHistoryDictionary(settingsValues, chosenWord, prevWordsInfo); + // TODO: figure out here if this is an auto-correct or if the best word is actually + // what user typed. Note: currently this is done much later in + // LastComposedWord#didCommitTypedWord by string equality of the remembered + // strings. + mLastComposedWord = mWordComposer.commitWord(commitType, + chosenWordWithSuggestions, separatorString, prevWordsInfo); + } + + /** + * Retry resetting caches in the rich input connection. + * + * When the editor can't be accessed we can't reset the caches, so we schedule a retry. + * This method handles the retry, and re-schedules a new retry if we still can't access. + * We only retry up to 5 times before giving up. + * + * @param settingsValues the current values of the settings. + * @param tryResumeSuggestions Whether we should resume suggestions or not. + * @param remainingTries How many times we may try again before giving up. + * @return whether true if the caches were successfully reset, false otherwise. + */ + // TODO: make this private + public boolean retryResetCachesAndReturnSuccess(final SettingsValues settingsValues, + final boolean tryResumeSuggestions, final int remainingTries, + // TODO: remove these arguments + final LatinIME.UIHandler handler) { + final boolean shouldFinishComposition = mConnection.hasSelection() + || !mConnection.isCursorPositionKnown(); + if (!mConnection.resetCachesUponCursorMoveAndReturnSuccess( + mConnection.getExpectedSelectionStart(), mConnection.getExpectedSelectionEnd(), + shouldFinishComposition)) { + if (0 < remainingTries) { + handler.postResetCaches(tryResumeSuggestions, remainingTries - 1); + return false; + } + // If remainingTries is 0, we should stop waiting for new tries, however we'll still + // return true as we need to perform other tasks (for example, loading the keyboard). + } + mConnection.tryFixLyingCursorPosition(); + if (tryResumeSuggestions) { + // This is triggered when starting input anew, so we want to include the resumed + // word in suggestions. + handler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, + true /* shouldDelay */); + } + return true; + } + + public void getSuggestedWords(final SettingsValues settingsValues, + final ProximityInfo proximityInfo, final int keyboardShiftMode, final int sessionId, + final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { + mWordComposer.adviseCapitalizedModeBeforeFetchingSuggestions( + getActualCapsMode(settingsValues, keyboardShiftMode)); + mSuggest.getSuggestedWords(mWordComposer, + getPrevWordsInfoFromNthPreviousWordForSuggestion( + settingsValues.mSpacingAndPunctuations, + // Get the word on which we should search the bigrams. If we are composing + // a word, it's whatever is *before* the half-committed word in the buffer, + // hence 2; if we aren't, we should just skip whitespace if any, so 1. + mWordComposer.isComposingWord() ? 2 : 1), + proximityInfo, settingsValues.mBlockPotentiallyOffensive, + settingsValues.mAutoCorrectionEnabled, + settingsValues.mAdditionalFeaturesSettingValues, + sessionId, sequenceNumber, callback); + } +} diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java new file mode 100644 index 000000000..9dbe2c38b --- /dev/null +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2013 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.inputlogic; + +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Message; + +import com.android.inputmethod.compat.LooperCompatUtils; +import com.android.inputmethod.latin.InputPointers; +import com.android.inputmethod.latin.LatinIME; +import com.android.inputmethod.latin.Suggest; +import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.Suggest.OnGetSuggestedWordsCallback; + +/** + * A helper to manage deferred tasks for the input logic. + */ +class InputLogicHandler implements Handler.Callback { + final Handler mNonUIThreadHandler; + // TODO: remove this reference. + final LatinIME mLatinIME; + final InputLogic mInputLogic; + private final Object mLock = new Object(); + private boolean mInBatchInput; // synchronized using {@link #mLock}. + + private static final int MSG_GET_SUGGESTED_WORDS = 1; + + // A handler that never does anything. This is used for cases where events come before anything + // is initialized, though probably only the monkey can actually do this. + public static final InputLogicHandler NULL_HANDLER = new InputLogicHandler() { + @Override + public void reset() {} + @Override + public boolean handleMessage(final Message msg) { return true; } + @Override + public void onStartBatchInput() {} + @Override + public void onUpdateBatchInput(final InputPointers batchPointers, + final int sequenceNumber) {} + @Override + public void onCancelBatchInput() {} + @Override + public void updateTailBatchInput(final InputPointers batchPointers, + final int sequenceNumber) {} + @Override + public void getSuggestedWords(final int sessionId, final int sequenceNumber, + final OnGetSuggestedWordsCallback callback) {} + }; + + private InputLogicHandler() { + mNonUIThreadHandler = null; + mLatinIME = null; + mInputLogic = null; + } + + public InputLogicHandler(final LatinIME latinIME, final InputLogic inputLogic) { + final HandlerThread handlerThread = new HandlerThread( + InputLogicHandler.class.getSimpleName()); + handlerThread.start(); + mNonUIThreadHandler = new Handler(handlerThread.getLooper(), this); + mLatinIME = latinIME; + mInputLogic = inputLogic; + } + + public void reset() { + mNonUIThreadHandler.removeCallbacksAndMessages(null); + } + + // In unit tests, we create several instances of LatinIME, which results in several instances + // of InputLogicHandler. To avoid these handlers lingering, we call this. + public void destroy() { + LooperCompatUtils.quitSafely(mNonUIThreadHandler.getLooper()); + } + + /** + * Handle a message. + * @see android.os.Handler.Callback#handleMessage(android.os.Message) + */ + // Called on the Non-UI handler thread by the Handler code. + @Override + public boolean handleMessage(final Message msg) { + switch (msg.what) { + case MSG_GET_SUGGESTED_WORDS: + mLatinIME.getSuggestedWords(msg.arg1 /* sessionId */, + msg.arg2 /* sequenceNumber */, (OnGetSuggestedWordsCallback) msg.obj); + break; + } + return true; + } + + // Called on the UI thread by InputLogic. + public void onStartBatchInput() { + synchronized (mLock) { + mInBatchInput = true; + } + } + + public boolean isInBatchInput() { + return mInBatchInput; + } + + /** + * Fetch suggestions corresponding to an update of a batch input. + * @param batchPointers the updated pointers, including the part that was passed last time. + * @param sequenceNumber the sequence number associated with this batch input. + * @param isTailBatchInput true if this is the end of a batch input, false if it's an update. + */ + // This method can be called from any thread and will see to it that the correct threads + // are used for parts that require it. This method will send a message to the Non-UI handler + // thread to pull suggestions, and get the inlined callback to get called on the Non-UI + // handler thread. If this is the end of a batch input, the callback will then proceed to + // send a message to the UI handler in LatinIME so that showing suggestions can be done on + // the UI thread. + private void updateBatchInput(final InputPointers batchPointers, + final int sequenceNumber, final boolean isTailBatchInput) { + synchronized (mLock) { + if (!mInBatchInput) { + // Batch input has ended or canceled while the message was being delivered. + return; + } + mInputLogic.mWordComposer.setBatchInputPointers(batchPointers); + getSuggestedWords(Suggest.SESSION_GESTURE, sequenceNumber, + new OnGetSuggestedWordsCallback() { + @Override + public void onGetSuggestedWords(SuggestedWords suggestedWords) { + // We're now inside the callback. This always runs on the Non-UI thread, + // no matter what thread updateBatchInput was originally called on. + if (suggestedWords.isEmpty()) { + // Use old suggestions if we don't have any new ones. + // Previous suggestions are found in InputLogic#mSuggestedWords. + // Since these are the most recent ones and we just recomputed + // new ones to update them, then the previous ones are there. + suggestedWords = mInputLogic.mSuggestedWords; + } + mLatinIME.mHandler.showGesturePreviewAndSuggestionStrip(suggestedWords, + isTailBatchInput /* dismissGestureFloatingPreviewText */); + if (isTailBatchInput) { + mInBatchInput = false; + // The following call schedules onEndBatchInputInternal + // to be called on the UI thread. + mLatinIME.mHandler.showTailBatchInputResult(suggestedWords); + } + } + }); + } + } + + /** + * Update a batch input. + * + * This fetches suggestions and updates the suggestion strip and the floating text preview. + * + * @param batchPointers the updated batch pointers. + * @param sequenceNumber the sequence number associated with this batch input. + */ + // Called on the UI thread by InputLogic. + public void onUpdateBatchInput(final InputPointers batchPointers, + final int sequenceNumber) { + updateBatchInput(batchPointers, sequenceNumber, false /* isTailBatchInput */); + } + + /** + * Cancel a batch input. + * + * Note that as opposed to updateTailBatchInput, we do the UI side of this immediately on the + * same thread, rather than get this to call a method in LatinIME. This is because + * canceling a batch input does not necessitate the long operation of pulling suggestions. + */ + // Called on the UI thread by InputLogic. + public void onCancelBatchInput() { + synchronized (mLock) { + mInBatchInput = false; + } + } + + /** + * Trigger an update for a tail batch input. + * + * A tail batch input is the last update for a gesture, the one that is triggered after the + * user lifts their finger. This method schedules fetching suggestions on the non-UI thread, + * then when the suggestions are computed it comes back on the UI thread to update the + * suggestion strip, commit the first suggestion, and dismiss the floating text preview. + * + * @param batchPointers the updated batch pointers. + * @param sequenceNumber the sequence number associated with this batch input. + */ + // Called on the UI thread by InputLogic. + public void updateTailBatchInput(final InputPointers batchPointers, + final int sequenceNumber) { + updateBatchInput(batchPointers, sequenceNumber, true /* isTailBatchInput */); + } + + public void getSuggestedWords(final int sessionId, final int sequenceNumber, + final OnGetSuggestedWordsCallback callback) { + mNonUIThreadHandler.obtainMessage( + MSG_GET_SUGGESTED_WORDS, sessionId, sequenceNumber, callback).sendToTarget(); + } +} diff --git a/java/src/com/android/inputmethod/latin/inputlogic/SpaceState.java b/java/src/com/android/inputmethod/latin/inputlogic/SpaceState.java new file mode 100644 index 000000000..ce80c0016 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/inputlogic/SpaceState.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 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.inputlogic; + +/** + * Class for managing space states. + * + * At any given time, the input logic is in one of five possible space states. Depending on the + * current space state, some behavior will change; the prime example of this is the PHANTOM state, + * in which any subsequent letter input will input a space before the letter. Read on the + * description inside this class for each of the space states. + */ +public class SpaceState { + // None: the state where all the keyboard behavior is the most "standard" and no automatic + // input is added or removed. In this state, all self-inserting keys only insert themselves, + // and backspace removes one character. + public static final int NONE = 0; + // Double space: the state where the user pressed space twice quickly, which LatinIME + // resolved as period-space. In this state, pressing backspace will undo the + // double-space-to-period insertion: it will replace ". " with " ". + public static final int DOUBLE = 1; + // Swap punctuation: the state where a weak space and a punctuation from the suggestion strip + // have just been swapped. In this state, pressing backspace will undo the swap: the + // characters will be swapped back back, and the space state will go to WEAK. + public static final int SWAP_PUNCTUATION = 2; + // Weak space: a space that should be swapped only by suggestion strip punctuation. Weak + // spaces happen when the user presses space, accepting the current suggestion (whether + // it's an auto-correction or not). In this state, pressing a punctuation from the suggestion + // strip inserts it before the space (while it inserts it after the space in the NONE state). + public static final int WEAK = 3; + // Phantom space: a not-yet-inserted space that should get inserted on the next input, + // character provided it's not a separator. If it's a separator, the phantom space is dropped. + // Phantom spaces happen when a user chooses a word from the suggestion strip. In this state, + // non-separators insert a space before they get inserted. + public static final int PHANTOM = 4; + + private SpaceState() { + // This class is not publicly instantiable. + } +} diff --git a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java deleted file mode 100644 index fda97dafc..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.TreeMap; - -/** - * A base class of the binary dictionary decoder. - */ -public abstract class AbstractDictDecoder implements DictDecoder { - protected FileHeader readHeader(final DictBuffer dictBuffer) - throws IOException, UnsupportedFormatException { - if (dictBuffer == null) { - openDictBuffer(); - } - - final int version = HeaderReader.readVersion(dictBuffer); - if (version < FormatSpec.MINIMUM_SUPPORTED_VERSION - || version > FormatSpec.MAXIMUM_SUPPORTED_VERSION) { - throw new UnsupportedFormatException("Unsupported version : " + version); - } - // TODO: Remove this field. - final int optionsFlags = HeaderReader.readOptionFlags(dictBuffer); - - final int headerSize = HeaderReader.readHeaderSize(dictBuffer); - - if (headerSize < 0) { - throw new UnsupportedFormatException("header size can't be negative."); - } - - final HashMap<String, String> attributes = HeaderReader.readAttributes(dictBuffer, - headerSize); - - final FileHeader header = new FileHeader(headerSize, - new FusionDictionary.DictionaryOptions(attributes, - 0 != (optionsFlags & FormatSpec.GERMAN_UMLAUT_PROCESSING_FLAG), - 0 != (optionsFlags & FormatSpec.FRENCH_LIGATURE_PROCESSING_FLAG)), - new FormatOptions(version, - 0 != (optionsFlags & FormatSpec.SUPPORTS_DYNAMIC_UPDATE), - 0 != (optionsFlags & FormatSpec.CONTAINS_TIMESTAMP_FLAG))); - return header; - } - - @Override @UsedForTesting - public int getTerminalPosition(final String word) - throws IOException, UnsupportedFormatException { - if (!isDictBufferOpen()) { - openDictBuffer(); - } - return BinaryDictIOUtils.getTerminalPosition(this, word); - } - - @Override @UsedForTesting - public void readUnigramsAndBigramsBinary(final TreeMap<Integer, String> words, - final TreeMap<Integer, Integer> frequencies, - final TreeMap<Integer, ArrayList<PendingAttribute>> bigrams) - throws IOException, UnsupportedFormatException { - if (!isDictBufferOpen()) { - openDictBuffer(); - } - BinaryDictIOUtils.readUnigramsAndBigramsBinary(this, words, frequencies, bigrams); - } - - /** - * A utility class for reading a file header. - */ - protected static class HeaderReader { - protected static int readVersion(final DictBuffer dictBuffer) - throws IOException, UnsupportedFormatException { - return BinaryDictDecoderUtils.checkFormatVersion(dictBuffer); - } - - protected static int readOptionFlags(final DictBuffer dictBuffer) { - return dictBuffer.readUnsignedShort(); - } - - protected static int readHeaderSize(final DictBuffer dictBuffer) { - return dictBuffer.readInt(); - } - - protected static HashMap<String, String> readAttributes(final DictBuffer dictBuffer, - final int headerSize) { - final HashMap<String, String> attributes = new HashMap<String, String>(); - while (dictBuffer.position() < headerSize) { - // We can avoid an infinite loop here since dictBuffer.position() is always - // increased by calling CharEncoding.readString. - final String key = CharEncoding.readString(dictBuffer); - final String value = CharEncoding.readString(dictBuffer); - attributes.put(key, value); - } - dictBuffer.position(headerSize); - return attributes; - } - } - - /** - * A utility class for reading a PtNode. - */ - protected static class PtNodeReader { - protected static int readPtNodeOptionFlags(final DictBuffer dictBuffer) { - return dictBuffer.readUnsignedByte(); - } - - protected static int readParentAddress(final DictBuffer dictBuffer, - final FormatOptions formatOptions) { - if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) { - return BinaryDictDecoderUtils.readSInt24(dictBuffer); - } else { - return FormatSpec.NO_PARENT_ADDRESS; - } - } - - protected static int readChildrenAddress(final DictBuffer dictBuffer, final int optionFlags, - final FormatOptions formatOptions) { - if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) { - final int address = BinaryDictDecoderUtils.readSInt24(dictBuffer); - if (address == 0) return FormatSpec.NO_CHILDREN_ADDRESS; - return address; - } else { - switch (optionFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) { - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE: - return dictBuffer.readUnsignedByte(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES: - return dictBuffer.readUnsignedShort(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES: - return dictBuffer.readUnsignedInt24(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS: - default: - return FormatSpec.NO_CHILDREN_ADDRESS; - } - } - } - - // Reads shortcuts and returns the read length. - protected static int readShortcut(final DictBuffer dictBuffer, - final ArrayList<WeightedString> shortcutTargets) { - final int pointerBefore = dictBuffer.position(); - dictBuffer.readUnsignedShort(); // skip the size - while (true) { - final int targetFlags = dictBuffer.readUnsignedByte(); - final String word = CharEncoding.readString(dictBuffer); - shortcutTargets.add(new WeightedString(word, - targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY)); - if (0 == (targetFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break; - } - return dictBuffer.position() - pointerBefore; - } - - protected static int readBigramAddresses(final DictBuffer dictBuffer, - final ArrayList<PendingAttribute> bigrams, final int baseAddress) { - int readLength = 0; - int bigramCount = 0; - while (bigramCount++ < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - final int bigramFlags = dictBuffer.readUnsignedByte(); - ++readLength; - final int sign = 0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_ATTR_OFFSET_NEGATIVE) - ? 1 : -1; - int bigramAddress = baseAddress + readLength; - switch (bigramFlags & FormatSpec.MASK_BIGRAM_ATTR_ADDRESS_TYPE) { - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE: - bigramAddress += sign * dictBuffer.readUnsignedByte(); - readLength += 1; - break; - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES: - bigramAddress += sign * dictBuffer.readUnsignedShort(); - readLength += 2; - break; - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES: - bigramAddress += sign * dictBuffer.readUnsignedInt24(); - readLength += 3; - break; - default: - throw new RuntimeException("Has bigrams with no address"); - } - bigrams.add(new PendingAttribute( - bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY, - bigramAddress)); - if (0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break; - } - return readLength; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java deleted file mode 100644 index 216492b4d..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Map; -import java.util.TreeMap; - -/** - * Decodes binary files for a FusionDictionary. - * - * All the methods in this class are static. - * - * TODO: Remove calls from classes except Ver3DictDecoder - * TODO: Move this file to makedict/internal. - * TODO: Rename this class to DictDecoderUtils. - */ -public final class BinaryDictDecoderUtils { - - private static final boolean DBG = MakedictLog.DBG; - - private BinaryDictDecoderUtils() { - // This utility class is not publicly instantiable. - } - - private static final int MAX_JUMPS = 12; - - @UsedForTesting - public interface DictBuffer { - public int readUnsignedByte(); - public int readUnsignedShort(); - public int readUnsignedInt24(); - public int readInt(); - public int position(); - public void position(int newPosition); - public void put(final byte b); - public int limit(); - @UsedForTesting - public int capacity(); - } - - public static final class ByteBufferDictBuffer implements DictBuffer { - private ByteBuffer mBuffer; - - public ByteBufferDictBuffer(final ByteBuffer buffer) { - mBuffer = buffer; - } - - @Override - public int readUnsignedByte() { - return mBuffer.get() & 0xFF; - } - - @Override - public int readUnsignedShort() { - return mBuffer.getShort() & 0xFFFF; - } - - @Override - public int readUnsignedInt24() { - final int retval = readUnsignedByte(); - return (retval << 16) + readUnsignedShort(); - } - - @Override - public int readInt() { - return mBuffer.getInt(); - } - - @Override - public int position() { - return mBuffer.position(); - } - - @Override - public void position(int newPos) { - mBuffer.position(newPos); - } - - @Override - public void put(final byte b) { - mBuffer.put(b); - } - - @Override - public int limit() { - return mBuffer.limit(); - } - - @Override - public int capacity() { - return mBuffer.capacity(); - } - } - - /** - * A class grouping utility function for our specific character encoding. - */ - static final class CharEncoding { - private static final int MINIMAL_ONE_BYTE_CHARACTER_VALUE = 0x20; - private static final int MAXIMAL_ONE_BYTE_CHARACTER_VALUE = 0xFF; - - /** - * Helper method to find out whether this code fits on one byte - */ - private static boolean fitsOnOneByte(final int character) { - return character >= MINIMAL_ONE_BYTE_CHARACTER_VALUE - && character <= MAXIMAL_ONE_BYTE_CHARACTER_VALUE; - } - - /** - * Compute the size of a character given its character code. - * - * Char format is: - * 1 byte = bbbbbbbb match - * case 000xxxxx: xxxxx << 16 + next byte << 8 + next byte - * else: if 00011111 (= 0x1F) : this is the terminator. This is a relevant choice because - * unicode code points range from 0 to 0x10FFFF, so any 3-byte value starting with - * 00011111 would be outside unicode. - * else: iso-latin-1 code - * This allows for the whole unicode range to be encoded, including chars outside of - * the BMP. Also everything in the iso-latin-1 charset is only 1 byte, except control - * characters which should never happen anyway (and still work, but take 3 bytes). - * - * @param character the character code. - * @return the size in binary encoded-form, either 1 or 3 bytes. - */ - static int getCharSize(final int character) { - // See char encoding in FusionDictionary.java - if (fitsOnOneByte(character)) return 1; - if (FormatSpec.INVALID_CHARACTER == character) return 1; - return 3; - } - - /** - * Compute the byte size of a character array. - */ - static int getCharArraySize(final int[] chars) { - int size = 0; - for (int character : chars) size += getCharSize(character); - return size; - } - - /** - * Writes a char array to a byte buffer. - * - * @param codePoints the code point array to write. - * @param buffer the byte buffer to write to. - * @param index the index in buffer to write the character array to. - * @return the index after the last character. - */ - static int writeCharArray(final int[] codePoints, final byte[] buffer, int index) { - for (int codePoint : codePoints) { - if (1 == getCharSize(codePoint)) { - buffer[index++] = (byte)codePoint; - } else { - buffer[index++] = (byte)(0xFF & (codePoint >> 16)); - buffer[index++] = (byte)(0xFF & (codePoint >> 8)); - buffer[index++] = (byte)(0xFF & codePoint); - } - } - return index; - } - - /** - * Writes a string with our character format to a byte buffer. - * - * This will also write the terminator byte. - * - * @param buffer the byte buffer to write to. - * @param origin the offset to write from. - * @param word the string to write. - * @return the size written, in bytes. - */ - static int writeString(final byte[] buffer, final int origin, - final String word) { - final int length = word.length(); - int index = origin; - for (int i = 0; i < length; i = word.offsetByCodePoints(i, 1)) { - final int codePoint = word.codePointAt(i); - if (1 == getCharSize(codePoint)) { - buffer[index++] = (byte)codePoint; - } else { - buffer[index++] = (byte)(0xFF & (codePoint >> 16)); - buffer[index++] = (byte)(0xFF & (codePoint >> 8)); - buffer[index++] = (byte)(0xFF & codePoint); - } - } - buffer[index++] = FormatSpec.PTNODE_CHARACTERS_TERMINATOR; - return index - origin; - } - - /** - * Writes a string with our character format to an OutputStream. - * - * This will also write the terminator byte. - * - * @param buffer the OutputStream to write to. - * @param word the string to write. - */ - static void writeString(final OutputStream buffer, final String word) throws IOException { - final int length = word.length(); - for (int i = 0; i < length; i = word.offsetByCodePoints(i, 1)) { - final int codePoint = word.codePointAt(i); - if (1 == getCharSize(codePoint)) { - buffer.write((byte) codePoint); - } else { - buffer.write((byte) (0xFF & (codePoint >> 16))); - buffer.write((byte) (0xFF & (codePoint >> 8))); - buffer.write((byte) (0xFF & codePoint)); - } - } - buffer.write(FormatSpec.PTNODE_CHARACTERS_TERMINATOR); - } - - /** - * Reads a string from a DictBuffer. This is the converse of the above method. - */ - static String readString(final DictBuffer dictBuffer) { - final StringBuilder s = new StringBuilder(); - int character = readChar(dictBuffer); - while (character != FormatSpec.INVALID_CHARACTER) { - s.appendCodePoint(character); - character = readChar(dictBuffer); - } - return s.toString(); - } - - /** - * Reads a character from the buffer. - * - * This follows the character format documented earlier in this source file. - * - * @param dictBuffer the buffer, positioned over an encoded character. - * @return the character code. - */ - static int readChar(final DictBuffer dictBuffer) { - int character = dictBuffer.readUnsignedByte(); - if (!fitsOnOneByte(character)) { - if (FormatSpec.PTNODE_CHARACTERS_TERMINATOR == character) { - return FormatSpec.INVALID_CHARACTER; - } - character <<= 16; - character += dictBuffer.readUnsignedShort(); - } - return character; - } - } - - // Input methods: Read a binary dictionary to memory. - // readDictionaryBinary is the public entry point for them. - - static int readSInt24(final DictBuffer dictBuffer) { - final int retval = dictBuffer.readUnsignedInt24(); - final int sign = ((retval & FormatSpec.MSB24) != 0) ? -1 : 1; - return sign * (retval & FormatSpec.SINT24_MAX); - } - - static int readChildrenAddress(final DictBuffer dictBuffer, - final int optionFlags, final FormatOptions options) { - if (options.mSupportsDynamicUpdate) { - final int address = dictBuffer.readUnsignedInt24(); - if (address == 0) return FormatSpec.NO_CHILDREN_ADDRESS; - if ((address & FormatSpec.MSB24) != 0) { - return -(address & FormatSpec.SINT24_MAX); - } else { - return address; - } - } - switch (optionFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) { - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE: - return dictBuffer.readUnsignedByte(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES: - return dictBuffer.readUnsignedShort(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES: - return dictBuffer.readUnsignedInt24(); - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS: - default: - return FormatSpec.NO_CHILDREN_ADDRESS; - } - } - - static int readParentAddress(final DictBuffer dictBuffer, - final FormatOptions formatOptions) { - if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) { - final int parentAddress = dictBuffer.readUnsignedInt24(); - final int sign = ((parentAddress & FormatSpec.MSB24) != 0) ? -1 : 1; - return sign * (parentAddress & FormatSpec.SINT24_MAX); - } else { - return FormatSpec.NO_PARENT_ADDRESS; - } - } - - /** - * Reads and returns the PtNode count out of a buffer and forwards the pointer. - */ - /* package */ static int readPtNodeCount(final DictBuffer dictBuffer) { - final int msb = dictBuffer.readUnsignedByte(); - if (FormatSpec.MAX_PTNODES_FOR_ONE_BYTE_PTNODE_COUNT >= msb) { - return msb; - } else { - return ((FormatSpec.MAX_PTNODES_FOR_ONE_BYTE_PTNODE_COUNT & msb) << 8) - + dictBuffer.readUnsignedByte(); - } - } - - /** - * Finds, as a string, the word at the position passed as an argument. - * - * @param dictDecoder the dict decoder. - * @param headerSize the size of the header. - * @param pos the position to seek. - * @param formatOptions file format options. - * @return the word with its frequency, as a weighted string. - */ - /* package for tests */ static WeightedString getWordAtPosition(final DictDecoder dictDecoder, - final int headerSize, final int pos, final FormatOptions formatOptions) { - final WeightedString result; - final int originalPos = dictDecoder.getPosition(); - dictDecoder.setPosition(pos); - - if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) { - result = getWordAtPositionWithParentAddress(dictDecoder, pos, formatOptions); - } else { - result = getWordAtPositionWithoutParentAddress(dictDecoder, headerSize, pos, - formatOptions); - } - - dictDecoder.setPosition(originalPos); - return result; - } - - @SuppressWarnings("unused") - private static WeightedString getWordAtPositionWithParentAddress(final DictDecoder dictDecoder, - final int pos, final FormatOptions options) { - int currentPos = pos; - int frequency = Integer.MIN_VALUE; - final StringBuilder builder = new StringBuilder(); - // the length of the path from the root to the leaf is limited by MAX_WORD_LENGTH - for (int count = 0; count < FormatSpec.MAX_WORD_LENGTH; ++count) { - PtNodeInfo currentInfo; - int loopCounter = 0; - do { - dictDecoder.setPosition(currentPos); - currentInfo = dictDecoder.readPtNode(currentPos, options); - if (BinaryDictIOUtils.isMovedPtNode(currentInfo.mFlags, options)) { - currentPos = currentInfo.mParentAddress + currentInfo.mOriginalAddress; - } - if (DBG && loopCounter++ > MAX_JUMPS) { - MakedictLog.d("Too many jumps - probably a bug"); - } - } while (BinaryDictIOUtils.isMovedPtNode(currentInfo.mFlags, options)); - if (Integer.MIN_VALUE == frequency) frequency = currentInfo.mFrequency; - builder.insert(0, - new String(currentInfo.mCharacters, 0, currentInfo.mCharacters.length)); - if (currentInfo.mParentAddress == FormatSpec.NO_PARENT_ADDRESS) break; - currentPos = currentInfo.mParentAddress + currentInfo.mOriginalAddress; - } - return new WeightedString(builder.toString(), frequency); - } - - private static WeightedString getWordAtPositionWithoutParentAddress( - final DictDecoder dictDecoder, final int headerSize, final int pos, - final FormatOptions options) { - dictDecoder.setPosition(headerSize); - final int count = dictDecoder.readPtNodeCount(); - int groupPos = headerSize + BinaryDictIOUtils.getPtNodeCountSize(count); - final StringBuilder builder = new StringBuilder(); - WeightedString result = null; - - PtNodeInfo last = null; - for (int i = count - 1; i >= 0; --i) { - PtNodeInfo info = dictDecoder.readPtNode(groupPos, options); - groupPos = info.mEndAddress; - if (info.mOriginalAddress == pos) { - builder.append(new String(info.mCharacters, 0, info.mCharacters.length)); - result = new WeightedString(builder.toString(), info.mFrequency); - break; // and return - } - if (BinaryDictIOUtils.hasChildrenAddress(info.mChildrenAddress)) { - if (info.mChildrenAddress > pos) { - if (null == last) continue; - builder.append(new String(last.mCharacters, 0, last.mCharacters.length)); - dictDecoder.setPosition(last.mChildrenAddress); - i = dictDecoder.readPtNodeCount(); - groupPos = last.mChildrenAddress + BinaryDictIOUtils.getPtNodeCountSize(i); - last = null; - continue; - } - last = info; - } - if (0 == i && BinaryDictIOUtils.hasChildrenAddress(last.mChildrenAddress)) { - builder.append(new String(last.mCharacters, 0, last.mCharacters.length)); - dictDecoder.setPosition(last.mChildrenAddress); - i = dictDecoder.readPtNodeCount(); - groupPos = last.mChildrenAddress + BinaryDictIOUtils.getPtNodeCountSize(i); - last = null; - continue; - } - } - return result; - } - - /** - * Reads a single node array from a buffer. - * - * This methods reads the file at the current position. A node array is fully expected to start - * at the current position. - * This will recursively read other node arrays into the structure, populating the reverse - * maps on the fly and using them to keep track of already read nodes. - * - * @param dictDecoder the dict decoder, correctly positioned at the start of a node array. - * @param headerSize the size, in bytes, of the file header. - * @param reverseNodeArrayMap a mapping from addresses to already read node arrays. - * @param reversePtNodeMap a mapping from addresses to already read PtNodes. - * @param options file format options. - * @return the read node array with all his children already read. - */ - private static PtNodeArray readNodeArray(final DictDecoder dictDecoder, - final int headerSize, final Map<Integer, PtNodeArray> reverseNodeArrayMap, - final Map<Integer, PtNode> reversePtNodeMap, final FormatOptions options) - throws IOException { - final ArrayList<PtNode> nodeArrayContents = new ArrayList<PtNode>(); - final int nodeArrayOriginPos = dictDecoder.getPosition(); - - do { // Scan the linked-list node. - final int nodeArrayHeadPos = dictDecoder.getPosition(); - final int count = dictDecoder.readPtNodeCount(); - int groupOffsetPos = nodeArrayHeadPos + BinaryDictIOUtils.getPtNodeCountSize(count); - for (int i = count; i > 0; --i) { // Scan the array of PtNode. - PtNodeInfo info = dictDecoder.readPtNode(groupOffsetPos, options); - if (BinaryDictIOUtils.isMovedPtNode(info.mFlags, options)) continue; - ArrayList<WeightedString> shortcutTargets = info.mShortcutTargets; - ArrayList<WeightedString> bigrams = null; - if (null != info.mBigrams) { - bigrams = new ArrayList<WeightedString>(); - for (PendingAttribute bigram : info.mBigrams) { - final WeightedString word = getWordAtPosition(dictDecoder, headerSize, - bigram.mAddress, options); - final int reconstructedFrequency = - BinaryDictIOUtils.reconstructBigramFrequency(word.mFrequency, - bigram.mFrequency); - bigrams.add(new WeightedString(word.mWord, reconstructedFrequency)); - } - } - if (BinaryDictIOUtils.hasChildrenAddress(info.mChildrenAddress)) { - PtNodeArray children = reverseNodeArrayMap.get(info.mChildrenAddress); - if (null == children) { - final int currentPosition = dictDecoder.getPosition(); - dictDecoder.setPosition(info.mChildrenAddress); - children = readNodeArray(dictDecoder, headerSize, reverseNodeArrayMap, - reversePtNodeMap, options); - dictDecoder.setPosition(currentPosition); - } - nodeArrayContents.add( - new PtNode(info.mCharacters, shortcutTargets, bigrams, - info.mFrequency, - 0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD), - 0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED), children)); - } else { - nodeArrayContents.add( - new PtNode(info.mCharacters, shortcutTargets, bigrams, - info.mFrequency, - 0 != (info.mFlags & FormatSpec.FLAG_IS_NOT_A_WORD), - 0 != (info.mFlags & FormatSpec.FLAG_IS_BLACKLISTED))); - } - groupOffsetPos = info.mEndAddress; - } - - // reach the end of the array. - if (options.mSupportsDynamicUpdate) { - final boolean hasValidForwardLink = dictDecoder.readAndFollowForwardLink(); - if (!hasValidForwardLink) break; - } - } while (options.mSupportsDynamicUpdate && dictDecoder.hasNextPtNodeArray()); - - final PtNodeArray nodeArray = new PtNodeArray(nodeArrayContents); - nodeArray.mCachedAddressBeforeUpdate = nodeArrayOriginPos; - nodeArray.mCachedAddressAfterUpdate = nodeArrayOriginPos; - reverseNodeArrayMap.put(nodeArray.mCachedAddressAfterUpdate, nodeArray); - return nodeArray; - } - - /** - * Helper function to get the binary format version from the header. - * @throws IOException - */ - private static int getFormatVersion(final DictBuffer dictBuffer) - throws IOException { - final int magic = dictBuffer.readInt(); - if (FormatSpec.MAGIC_NUMBER == magic) return dictBuffer.readUnsignedShort(); - return FormatSpec.NOT_A_VERSION_NUMBER; - } - - /** - * Helper function to get and validate the binary format version. - * @throws UnsupportedFormatException - * @throws IOException - */ - static int checkFormatVersion(final DictBuffer dictBuffer) - throws IOException, UnsupportedFormatException { - final int version = getFormatVersion(dictBuffer); - if (version < FormatSpec.MINIMUM_SUPPORTED_VERSION - || version > FormatSpec.MAXIMUM_SUPPORTED_VERSION) { - throw new UnsupportedFormatException("This file has version " + version - + ", but this implementation does not support versions above " - + FormatSpec.MAXIMUM_SUPPORTED_VERSION); - } - return version; - } - - /** - * Reads a buffer and returns the memory representation of the dictionary. - * - * This high-level method takes a buffer and reads its contents, populating a - * FusionDictionary structure. The optional dict argument is an existing dictionary to - * which words from the buffer should be added. If it is null, a new dictionary is created. - * - * @param dictDecoder the dict decoder. - * @param dict an optional dictionary to add words to, or null. - * @return the created (or merged) dictionary. - */ - @UsedForTesting - /* package */ static FusionDictionary readDictionaryBinary(final DictDecoder dictDecoder, - final FusionDictionary dict) throws IOException, UnsupportedFormatException { - // Read header - final FileHeader fileHeader = dictDecoder.readHeader(); - - Map<Integer, PtNodeArray> reverseNodeArrayMapping = new TreeMap<Integer, PtNodeArray>(); - Map<Integer, PtNode> reversePtNodeMapping = new TreeMap<Integer, PtNode>(); - final PtNodeArray root = readNodeArray(dictDecoder, fileHeader.mHeaderSize, - reverseNodeArrayMapping, reversePtNodeMapping, fileHeader.mFormatOptions); - - FusionDictionary newDict = new FusionDictionary(root, fileHeader.mDictionaryOptions); - if (null != dict) { - for (final Word w : dict) { - if (w.mIsBlacklistEntry) { - newDict.addBlacklistEntry(w.mWord, w.mShortcutTargets, w.mIsNotAWord); - } else { - newDict.add(w.mWord, w.mFrequency, w.mShortcutTargets, w.mIsNotAWord); - } - } - for (final Word w : dict) { - // By construction a binary dictionary may not have bigrams pointing to - // words that are not also registered as unigrams so we don't have to avoid - // them explicitly here. - for (final WeightedString bigram : w.mBigrams) { - newDict.setBigram(w.mWord, bigram.mWord, bigram.mFrequency); - } - } - } - - return newDict; - } - - /** - * Helper method to pass a file name instead of a File object to isBinaryDictionary. - */ - public static boolean isBinaryDictionary(final String filename) { - final File file = new File(filename); - return isBinaryDictionary(file); - } - - /** - * Basic test to find out whether the file is a binary dictionary or not. - * - * Concretely this only tests the magic number. - * - * @param file The file to test. - * @return true if it's a binary dictionary, false otherwise - */ - public static boolean isBinaryDictionary(final File file) { - FileInputStream inStream = null; - try { - inStream = new FileInputStream(file); - final ByteBuffer buffer = inStream.getChannel().map( - FileChannel.MapMode.READ_ONLY, 0, file.length()); - final int version = getFormatVersion(new ByteBufferDictBuffer(buffer)); - return (version >= FormatSpec.MINIMUM_SUPPORTED_VERSION - && version <= FormatSpec.MAXIMUM_SUPPORTED_VERSION); - } catch (FileNotFoundException e) { - return false; - } catch (IOException e) { - return false; - } finally { - if (inStream != null) { - try { - inStream.close(); - } catch (IOException e) { - // do nothing - } - } - } - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java deleted file mode 100644 index f761829de..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictEncoderUtils.java +++ /dev/null @@ -1,956 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; - -/** - * Encodes binary files for a FusionDictionary. - * - * All the methods in this class are static. - * - * TODO: Rename this class to DictEncoderUtils. - */ -public class BinaryDictEncoderUtils { - - private static final boolean DBG = MakedictLog.DBG; - - private BinaryDictEncoderUtils() { - // This utility class is not publicly instantiable. - } - - // Arbitrary limit to how much passes we consider address size compression should - // terminate in. At the time of this writing, our largest dictionary completes - // compression in five passes. - // If the number of passes exceeds this number, makedict bails with an exception on - // suspicion that a bug might be causing an infinite loop. - private static final int MAX_PASSES = 24; - - /** - * Compute the binary size of the character array. - * - * If only one character, this is the size of this character. If many, it's the sum of their - * sizes + 1 byte for the terminator. - * - * @param characters the character array - * @return the size of the char array, including the terminator if any - */ - static int getPtNodeCharactersSize(final int[] characters) { - int size = CharEncoding.getCharArraySize(characters); - if (characters.length > 1) size += FormatSpec.PTNODE_TERMINATOR_SIZE; - return size; - } - - /** - * Compute the binary size of the character array in a PtNode - * - * If only one character, this is the size of this character. If many, it's the sum of their - * sizes + 1 byte for the terminator. - * - * @param ptNode the PtNode - * @return the size of the char array, including the terminator if any - */ - private static int getPtNodeCharactersSize(final PtNode ptNode) { - return getPtNodeCharactersSize(ptNode.mChars); - } - - /** - * Compute the binary size of the PtNode count for a node array. - * @param nodeArray the nodeArray - * @return the size of the PtNode count, either 1 or 2 bytes. - */ - private static int getPtNodeCountSize(final PtNodeArray nodeArray) { - return BinaryDictIOUtils.getPtNodeCountSize(nodeArray.mData.size()); - } - - /** - * Compute the size of a shortcut in bytes. - */ - private static int getShortcutSize(final WeightedString shortcut) { - int size = FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE; - final String word = shortcut.mWord; - final int length = word.length(); - for (int i = 0; i < length; i = word.offsetByCodePoints(i, 1)) { - final int codePoint = word.codePointAt(i); - size += CharEncoding.getCharSize(codePoint); - } - size += FormatSpec.PTNODE_TERMINATOR_SIZE; - return size; - } - - /** - * Compute the size of a shortcut list in bytes. - * - * This is known in advance and does not change according to position in the file - * like address lists do. - */ - static int getShortcutListSize(final ArrayList<WeightedString> shortcutList) { - if (null == shortcutList || shortcutList.isEmpty()) return 0; - int size = FormatSpec.PTNODE_SHORTCUT_LIST_SIZE_SIZE; - for (final WeightedString shortcut : shortcutList) { - size += getShortcutSize(shortcut); - } - return size; - } - - /** - * Compute the maximum size of a PtNode, assuming 3-byte addresses for everything. - * - * @param ptNode the PtNode to compute the size of. - * @param options file format options. - * @return the maximum size of the PtNode. - */ - private static int getPtNodeMaximumSize(final PtNode ptNode, final FormatOptions options) { - int size = getNodeHeaderSize(ptNode, options); - if (ptNode.isTerminal()) { - // If terminal, one byte for the frequency or four bytes for the terminal id. - if (options.mHasTerminalId) { - size += FormatSpec.PTNODE_TERMINAL_ID_SIZE; - } else { - size += FormatSpec.PTNODE_FREQUENCY_SIZE; - } - } - size += FormatSpec.PTNODE_MAX_ADDRESS_SIZE; // For children address - size += getShortcutListSize(ptNode.mShortcutTargets); - if (null != ptNode.mBigrams) { - size += (FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE - + FormatSpec.PTNODE_ATTRIBUTE_MAX_ADDRESS_SIZE) - * ptNode.mBigrams.size(); - } - return size; - } - - /** - * Compute the maximum size of each PtNode of a PtNode array, assuming 3-byte addresses for - * everything, and caches it in the `mCachedSize' member of the nodes; deduce the size of - * the containing node array, and cache it it its 'mCachedSize' member. - * - * @param ptNodeArray the node array to compute the maximum size of. - * @param options file format options. - */ - private static void calculatePtNodeArrayMaximumSize(final PtNodeArray ptNodeArray, - final FormatOptions options) { - int size = getPtNodeCountSize(ptNodeArray); - for (PtNode node : ptNodeArray.mData) { - final int nodeSize = getPtNodeMaximumSize(node, options); - node.mCachedSize = nodeSize; - size += nodeSize; - } - if (options.mSupportsDynamicUpdate) { - size += FormatSpec.FORWARD_LINK_ADDRESS_SIZE; - } - ptNodeArray.mCachedSize = size; - } - - /** - * Compute the size of the header (flag + [parent address] + characters size) of a PtNode. - * - * @param ptNode the PtNode of which to compute the size of the header - * @param options file format options. - */ - private static int getNodeHeaderSize(final PtNode ptNode, final FormatOptions options) { - if (BinaryDictIOUtils.supportsDynamicUpdate(options)) { - return FormatSpec.PTNODE_FLAGS_SIZE + FormatSpec.PARENT_ADDRESS_SIZE - + getPtNodeCharactersSize(ptNode); - } else { - return FormatSpec.PTNODE_FLAGS_SIZE + getPtNodeCharactersSize(ptNode); - } - } - - /** - * Compute the size, in bytes, that an address will occupy. - * - * This can be used either for children addresses (which are always positive) or for - * attribute, which may be positive or negative but - * store their sign bit separately. - * - * @param address the address - * @return the byte size. - */ - static int getByteSize(final int address) { - assert(address <= FormatSpec.UINT24_MAX); - if (!BinaryDictIOUtils.hasChildrenAddress(address)) { - return 0; - } else if (Math.abs(address) <= FormatSpec.UINT8_MAX) { - return 1; - } else if (Math.abs(address) <= FormatSpec.UINT16_MAX) { - return 2; - } else { - return 3; - } - } - - static int writeUIntToBuffer(final byte[] buffer, int position, final int value, - final int size) { - switch(size) { - case 4: - buffer[position++] = (byte) ((value >> 24) & 0xFF); - /* fall through */ - case 3: - buffer[position++] = (byte) ((value >> 16) & 0xFF); - /* fall through */ - case 2: - buffer[position++] = (byte) ((value >> 8) & 0xFF); - /* fall through */ - case 1: - buffer[position++] = (byte) (value & 0xFF); - break; - default: - /* nop */ - } - return position; - } - - static void writeUIntToStream(final OutputStream stream, final int value, final int size) - throws IOException { - switch(size) { - case 4: - stream.write((value >> 24) & 0xFF); - /* fall through */ - case 3: - stream.write((value >> 16) & 0xFF); - /* fall through */ - case 2: - stream.write((value >> 8) & 0xFF); - /* fall through */ - case 1: - stream.write(value & 0xFF); - break; - default: - /* nop */ - } - } - - // End utility methods - - // This method is responsible for finding a nice ordering of the nodes that favors run-time - // cache performance and dictionary size. - /* package for tests */ static ArrayList<PtNodeArray> flattenTree( - final PtNodeArray rootNodeArray) { - final int treeSize = FusionDictionary.countPtNodes(rootNodeArray); - MakedictLog.i("Counted nodes : " + treeSize); - final ArrayList<PtNodeArray> flatTree = new ArrayList<PtNodeArray>(treeSize); - return flattenTreeInner(flatTree, rootNodeArray); - } - - private static ArrayList<PtNodeArray> flattenTreeInner(final ArrayList<PtNodeArray> list, - final PtNodeArray ptNodeArray) { - // Removing the node is necessary if the tails are merged, because we would then - // add the same node several times when we only want it once. A number of places in - // the code also depends on any node being only once in the list. - // Merging tails can only be done if there are no attributes. Searching for attributes - // in LatinIME code depends on a total breadth-first ordering, which merging tails - // breaks. If there are no attributes, it should be fine (and reduce the file size) - // to merge tails, and removing the node from the list would be necessary. However, - // we don't merge tails because breaking the breadth-first ordering would result in - // extreme overhead at bigram lookup time (it would make the search function O(n) instead - // of the current O(log(n)), where n=number of nodes in the dictionary which is pretty - // high). - // If no nodes are ever merged, we can't have the same node twice in the list, hence - // searching for duplicates in unnecessary. It is also very performance consuming, - // since `list' is an ArrayList so it's an O(n) operation that runs on all nodes, making - // this simple list.remove operation O(n*n) overall. On Android this overhead is very - // high. - // For future reference, the code to remove duplicate is a simple : list.remove(node); - list.add(ptNodeArray); - final ArrayList<PtNode> branches = ptNodeArray.mData; - for (PtNode ptNode : branches) { - if (null != ptNode.mChildren) flattenTreeInner(list, ptNode.mChildren); - } - return list; - } - - /** - * Get the offset from a position inside a current node array to a target node array, during - * update. - * - * If the current node array is before the target node array, the target node array has not - * been updated yet, so we should return the offset from the old position of the current node - * array to the old position of the target node array. If on the other hand the target is - * before the current node array, it already has been updated, so we should return the offset - * from the new position in the current node array to the new position in the target node - * array. - * - * @param currentNodeArray node array containing the PtNode where the offset will be written - * @param offsetFromStartOfCurrentNodeArray offset, in bytes, from the start of currentNodeArray - * @param targetNodeArray the target node array to get the offset to - * @return the offset to the target node array - */ - private static int getOffsetToTargetNodeArrayDuringUpdate(final PtNodeArray currentNodeArray, - final int offsetFromStartOfCurrentNodeArray, final PtNodeArray targetNodeArray) { - final boolean isTargetBeforeCurrent = (targetNodeArray.mCachedAddressBeforeUpdate - < currentNodeArray.mCachedAddressBeforeUpdate); - if (isTargetBeforeCurrent) { - return targetNodeArray.mCachedAddressAfterUpdate - - (currentNodeArray.mCachedAddressAfterUpdate - + offsetFromStartOfCurrentNodeArray); - } else { - return targetNodeArray.mCachedAddressBeforeUpdate - - (currentNodeArray.mCachedAddressBeforeUpdate - + offsetFromStartOfCurrentNodeArray); - } - } - - /** - * Get the offset from a position inside a current node array to a target PtNode, during - * update. - * - * @param currentNodeArray node array containing the PtNode where the offset will be written - * @param offsetFromStartOfCurrentNodeArray offset, in bytes, from the start of currentNodeArray - * @param targetPtNode the target PtNode to get the offset to - * @return the offset to the target PtNode - */ - // TODO: is there any way to factorize this method with the one above? - private static int getOffsetToTargetPtNodeDuringUpdate(final PtNodeArray currentNodeArray, - final int offsetFromStartOfCurrentNodeArray, final PtNode targetPtNode) { - final int oldOffsetBasePoint = currentNodeArray.mCachedAddressBeforeUpdate - + offsetFromStartOfCurrentNodeArray; - final boolean isTargetBeforeCurrent = (targetPtNode.mCachedAddressBeforeUpdate - < oldOffsetBasePoint); - // If the target is before the current node array, then its address has already been - // updated. We can use the AfterUpdate member, and compare it to our own member after - // update. Otherwise, the AfterUpdate member is not updated yet, so we need to use the - // BeforeUpdate member, and of course we have to compare this to our own address before - // update. - if (isTargetBeforeCurrent) { - final int newOffsetBasePoint = currentNodeArray.mCachedAddressAfterUpdate - + offsetFromStartOfCurrentNodeArray; - return targetPtNode.mCachedAddressAfterUpdate - newOffsetBasePoint; - } else { - return targetPtNode.mCachedAddressBeforeUpdate - oldOffsetBasePoint; - } - } - - /** - * Computes the actual node array size, based on the cached addresses of the children nodes. - * - * Each node array stores its tentative address. During dictionary address computing, these - * are not final, but they can be used to compute the node array size (the node array size - * depends on the address of the children because the number of bytes necessary to store an - * address depends on its numeric value. The return value indicates whether the node array - * contents (as in, any of the addresses stored in the cache fields) have changed with - * respect to their previous value. - * - * @param ptNodeArray the node array to compute the size of. - * @param dict the dictionary in which the word/attributes are to be found. - * @param formatOptions file format options. - * @return false if none of the cached addresses inside the node array changed, true otherwise. - */ - private static boolean computeActualPtNodeArraySize(final PtNodeArray ptNodeArray, - final FusionDictionary dict, final FormatOptions formatOptions) { - boolean changed = false; - int size = getPtNodeCountSize(ptNodeArray); - for (PtNode ptNode : ptNodeArray.mData) { - ptNode.mCachedAddressAfterUpdate = ptNodeArray.mCachedAddressAfterUpdate + size; - if (ptNode.mCachedAddressAfterUpdate != ptNode.mCachedAddressBeforeUpdate) { - changed = true; - } - int nodeSize = getNodeHeaderSize(ptNode, formatOptions); - if (ptNode.isTerminal()) { - if (formatOptions.mHasTerminalId) { - nodeSize += FormatSpec.PTNODE_TERMINAL_ID_SIZE; - } else { - nodeSize += FormatSpec.PTNODE_FREQUENCY_SIZE; - } - } - if (formatOptions.mSupportsDynamicUpdate) { - nodeSize += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE; - } else if (null != ptNode.mChildren) { - nodeSize += getByteSize(getOffsetToTargetNodeArrayDuringUpdate(ptNodeArray, - nodeSize + size, ptNode.mChildren)); - } - if (formatOptions.mVersion < FormatSpec.FIRST_VERSION_WITH_TERMINAL_ID) { - nodeSize += getShortcutListSize(ptNode.mShortcutTargets); - if (null != ptNode.mBigrams) { - for (WeightedString bigram : ptNode.mBigrams) { - final int offset = getOffsetToTargetPtNodeDuringUpdate(ptNodeArray, - nodeSize + size + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE, - FusionDictionary.findWordInTree(dict.mRootNodeArray, bigram.mWord)); - nodeSize += getByteSize(offset) + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE; - } - } - } - ptNode.mCachedSize = nodeSize; - size += nodeSize; - } - if (formatOptions.mSupportsDynamicUpdate) { - size += FormatSpec.FORWARD_LINK_ADDRESS_SIZE; - } - if (ptNodeArray.mCachedSize != size) { - ptNodeArray.mCachedSize = size; - changed = true; - } - return changed; - } - - /** - * Initializes the cached addresses of node arrays and their containing nodes from their size. - * - * @param flatNodes the list of node arrays. - * @param formatOptions file format options. - * @return the byte size of the entire stack. - */ - private static int initializePtNodeArraysCachedAddresses(final ArrayList<PtNodeArray> flatNodes, - final FormatOptions formatOptions) { - int nodeArrayOffset = 0; - for (final PtNodeArray nodeArray : flatNodes) { - nodeArray.mCachedAddressBeforeUpdate = nodeArrayOffset; - int nodeCountSize = getPtNodeCountSize(nodeArray); - int nodeffset = 0; - for (final PtNode ptNode : nodeArray.mData) { - ptNode.mCachedAddressBeforeUpdate = ptNode.mCachedAddressAfterUpdate = - nodeCountSize + nodeArrayOffset + nodeffset; - nodeffset += ptNode.mCachedSize; - } - nodeArrayOffset += nodeArray.mCachedSize; - } - return nodeArrayOffset; - } - - /** - * Updates the cached addresses of node arrays after recomputing their new positions. - * - * @param flatNodes the list of node arrays. - */ - private static void updatePtNodeArraysCachedAddresses(final ArrayList<PtNodeArray> flatNodes) { - for (final PtNodeArray nodeArray : flatNodes) { - nodeArray.mCachedAddressBeforeUpdate = nodeArray.mCachedAddressAfterUpdate; - for (final PtNode ptNode : nodeArray.mData) { - ptNode.mCachedAddressBeforeUpdate = ptNode.mCachedAddressAfterUpdate; - } - } - } - - /** - * Compute the cached parent addresses after all has been updated. - * - * The parent addresses are used by some binary formats at write-to-disk time. Not all formats - * need them. In particular, version 2 does not need them, and version 3 does. - * - * @param flatNodes the flat array of node arrays to fill in - */ - private static void computeParentAddresses(final ArrayList<PtNodeArray> flatNodes) { - for (final PtNodeArray nodeArray : flatNodes) { - for (final PtNode ptNode : nodeArray.mData) { - if (null != ptNode.mChildren) { - // Assign my address to children's parent address - // Here BeforeUpdate and AfterUpdate addresses have the same value, so it - // does not matter which we use. - ptNode.mChildren.mCachedParentAddress = ptNode.mCachedAddressAfterUpdate - - ptNode.mChildren.mCachedAddressAfterUpdate; - } - } - } - } - - /** - * Compute the addresses and sizes of an ordered list of PtNode arrays. - * - * This method takes a list of PtNode arrays and will update their cached address and size - * values so that they can be written into a file. It determines the smallest size each of the - * PtNode arrays can be given the addresses of its children and attributes, and store that into - * each PtNode. - * The order of the PtNode is given by the order of the array. This method makes no effort - * to find a good order; it only mechanically computes the size this order results in. - * - * @param dict the dictionary - * @param flatNodes the ordered list of PtNode arrays - * @param formatOptions file format options. - * @return the same array it was passed. The nodes have been updated for address and size. - */ - /* package */ static ArrayList<PtNodeArray> computeAddresses(final FusionDictionary dict, - final ArrayList<PtNodeArray> flatNodes, final FormatOptions formatOptions) { - // First get the worst possible sizes and offsets - for (final PtNodeArray n : flatNodes) calculatePtNodeArrayMaximumSize(n, formatOptions); - final int offset = initializePtNodeArraysCachedAddresses(flatNodes, formatOptions); - - MakedictLog.i("Compressing the array addresses. Original size : " + offset); - MakedictLog.i("(Recursively seen size : " + offset + ")"); - - int passes = 0; - boolean changesDone = false; - do { - changesDone = false; - int ptNodeArrayStartOffset = 0; - for (final PtNodeArray ptNodeArray : flatNodes) { - ptNodeArray.mCachedAddressAfterUpdate = ptNodeArrayStartOffset; - final int oldNodeArraySize = ptNodeArray.mCachedSize; - final boolean changed = - computeActualPtNodeArraySize(ptNodeArray, dict, formatOptions); - final int newNodeArraySize = ptNodeArray.mCachedSize; - if (oldNodeArraySize < newNodeArraySize) { - throw new RuntimeException("Increased size ?!"); - } - ptNodeArrayStartOffset += newNodeArraySize; - changesDone |= changed; - } - updatePtNodeArraysCachedAddresses(flatNodes); - ++passes; - if (passes > MAX_PASSES) throw new RuntimeException("Too many passes - probably a bug"); - } while (changesDone); - - if (formatOptions.mSupportsDynamicUpdate) { - computeParentAddresses(flatNodes); - } - final PtNodeArray lastPtNodeArray = flatNodes.get(flatNodes.size() - 1); - MakedictLog.i("Compression complete in " + passes + " passes."); - MakedictLog.i("After address compression : " - + (lastPtNodeArray.mCachedAddressAfterUpdate + lastPtNodeArray.mCachedSize)); - - return flatNodes; - } - - /** - * Sanity-checking method. - * - * This method checks a list of PtNode arrays for juxtaposition, that is, it will do - * nothing if each node array's cached address is actually the previous node array's address - * plus the previous node's size. - * If this is not the case, it will throw an exception. - * - * @param arrays the list of node arrays to check - */ - /* package */ static void checkFlatPtNodeArrayList(final ArrayList<PtNodeArray> arrays) { - int offset = 0; - int index = 0; - for (final PtNodeArray ptNodeArray : arrays) { - // BeforeUpdate and AfterUpdate addresses are the same here, so it does not matter - // which we use. - if (ptNodeArray.mCachedAddressAfterUpdate != offset) { - throw new RuntimeException("Wrong address for node " + index - + " : expected " + offset + ", got " + - ptNodeArray.mCachedAddressAfterUpdate); - } - ++index; - offset += ptNodeArray.mCachedSize; - } - } - - /** - * Helper method to write a children position to a file. - * - * @param buffer the buffer to write to. - * @param index the index in the buffer to write the address to. - * @param position the position to write. - * @return the size in bytes the address actually took. - */ - /* package */ static int writeChildrenPosition(final byte[] buffer, int index, - final int position) { - switch (getByteSize(position)) { - case 1: - buffer[index++] = (byte)position; - return 1; - case 2: - buffer[index++] = (byte)(0xFF & (position >> 8)); - buffer[index++] = (byte)(0xFF & position); - return 2; - case 3: - buffer[index++] = (byte)(0xFF & (position >> 16)); - buffer[index++] = (byte)(0xFF & (position >> 8)); - buffer[index++] = (byte)(0xFF & position); - return 3; - case 0: - return 0; - default: - throw new RuntimeException("Position " + position + " has a strange size"); - } - } - - /** - * Helper method to write a signed children position to a file. - * - * @param buffer the buffer to write to. - * @param index the index in the buffer to write the address to. - * @param position the position to write. - * @return the size in bytes the address actually took. - */ - /* package */ static int writeSignedChildrenPosition(final byte[] buffer, int index, - final int position) { - if (!BinaryDictIOUtils.hasChildrenAddress(position)) { - buffer[index] = buffer[index + 1] = buffer[index + 2] = 0; - } else { - final int absPosition = Math.abs(position); - buffer[index++] = - (byte)((position < 0 ? FormatSpec.MSB8 : 0) | (0xFF & (absPosition >> 16))); - buffer[index++] = (byte)(0xFF & (absPosition >> 8)); - buffer[index++] = (byte)(0xFF & absPosition); - } - return 3; - } - - /** - * Makes the flag value for a PtNode. - * - * @param hasMultipleChars whether the PtNode has multiple chars. - * @param isTerminal whether the PtNode is terminal. - * @param childrenAddressSize the size of a children address. - * @param hasShortcuts whether the PtNode has shortcuts. - * @param hasBigrams whether the PtNode has bigrams. - * @param isNotAWord whether the PtNode is not a word. - * @param isBlackListEntry whether the PtNode is a blacklist entry. - * @param formatOptions file format options. - * @return the flags - */ - static int makePtNodeFlags(final boolean hasMultipleChars, final boolean isTerminal, - final int childrenAddressSize, final boolean hasShortcuts, final boolean hasBigrams, - final boolean isNotAWord, final boolean isBlackListEntry, - final FormatOptions formatOptions) { - byte flags = 0; - if (hasMultipleChars) flags |= FormatSpec.FLAG_HAS_MULTIPLE_CHARS; - if (isTerminal) flags |= FormatSpec.FLAG_IS_TERMINAL; - if (formatOptions.mSupportsDynamicUpdate) { - flags |= FormatSpec.FLAG_IS_NOT_MOVED; - } else if (true) { - switch (childrenAddressSize) { - case 1: - flags |= FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE; - break; - case 2: - flags |= FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES; - break; - case 3: - flags |= FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES; - break; - case 0: - flags |= FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS; - break; - default: - throw new RuntimeException("Node with a strange address"); - } - } - if (hasShortcuts) flags |= FormatSpec.FLAG_HAS_SHORTCUT_TARGETS; - if (hasBigrams) flags |= FormatSpec.FLAG_HAS_BIGRAMS; - if (isNotAWord) flags |= FormatSpec.FLAG_IS_NOT_A_WORD; - if (isBlackListEntry) flags |= FormatSpec.FLAG_IS_BLACKLISTED; - return flags; - } - - /* package */ static byte makePtNodeFlags(final PtNode node, final int childrenOffset, - final FormatOptions formatOptions) { - return (byte) makePtNodeFlags(node.mChars.length > 1, node.mFrequency >= 0, - getByteSize(childrenOffset), - node.mShortcutTargets != null && !node.mShortcutTargets.isEmpty(), - node.mBigrams != null, node.mIsNotAWord, node.mIsBlacklistEntry, formatOptions); - } - - /** - * Makes the flag value for a bigram. - * - * @param more whether there are more bigrams after this one. - * @param offset the offset of the bigram. - * @param bigramFrequency the frequency of the bigram, 0..255. - * @param unigramFrequency the unigram frequency of the same word, 0..255. - * @param word the second bigram, for debugging purposes - * @return the flags - */ - /* package */ static final int makeBigramFlags(final boolean more, final int offset, - int bigramFrequency, final int unigramFrequency, final String word) { - int bigramFlags = (more ? FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT : 0) - + (offset < 0 ? FormatSpec.FLAG_BIGRAM_ATTR_OFFSET_NEGATIVE : 0); - switch (getByteSize(offset)) { - case 1: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE; - break; - case 2: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES; - break; - case 3: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES; - break; - default: - throw new RuntimeException("Strange offset size"); - } - if (unigramFrequency > bigramFrequency) { - MakedictLog.e("Unigram freq is superior to bigram freq for \"" + word - + "\". Bigram freq is " + bigramFrequency + ", unigram freq for " - + word + " is " + unigramFrequency); - bigramFrequency = unigramFrequency; - } - // We compute the difference between 255 (which means probability = 1) and the - // unigram score. We split this into a number of discrete steps. - // Now, the steps are numbered 0~15; 0 represents an increase of 1 step while 15 - // represents an increase of 16 steps: a value of 15 will be interpreted as the median - // value of the 16th step. In all justice, if the bigram frequency is low enough to be - // rounded below the first step (which means it is less than half a step higher than the - // unigram frequency) then the unigram frequency itself is the best approximation of the - // bigram freq that we could possibly supply, hence we should *not* include this bigram - // in the file at all. - // until this is done, we'll write 0 and slightly overestimate this case. - // In other words, 0 means "between 0.5 step and 1.5 step", 1 means "between 1.5 step - // and 2.5 steps", and 15 means "between 15.5 steps and 16.5 steps". So we want to - // divide our range [unigramFreq..MAX_TERMINAL_FREQUENCY] in 16.5 steps to get the - // step size. Then we compute the start of the first step (the one where value 0 starts) - // by adding half-a-step to the unigramFrequency. From there, we compute the integer - // number of steps to the bigramFrequency. One last thing: we want our steps to include - // their lower bound and exclude their higher bound so we need to have the first step - // start at exactly 1 unit higher than floor(unigramFreq + half a step). - // Note : to reconstruct the score, the dictionary reader will need to divide - // MAX_TERMINAL_FREQUENCY - unigramFreq by 16.5 likewise to get the value of the step, - // and add (discretizedFrequency + 0.5 + 0.5) times this value to get the best - // approximation. (0.5 to get the first step start, and 0.5 to get the middle of the - // step pointed by the discretized frequency. - final float stepSize = - (FormatSpec.MAX_TERMINAL_FREQUENCY - unigramFrequency) - / (1.5f + FormatSpec.MAX_BIGRAM_FREQUENCY); - final float firstStepStart = 1 + unigramFrequency + (stepSize / 2.0f); - final int discretizedFrequency = (int)((bigramFrequency - firstStepStart) / stepSize); - // If the bigram freq is less than half-a-step higher than the unigram freq, we get -1 - // here. The best approximation would be the unigram freq itself, so we should not - // include this bigram in the dictionary. For now, register as 0, and live with the - // small over-estimation that we get in this case. TODO: actually remove this bigram - // if discretizedFrequency < 0. - final int finalBigramFrequency = discretizedFrequency > 0 ? discretizedFrequency : 0; - bigramFlags += finalBigramFrequency & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY; - return bigramFlags; - } - - /** - * Makes the 2-byte value for options flags. - */ - private static final int makeOptionsValue(final FusionDictionary dictionary, - final FormatOptions formatOptions) { - final DictionaryOptions options = dictionary.mOptions; - final boolean hasBigrams = dictionary.hasBigrams(); - return (options.mFrenchLigatureProcessing ? FormatSpec.FRENCH_LIGATURE_PROCESSING_FLAG : 0) - + (options.mGermanUmlautProcessing ? FormatSpec.GERMAN_UMLAUT_PROCESSING_FLAG : 0) - + (hasBigrams ? FormatSpec.CONTAINS_BIGRAMS_FLAG : 0) - + (formatOptions.mSupportsDynamicUpdate ? FormatSpec.SUPPORTS_DYNAMIC_UPDATE : 0); - } - - /** - * Makes the flag value for a shortcut. - * - * @param more whether there are more attributes after this one. - * @param frequency the frequency of the attribute, 0..15 - * @return the flags - */ - static final int makeShortcutFlags(final boolean more, final int frequency) { - return (more ? FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT : 0) - + (frequency & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY); - } - - /* package */ static final int writeParentAddress(final byte[] buffer, final int index, - final int address, final FormatOptions formatOptions) { - if (BinaryDictIOUtils.supportsDynamicUpdate(formatOptions)) { - if (address == FormatSpec.NO_PARENT_ADDRESS) { - buffer[index] = buffer[index + 1] = buffer[index + 2] = 0; - } else { - final int absAddress = Math.abs(address); - assert(absAddress <= FormatSpec.SINT24_MAX); - buffer[index] = (byte)((address < 0 ? FormatSpec.MSB8 : 0) - | ((absAddress >> 16) & 0xFF)); - buffer[index + 1] = (byte)((absAddress >> 8) & 0xFF); - buffer[index + 2] = (byte)(absAddress & 0xFF); - } - return index + 3; - } else { - return index; - } - } - - /* package */ static final int getChildrenPosition(final PtNode ptNode, - final FormatOptions formatOptions) { - int positionOfChildrenPosField = ptNode.mCachedAddressAfterUpdate - + getNodeHeaderSize(ptNode, formatOptions); - if (ptNode.isTerminal()) { - // A terminal node has either the terminal id or the frequency. - // If positionOfChildrenPosField is incorrect, we may crash when jumping to the children - // position. - if (formatOptions.mHasTerminalId) { - positionOfChildrenPosField += FormatSpec.PTNODE_TERMINAL_ID_SIZE; - } else { - positionOfChildrenPosField += FormatSpec.PTNODE_FREQUENCY_SIZE; - } - } - return null == ptNode.mChildren ? FormatSpec.NO_CHILDREN_ADDRESS - : ptNode.mChildren.mCachedAddressAfterUpdate - positionOfChildrenPosField; - } - - /** - * Write a PtNodeArray. The PtNodeArray is expected to have its final position cached. - * - * @param dict the dictionary the node array is a part of (for relative offsets). - * @param dictEncoder the dictionary encoder. - * @param ptNodeArray the node array to write. - * @param formatOptions file format options. - */ - @SuppressWarnings("unused") - /* package */ static void writePlacedPtNodeArray(final FusionDictionary dict, - final DictEncoder dictEncoder, final PtNodeArray ptNodeArray, - final FormatOptions formatOptions) { - // TODO: Make the code in common with BinaryDictIOUtils#writePtNode - dictEncoder.setPosition(ptNodeArray.mCachedAddressAfterUpdate); - - final int ptNodeCount = ptNodeArray.mData.size(); - dictEncoder.writePtNodeCount(ptNodeCount); - final int parentPosition = - (ptNodeArray.mCachedParentAddress == FormatSpec.NO_PARENT_ADDRESS) - ? FormatSpec.NO_PARENT_ADDRESS - : ptNodeArray.mCachedParentAddress + ptNodeArray.mCachedAddressAfterUpdate; - for (int i = 0; i < ptNodeCount; ++i) { - final PtNode ptNode = ptNodeArray.mData.get(i); - if (dictEncoder.getPosition() != ptNode.mCachedAddressAfterUpdate) { - throw new RuntimeException("Bug: write index is not the same as the cached address " - + "of the node : " + dictEncoder.getPosition() + " <> " - + ptNode.mCachedAddressAfterUpdate); - } - // Sanity checks. - if (DBG && ptNode.mFrequency > FormatSpec.MAX_TERMINAL_FREQUENCY) { - throw new RuntimeException("A node has a frequency > " - + FormatSpec.MAX_TERMINAL_FREQUENCY - + " : " + ptNode.mFrequency); - } - dictEncoder.writePtNode(ptNode, parentPosition, formatOptions, dict); - } - if (formatOptions.mSupportsDynamicUpdate) { - dictEncoder.writeForwardLinkAddress(FormatSpec.NO_FORWARD_LINK_ADDRESS); - } - if (dictEncoder.getPosition() != ptNodeArray.mCachedAddressAfterUpdate - + ptNodeArray.mCachedSize) { - throw new RuntimeException("Not the same size : written " - + (dictEncoder.getPosition() - ptNodeArray.mCachedAddressAfterUpdate) - + " bytes from a node that should have " + ptNodeArray.mCachedSize + " bytes"); - } - } - - /** - * Dumps a collection of useful statistics about a list of PtNode arrays. - * - * This prints purely informative stuff, like the total estimated file size, the - * number of PtNode arrays, of PtNodes, the repartition of each address size, etc - * - * @param ptNodeArrays the list of PtNode arrays. - */ - /* package */ static void showStatistics(ArrayList<PtNodeArray> ptNodeArrays) { - int firstTerminalAddress = Integer.MAX_VALUE; - int lastTerminalAddress = Integer.MIN_VALUE; - int size = 0; - int ptNodes = 0; - int maxNodes = 0; - int maxRuns = 0; - for (final PtNodeArray ptNodeArray : ptNodeArrays) { - if (maxNodes < ptNodeArray.mData.size()) maxNodes = ptNodeArray.mData.size(); - for (final PtNode ptNode : ptNodeArray.mData) { - ++ptNodes; - if (ptNode.mChars.length > maxRuns) maxRuns = ptNode.mChars.length; - if (ptNode.mFrequency >= 0) { - if (ptNodeArray.mCachedAddressAfterUpdate < firstTerminalAddress) - firstTerminalAddress = ptNodeArray.mCachedAddressAfterUpdate; - if (ptNodeArray.mCachedAddressAfterUpdate > lastTerminalAddress) - lastTerminalAddress = ptNodeArray.mCachedAddressAfterUpdate; - } - } - if (ptNodeArray.mCachedAddressAfterUpdate + ptNodeArray.mCachedSize > size) { - size = ptNodeArray.mCachedAddressAfterUpdate + ptNodeArray.mCachedSize; - } - } - final int[] ptNodeCounts = new int[maxNodes + 1]; - final int[] runCounts = new int[maxRuns + 1]; - for (final PtNodeArray ptNodeArray : ptNodeArrays) { - ++ptNodeCounts[ptNodeArray.mData.size()]; - for (final PtNode ptNode : ptNodeArray.mData) { - ++runCounts[ptNode.mChars.length]; - } - } - - MakedictLog.i("Statistics:\n" - + " total file size " + size + "\n" - + " " + ptNodeArrays.size() + " node arrays\n" - + " " + ptNodes + " PtNodes (" + ((float)ptNodes / ptNodeArrays.size()) - + " PtNodes per node)\n" - + " first terminal at " + firstTerminalAddress + "\n" - + " last terminal at " + lastTerminalAddress + "\n" - + " PtNode stats : max = " + maxNodes); - for (int i = 0; i < ptNodeCounts.length; ++i) { - MakedictLog.i(" " + i + " : " + ptNodeCounts[i]); - } - MakedictLog.i(" Character run stats : max = " + maxRuns); - for (int i = 0; i < runCounts.length; ++i) { - MakedictLog.i(" " + i + " : " + runCounts[i]); - } - } - - /** - * Writes a file header to an output stream. - * - * @param destination the stream to write the file header to. - * @param dict the dictionary to write. - * @param formatOptions file format options. - * @return the size of the header. - */ - /* package */ static int writeDictionaryHeader(final OutputStream destination, - final FusionDictionary dict, final FormatOptions formatOptions) - throws IOException, UnsupportedFormatException { - final int version = formatOptions.mVersion; - if (version < FormatSpec.MINIMUM_SUPPORTED_VERSION - || version > FormatSpec.MAXIMUM_SUPPORTED_VERSION) { - throw new UnsupportedFormatException("Requested file format version " + version - + ", but this implementation only supports versions " - + FormatSpec.MINIMUM_SUPPORTED_VERSION + " through " - + FormatSpec.MAXIMUM_SUPPORTED_VERSION); - } - - ByteArrayOutputStream headerBuffer = new ByteArrayOutputStream(256); - - // The magic number in big-endian order. - // Magic number for all versions. - headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 24))); - headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 16))); - headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 8))); - headerBuffer.write((byte) (0xFF & FormatSpec.MAGIC_NUMBER)); - // Dictionary version. - headerBuffer.write((byte) (0xFF & (version >> 8))); - headerBuffer.write((byte) (0xFF & version)); - - // Options flags - final int options = makeOptionsValue(dict, formatOptions); - headerBuffer.write((byte) (0xFF & (options >> 8))); - headerBuffer.write((byte) (0xFF & options)); - final int headerSizeOffset = headerBuffer.size(); - // Placeholder to be written later with header size. - for (int i = 0; i < 4; ++i) { - headerBuffer.write(0); - } - // Write out the options. - for (final String key : dict.mOptions.mAttributes.keySet()) { - final String value = dict.mOptions.mAttributes.get(key); - CharEncoding.writeString(headerBuffer, key); - CharEncoding.writeString(headerBuffer, value); - } - final int size = headerBuffer.size(); - final byte[] bytes = headerBuffer.toByteArray(); - // Write out the header size. - bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24)); - bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16)); - bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8)); - bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0)); - destination.write(bytes); - - headerBuffer.close(); - return size; - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java deleted file mode 100644 index d5516ef46..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; -import com.android.inputmethod.latin.utils.ByteArrayDictBuffer; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; -import java.util.Stack; - -public final class BinaryDictIOUtils { - private static final boolean DBG = false; - - private BinaryDictIOUtils() { - // This utility class is not publicly instantiable. - } - - private static final class Position { - public static final int NOT_READ_PTNODE_COUNT = -1; - - public int mAddress; - public int mNumOfPtNode; - public int mPosition; - public int mLength; - - public Position(int address, int length) { - mAddress = address; - mLength = length; - mNumOfPtNode = NOT_READ_PTNODE_COUNT; - } - } - - /** - * Retrieves all node arrays without recursive call. - */ - private static void readUnigramsAndBigramsBinaryInner(final DictDecoder dictDecoder, - final int headerSize, final Map<Integer, String> words, - final Map<Integer, Integer> frequencies, - final Map<Integer, ArrayList<PendingAttribute>> bigrams, - final FormatOptions formatOptions) { - int[] pushedChars = new int[FormatSpec.MAX_WORD_LENGTH + 1]; - - Stack<Position> stack = new Stack<Position>(); - int index = 0; - - Position initPos = new Position(headerSize, 0); - stack.push(initPos); - - while (!stack.empty()) { - Position p = stack.peek(); - - if (DBG) { - MakedictLog.d("read: address=" + p.mAddress + ", numOfPtNode=" + - p.mNumOfPtNode + ", position=" + p.mPosition + ", length=" + p.mLength); - } - - if (dictDecoder.getPosition() != p.mAddress) dictDecoder.setPosition(p.mAddress); - if (index != p.mLength) index = p.mLength; - - if (p.mNumOfPtNode == Position.NOT_READ_PTNODE_COUNT) { - p.mNumOfPtNode = dictDecoder.readPtNodeCount(); - p.mAddress += getPtNodeCountSize(p.mNumOfPtNode); - p.mPosition = 0; - } - if (p.mNumOfPtNode == 0) { - stack.pop(); - continue; - } - PtNodeInfo info = dictDecoder.readPtNode(p.mAddress, formatOptions); - for (int i = 0; i < info.mCharacters.length; ++i) { - pushedChars[index++] = info.mCharacters[i]; - } - p.mPosition++; - - final boolean isMovedPtNode = isMovedPtNode(info.mFlags, - formatOptions); - final boolean isDeletedPtNode = isDeletedPtNode(info.mFlags, - formatOptions); - if (!isMovedPtNode && !isDeletedPtNode - && info.mFrequency != FusionDictionary.PtNode.NOT_A_TERMINAL) {// found word - words.put(info.mOriginalAddress, new String(pushedChars, 0, index)); - frequencies.put(info.mOriginalAddress, info.mFrequency); - if (info.mBigrams != null) bigrams.put(info.mOriginalAddress, info.mBigrams); - } - - if (p.mPosition == p.mNumOfPtNode) { - if (formatOptions.mSupportsDynamicUpdate) { - final boolean hasValidForwardLinkAddress = - dictDecoder.readAndFollowForwardLink(); - if (hasValidForwardLinkAddress && dictDecoder.hasNextPtNodeArray()) { - // The node array has a forward link. - p.mNumOfPtNode = Position.NOT_READ_PTNODE_COUNT; - p.mAddress = dictDecoder.getPosition(); - } else { - stack.pop(); - } - } else { - stack.pop(); - } - } else { - // The Ptnode array has more PtNodes. - p.mAddress = dictDecoder.getPosition(); - } - - if (!isMovedPtNode && hasChildrenAddress(info.mChildrenAddress)) { - final Position childrenPos = new Position(info.mChildrenAddress, index); - stack.push(childrenPos); - } - } - } - - /** - * Reads unigrams and bigrams from the binary file. - * Doesn't store a full memory representation of the dictionary. - * - * @param dictDecoder the dict decoder. - * @param words the map to store the address as a key and the word as a value. - * @param frequencies the map to store the address as a key and the frequency as a value. - * @param bigrams the map to store the address as a key and the list of address as a value. - * @throws IOException if the file can't be read. - * @throws UnsupportedFormatException if the format of the file is not recognized. - */ - /* package */ static void readUnigramsAndBigramsBinary(final DictDecoder dictDecoder, - final Map<Integer, String> words, final Map<Integer, Integer> frequencies, - final Map<Integer, ArrayList<PendingAttribute>> bigrams) throws IOException, - UnsupportedFormatException { - // Read header - final FileHeader header = dictDecoder.readHeader(); - readUnigramsAndBigramsBinaryInner(dictDecoder, header.mHeaderSize, words, - frequencies, bigrams, header.mFormatOptions); - } - - /** - * Gets the address of the last PtNode of the exact matching word in the dictionary. - * If no match is found, returns NOT_VALID_WORD. - * - * @param dictDecoder the dict decoder. - * @param word the word we search for. - * @return the address of the terminal node. - * @throws IOException if the file can't be read. - * @throws UnsupportedFormatException if the format of the file is not recognized. - */ - @UsedForTesting - /* package */ static int getTerminalPosition(final DictDecoder dictDecoder, - final String word) throws IOException, UnsupportedFormatException { - if (word == null) return FormatSpec.NOT_VALID_WORD; - dictDecoder.setPosition(0); - - final FileHeader header = dictDecoder.readHeader(); - int wordPos = 0; - final int wordLen = word.codePointCount(0, word.length()); - for (int depth = 0; depth < Constants.DICTIONARY_MAX_WORD_LENGTH; ++depth) { - if (wordPos >= wordLen) return FormatSpec.NOT_VALID_WORD; - - do { - final int ptNodeCount = dictDecoder.readPtNodeCount(); - boolean foundNextPtNode = false; - for (int i = 0; i < ptNodeCount; ++i) { - final int ptNodePos = dictDecoder.getPosition(); - final PtNodeInfo currentInfo = dictDecoder.readPtNode(ptNodePos, - header.mFormatOptions); - final boolean isMovedNode = isMovedPtNode(currentInfo.mFlags, - header.mFormatOptions); - final boolean isDeletedNode = isDeletedPtNode(currentInfo.mFlags, - header.mFormatOptions); - if (isMovedNode) continue; - boolean same = true; - for (int p = 0, j = word.offsetByCodePoints(0, wordPos); - p < currentInfo.mCharacters.length; - ++p, j = word.offsetByCodePoints(j, 1)) { - if (wordPos + p >= wordLen - || word.codePointAt(j) != currentInfo.mCharacters[p]) { - same = false; - break; - } - } - - if (same) { - // found the PtNode matches the word. - if (wordPos + currentInfo.mCharacters.length == wordLen) { - if (currentInfo.mFrequency == PtNode.NOT_A_TERMINAL - || isDeletedNode) { - return FormatSpec.NOT_VALID_WORD; - } else { - return ptNodePos; - } - } - wordPos += currentInfo.mCharacters.length; - if (currentInfo.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS) { - return FormatSpec.NOT_VALID_WORD; - } - foundNextPtNode = true; - dictDecoder.setPosition(currentInfo.mChildrenAddress); - break; - } - } - - // If we found the next PtNode, it is under the file pointer. - // But if not, we are at the end of this node array so we expect to have - // a forward link address that we need to consult and possibly resume - // search on the next node array in the linked list. - if (foundNextPtNode) break; - if (!header.mFormatOptions.mSupportsDynamicUpdate) { - return FormatSpec.NOT_VALID_WORD; - } - - final boolean hasValidForwardLinkAddress = - dictDecoder.readAndFollowForwardLink(); - if (!hasValidForwardLinkAddress || !dictDecoder.hasNextPtNodeArray()) { - return FormatSpec.NOT_VALID_WORD; - } - } while(true); - } - return FormatSpec.NOT_VALID_WORD; - } - - /** - * @return the size written, in bytes. Always 3 bytes. - */ - static int writeSInt24ToBuffer(final DictBuffer dictBuffer, - final int value) { - final int absValue = Math.abs(value); - dictBuffer.put((byte)(((value < 0 ? 0x80 : 0) | (absValue >> 16)) & 0xFF)); - dictBuffer.put((byte)((absValue >> 8) & 0xFF)); - dictBuffer.put((byte)(absValue & 0xFF)); - return 3; - } - - /** - * @return the size written, in bytes. Always 3 bytes. - */ - static int writeSInt24ToStream(final OutputStream destination, final int value) - throws IOException { - final int absValue = Math.abs(value); - destination.write((byte)(((value < 0 ? 0x80 : 0) | (absValue >> 16)) & 0xFF)); - destination.write((byte)((absValue >> 8) & 0xFF)); - destination.write((byte)(absValue & 0xFF)); - return 3; - } - - /** - * @return the size written, in bytes. 1, 2, or 3 bytes. - */ - private static int writeVariableAddress(final OutputStream destination, final int value) - throws IOException { - switch (BinaryDictEncoderUtils.getByteSize(value)) { - case 1: - destination.write((byte)value); - break; - case 2: - destination.write((byte)(0xFF & (value >> 8))); - destination.write((byte)(0xFF & value)); - break; - case 3: - destination.write((byte)(0xFF & (value >> 16))); - destination.write((byte)(0xFF & (value >> 8))); - destination.write((byte)(0xFF & value)); - break; - } - return BinaryDictEncoderUtils.getByteSize(value); - } - - static void skipString(final DictBuffer dictBuffer, - final boolean hasMultipleChars) { - if (hasMultipleChars) { - int character = CharEncoding.readChar(dictBuffer); - while (character != FormatSpec.INVALID_CHARACTER) { - character = CharEncoding.readChar(dictBuffer); - } - } else { - CharEncoding.readChar(dictBuffer); - } - } - - /** - * Write a string to a stream. - * - * @param destination the stream to write. - * @param word the string to be written. - * @return the size written, in bytes. - * @throws IOException - */ - private static int writeString(final OutputStream destination, final String word) - throws IOException { - int size = 0; - final int length = word.length(); - for (int i = 0; i < length; i = word.offsetByCodePoints(i, 1)) { - final int codePoint = word.codePointAt(i); - if (CharEncoding.getCharSize(codePoint) == 1) { - destination.write((byte)codePoint); - size++; - } else { - destination.write((byte)(0xFF & (codePoint >> 16))); - destination.write((byte)(0xFF & (codePoint >> 8))); - destination.write((byte)(0xFF & codePoint)); - size += 3; - } - } - destination.write((byte)FormatSpec.PTNODE_CHARACTERS_TERMINATOR); - size += FormatSpec.PTNODE_TERMINATOR_SIZE; - return size; - } - - /** - * Write a PtNode to an output stream from a PtNodeInfo. - * A PtNode is an in-memory representation of a node in the patricia trie. - * A PtNode info is a container for low-level information about how the - * PtNode is stored in the binary format. - * - * @param destination the stream to write. - * @param info the PtNode info to be written. - * @return the size written, in bytes. - */ - private static int writePtNode(final OutputStream destination, final PtNodeInfo info) - throws IOException { - int size = FormatSpec.PTNODE_FLAGS_SIZE; - destination.write((byte)info.mFlags); - final int parentOffset = info.mParentAddress == FormatSpec.NO_PARENT_ADDRESS ? - FormatSpec.NO_PARENT_ADDRESS : info.mParentAddress - info.mOriginalAddress; - size += writeSInt24ToStream(destination, parentOffset); - - for (int i = 0; i < info.mCharacters.length; ++i) { - if (CharEncoding.getCharSize(info.mCharacters[i]) == 1) { - destination.write((byte)info.mCharacters[i]); - size++; - } else { - size += writeSInt24ToStream(destination, info.mCharacters[i]); - } - } - if (info.mCharacters.length > 1) { - destination.write((byte)FormatSpec.PTNODE_CHARACTERS_TERMINATOR); - size++; - } - - if ((info.mFlags & FormatSpec.FLAG_IS_TERMINAL) != 0) { - destination.write((byte)info.mFrequency); - size++; - } - - if (DBG) { - MakedictLog.d("writePtNode origin=" + info.mOriginalAddress + ", size=" + size - + ", child=" + info.mChildrenAddress + ", characters =" - + new String(info.mCharacters, 0, info.mCharacters.length)); - } - final int childrenOffset = info.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS ? - 0 : info.mChildrenAddress - (info.mOriginalAddress + size); - writeSInt24ToStream(destination, childrenOffset); - size += FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE; - - if (info.mShortcutTargets != null && info.mShortcutTargets.size() > 0) { - final int shortcutListSize = - BinaryDictEncoderUtils.getShortcutListSize(info.mShortcutTargets); - destination.write((byte)(shortcutListSize >> 8)); - destination.write((byte)(shortcutListSize & 0xFF)); - size += 2; - final Iterator<WeightedString> shortcutIterator = info.mShortcutTargets.iterator(); - while (shortcutIterator.hasNext()) { - final WeightedString target = shortcutIterator.next(); - destination.write((byte)BinaryDictEncoderUtils.makeShortcutFlags( - shortcutIterator.hasNext(), target.mFrequency)); - size++; - size += writeString(destination, target.mWord); - } - } - - if (info.mBigrams != null) { - // TODO: Consolidate this code with the code that computes the size of the bigram list - // in BinaryDictEncoderUtils#computeActualNodeArraySize - for (int i = 0; i < info.mBigrams.size(); ++i) { - - final int bigramFrequency = info.mBigrams.get(i).mFrequency; - int bigramFlags = (i < info.mBigrams.size() - 1) - ? FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT : 0; - size++; - final int bigramOffset = info.mBigrams.get(i).mAddress - (info.mOriginalAddress - + size); - bigramFlags |= (bigramOffset < 0) ? FormatSpec.FLAG_BIGRAM_ATTR_OFFSET_NEGATIVE : 0; - switch (BinaryDictEncoderUtils.getByteSize(bigramOffset)) { - case 1: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE; - break; - case 2: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES; - break; - case 3: - bigramFlags |= FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES; - break; - } - bigramFlags |= bigramFrequency & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY; - destination.write((byte)bigramFlags); - size += writeVariableAddress(destination, Math.abs(bigramOffset)); - } - } - return size; - } - - /** - * Compute the size of the PtNode. - */ - static int computePtNodeSize(final PtNodeInfo info, final FormatOptions formatOptions) { - int size = FormatSpec.PTNODE_FLAGS_SIZE + FormatSpec.PARENT_ADDRESS_SIZE - + BinaryDictEncoderUtils.getPtNodeCharactersSize(info.mCharacters) - + getChildrenAddressSize(info.mFlags, formatOptions); - if ((info.mFlags & FormatSpec.FLAG_IS_TERMINAL) != 0) { - size += FormatSpec.PTNODE_FREQUENCY_SIZE; - } - if (info.mShortcutTargets != null && !info.mShortcutTargets.isEmpty()) { - size += BinaryDictEncoderUtils.getShortcutListSize(info.mShortcutTargets); - } - if (info.mBigrams != null) { - for (final PendingAttribute attr : info.mBigrams) { - size += FormatSpec.PTNODE_FLAGS_SIZE; - size += BinaryDictEncoderUtils.getByteSize(attr.mAddress); - } - } - return size; - } - - /** - * Write a node array to the stream. - * - * @param destination the stream to write. - * @param infos an array of PtNodeInfo to be written. - * @return the size written, in bytes. - * @throws IOException - */ - static int writeNodes(final OutputStream destination, final PtNodeInfo[] infos) - throws IOException { - int size = getPtNodeCountSize(infos.length); - switch (getPtNodeCountSize(infos.length)) { - case 1: - destination.write((byte)infos.length); - break; - case 2: - final int encodedPtNodeCount = - infos.length | FormatSpec.LARGE_PTNODE_ARRAY_SIZE_FIELD_SIZE_FLAG; - destination.write((byte)(encodedPtNodeCount >> 8)); - destination.write((byte)(encodedPtNodeCount & 0xFF)); - break; - default: - throw new RuntimeException("Invalid node count size."); - } - for (final PtNodeInfo info : infos) size += writePtNode(destination, info); - writeSInt24ToStream(destination, FormatSpec.NO_FORWARD_LINK_ADDRESS); - return size + FormatSpec.FORWARD_LINK_ADDRESS_SIZE; - } - - private static final int HEADER_READING_BUFFER_SIZE = 16384; - /** - * Convenience method to read the header of a binary file. - * - * This is quite resource intensive - don't call when performance is critical. - * - * @param file The file to read. - * @param offset The offset in the file where to start reading the data. - * @param length The length of the data file. - */ - private static FileHeader getDictionaryFileHeader( - final File file, final long offset, final long length) - throws FileNotFoundException, IOException, UnsupportedFormatException { - final byte[] buffer = new byte[HEADER_READING_BUFFER_SIZE]; - final DictDecoder dictDecoder = FormatSpec.getDictDecoder(file, - new DictDecoder.DictionaryBufferFactory() { - @Override - public DictBuffer getDictionaryBuffer(File file) - throws FileNotFoundException, IOException { - final FileInputStream inStream = new FileInputStream(file); - try { - inStream.skip(offset); - inStream.read(buffer); - return new ByteArrayDictBuffer(buffer); - } finally { - inStream.close(); - } - } - } - ); - return dictDecoder.readHeader(); - } - - public static FileHeader getDictionaryFileHeaderOrNull(final File file, final long offset, - final long length) { - try { - final FileHeader header = getDictionaryFileHeader(file, offset, length); - return header; - } catch (UnsupportedFormatException e) { - return null; - } catch (IOException e) { - return null; - } - } - - /** - * Helper method to hide the actual value of the no children address. - */ - public static boolean hasChildrenAddress(final int address) { - return FormatSpec.NO_CHILDREN_ADDRESS != address; - } - - /** - * Helper method to check whether the node is moved. - */ - public static boolean isMovedPtNode(final int flags, final FormatOptions options) { - return options.mSupportsDynamicUpdate - && ((flags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) == FormatSpec.FLAG_IS_MOVED); - } - - /** - * Helper method to check whether the dictionary can be updated dynamically. - */ - public static boolean supportsDynamicUpdate(final FormatOptions options) { - return options.mVersion >= FormatSpec.FIRST_VERSION_WITH_DYNAMIC_UPDATE - && options.mSupportsDynamicUpdate; - } - - /** - * Helper method to check whether the node is deleted. - */ - public static boolean isDeletedPtNode(final int flags, final FormatOptions formatOptions) { - return formatOptions.mSupportsDynamicUpdate - && ((flags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) == FormatSpec.FLAG_IS_DELETED); - } - - /** - * Compute the binary size of the node count - * @param count the node count - * @return the size of the node count, either 1 or 2 bytes. - */ - public static int getPtNodeCountSize(final int count) { - if (FormatSpec.MAX_PTNODES_FOR_ONE_BYTE_PTNODE_COUNT >= count) { - return 1; - } else if (FormatSpec.MAX_PTNODES_IN_A_PT_NODE_ARRAY >= count) { - return 2; - } else { - throw new RuntimeException("Can't have more than " - + FormatSpec.MAX_PTNODES_IN_A_PT_NODE_ARRAY + " PtNode in a PtNodeArray (found " - + count + ")"); - } - } - - static int getChildrenAddressSize(final int optionFlags, - final FormatOptions formatOptions) { - if (formatOptions.mSupportsDynamicUpdate) return FormatSpec.SIGNED_CHILDREN_ADDRESS_SIZE; - switch (optionFlags & FormatSpec.MASK_CHILDREN_ADDRESS_TYPE) { - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE: - return 1; - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES: - return 2; - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES: - return 3; - case FormatSpec.FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS: - default: - return 0; - } - } - - /** - * Calculate bigram frequency from compressed value - * - * @param unigramFrequency - * @param bigramFrequency compressed frequency - * @return approximate bigram frequency - */ - public static int reconstructBigramFrequency(final int unigramFrequency, - final int bigramFrequency) { - final float stepSize = (FormatSpec.MAX_TERMINAL_FREQUENCY - unigramFrequency) - / (1.5f + FormatSpec.MAX_BIGRAM_FREQUENCY); - final float resultFreqFloat = unigramFrequency + stepSize * (bigramFrequency + 1.0f); - return (int)resultFreqFloat; - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java deleted file mode 100644 index 3dbeee099..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.utils.ByteArrayDictBuffer; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.TreeMap; - -/** - * An interface of binary dictionary decoders. - */ -public interface DictDecoder { - - /** - * Reads and returns the file header. - */ - public FileHeader readHeader() throws IOException, UnsupportedFormatException; - - /** - * Reads PtNode from nodeAddress. - * @param ptNodePos the position of PtNode. - * @param formatOptions the format options. - * @return PtNodeInfo. - */ - public PtNodeInfo readPtNode(final int ptNodePos, final FormatOptions formatOptions); - - /** - * Reads a buffer and returns the memory representation of the dictionary. - * - * This high-level method takes a buffer and reads its contents, populating a - * FusionDictionary structure. The optional dict argument is an existing dictionary to - * which words from the buffer should be added. If it is null, a new dictionary is created. - * - * @param dict an optional dictionary to add words to, or null. - * @param deleteDictIfBroken a flag indicating whether this method should remove the broken - * dictionary or not. - * @return the created (or merged) dictionary. - */ - @UsedForTesting - public FusionDictionary readDictionaryBinary(final FusionDictionary dict, - final boolean deleteDictIfBroken) - throws FileNotFoundException, IOException, UnsupportedFormatException; - - /** - * Gets the address of the last PtNode of the exact matching word in the dictionary. - * If no match is found, returns NOT_VALID_WORD. - * - * @param word the word we search for. - * @return the address of the terminal node. - * @throws IOException if the file can't be read. - * @throws UnsupportedFormatException if the format of the file is not recognized. - */ - @UsedForTesting - public int getTerminalPosition(final String word) - throws IOException, UnsupportedFormatException; - - /** - * Reads unigrams and bigrams from the binary file. - * Doesn't store a full memory representation of the dictionary. - * - * @param words the map to store the address as a key and the word as a value. - * @param frequencies the map to store the address as a key and the frequency as a value. - * @param bigrams the map to store the address as a key and the list of address as a value. - * @throws IOException if the file can't be read. - * @throws UnsupportedFormatException if the format of the file is not recognized. - */ - @UsedForTesting - public void readUnigramsAndBigramsBinary(final TreeMap<Integer, String> words, - final TreeMap<Integer, Integer> frequencies, - final TreeMap<Integer, ArrayList<PendingAttribute>> bigrams) - throws IOException, UnsupportedFormatException; - - /** - * Sets the position of the buffer to the given value. - * - * @param newPos the new position - */ - public void setPosition(final int newPos); - - /** - * Gets the position of the buffer. - * - * @return the position - */ - public int getPosition(); - - /** - * Reads and returns the PtNode count out of a buffer and forwards the pointer. - */ - public int readPtNodeCount(); - - /** - * Reads the forward link and advances the position. - * - * @return true if this method moves the file pointer, false otherwise. - */ - public boolean readAndFollowForwardLink(); - public boolean hasNextPtNodeArray(); - - /** - * Opens the dictionary file and makes DictBuffer. - */ - @UsedForTesting - public void openDictBuffer() throws FileNotFoundException, IOException; - @UsedForTesting - public boolean isDictBufferOpen(); - - // Constants for DictionaryBufferFactory. - public static final int USE_READONLY_BYTEBUFFER = 0x01000000; - public static final int USE_BYTEARRAY = 0x02000000; - public static final int USE_WRITABLE_BYTEBUFFER = 0x03000000; - public static final int MASK_DICTBUFFER = 0x0F000000; - - public interface DictionaryBufferFactory { - public DictBuffer getDictionaryBuffer(final File file) - throws FileNotFoundException, IOException; - } - - /** - * Creates DictionaryBuffer using a ByteBuffer - * - * This class uses less memory than DictionaryBufferFromByteArrayFactory, - * but doesn't perform as fast. - * When operating on a big dictionary, this class is preferred. - */ - public static final class DictionaryBufferFromReadOnlyByteBufferFactory - implements DictionaryBufferFactory { - @Override - public DictBuffer getDictionaryBuffer(final File file) - throws FileNotFoundException, IOException { - FileInputStream inStream = null; - ByteBuffer buffer = null; - try { - inStream = new FileInputStream(file); - buffer = inStream.getChannel().map(FileChannel.MapMode.READ_ONLY, - 0, file.length()); - } finally { - if (inStream != null) { - inStream.close(); - } - } - if (buffer != null) { - return new BinaryDictDecoderUtils.ByteBufferDictBuffer(buffer); - } - return null; - } - } - - /** - * Creates DictionaryBuffer using a byte array - * - * This class performs faster than other classes, but consumes more memory. - * When operating on a small dictionary, this class is preferred. - */ - public static final class DictionaryBufferFromByteArrayFactory - implements DictionaryBufferFactory { - @Override - public DictBuffer getDictionaryBuffer(final File file) - throws FileNotFoundException, IOException { - FileInputStream inStream = null; - try { - inStream = new FileInputStream(file); - final byte[] array = new byte[(int) file.length()]; - inStream.read(array); - return new ByteArrayDictBuffer(array); - } finally { - if (inStream != null) { - inStream.close(); - } - } - } - } - - /** - * Creates DictionaryBuffer using a writable ByteBuffer and a RandomAccessFile. - * - * This class doesn't perform as fast as other classes, - * but this class is the only option available for destructive operations (insert or delete) - * on a dictionary. - */ - @UsedForTesting - public static final class DictionaryBufferFromWritableByteBufferFactory - implements DictionaryBufferFactory { - @Override - public DictBuffer getDictionaryBuffer(final File file) - throws FileNotFoundException, IOException { - RandomAccessFile raFile = null; - ByteBuffer buffer = null; - try { - raFile = new RandomAccessFile(file, "rw"); - buffer = raFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, file.length()); - } finally { - if (raFile != null) { - raFile.close(); - } - } - if (buffer != null) { - return new BinaryDictDecoderUtils.ByteBufferDictBuffer(buffer); - } - return null; - } - } - - public void skipPtNode(final FormatOptions formatOptions); -} diff --git a/java/src/com/android/inputmethod/latin/makedict/DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/DictEncoder.java deleted file mode 100644 index ea5d492d8..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/DictEncoder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; - -import java.io.IOException; - -/** - * An interface of binary dictionary encoder. - */ -public interface DictEncoder { - public void writeDictionary(final FusionDictionary dict, final FormatOptions formatOptions) - throws IOException, UnsupportedFormatException; - - public void setPosition(final int position); - public int getPosition(); - public void writePtNodeCount(final int ptNodeCount); - public void writeForwardLinkAddress(final int forwardLinkAddress); - - public void writePtNode(final PtNode ptNode, final int parentPosition, - final FormatOptions formatOptions, final FusionDictionary dict); -} diff --git a/java/src/com/android/inputmethod/latin/makedict/DictUpdater.java b/java/src/com/android/inputmethod/latin/makedict/DictUpdater.java deleted file mode 100644 index c4f7ec91f..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/DictUpdater.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.IOException; -import java.util.ArrayList; - -/** - * An interface of a binary dictionary updater. - */ -@UsedForTesting -public interface DictUpdater extends DictDecoder { - - /** - * Deletes the word from the binary dictionary. - * - * @param word the word to be deleted. - */ - @UsedForTesting - public void deleteWord(final String word) throws IOException, UnsupportedFormatException; - - /** - * Inserts a word into a binary dictionary. - * - * @param word the word to be inserted. - * @param frequency the frequency of the new word. - * @param bigramStrings bigram list, or null if none. - * @param shortcuts shortcut list, or null if none. - * @param isBlackListEntry whether this should be a blacklist entry. - */ - // TODO: Support batch insertion. - @UsedForTesting - public void insertWord(final String word, final int frequency, - final ArrayList<WeightedString> bigramStrings, - final ArrayList<WeightedString> shortcuts, final boolean isNotAWord, - final boolean isBlackListEntry) throws IOException, UnsupportedFormatException; -} diff --git a/java/src/com/android/inputmethod/latin/makedict/DictionaryHeader.java b/java/src/com/android/inputmethod/latin/makedict/DictionaryHeader.java new file mode 100644 index 000000000..df447fd75 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/makedict/DictionaryHeader.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2014 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.makedict; + +import com.android.inputmethod.latin.makedict.FormatSpec.DictionaryOptions; +import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; + +/** + * Class representing dictionary header. + */ +public final class DictionaryHeader { + public final int mBodyOffset; + public final DictionaryOptions mDictionaryOptions; + public final FormatOptions mFormatOptions; + + // Note that these are corresponding definitions in native code in latinime::HeaderPolicy + // and latinime::HeaderReadWriteUtils. + // TODO: Standardize the key names and bump up the format version, taking care not to + // break format version 2 dictionaries. + public static final String DICTIONARY_VERSION_KEY = "version"; + public static final String DICTIONARY_LOCALE_KEY = "locale"; + public static final String DICTIONARY_ID_KEY = "dictionary"; + public static final String DICTIONARY_DESCRIPTION_KEY = "description"; + public static final String DICTIONARY_DATE_KEY = "date"; + public static final String HAS_HISTORICAL_INFO_KEY = "HAS_HISTORICAL_INFO"; + public static final String USES_FORGETTING_CURVE_KEY = "USES_FORGETTING_CURVE"; + public static final String FORGETTING_CURVE_OCCURRENCES_TO_LEVEL_UP_KEY = + "FORGETTING_CURVE_OCCURRENCES_TO_LEVEL_UP"; + public static final String FORGETTING_CURVE_PROBABILITY_VALUES_TABLE_ID_KEY = + "FORGETTING_CURVE_PROBABILITY_VALUES_TABLE_ID"; + public static final String FORGETTING_CURVE_DURATION_TO_LEVEL_DOWN_IN_SECONDS_KEY = + "FORGETTING_CURVE_DURATION_TO_LEVEL_DOWN_IN_SECONDS"; + public static final String MAX_UNIGRAM_COUNT_KEY = "MAX_UNIGRAM_COUNT"; + public static final String MAX_BIGRAM_COUNT_KEY = "MAX_BIGRAM_COUNT"; + public static final String ATTRIBUTE_VALUE_TRUE = "1"; + + public DictionaryHeader(final int headerSize, final DictionaryOptions dictionaryOptions, + final FormatOptions formatOptions) throws UnsupportedFormatException { + mDictionaryOptions = dictionaryOptions; + mFormatOptions = formatOptions; + mBodyOffset = formatOptions.mVersion < FormatSpec.VERSION4 ? headerSize : 0; + if (null == getLocaleString()) { + throw new UnsupportedFormatException("Cannot create a FileHeader without a locale"); + } + if (null == getVersion()) { + throw new UnsupportedFormatException( + "Cannot create a FileHeader without a version"); + } + if (null == getId()) { + throw new UnsupportedFormatException("Cannot create a FileHeader without an ID"); + } + } + + // Helper method to get the locale as a String + public String getLocaleString() { + return mDictionaryOptions.mAttributes.get(DICTIONARY_LOCALE_KEY); + } + + // Helper method to get the version String + public String getVersion() { + return mDictionaryOptions.mAttributes.get(DICTIONARY_VERSION_KEY); + } + + // Helper method to get the dictionary ID as a String + public String getId() { + return mDictionaryOptions.mAttributes.get(DICTIONARY_ID_KEY); + } + + // Helper method to get the description + public String getDescription() { + // TODO: Right now each dictionary file comes with a description in its own language. + // It will display as is no matter the device's locale. It should be internationalized. + return mDictionaryOptions.mAttributes.get(DICTIONARY_DESCRIPTION_KEY); + } +}
\ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/makedict/DynamicBinaryDictIOUtils.java b/java/src/com/android/inputmethod/latin/makedict/DynamicBinaryDictIOUtils.java deleted file mode 100644 index 28da9ffdd..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/DynamicBinaryDictIOUtils.java +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * The utility class to help dynamic updates on the binary dictionary. - * - * All the methods in this class are static. - */ -@UsedForTesting -public final class DynamicBinaryDictIOUtils { - private static final boolean DBG = false; - private static final int MAX_JUMPS = 10000; - - private DynamicBinaryDictIOUtils() { - // This utility class is not publicly instantiable. - } - - /* package */ static int markAsDeleted(final int flags) { - return (flags & (~FormatSpec.MASK_CHILDREN_ADDRESS_TYPE)) | FormatSpec.FLAG_IS_DELETED; - } - - /** - * Update a parent address in a PtNode that is referred to by ptNodeOriginAddress. - * - * @param dictUpdater the DictUpdater to write. - * @param ptNodeOriginAddress the address of the PtNode. - * @param newParentAddress the absolute address of the parent. - * @param formatOptions file format options. - */ - private static void updateParentAddress(final Ver3DictUpdater dictUpdater, - final int ptNodeOriginAddress, final int newParentAddress, - final FormatOptions formatOptions) { - final DictBuffer dictBuffer = dictUpdater.getDictBuffer(); - final int originalPosition = dictBuffer.position(); - dictBuffer.position(ptNodeOriginAddress); - if (!formatOptions.mSupportsDynamicUpdate) { - throw new RuntimeException("this file format does not support parent addresses"); - } - final int flags = dictBuffer.readUnsignedByte(); - if (BinaryDictIOUtils.isMovedPtNode(flags, formatOptions)) { - // If the node is moved, the parent address is stored in the destination node. - // We are guaranteed to process the destination node later, so there is no need to - // update anything here. - dictBuffer.position(originalPosition); - return; - } - if (DBG) { - MakedictLog.d("update parent address flags=" + flags + ", " + ptNodeOriginAddress); - } - final int parentOffset = newParentAddress - ptNodeOriginAddress; - BinaryDictIOUtils.writeSInt24ToBuffer(dictBuffer, parentOffset); - dictBuffer.position(originalPosition); - } - - /** - * Update parent addresses in a node array stored at ptNodeOriginAddress. - * - * @param dictUpdater the DictUpdater to be modified. - * @param ptNodeOriginAddress the address of the node array to update. - * @param newParentAddress the address to be written. - * @param formatOptions file format options. - */ - private static void updateParentAddresses(final Ver3DictUpdater dictUpdater, - final int ptNodeOriginAddress, final int newParentAddress, - final FormatOptions formatOptions) { - final int originalPosition = dictUpdater.getPosition(); - dictUpdater.setPosition(ptNodeOriginAddress); - do { - final int count = dictUpdater.readPtNodeCount(); - for (int i = 0; i < count; ++i) { - updateParentAddress(dictUpdater, dictUpdater.getPosition(), newParentAddress, - formatOptions); - dictUpdater.skipPtNode(formatOptions); - } - if (!dictUpdater.readAndFollowForwardLink()) break; - if (dictUpdater.getPosition() == FormatSpec.NO_FORWARD_LINK_ADDRESS) break; - } while (formatOptions.mSupportsDynamicUpdate); - dictUpdater.setPosition(originalPosition); - } - - /** - * Update a children address in a PtNode that is addressed by ptNodeOriginAddress. - * - * @param dictUpdater the DictUpdater to write. - * @param ptNodeOriginAddress the address of the PtNode. - * @param newChildrenAddress the absolute address of the child. - * @param formatOptions file format options. - */ - private static void updateChildrenAddress(final Ver3DictUpdater dictUpdater, - final int ptNodeOriginAddress, final int newChildrenAddress, - final FormatOptions formatOptions) { - final DictBuffer dictBuffer = dictUpdater.getDictBuffer(); - final int originalPosition = dictBuffer.position(); - dictBuffer.position(ptNodeOriginAddress); - final int flags = dictBuffer.readUnsignedByte(); - BinaryDictDecoderUtils.readParentAddress(dictBuffer, formatOptions); - BinaryDictIOUtils.skipString(dictBuffer, (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS) != 0); - if ((flags & FormatSpec.FLAG_IS_TERMINAL) != 0) dictBuffer.readUnsignedByte(); - final int childrenOffset = newChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS - ? FormatSpec.NO_CHILDREN_ADDRESS : newChildrenAddress - dictBuffer.position(); - BinaryDictIOUtils.writeSInt24ToBuffer(dictBuffer, childrenOffset); - dictBuffer.position(originalPosition); - } - - /** - * Helper method to move a PtNode to the tail of the file. - */ - private static int movePtNode(final OutputStream destination, - final Ver3DictUpdater dictUpdater, final PtNodeInfo info, - final int nodeArrayOriginAddress, final int oldNodeAddress, - final FormatOptions formatOptions) throws IOException { - final DictBuffer dictBuffer = dictUpdater.getDictBuffer(); - updateParentAddress(dictUpdater, oldNodeAddress, dictBuffer.limit() + 1, formatOptions); - dictBuffer.position(oldNodeAddress); - final int currentFlags = dictBuffer.readUnsignedByte(); - dictBuffer.position(oldNodeAddress); - dictBuffer.put((byte)(FormatSpec.FLAG_IS_MOVED | (currentFlags - & (~FormatSpec.MASK_MOVE_AND_DELETE_FLAG)))); - int size = FormatSpec.PTNODE_FLAGS_SIZE; - updateForwardLink(dictUpdater, nodeArrayOriginAddress, dictBuffer.limit(), formatOptions); - size += BinaryDictIOUtils.writeNodes(destination, new PtNodeInfo[] { info }); - return size; - } - - @SuppressWarnings("unused") - private static void updateForwardLink(final Ver3DictUpdater dictUpdater, - final int nodeArrayOriginAddress, final int newNodeArrayAddress, - final FormatOptions formatOptions) { - final DictBuffer dictBuffer = dictUpdater.getDictBuffer(); - dictUpdater.setPosition(nodeArrayOriginAddress); - int jumpCount = 0; - while (jumpCount++ < MAX_JUMPS) { - final int count = dictUpdater.readPtNodeCount(); - for (int i = 0; i < count; ++i) { - dictUpdater.readPtNode(dictUpdater.getPosition(), formatOptions); - } - final int forwardLinkAddress = dictBuffer.readUnsignedInt24(); - if (forwardLinkAddress == FormatSpec.NO_FORWARD_LINK_ADDRESS) { - dictBuffer.position(dictBuffer.position() - FormatSpec.FORWARD_LINK_ADDRESS_SIZE); - BinaryDictIOUtils.writeSInt24ToBuffer(dictBuffer, newNodeArrayAddress); - return; - } - dictBuffer.position(forwardLinkAddress); - } - if (DBG && jumpCount >= MAX_JUMPS) { - throw new RuntimeException("too many jumps, probably a bug."); - } - } - - /** - * Move a PtNode that is referred to by oldPtNodeOrigin to the tail of the file, and set the - * children address to the byte after the PtNode. - * - * @param fileEndAddress the address of the tail of the file. - * @param codePoints the characters to put inside the PtNode. - * @param length how many code points to read from codePoints. - * @param flags the flags for this PtNode. - * @param frequency the frequency of this terminal. - * @param parentAddress the address of the parent PtNode of this PtNode. - * @param shortcutTargets the shortcut targets for this PtNode. - * @param bigrams the bigrams for this PtNode. - * @param destination the stream representing the tail of the file. - * @param dictUpdater the DictUpdater. - * @param oldPtNodeArrayOrigin the origin of the old PtNode array this PtNode was a part of. - * @param oldPtNodeOrigin the old origin where this PtNode used to be stored. - * @param formatOptions format options for this dictionary. - * @return the size written, in bytes. - * @throws IOException if the file can't be accessed - */ - private static int movePtNode(final int fileEndAddress, final int[] codePoints, - final int length, final int flags, final int frequency, final int parentAddress, - final ArrayList<WeightedString> shortcutTargets, - final ArrayList<PendingAttribute> bigrams, final OutputStream destination, - final Ver3DictUpdater dictUpdater, final int oldPtNodeArrayOrigin, - final int oldPtNodeOrigin, final FormatOptions formatOptions) throws IOException { - int size = 0; - final int newPtNodeOrigin = fileEndAddress + 1; - final int[] writtenCharacters = Arrays.copyOfRange(codePoints, 0, length); - final PtNodeInfo tmpInfo = new PtNodeInfo(newPtNodeOrigin, -1 /* endAddress */, - flags, writtenCharacters, frequency, parentAddress, FormatSpec.NO_CHILDREN_ADDRESS, - shortcutTargets, bigrams); - size = BinaryDictIOUtils.computePtNodeSize(tmpInfo, formatOptions); - final PtNodeInfo newInfo = new PtNodeInfo(newPtNodeOrigin, newPtNodeOrigin + size, - flags, writtenCharacters, frequency, parentAddress, - fileEndAddress + 1 + size + FormatSpec.FORWARD_LINK_ADDRESS_SIZE, shortcutTargets, - bigrams); - movePtNode(destination, dictUpdater, newInfo, oldPtNodeArrayOrigin, oldPtNodeOrigin, - formatOptions); - return 1 + size + FormatSpec.FORWARD_LINK_ADDRESS_SIZE; - } - - /** - * Converts a list of WeightedString to a list of PendingAttribute. - */ - public static ArrayList<PendingAttribute> resolveBigramPositions(final DictUpdater dictUpdater, - final ArrayList<WeightedString> bigramStrings) - throws IOException, UnsupportedFormatException { - if (bigramStrings == null) return CollectionUtils.newArrayList(); - final ArrayList<PendingAttribute> bigrams = CollectionUtils.newArrayList(); - for (final WeightedString bigram : bigramStrings) { - final int pos = dictUpdater.getTerminalPosition(bigram.mWord); - if (pos == FormatSpec.NOT_VALID_WORD) { - // TODO: figure out what is the correct thing to do here. - } else { - bigrams.add(new PendingAttribute(bigram.mFrequency, pos)); - } - } - return bigrams; - } - - /** - * Insert a word into a binary dictionary. - * - * @param dictUpdater the dict updater. - * @param destination a stream to the underlying file, with the pointer at the end of the file. - * @param word the word to insert. - * @param frequency the frequency of the new word. - * @param bigramStrings bigram list, or null if none. - * @param shortcuts shortcut list, or null if none. - * @param isBlackListEntry whether this should be a blacklist entry. - * @throws IOException if the file can't be accessed. - * @throws UnsupportedFormatException if the existing dictionary is in an unexpected format. - */ - // TODO: Support batch insertion. - // TODO: Remove @UsedForTesting once UserHistoryDictionary is implemented by BinaryDictionary. - @UsedForTesting - public static void insertWord(final Ver3DictUpdater dictUpdater, - final OutputStream destination, final String word, final int frequency, - final ArrayList<WeightedString> bigramStrings, - final ArrayList<WeightedString> shortcuts, final boolean isNotAWord, - final boolean isBlackListEntry) - throws IOException, UnsupportedFormatException { - final ArrayList<PendingAttribute> bigrams = resolveBigramPositions(dictUpdater, - bigramStrings); - final DictBuffer dictBuffer = dictUpdater.getDictBuffer(); - - final boolean isTerminal = true; - final boolean hasBigrams = !bigrams.isEmpty(); - final boolean hasShortcuts = shortcuts != null && !shortcuts.isEmpty(); - - // find the insert position of the word. - if (dictBuffer.position() != 0) dictBuffer.position(0); - final FileHeader fileHeader = dictUpdater.readHeader(); - - int wordPos = 0, address = dictBuffer.position(), nodeOriginAddress = dictBuffer.position(); - final int[] codePoints = FusionDictionary.getCodePoints(word); - final int wordLen = codePoints.length; - - for (int depth = 0; depth < Constants.DICTIONARY_MAX_WORD_LENGTH; ++depth) { - if (wordPos >= wordLen) break; - nodeOriginAddress = dictBuffer.position(); - int nodeParentAddress = -1; - final int ptNodeCount = BinaryDictDecoderUtils.readPtNodeCount(dictBuffer); - boolean foundNextNode = false; - - for (int i = 0; i < ptNodeCount; ++i) { - address = dictBuffer.position(); - final PtNodeInfo currentInfo = dictUpdater.readPtNode(address, - fileHeader.mFormatOptions); - final boolean isMovedNode = BinaryDictIOUtils.isMovedPtNode(currentInfo.mFlags, - fileHeader.mFormatOptions); - if (isMovedNode) continue; - nodeParentAddress = (currentInfo.mParentAddress == FormatSpec.NO_PARENT_ADDRESS) - ? FormatSpec.NO_PARENT_ADDRESS : currentInfo.mParentAddress + address; - boolean matched = true; - for (int p = 0; p < currentInfo.mCharacters.length; ++p) { - if (wordPos + p >= wordLen) { - /* - * splitting - * before - * abcd - ef - * - * insert "abc" - * - * after - * abc - d - ef - */ - final int newNodeAddress = dictBuffer.limit(); - final int flags = BinaryDictEncoderUtils.makePtNodeFlags(p > 1, - isTerminal, 0, hasShortcuts, hasBigrams, false /* isNotAWord */, - false /* isBlackListEntry */, fileHeader.mFormatOptions); - int written = movePtNode(newNodeAddress, currentInfo.mCharacters, p, flags, - frequency, nodeParentAddress, shortcuts, bigrams, destination, - dictUpdater, nodeOriginAddress, address, fileHeader.mFormatOptions); - - final int[] characters2 = Arrays.copyOfRange(currentInfo.mCharacters, p, - currentInfo.mCharacters.length); - if (currentInfo.mChildrenAddress != FormatSpec.NO_CHILDREN_ADDRESS) { - updateParentAddresses(dictUpdater, currentInfo.mChildrenAddress, - newNodeAddress + written + 1, fileHeader.mFormatOptions); - } - final PtNodeInfo newInfo2 = new PtNodeInfo( - newNodeAddress + written + 1, -1 /* endAddress */, - currentInfo.mFlags, characters2, currentInfo.mFrequency, - newNodeAddress + 1, currentInfo.mChildrenAddress, - currentInfo.mShortcutTargets, currentInfo.mBigrams); - BinaryDictIOUtils.writeNodes(destination, new PtNodeInfo[] { newInfo2 }); - return; - } else if (codePoints[wordPos + p] != currentInfo.mCharacters[p]) { - if (p > 0) { - /* - * splitting - * before - * ab - cd - * - * insert "ac" - * - * after - * a - b - cd - * | - * - c - */ - - final int newNodeAddress = dictBuffer.limit(); - final int childrenAddress = currentInfo.mChildrenAddress; - - // move prefix - final int prefixFlags = BinaryDictEncoderUtils.makePtNodeFlags(p > 1, - false /* isTerminal */, 0 /* childrenAddressSize*/, - false /* hasShortcut */, false /* hasBigrams */, - false /* isNotAWord */, false /* isBlackListEntry */, - fileHeader.mFormatOptions); - int written = movePtNode(newNodeAddress, currentInfo.mCharacters, p, - prefixFlags, -1 /* frequency */, nodeParentAddress, null, null, - destination, dictUpdater, nodeOriginAddress, address, - fileHeader.mFormatOptions); - - final int[] suffixCharacters = Arrays.copyOfRange( - currentInfo.mCharacters, p, currentInfo.mCharacters.length); - if (currentInfo.mChildrenAddress != FormatSpec.NO_CHILDREN_ADDRESS) { - updateParentAddresses(dictUpdater, currentInfo.mChildrenAddress, - newNodeAddress + written + 1, fileHeader.mFormatOptions); - } - final int suffixFlags = BinaryDictEncoderUtils.makePtNodeFlags( - suffixCharacters.length > 1, - (currentInfo.mFlags & FormatSpec.FLAG_IS_TERMINAL) != 0, - 0 /* childrenAddressSize */, - (currentInfo.mFlags & FormatSpec.FLAG_HAS_SHORTCUT_TARGETS) - != 0, - (currentInfo.mFlags & FormatSpec.FLAG_HAS_BIGRAMS) != 0, - isNotAWord, isBlackListEntry, fileHeader.mFormatOptions); - final PtNodeInfo suffixInfo = new PtNodeInfo( - newNodeAddress + written + 1, -1 /* endAddress */, suffixFlags, - suffixCharacters, currentInfo.mFrequency, newNodeAddress + 1, - currentInfo.mChildrenAddress, currentInfo.mShortcutTargets, - currentInfo.mBigrams); - written += BinaryDictIOUtils.computePtNodeSize(suffixInfo, - fileHeader.mFormatOptions) + 1; - - final int[] newCharacters = Arrays.copyOfRange(codePoints, wordPos + p, - codePoints.length); - final int flags = BinaryDictEncoderUtils.makePtNodeFlags( - newCharacters.length > 1, isTerminal, - 0 /* childrenAddressSize */, hasShortcuts, hasBigrams, - isNotAWord, isBlackListEntry, fileHeader.mFormatOptions); - final PtNodeInfo newInfo = new PtNodeInfo( - newNodeAddress + written, -1 /* endAddress */, flags, - newCharacters, frequency, newNodeAddress + 1, - FormatSpec.NO_CHILDREN_ADDRESS, shortcuts, bigrams); - BinaryDictIOUtils.writeNodes(destination, - new PtNodeInfo[] { suffixInfo, newInfo }); - return; - } - matched = false; - break; - } - } - - if (matched) { - if (wordPos + currentInfo.mCharacters.length == wordLen) { - // the word exists in the dictionary. - // only update the PtNode. - final int newNodeAddress = dictBuffer.limit(); - final boolean hasMultipleChars = currentInfo.mCharacters.length > 1; - final int flags = BinaryDictEncoderUtils.makePtNodeFlags(hasMultipleChars, - isTerminal, 0 /* childrenAddressSize */, hasShortcuts, hasBigrams, - isNotAWord, isBlackListEntry, fileHeader.mFormatOptions); - final PtNodeInfo newInfo = new PtNodeInfo(newNodeAddress + 1, - -1 /* endAddress */, flags, currentInfo.mCharacters, frequency, - nodeParentAddress, currentInfo.mChildrenAddress, shortcuts, - bigrams); - movePtNode(destination, dictUpdater, newInfo, nodeOriginAddress, address, - fileHeader.mFormatOptions); - return; - } - wordPos += currentInfo.mCharacters.length; - if (currentInfo.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS) { - /* - * found the prefix of the word. - * make new PtNode and link to the PtNode from this PtNode. - * - * before - * ab - cd - * - * insert "abcde" - * - * after - * ab - cd - e - */ - final int newNodeArrayAddress = dictBuffer.limit(); - updateChildrenAddress(dictUpdater, address, newNodeArrayAddress, - fileHeader.mFormatOptions); - final int newNodeAddress = newNodeArrayAddress + 1; - final boolean hasMultipleChars = (wordLen - wordPos) > 1; - final int flags = BinaryDictEncoderUtils.makePtNodeFlags(hasMultipleChars, - isTerminal, 0 /* childrenAddressSize */, hasShortcuts, hasBigrams, - isNotAWord, isBlackListEntry, fileHeader.mFormatOptions); - final int[] characters = Arrays.copyOfRange(codePoints, wordPos, wordLen); - final PtNodeInfo newInfo = new PtNodeInfo(newNodeAddress, -1, flags, - characters, frequency, address, FormatSpec.NO_CHILDREN_ADDRESS, - shortcuts, bigrams); - BinaryDictIOUtils.writeNodes(destination, new PtNodeInfo[] { newInfo }); - return; - } - dictBuffer.position(currentInfo.mChildrenAddress); - foundNextNode = true; - break; - } - } - - if (foundNextNode) continue; - - // reached the end of the array. - final int linkAddressPosition = dictBuffer.position(); - int nextLink = dictBuffer.readUnsignedInt24(); - if ((nextLink & FormatSpec.MSB24) != 0) { - nextLink = -(nextLink & FormatSpec.SINT24_MAX); - } - if (nextLink == FormatSpec.NO_FORWARD_LINK_ADDRESS) { - /* - * expand this node. - * - * before - * ab - cd - * - * insert "abef" - * - * after - * ab - cd - * | - * - ef - */ - - // change the forward link address. - final int newNodeAddress = dictBuffer.limit(); - dictBuffer.position(linkAddressPosition); - BinaryDictIOUtils.writeSInt24ToBuffer(dictBuffer, newNodeAddress); - - final int[] characters = Arrays.copyOfRange(codePoints, wordPos, wordLen); - final int flags = BinaryDictEncoderUtils.makePtNodeFlags(characters.length > 1, - isTerminal, 0 /* childrenAddressSize */, hasShortcuts, hasBigrams, - isNotAWord, isBlackListEntry, fileHeader.mFormatOptions); - final PtNodeInfo newInfo = new PtNodeInfo(newNodeAddress + 1, - -1 /* endAddress */, flags, characters, frequency, nodeParentAddress, - FormatSpec.NO_CHILDREN_ADDRESS, shortcuts, bigrams); - BinaryDictIOUtils.writeNodes(destination, new PtNodeInfo[]{ newInfo }); - return; - } else { - depth--; - dictBuffer.position(nextLink); - } - } - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java index b56234f6d..a2ae74b20 100644 --- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java +++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java @@ -18,10 +18,9 @@ package com.android.inputmethod.latin.makedict; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.makedict.DictDecoder.DictionaryBufferFactory; -import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions; -import java.io.File; +import java.util.Date; +import java.util.HashMap; /** * Dictionary File Format Specification. @@ -40,12 +39,8 @@ public final class FormatSpec { * p | not used 3 bits * t | each unigram and bigram entry has a time stamp? * i | 1 bit, 1 = yes, 0 = no : CONTAINS_TIMESTAMP_FLAG - * o | has bigrams ? 1 bit, 1 = yes, 0 = no : CONTAINS_BIGRAMS_FLAG - * n | FRENCH_LIGATURE_PROCESSING_FLAG - * f | supports dynamic updates ? 1 bit, 1 = yes, 0 = no : SUPPORTS_DYNAMIC_UPDATE - * l | GERMAN_UMLAUT_PROCESSING_FLAG - * a | - * gs + * o | + * nflags * * h | * e | size of the file header, 4bytes @@ -82,45 +77,36 @@ public final class FormatSpec { * s * * f | - * o | IF SUPPORTS_DYNAMIC_UPDATE (defined in the file header) - * r | forward link address, 3byte - * w | 1 byte = bbbbbbbb match - * a | case 1xxxxxxx => -((xxxxxxx << 16) + (next byte << 8) + next byte) - * r | otherwise => (xxxxxxx << 16) + (next byte << 8) + next byte - * d | - * linkaddress + * o | forward link address, 3byte + * r | 1 byte = bbbbbbbb match + * w | case 1xxxxxxx => -((xxxxxxx << 16) + (next byte << 8) + next byte) + * a | otherwise => (xxxxxxx << 16) + (next byte << 8) + next byte + * r | + * dlinkaddress */ /* Node (FusionDictionary.PtNode) layout is as follows: - * | IF !SUPPORTS_DYNAMIC_UPDATE - * | addressType xx : mask with MASK_CHILDREN_ADDRESS_TYPE - * | 2 bits, 00 = no children : FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS - * f | 01 = 1 byte : FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE - * l | 10 = 2 bytes : FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES - * a | 11 = 3 bytes : FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES - * g | ELSE - * s | is moved ? 2 bits, 11 = no : FLAG_IS_NOT_MOVED - * | This must be the same as FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES - * | 01 = yes : FLAG_IS_MOVED - * | the new address is stored in the same place as the parent address - * | is deleted? 10 = yes : FLAG_IS_DELETED - * | has several chars ? 1 bit, 1 = yes, 0 = no : FLAG_HAS_MULTIPLE_CHARS - * | has a terminal ? 1 bit, 1 = yes, 0 = no : FLAG_IS_TERMINAL - * | has shortcut targets ? 1 bit, 1 = yes, 0 = no : FLAG_HAS_SHORTCUT_TARGETS + * | is moved ? 2 bits, 11 = no : FLAG_IS_NOT_MOVED + * | This must be the same as FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES + * | 01 = yes : FLAG_IS_MOVED + * f | the new address is stored in the same place as the parent address + * l | is deleted? 10 = yes : FLAG_IS_DELETED + * a | has several chars ? 1 bit, 1 = yes, 0 = no : FLAG_HAS_MULTIPLE_CHARS + * g | has a terminal ? 1 bit, 1 = yes, 0 = no : FLAG_IS_TERMINAL + * s | has shortcut targets ? 1 bit, 1 = yes, 0 = no : FLAG_HAS_SHORTCUT_TARGETS * | has bigrams ? 1 bit, 1 = yes, 0 = no : FLAG_HAS_BIGRAMS * | is not a word ? 1 bit, 1 = yes, 0 = no : FLAG_IS_NOT_A_WORD * | is blacklisted ? 1 bit, 1 = yes, 0 = no : FLAG_IS_BLACKLISTED * * p | - * a | IF SUPPORTS_DYNAMIC_UPDATE (defined in the file header) - * r | parent address, 3byte - * e | 1 byte = bbbbbbbb match - * n | case 1xxxxxxx => -((0xxxxxxx << 16) + (next byte << 8) + next byte) - * t | otherwise => (bbbbbbbb << 16) + (next byte << 8) + next byte - * a | This address is relative to the head of the PtNode. - * d | If the node doesn't have a parent, this field is set to 0. + * a | parent address, 3byte + * r | 1 byte = bbbbbbbb match + * e | case 1xxxxxxx => -((0xxxxxxx << 16) + (next byte << 8) + next byte) + * n | otherwise => (bbbbbbbb << 16) + (next byte << 8) + next byte + * t | This address is relative to the head of the PtNode. + * a | If the node doesn't have a parent, this field is set to 0. * d | - * ress + * dress * * c | IF FLAG_HAS_MULTIPLE_CHARS * h | char, char, char, char n * (1 or 3 bytes) : use PtNodeInfo for i/o helpers @@ -134,23 +120,16 @@ public final class FormatSpec { * e | frequency 1 byte * q | * - * c | IF SUPPORTS_DYNAMIC_UPDATE - * h | children address, 3 bytes - * i | 1 byte = bbbbbbbb match - * l | case 1xxxxxxx => -((0xxxxxxx << 16) + (next byte << 8) + next byte) - * d | otherwise => (bbbbbbbb<<16) + (next byte << 8) + next byte - * r | if this node doesn't have children, this field is set to 0. - * e | (see BinaryDictEncoderUtils#writeVariableSignedAddress) - * n | ELSIF 00 = FLAG_CHILDREN_ADDRESS_TYPE_NOADDRESS == addressType - * a | // nothing - * d | ELSIF 01 = FLAG_CHILDREN_ADDRESS_TYPE_ONEBYTE == addressType - * d | children address, 1 byte - * r | ELSIF 10 = FLAG_CHILDREN_ADDRESS_TYPE_TWOBYTES == addressType - * e | children address, 2 bytes - * s | ELSE // 11 = FLAG_CHILDREN_ADDRESS_TYPE_THREEBYTES = addressType - * s | children address, 3 bytes - * | END - * | This address is relative to the position of this field. + * c | + * h | children address, 3 bytes + * i | 1 byte = bbbbbbbb match + * l | case 1xxxxxxx => -((0xxxxxxx << 16) + (next byte << 8) + next byte) + * d | otherwise => (bbbbbbbb<<16) + (next byte << 8) + next byte + * r | if this node doesn't have children, this field is set to 0. + * e | (see BinaryDictEncoderUtils#writeVariableSignedAddress) + * n | This address is relative to the position of this field. + * a | + * ddress * * | IF FLAG_IS_TERMINAL && FLAG_HAS_SHORTCUT_TARGETS * | shortcut string list @@ -199,21 +178,25 @@ public final class FormatSpec { */ public static final int MAGIC_NUMBER = 0x9BC13AFE; - static final int MINIMUM_SUPPORTED_VERSION = 2; - static final int MAXIMUM_SUPPORTED_VERSION = 4; static final int NOT_A_VERSION_NUMBER = -1; static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3; static final int FIRST_VERSION_WITH_TERMINAL_ID = 4; - static final int VERSION3 = 3; - static final int VERSION4 = 4; - // These options need to be the same numeric values as the one in the native reading code. - static final int GERMAN_UMLAUT_PROCESSING_FLAG = 0x1; - // TODO: Make the native reading code read this variable. - static final int SUPPORTS_DYNAMIC_UPDATE = 0x2; - static final int FRENCH_LIGATURE_PROCESSING_FLAG = 0x4; - static final int CONTAINS_BIGRAMS_FLAG = 0x8; - static final int CONTAINS_TIMESTAMP_FLAG = 0x10; + // These MUST have the same values as the relevant constants in format_utils.h. + // From version 4 on, we use version * 100 + revision as a version number. That allows + // us to change the format during development while having testing devices remove + // older files with each upgrade, while still having a readable versioning scheme. + // When we bump up the dictionary format version, we should update + // ExpandableDictionary.needsToMigrateDictionary() and + // ExpandableDictionary.matchesExpectedBinaryDictFormatVersionForThisType(). + public static final int VERSION2 = 2; + // Dictionary version used for testing. + public static final int VERSION4_ONLY_FOR_TESTING = 399; + public static final int VERSION401 = 401; + public static final int VERSION4 = 402; + public static final int VERSION4_DEV = 403; + static final int MINIMUM_SUPPORTED_VERSION = VERSION2; + static final int MAXIMUM_SUPPORTED_VERSION = VERSION4_DEV; // TODO: Make this value adaptative to content data, store it in the header, and // use it in the reading code. @@ -263,29 +246,31 @@ public final class FormatSpec { static final int PTNODE_ATTRIBUTE_MAX_ADDRESS_SIZE = 3; static final int PTNODE_SHORTCUT_LIST_SIZE_SIZE = 2; - // These values are used only by version 4 or later. + // These values are used only by version 4 or later. They MUST match the definitions in + // ver4_dict_constants.cpp. static final String TRIE_FILE_EXTENSION = ".trie"; + public static final String HEADER_FILE_EXTENSION = ".header"; static final String FREQ_FILE_EXTENSION = ".freq"; - static final String UNIGRAM_TIMESTAMP_FILE_EXTENSION = ".timestamp"; // tat = Terminal Address Table static final String TERMINAL_ADDRESS_TABLE_FILE_EXTENSION = ".tat"; static final String BIGRAM_FILE_EXTENSION = ".bigram"; static final String SHORTCUT_FILE_EXTENSION = ".shortcut"; static final String LOOKUP_TABLE_FILE_SUFFIX = "_lookup"; static final String CONTENT_TABLE_FILE_SUFFIX = "_index"; + static final int FLAGS_IN_FREQ_FILE_SIZE = 1; static final int FREQUENCY_AND_FLAGS_SIZE = 2; static final int TERMINAL_ADDRESS_TABLE_ADDRESS_SIZE = 3; static final int UNIGRAM_TIMESTAMP_SIZE = 4; + static final int UNIGRAM_COUNTER_SIZE = 1; + static final int UNIGRAM_LEVEL_SIZE = 1; // With the English main dictionary as of October 2013, the size of bigram address table is - // is 584KB with the block size being 4. - // This is 91% of that of full address table. - static final int BIGRAM_ADDRESS_TABLE_BLOCK_SIZE = 4; - static final int BIGRAM_CONTENT_COUNT = 2; + // is 345KB with the block size being 16. + // This is 54% of that of full address table. + static final int BIGRAM_ADDRESS_TABLE_BLOCK_SIZE = 16; + static final int BIGRAM_CONTENT_COUNT = 1; static final int BIGRAM_FREQ_CONTENT_INDEX = 0; - static final int BIGRAM_TIMESTAMP_CONTENT_INDEX = 1; static final String BIGRAM_FREQ_CONTENT_ID = "_freq"; - static final String BIGRAM_TIMESTAMP_CONTENT_ID = "_timestamp"; static final int BIGRAM_TIMESTAMP_SIZE = 4; static final int BIGRAM_COUNTER_SIZE = 1; static final int BIGRAM_LEVEL_SIZE = 1; @@ -293,7 +278,7 @@ public final class FormatSpec { static final int SHORTCUT_CONTENT_COUNT = 1; static final int SHORTCUT_CONTENT_INDEX = 0; // With the English main dictionary as of October 2013, the size of shortcut address table is - // 29KB with the block size being 64. + // 26KB with the block size being 64. // This is only 4.4% of that of full address table. static final int SHORTCUT_ADDRESS_TABLE_BLOCK_SIZE = 64; static final String SHORTCUT_CONTENT_ID = "_shortcut"; @@ -331,107 +316,56 @@ public final class FormatSpec { */ public static final class FormatOptions { public final int mVersion; - public final boolean mSupportsDynamicUpdate; - public final boolean mHasTerminalId; public final boolean mHasTimestamp; - @UsedForTesting - public FormatOptions(final int version) { - this(version, false); - } @UsedForTesting - public FormatOptions(final int version, final boolean supportsDynamicUpdate) { - this(version, supportsDynamicUpdate, false /* hasTimestamp */); + public FormatOptions(final int version) { + this(version, false /* hasTimestamp */); } - public FormatOptions(final int version, final boolean supportsDynamicUpdate, - final boolean hasTimestamp) { + public FormatOptions(final int version, final boolean hasTimestamp) { mVersion = version; - if (version < FIRST_VERSION_WITH_DYNAMIC_UPDATE && supportsDynamicUpdate) { - throw new RuntimeException("Dynamic updates are only supported with versions " - + FIRST_VERSION_WITH_DYNAMIC_UPDATE + " and ulterior."); - } - mSupportsDynamicUpdate = supportsDynamicUpdate; - mHasTerminalId = (version >= FIRST_VERSION_WITH_TERMINAL_ID); mHasTimestamp = hasTimestamp; } } /** - * Class representing file header. + * Options global to the dictionary. */ - public static final class FileHeader { - public final int mHeaderSize; - public final DictionaryOptions mDictionaryOptions; - public final FormatOptions mFormatOptions; - // Note that these are corresponding definitions in native code in latinime::HeaderPolicy - // and latinime::HeaderReadWriteUtils. - public static final String SUPPORTS_DYNAMIC_UPDATE_ATTRIBUTE = "SUPPORTS_DYNAMIC_UPDATE"; - public static final String USES_FORGETTING_CURVE_ATTRIBUTE = "USES_FORGETTING_CURVE"; - public static final String ATTRIBUTE_VALUE_TRUE = "1"; - - public static final String DICTIONARY_VERSION_ATTRIBUTE = "version"; - public static final String DICTIONARY_LOCALE_ATTRIBUTE = "locale"; - public static final String DICTIONARY_ID_ATTRIBUTE = "dictionary"; - private static final String DICTIONARY_DESCRIPTION_ATTRIBUTE = "description"; - public FileHeader(final int headerSize, final DictionaryOptions dictionaryOptions, - final FormatOptions formatOptions) { - mHeaderSize = headerSize; - mDictionaryOptions = dictionaryOptions; - mFormatOptions = formatOptions; - } - - // Helper method to get the locale as a String - public String getLocaleString() { - return mDictionaryOptions.mAttributes.get(FileHeader.DICTIONARY_LOCALE_ATTRIBUTE); - } - - // Helper method to get the version String - public String getVersion() { - return mDictionaryOptions.mAttributes.get(FileHeader.DICTIONARY_VERSION_ATTRIBUTE); + public static final class DictionaryOptions { + public final HashMap<String, String> mAttributes; + public DictionaryOptions(final HashMap<String, String> attributes) { + mAttributes = attributes; } - - // Helper method to get the dictionary ID as a String - public String getId() { - return mDictionaryOptions.mAttributes.get(FileHeader.DICTIONARY_ID_ATTRIBUTE); - } - - // Helper method to get the description - public String getDescription() { - // TODO: Right now each dictionary file comes with a description in its own language. - // It will display as is no matter the device's locale. It should be internationalized. - return mDictionaryOptions.mAttributes.get(FileHeader.DICTIONARY_DESCRIPTION_ATTRIBUTE); + @Override + public String toString() { // Convenience method + return toString(0, false); } - } - - /** - * Returns new dictionary decoder. - * - * @param dictFile the dictionary file. - * @param bufferType The type of buffer, as one of USE_* in DictDecoder. - * @return new dictionary decoder if the dictionary file exists, otherwise null. - */ - public static DictDecoder getDictDecoder(final File dictFile, final int bufferType) { - if (dictFile.isDirectory()) { - return new Ver4DictDecoder(dictFile, bufferType); - } else if (dictFile.isFile()) { - return new Ver3DictDecoder(dictFile, bufferType); - } - return null; - } - - public static DictDecoder getDictDecoder(final File dictFile, - final DictionaryBufferFactory factory) { - if (dictFile.isDirectory()) { - return new Ver4DictDecoder(dictFile, factory); - } else if (dictFile.isFile()) { - return new Ver3DictDecoder(dictFile, factory); + public String toString(final int indentCount, final boolean plumbing) { + final StringBuilder indent = new StringBuilder(); + if (plumbing) { + indent.append("H:"); + } else { + for (int i = 0; i < indentCount; ++i) { + indent.append(" "); + } + } + final StringBuilder s = new StringBuilder(); + for (final String optionKey : mAttributes.keySet()) { + s.append(indent); + s.append(optionKey); + s.append(" = "); + if ("date".equals(optionKey) && !plumbing) { + // Date needs a number of milliseconds, but the dictionary contains seconds + s.append(new Date( + 1000 * Long.parseLong(mAttributes.get(optionKey))).toString()); + } else { + s.append(mAttributes.get(optionKey)); + } + s.append("\n"); + } + return s.toString(); } - return null; - } - - public static DictDecoder getDictDecoder(final File dictFile) { - return getDictDecoder(dictFile, DictDecoder.USE_READONLY_BYTEBUFFER); } private FormatSpec() { diff --git a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java deleted file mode 100644 index 3bb218bea..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java +++ /dev/null @@ -1,916 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Constants; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; - -/** - * A dictionary that can fusion heads and tails of words for more compression. - */ -@UsedForTesting -public final class FusionDictionary implements Iterable<Word> { - private static final boolean DBG = MakedictLog.DBG; - - private static int CHARACTER_NOT_FOUND_INDEX = -1; - - /** - * A node array of the dictionary, containing several PtNodes. - * - * A PtNodeArray is but an ordered array of PtNodes, which essentially contain all the - * real information. - * This class also contains fields to cache size and address, to help with binary - * generation. - */ - public static final class PtNodeArray { - ArrayList<PtNode> mData; - // To help with binary generation - int mCachedSize = Integer.MIN_VALUE; - // mCachedAddressBefore/AfterUpdate are helpers for binary dictionary generation. They - // always hold the same value except between dictionary address compression, during which - // the update process needs to know about both values at the same time. Updating will - // update the AfterUpdate value, and the code will move them to BeforeUpdate before - // the next update pass. - int mCachedAddressBeforeUpdate = Integer.MIN_VALUE; - int mCachedAddressAfterUpdate = Integer.MIN_VALUE; - int mCachedParentAddress = 0; - - public PtNodeArray() { - mData = new ArrayList<PtNode>(); - } - public PtNodeArray(ArrayList<PtNode> data) { - mData = data; - } - } - - /** - * A string with a frequency. - * - * This represents an "attribute", that is either a bigram or a shortcut. - */ - public static final class WeightedString { - public final String mWord; - public int mFrequency; - public WeightedString(String word, int frequency) { - mWord = word; - mFrequency = frequency; - } - - @Override - public int hashCode() { - return Arrays.hashCode(new Object[] { mWord, mFrequency }); - } - - @Override - public boolean equals(Object o) { - if (o == this) return true; - if (!(o instanceof WeightedString)) return false; - WeightedString w = (WeightedString)o; - return mWord.equals(w.mWord) && mFrequency == w.mFrequency; - } - } - - /** - * PtNode is a group of characters, with a frequency, shortcut targets, bigrams, and children - * (Pt means Patricia Trie). - * - * This is the central class of the in-memory representation. A PtNode is what can - * be seen as a traditional "trie node", except it can hold several characters at the - * same time. A PtNode essentially represents one or several characters in the middle - * of the trie tree; as such, it can be a terminal, and it can have children. - * In this in-memory representation, whether the PtNode is a terminal or not is represented - * in the frequency, where NOT_A_TERMINAL (= -1) means this is not a terminal and any other - * value is the frequency of this terminal. A terminal may have non-null shortcuts and/or - * bigrams, but a non-terminal may not. Moreover, children, if present, are null. - */ - public static final class PtNode { - public static final int NOT_A_TERMINAL = -1; - final int mChars[]; - ArrayList<WeightedString> mShortcutTargets; - ArrayList<WeightedString> mBigrams; - int mFrequency; // NOT_A_TERMINAL == mFrequency indicates this is not a terminal. - int mTerminalId; // NOT_A_TERMINAL == mTerminalId indicates this is not a terminal. - PtNodeArray mChildren; - boolean mIsNotAWord; // Only a shortcut - boolean mIsBlacklistEntry; - // mCachedSize and mCachedAddressBefore/AfterUpdate are helpers for binary dictionary - // generation. Before and After always hold the same value except during dictionary - // address compression, where the update process needs to know about both values at the - // same time. Updating will update the AfterUpdate value, and the code will move them - // to BeforeUpdate before the next update pass. - // The update process does not need two versions of mCachedSize. - int mCachedSize; // The size, in bytes, of this PtNode. - int mCachedAddressBeforeUpdate; // The address of this PtNode (before update) - int mCachedAddressAfterUpdate; // The address of this PtNode (after update) - - public PtNode(final int[] chars, final ArrayList<WeightedString> shortcutTargets, - final ArrayList<WeightedString> bigrams, final int frequency, - final boolean isNotAWord, final boolean isBlacklistEntry) { - mChars = chars; - mFrequency = frequency; - mTerminalId = frequency; - mShortcutTargets = shortcutTargets; - mBigrams = bigrams; - mChildren = null; - mIsNotAWord = isNotAWord; - mIsBlacklistEntry = isBlacklistEntry; - } - - public PtNode(final int[] chars, final ArrayList<WeightedString> shortcutTargets, - final ArrayList<WeightedString> bigrams, final int frequency, - final boolean isNotAWord, final boolean isBlacklistEntry, - final PtNodeArray children) { - mChars = chars; - mFrequency = frequency; - mShortcutTargets = shortcutTargets; - mBigrams = bigrams; - mChildren = children; - mIsNotAWord = isNotAWord; - mIsBlacklistEntry = isBlacklistEntry; - } - - public void addChild(PtNode n) { - if (null == mChildren) { - mChildren = new PtNodeArray(); - } - mChildren.mData.add(n); - } - - public int getTerminalId() { - return mTerminalId; - } - - public boolean isTerminal() { - return NOT_A_TERMINAL != mFrequency; - } - - public int getFrequency() { - return mFrequency; - } - - public boolean getIsNotAWord() { - return mIsNotAWord; - } - - public boolean getIsBlacklistEntry() { - return mIsBlacklistEntry; - } - - public ArrayList<WeightedString> getShortcutTargets() { - // We don't want write permission to escape outside the package, so we return a copy - if (null == mShortcutTargets) return null; - final ArrayList<WeightedString> copyOfShortcutTargets = - new ArrayList<WeightedString>(mShortcutTargets); - return copyOfShortcutTargets; - } - - public ArrayList<WeightedString> getBigrams() { - // We don't want write permission to escape outside the package, so we return a copy - if (null == mBigrams) return null; - final ArrayList<WeightedString> copyOfBigrams = new ArrayList<WeightedString>(mBigrams); - return copyOfBigrams; - } - - public boolean hasSeveralChars() { - assert(mChars.length > 0); - return 1 < mChars.length; - } - - /** - * Adds a word to the bigram list. Updates the frequency if the word already - * exists. - */ - public void addBigram(final String word, final int frequency) { - if (mBigrams == null) { - mBigrams = new ArrayList<WeightedString>(); - } - WeightedString bigram = getBigram(word); - if (bigram != null) { - bigram.mFrequency = frequency; - } else { - bigram = new WeightedString(word, frequency); - mBigrams.add(bigram); - } - } - - /** - * Gets the shortcut target for the given word. Returns null if the word is not in the - * shortcut list. - */ - public WeightedString getShortcut(final String word) { - // TODO: Don't do a linear search - if (mShortcutTargets != null) { - final int size = mShortcutTargets.size(); - for (int i = 0; i < size; ++i) { - WeightedString shortcut = mShortcutTargets.get(i); - if (shortcut.mWord.equals(word)) { - return shortcut; - } - } - } - return null; - } - - /** - * Gets the bigram for the given word. - * Returns null if the word is not in the bigrams list. - */ - public WeightedString getBigram(final String word) { - // TODO: Don't do a linear search - if (mBigrams != null) { - final int size = mBigrams.size(); - for (int i = 0; i < size; ++i) { - WeightedString bigram = mBigrams.get(i); - if (bigram.mWord.equals(word)) { - return bigram; - } - } - } - return null; - } - - /** - * Updates the PtNode with the given properties. Adds the shortcut and bigram lists to - * the existing ones if any. Note: unigram, bigram, and shortcut frequencies are only - * updated if they are higher than the existing ones. - */ - public void update(final int frequency, final ArrayList<WeightedString> shortcutTargets, - final ArrayList<WeightedString> bigrams, - final boolean isNotAWord, final boolean isBlacklistEntry) { - if (frequency > mFrequency) { - mFrequency = frequency; - } - if (shortcutTargets != null) { - if (mShortcutTargets == null) { - mShortcutTargets = shortcutTargets; - } else { - final int size = shortcutTargets.size(); - for (int i = 0; i < size; ++i) { - final WeightedString shortcut = shortcutTargets.get(i); - final WeightedString existingShortcut = getShortcut(shortcut.mWord); - if (existingShortcut == null) { - mShortcutTargets.add(shortcut); - } else if (existingShortcut.mFrequency < shortcut.mFrequency) { - existingShortcut.mFrequency = shortcut.mFrequency; - } - } - } - } - if (bigrams != null) { - if (mBigrams == null) { - mBigrams = bigrams; - } else { - final int size = bigrams.size(); - for (int i = 0; i < size; ++i) { - final WeightedString bigram = bigrams.get(i); - final WeightedString existingBigram = getBigram(bigram.mWord); - if (existingBigram == null) { - mBigrams.add(bigram); - } else if (existingBigram.mFrequency < bigram.mFrequency) { - existingBigram.mFrequency = bigram.mFrequency; - } - } - } - } - mIsNotAWord = isNotAWord; - mIsBlacklistEntry = isBlacklistEntry; - } - } - - /** - * Options global to the dictionary. - */ - public static final class DictionaryOptions { - public final boolean mGermanUmlautProcessing; - public final boolean mFrenchLigatureProcessing; - public final HashMap<String, String> mAttributes; - public DictionaryOptions(final HashMap<String, String> attributes, - final boolean germanUmlautProcessing, final boolean frenchLigatureProcessing) { - mAttributes = attributes; - mGermanUmlautProcessing = germanUmlautProcessing; - mFrenchLigatureProcessing = frenchLigatureProcessing; - } - @Override - public String toString() { // Convenience method - return toString(0, false); - } - public String toString(final int indentCount, final boolean plumbing) { - final StringBuilder indent = new StringBuilder(); - if (plumbing) { - indent.append("H:"); - } else { - for (int i = 0; i < indentCount; ++i) { - indent.append(" "); - } - } - final StringBuilder s = new StringBuilder(); - for (final String optionKey : mAttributes.keySet()) { - s.append(indent); - s.append(optionKey); - s.append(" = "); - if ("date".equals(optionKey) && !plumbing) { - // Date needs a number of milliseconds, but the dictionary contains seconds - s.append(new Date( - 1000 * Long.parseLong(mAttributes.get(optionKey))).toString()); - } else { - s.append(mAttributes.get(optionKey)); - } - s.append("\n"); - } - if (mGermanUmlautProcessing) { - s.append(indent); - s.append("Needs German umlaut processing\n"); - } - if (mFrenchLigatureProcessing) { - s.append(indent); - s.append("Needs French ligature processing\n"); - } - return s.toString(); - } - } - - public final DictionaryOptions mOptions; - public final PtNodeArray mRootNodeArray; - - public FusionDictionary(final PtNodeArray rootNodeArray, final DictionaryOptions options) { - mRootNodeArray = rootNodeArray; - mOptions = options; - } - - public void addOptionAttribute(final String key, final String value) { - mOptions.mAttributes.put(key, value); - } - - /** - * Helper method to convert a String to an int array. - */ - static int[] getCodePoints(final String word) { - // TODO: this is a copy-paste of the old contents of StringUtils.toCodePointArray, - // which is not visible from the makedict package. Factor this code. - final int length = word.length(); - if (length <= 0) return new int[] {}; - final char[] characters = word.toCharArray(); - final int[] codePoints = new int[Character.codePointCount(characters, 0, length)]; - int codePoint = Character.codePointAt(characters, 0); - int dsti = 0; - for (int srci = Character.charCount(codePoint); - srci < length; srci += Character.charCount(codePoint), ++dsti) { - codePoints[dsti] = codePoint; - codePoint = Character.codePointAt(characters, srci); - } - codePoints[dsti] = codePoint; - return codePoints; - } - - /** - * Helper method to add a word as a string. - * - * This method adds a word to the dictionary with the given frequency. Optional - * lists of bigrams and shortcuts can be passed here. For each word inside, - * they will be added to the dictionary as necessary. - * - * @param word the word to add. - * @param frequency the frequency of the word, in the range [0..255]. - * @param shortcutTargets a list of shortcut targets for this word, or null. - * @param isNotAWord true if this should not be considered a word (e.g. shortcut only) - */ - public void add(final String word, final int frequency, - final ArrayList<WeightedString> shortcutTargets, final boolean isNotAWord) { - add(getCodePoints(word), frequency, shortcutTargets, isNotAWord, - false /* isBlacklistEntry */); - } - - /** - * Helper method to add a blacklist entry as a string. - * - * @param word the word to add as a blacklist entry. - * @param shortcutTargets a list of shortcut targets for this word, or null. - * @param isNotAWord true if this is not a word for spellcheking purposes (shortcut only or so) - */ - public void addBlacklistEntry(final String word, - final ArrayList<WeightedString> shortcutTargets, final boolean isNotAWord) { - add(getCodePoints(word), 0, shortcutTargets, isNotAWord, true /* isBlacklistEntry */); - } - - /** - * Sanity check for a PtNode array. - * - * This method checks that all PtNodes in a node array are ordered as expected. - * If they are, nothing happens. If they aren't, an exception is thrown. - */ - private void checkStack(PtNodeArray ptNodeArray) { - ArrayList<PtNode> stack = ptNodeArray.mData; - int lastValue = -1; - for (int i = 0; i < stack.size(); ++i) { - int currentValue = stack.get(i).mChars[0]; - if (currentValue <= lastValue) - throw new RuntimeException("Invalid stack"); - else - lastValue = currentValue; - } - } - - /** - * Helper method to add a new bigram to the dictionary. - * - * @param word1 the previous word of the context - * @param word2 the next word of the context - * @param frequency the bigram frequency - */ - public void setBigram(final String word1, final String word2, final int frequency) { - PtNode ptNode = findWordInTree(mRootNodeArray, word1); - if (ptNode != null) { - final PtNode ptNode2 = findWordInTree(mRootNodeArray, word2); - if (ptNode2 == null) { - add(getCodePoints(word2), 0, null, false /* isNotAWord */, - false /* isBlacklistEntry */); - // The PtNode for the first word may have moved by the above insertion, - // if word1 and word2 share a common stem that happens not to have been - // a cutting point until now. In this case, we need to refresh ptNode. - ptNode = findWordInTree(mRootNodeArray, word1); - } - ptNode.addBigram(word2, frequency); - } else { - throw new RuntimeException("First word of bigram not found"); - } - } - - /** - * Add a word to this dictionary. - * - * The shortcuts, if any, have to be in the dictionary already. If they aren't, - * an exception is thrown. - * - * @param word the word, as an int array. - * @param frequency the frequency of the word, in the range [0..255]. - * @param shortcutTargets an optional list of shortcut targets for this word (null if none). - * @param isNotAWord true if this is not a word for spellcheking purposes (shortcut only or so) - * @param isBlacklistEntry true if this is a blacklisted word, false otherwise - */ - private void add(final int[] word, final int frequency, - final ArrayList<WeightedString> shortcutTargets, - final boolean isNotAWord, final boolean isBlacklistEntry) { - assert(frequency >= 0 && frequency <= 255); - if (word.length >= Constants.DICTIONARY_MAX_WORD_LENGTH) { - MakedictLog.w("Ignoring a word that is too long: word.length = " + word.length); - return; - } - - PtNodeArray currentNodeArray = mRootNodeArray; - int charIndex = 0; - - PtNode currentPtNode = null; - int differentCharIndex = 0; // Set by the loop to the index of the char that differs - int nodeIndex = findIndexOfChar(mRootNodeArray, word[charIndex]); - while (CHARACTER_NOT_FOUND_INDEX != nodeIndex) { - currentPtNode = currentNodeArray.mData.get(nodeIndex); - differentCharIndex = compareCharArrays(currentPtNode.mChars, word, charIndex); - if (ARRAYS_ARE_EQUAL != differentCharIndex - && differentCharIndex < currentPtNode.mChars.length) break; - if (null == currentPtNode.mChildren) break; - charIndex += currentPtNode.mChars.length; - if (charIndex >= word.length) break; - currentNodeArray = currentPtNode.mChildren; - nodeIndex = findIndexOfChar(currentNodeArray, word[charIndex]); - } - - if (CHARACTER_NOT_FOUND_INDEX == nodeIndex) { - // No node at this point to accept the word. Create one. - final int insertionIndex = findInsertionIndex(currentNodeArray, word[charIndex]); - final PtNode newPtNode = new PtNode(Arrays.copyOfRange(word, charIndex, word.length), - shortcutTargets, null /* bigrams */, frequency, isNotAWord, isBlacklistEntry); - currentNodeArray.mData.add(insertionIndex, newPtNode); - if (DBG) checkStack(currentNodeArray); - } else { - // There is a word with a common prefix. - if (differentCharIndex == currentPtNode.mChars.length) { - if (charIndex + differentCharIndex >= word.length) { - // The new word is a prefix of an existing word, but the node on which it - // should end already exists as is. Since the old PtNode was not a terminal, - // make it one by filling in its frequency and other attributes - currentPtNode.update(frequency, shortcutTargets, null, isNotAWord, - isBlacklistEntry); - } else { - // The new word matches the full old word and extends past it. - // We only have to create a new node and add it to the end of this. - final PtNode newNode = new PtNode( - Arrays.copyOfRange(word, charIndex + differentCharIndex, word.length), - shortcutTargets, null /* bigrams */, frequency, isNotAWord, - isBlacklistEntry); - currentPtNode.mChildren = new PtNodeArray(); - currentPtNode.mChildren.mData.add(newNode); - } - } else { - if (0 == differentCharIndex) { - // Exact same word. Update the frequency if higher. This will also add the - // new shortcuts to the existing shortcut list if it already exists. - currentPtNode.update(frequency, shortcutTargets, null, - currentPtNode.mIsNotAWord && isNotAWord, - currentPtNode.mIsBlacklistEntry || isBlacklistEntry); - } else { - // Partial prefix match only. We have to replace the current node with a node - // containing the current prefix and create two new ones for the tails. - PtNodeArray newChildren = new PtNodeArray(); - final PtNode newOldWord = new PtNode( - Arrays.copyOfRange(currentPtNode.mChars, differentCharIndex, - currentPtNode.mChars.length), currentPtNode.mShortcutTargets, - currentPtNode.mBigrams, currentPtNode.mFrequency, - currentPtNode.mIsNotAWord, currentPtNode.mIsBlacklistEntry, - currentPtNode.mChildren); - newChildren.mData.add(newOldWord); - - final PtNode newParent; - if (charIndex + differentCharIndex >= word.length) { - newParent = new PtNode( - Arrays.copyOfRange(currentPtNode.mChars, 0, differentCharIndex), - shortcutTargets, null /* bigrams */, frequency, - isNotAWord, isBlacklistEntry, newChildren); - } else { - newParent = new PtNode( - Arrays.copyOfRange(currentPtNode.mChars, 0, differentCharIndex), - null /* shortcutTargets */, null /* bigrams */, -1, - false /* isNotAWord */, false /* isBlacklistEntry */, newChildren); - final PtNode newWord = new PtNode(Arrays.copyOfRange(word, - charIndex + differentCharIndex, word.length), - shortcutTargets, null /* bigrams */, frequency, - isNotAWord, isBlacklistEntry); - final int addIndex = word[charIndex + differentCharIndex] - > currentPtNode.mChars[differentCharIndex] ? 1 : 0; - newChildren.mData.add(addIndex, newWord); - } - currentNodeArray.mData.set(nodeIndex, newParent); - } - if (DBG) checkStack(currentNodeArray); - } - } - } - - private static int ARRAYS_ARE_EQUAL = 0; - - /** - * Custom comparison of two int arrays taken to contain character codes. - * - * This method compares the two arrays passed as an argument in a lexicographic way, - * with an offset in the dst string. - * This method does NOT test for the first character. It is taken to be equal. - * I repeat: this method starts the comparison at 1 <> dstOffset + 1. - * The index where the strings differ is returned. ARRAYS_ARE_EQUAL = 0 is returned if the - * strings are equal. This works BECAUSE we don't look at the first character. - * - * @param src the left-hand side string of the comparison. - * @param dst the right-hand side string of the comparison. - * @param dstOffset the offset in the right-hand side string. - * @return the index at which the strings differ, or ARRAYS_ARE_EQUAL = 0 if they don't. - */ - private static int compareCharArrays(final int[] src, final int[] dst, int dstOffset) { - // We do NOT test the first char, because we come from a method that already - // tested it. - for (int i = 1; i < src.length; ++i) { - if (dstOffset + i >= dst.length) return i; - if (src[i] != dst[dstOffset + i]) return i; - } - if (dst.length > src.length) return src.length; - return ARRAYS_ARE_EQUAL; - } - - /** - * Helper class that compares and sorts two PtNodes according to their - * first element only. I repeat: ONLY the first element is considered, the rest - * is ignored. - * This comparator imposes orderings that are inconsistent with equals. - */ - static private final class PtNodeComparator implements java.util.Comparator<PtNode> { - @Override - public int compare(PtNode p1, PtNode p2) { - if (p1.mChars[0] == p2.mChars[0]) return 0; - return p1.mChars[0] < p2.mChars[0] ? -1 : 1; - } - } - final static private PtNodeComparator PTNODE_COMPARATOR = new PtNodeComparator(); - - /** - * Finds the insertion index of a character within a node array. - */ - private static int findInsertionIndex(final PtNodeArray nodeArray, int character) { - final ArrayList<PtNode> data = nodeArray.mData; - final PtNode reference = new PtNode(new int[] { character }, - null /* shortcutTargets */, null /* bigrams */, 0, false /* isNotAWord */, - false /* isBlacklistEntry */); - int result = Collections.binarySearch(data, reference, PTNODE_COMPARATOR); - return result >= 0 ? result : -result - 1; - } - - /** - * Find the index of a char in a node array, if it exists. - * - * @param nodeArray the node array to search in. - * @param character the character to search for. - * @return the position of the character if it's there, or CHARACTER_NOT_FOUND_INDEX = -1 else. - */ - private static int findIndexOfChar(final PtNodeArray nodeArray, int character) { - final int insertionIndex = findInsertionIndex(nodeArray, character); - if (nodeArray.mData.size() <= insertionIndex) return CHARACTER_NOT_FOUND_INDEX; - return character == nodeArray.mData.get(insertionIndex).mChars[0] ? insertionIndex - : CHARACTER_NOT_FOUND_INDEX; - } - - /** - * Helper method to find a word in a given branch. - */ - @SuppressWarnings("unused") - public static PtNode findWordInTree(PtNodeArray nodeArray, final String string) { - int index = 0; - final StringBuilder checker = DBG ? new StringBuilder() : null; - final int[] codePoints = getCodePoints(string); - - PtNode currentPtNode; - do { - int indexOfGroup = findIndexOfChar(nodeArray, codePoints[index]); - if (CHARACTER_NOT_FOUND_INDEX == indexOfGroup) return null; - currentPtNode = nodeArray.mData.get(indexOfGroup); - - if (codePoints.length - index < currentPtNode.mChars.length) return null; - int newIndex = index; - while (newIndex < codePoints.length && newIndex - index < currentPtNode.mChars.length) { - if (currentPtNode.mChars[newIndex - index] != codePoints[newIndex]) return null; - newIndex++; - } - index = newIndex; - - if (DBG) { - checker.append(new String(currentPtNode.mChars, 0, currentPtNode.mChars.length)); - } - if (index < codePoints.length) { - nodeArray = currentPtNode.mChildren; - } - } while (null != nodeArray && index < codePoints.length); - - if (index < codePoints.length) return null; - if (!currentPtNode.isTerminal()) return null; - if (DBG && !string.equals(checker.toString())) return null; - return currentPtNode; - } - - /** - * Helper method to find out whether a word is in the dict or not. - */ - public boolean hasWord(final String s) { - if (null == s || "".equals(s)) { - throw new RuntimeException("Can't search for a null or empty string"); - } - return null != findWordInTree(mRootNodeArray, s); - } - - /** - * Recursively count the number of PtNodes in a given branch of the trie. - * - * @param nodeArray the parent node. - * @return the number of PtNodes in all the branch under this node. - */ - public static int countPtNodes(final PtNodeArray nodeArray) { - final int nodeSize = nodeArray.mData.size(); - int size = nodeSize; - for (int i = nodeSize - 1; i >= 0; --i) { - PtNode ptNode = nodeArray.mData.get(i); - if (null != ptNode.mChildren) - size += countPtNodes(ptNode.mChildren); - } - return size; - } - - /** - * Recursively count the number of nodes in a given branch of the trie. - * - * @param nodeArray the node array to count. - * @return the number of nodes in this branch. - */ - public static int countNodeArrays(final PtNodeArray nodeArray) { - int size = 1; - for (int i = nodeArray.mData.size() - 1; i >= 0; --i) { - PtNode ptNode = nodeArray.mData.get(i); - if (null != ptNode.mChildren) - size += countNodeArrays(ptNode.mChildren); - } - return size; - } - - // Recursively find out whether there are any bigrams. - // This can be pretty expensive especially if there aren't any (we return as soon - // as we find one, so it's much cheaper if there are bigrams) - private static boolean hasBigramsInternal(final PtNodeArray nodeArray) { - if (null == nodeArray) return false; - for (int i = nodeArray.mData.size() - 1; i >= 0; --i) { - PtNode ptNode = nodeArray.mData.get(i); - if (null != ptNode.mBigrams) return true; - if (hasBigramsInternal(ptNode.mChildren)) return true; - } - return false; - } - - /** - * Finds out whether there are any bigrams in this dictionary. - * - * @return true if there is any bigram, false otherwise. - */ - // TODO: this is expensive especially for large dictionaries without any bigram. - // The up side is, this is always accurate and correct and uses no memory. We should - // find a more efficient way of doing this, without compromising too much on memory - // and ease of use. - public boolean hasBigrams() { - return hasBigramsInternal(mRootNodeArray); - } - - // Historically, the tails of the words were going to be merged to save space. - // However, that would prevent the code to search for a specific address in log(n) - // time so this was abandoned. - // The code is still of interest as it does add some compression to any dictionary - // that has no need for attributes. Implementations that does not read attributes should be - // able to read a dictionary with merged tails. - // Also, the following code does support frequencies, as in, it will only merges - // tails that share the same frequency. Though it would result in the above loss of - // performance while searching by address, it is still technically possible to merge - // tails that contain attributes, but this code does not take that into account - it does - // not compare attributes and will merge terminals with different attributes regardless. - public void mergeTails() { - MakedictLog.i("Do not merge tails"); - return; - -// MakedictLog.i("Merging PtNodes. Number of PtNodes : " + countPtNodes(root)); -// MakedictLog.i("Number of PtNodes : " + countPtNodes(root)); -// -// final HashMap<String, ArrayList<PtNodeArray>> repository = -// new HashMap<String, ArrayList<PtNodeArray>>(); -// mergeTailsInner(repository, root); -// -// MakedictLog.i("Number of different pseudohashes : " + repository.size()); -// int size = 0; -// for (ArrayList<PtNodeArray> a : repository.values()) { -// size += a.size(); -// } -// MakedictLog.i("Number of nodes after merge : " + (1 + size)); -// MakedictLog.i("Recursively seen nodes : " + countNodes(root)); - } - - // The following methods are used by the deactivated mergeTails() -// private static boolean isEqual(PtNodeArray a, PtNodeArray b) { -// if (null == a && null == b) return true; -// if (null == a || null == b) return false; -// if (a.data.size() != b.data.size()) return false; -// final int size = a.data.size(); -// for (int i = size - 1; i >= 0; --i) { -// PtNode aPtNode = a.data.get(i); -// PtNode bPtNode = b.data.get(i); -// if (aPtNode.frequency != bPtNode.frequency) return false; -// if (aPtNode.alternates == null && bPtNode.alternates != null) return false; -// if (aPtNode.alternates != null && !aPtNode.equals(bPtNode.alternates)) return false; -// if (!Arrays.equals(aPtNode.chars, bPtNode.chars)) return false; -// if (!isEqual(aPtNode.children, bPtNode.children)) return false; -// } -// return true; -// } - -// static private HashMap<String, ArrayList<PtNodeArray>> mergeTailsInner( -// final HashMap<String, ArrayList<PtNodeArray>> map, final PtNodeArray nodeArray) { -// final ArrayList<PtNode> branches = nodeArray.data; -// final int nodeSize = branches.size(); -// for (int i = 0; i < nodeSize; ++i) { -// PtNode ptNode = branches.get(i); -// if (null != ptNode.children) { -// String pseudoHash = getPseudoHash(ptNode.children); -// ArrayList<PtNodeArray> similarList = map.get(pseudoHash); -// if (null == similarList) { -// similarList = new ArrayList<PtNodeArray>(); -// map.put(pseudoHash, similarList); -// } -// boolean merged = false; -// for (PtNodeArray similar : similarList) { -// if (isEqual(ptNode.children, similar)) { -// ptNode.children = similar; -// merged = true; -// break; -// } -// } -// if (!merged) { -// similarList.add(ptNode.children); -// } -// mergeTailsInner(map, ptNode.children); -// } -// } -// return map; -// } - -// private static String getPseudoHash(final PtNodeArray nodeArray) { -// StringBuilder s = new StringBuilder(); -// for (PtNode ptNode : nodeArray.data) { -// s.append(ptNode.frequency); -// for (int ch : ptNode.chars) { -// s.append(Character.toChars(ch)); -// } -// } -// return s.toString(); -// } - - /** - * Iterator to walk through a dictionary. - * - * This is purely for convenience. - */ - public static final class DictionaryIterator implements Iterator<Word> { - private static final class Position { - public Iterator<PtNode> pos; - public int length; - public Position(ArrayList<PtNode> ptNodes) { - pos = ptNodes.iterator(); - length = 0; - } - } - final StringBuilder mCurrentString; - final LinkedList<Position> mPositions; - - public DictionaryIterator(ArrayList<PtNode> ptRoot) { - mCurrentString = new StringBuilder(); - mPositions = new LinkedList<Position>(); - final Position rootPos = new Position(ptRoot); - mPositions.add(rootPos); - } - - @Override - public boolean hasNext() { - for (Position p : mPositions) { - if (p.pos.hasNext()) { - return true; - } - } - return false; - } - - @Override - public Word next() { - Position currentPos = mPositions.getLast(); - mCurrentString.setLength(currentPos.length); - - do { - if (currentPos.pos.hasNext()) { - final PtNode currentPtNode = currentPos.pos.next(); - currentPos.length = mCurrentString.length(); - for (int i : currentPtNode.mChars) { - mCurrentString.append(Character.toChars(i)); - } - if (null != currentPtNode.mChildren) { - currentPos = new Position(currentPtNode.mChildren.mData); - currentPos.length = mCurrentString.length(); - mPositions.addLast(currentPos); - } - if (currentPtNode.mFrequency >= 0) { - return new Word(mCurrentString.toString(), currentPtNode.mFrequency, - currentPtNode.mShortcutTargets, currentPtNode.mBigrams, - currentPtNode.mIsNotAWord, currentPtNode.mIsBlacklistEntry); - } - } else { - mPositions.removeLast(); - currentPos = mPositions.getLast(); - mCurrentString.setLength(mPositions.getLast().length); - } - } while (true); - } - - @Override - public void remove() { - throw new UnsupportedOperationException("Unsupported yet"); - } - - } - - /** - * Method to return an iterator. - * - * This method enables Java's enhanced for loop. With this you can have a FusionDictionary x - * and say : for (Word w : x) {} - */ - @Override - public Iterator<Word> iterator() { - return new DictionaryIterator(mRootNodeArray.mData); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/MakedictLog.java b/java/src/com/android/inputmethod/latin/makedict/MakedictLog.java deleted file mode 100644 index cf07209d9..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/MakedictLog.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -import android.util.Log; - -/** - * Wrapper to redirect log events to the right output medium. - */ -public final class MakedictLog { - public static final boolean DBG = false; - private static final String TAG = MakedictLog.class.getSimpleName(); - - public static void d(String message) { - if (DBG) { - Log.d(TAG, message); - } - } - - public static void i(String message) { - if (DBG) { - Log.i(TAG, message); - } - } - - public static void w(String message) { - Log.w(TAG, message); - } - - public static void e(String message) { - Log.e(TAG, message); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/PendingAttribute.java b/java/src/com/android/inputmethod/latin/makedict/PendingAttribute.java deleted file mode 100644 index 70e24cc98..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/PendingAttribute.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -/** - * A not-yet-resolved attribute. - * - * An attribute is either a bigram or a shortcut. - * All instances of this class are always immutable. - */ -public final class PendingAttribute { - public final int mFrequency; - public final int mAddress; - public PendingAttribute(final int frequency, final int address) { - mFrequency = frequency; - mAddress = address; - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java new file mode 100644 index 000000000..5fcbb6357 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2014 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.makedict; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.BinaryDictionary; +import com.android.inputmethod.latin.utils.CombinedFormatUtils; + +import java.util.Arrays; + +public final class ProbabilityInfo { + public final int mProbability; + // mTimestamp, mLevel and mCount are historical info. These values are depend on the + // implementation in native code; thus, we must not use them and have any assumptions about + // them except for tests. + public final int mTimestamp; + public final int mLevel; + public final int mCount; + + @UsedForTesting + public static ProbabilityInfo max(final ProbabilityInfo probabilityInfo1, + final ProbabilityInfo probabilityInfo2) { + if (probabilityInfo1 == null) { + return probabilityInfo2; + } + if (probabilityInfo2 == null) { + return probabilityInfo1; + } + if (probabilityInfo1.mProbability > probabilityInfo2.mProbability) { + return probabilityInfo1; + } else { + return probabilityInfo2; + } + } + + public ProbabilityInfo(final int probability) { + this(probability, BinaryDictionary.NOT_A_VALID_TIMESTAMP, 0, 0); + } + + public ProbabilityInfo(final int probability, final int timestamp, final int level, + final int count) { + mProbability = probability; + mTimestamp = timestamp; + mLevel = level; + mCount = count; + } + + public boolean hasHistoricalInfo() { + return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP; + } + + @Override + public int hashCode() { + if (hasHistoricalInfo()) { + return Arrays.hashCode(new Object[] { mProbability, mTimestamp, mLevel, mCount }); + } else { + return Arrays.hashCode(new Object[] { mProbability }); + } + } + + @Override + public String toString() { + return CombinedFormatUtils.formatProbabilityInfo(this); + } + + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof ProbabilityInfo)) return false; + final ProbabilityInfo p = (ProbabilityInfo)o; + if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) { + return mProbability == p.mProbability; + } + return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel + && mCount == p.mCount; + } +}
\ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java b/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java deleted file mode 100644 index 188de7a0f..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/PtNodeInfo.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.util.ArrayList; - -/** - * Raw PtNode info straight out of a file. This will contain numbers for addresses. - */ -public final class PtNodeInfo { - - public final int mOriginalAddress; - public final int mEndAddress; - public final int mFlags; - public final int[] mCharacters; - public final int mFrequency; - public final int mChildrenAddress; - public final int mParentAddress; - public final ArrayList<WeightedString> mShortcutTargets; - public final ArrayList<PendingAttribute> mBigrams; - - public PtNodeInfo(final int originalAddress, final int endAddress, final int flags, - final int[] characters, final int frequency, final int parentAddress, - final int childrenAddress, final ArrayList<WeightedString> shortcutTargets, - final ArrayList<PendingAttribute> bigrams) { - mOriginalAddress = originalAddress; - mEndAddress = endAddress; - mFlags = flags; - mCharacters = characters; - mFrequency = frequency; - mParentAddress = parentAddress; - mChildrenAddress = childrenAddress; - mShortcutTargets = shortcutTargets; - mBigrams = bigrams; - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/SparseTable.java b/java/src/com/android/inputmethod/latin/makedict/SparseTable.java deleted file mode 100644 index 7592a0c13..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/SparseTable.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; - -/** - * SparseTable is an extensible map from integer to integer. - * This holds one value for every mBlockSize keys, so it uses 1/mBlockSize'th of the full index - * memory. - */ -@UsedForTesting -public class SparseTable { - - /** - * mLookupTable is indexed by terminal ID, containing exactly one entry for every mBlockSize - * terminals. - * It contains at index i = j / mBlockSize the index in each ArrayList in mContentsTables where - * the values for terminals with IDs j to j + mBlockSize - 1 are stored as an mBlockSize-sized - * integer array. - */ - private final ArrayList<Integer> mLookupTable; - private final ArrayList<ArrayList<Integer>> mContentTables; - - private final int mBlockSize; - private final int mContentTableCount; - public static final int NOT_EXIST = -1; - public static final int SIZE_OF_INT_IN_BYTES = 4; - - @UsedForTesting - public SparseTable(final int initialCapacity, final int blockSize, - final int contentTableCount) { - mBlockSize = blockSize; - final int lookupTableSize = initialCapacity / mBlockSize - + (initialCapacity % mBlockSize > 0 ? 1 : 0); - mLookupTable = new ArrayList<Integer>(Collections.nCopies(lookupTableSize, NOT_EXIST)); - mContentTableCount = contentTableCount; - mContentTables = CollectionUtils.newArrayList(); - for (int i = 0; i < mContentTableCount; ++i) { - mContentTables.add(new ArrayList<Integer>()); - } - } - - @UsedForTesting - public SparseTable(final ArrayList<Integer> lookupTable, - final ArrayList<ArrayList<Integer>> contentTables, final int blockSize) { - mBlockSize = blockSize; - mContentTableCount = contentTables.size(); - mLookupTable = lookupTable; - mContentTables = contentTables; - } - - /** - * Converts an byte array to an int array considering each set of 4 bytes is an int stored in - * big-endian. - * The length of byteArray must be a multiple of four. - * Otherwise, IndexOutOfBoundsException will be raised. - */ - @UsedForTesting - private static ArrayList<Integer> convertByteArrayToIntegerArray(final byte[] byteArray) { - final ArrayList<Integer> integerArray = new ArrayList<Integer>(byteArray.length / 4); - for (int i = 0; i < byteArray.length; i += 4) { - int value = 0; - for (int j = i; j < i + 4; ++j) { - value <<= 8; - value |= byteArray[j] & 0xFF; - } - integerArray.add(value); - } - return integerArray; - } - - @UsedForTesting - public int get(final int contentTableIndex, final int index) { - if (!contains(index)) { - return NOT_EXIST; - } - return mContentTables.get(contentTableIndex).get( - mLookupTable.get(index / mBlockSize) + (index % mBlockSize)); - } - - @UsedForTesting - public ArrayList<Integer> getAll(final int index) { - final ArrayList<Integer> ret = CollectionUtils.newArrayList(); - for (int i = 0; i < mContentTableCount; ++i) { - ret.add(get(i, index)); - } - return ret; - } - - @UsedForTesting - public void set(final int contentTableIndex, final int index, final int value) { - if (mLookupTable.get(index / mBlockSize) == NOT_EXIST) { - mLookupTable.set(index / mBlockSize, mContentTables.get(contentTableIndex).size()); - for (int i = 0; i < mContentTableCount; ++i) { - for (int j = 0; j < mBlockSize; ++j) { - mContentTables.get(i).add(NOT_EXIST); - } - } - } - mContentTables.get(contentTableIndex).set( - mLookupTable.get(index / mBlockSize) + (index % mBlockSize), value); - } - - public void remove(final int indexOfContent, final int index) { - set(indexOfContent, index, NOT_EXIST); - } - - @UsedForTesting - public int size() { - return mLookupTable.size() * mBlockSize; - } - - @UsedForTesting - /* package */ int getContentTableSize() { - // This class always has at least one content table. - return mContentTables.get(0).size(); - } - - @UsedForTesting - /* package */ int getLookupTableSize() { - return mLookupTable.size(); - } - - public boolean contains(final int index) { - if (index < 0 || index / mBlockSize >= mLookupTable.size() - || mLookupTable.get(index / mBlockSize) == NOT_EXIST) { - return false; - } - return true; - } - - @UsedForTesting - public void write(final OutputStream lookupOutStream, final OutputStream[] contentOutStreams) - throws IOException { - if (contentOutStreams.length != mContentTableCount) { - throw new RuntimeException(contentOutStreams.length + " streams are given, but the" - + " table has " + mContentTableCount + " content tables."); - } - for (final int index : mLookupTable) { - BinaryDictEncoderUtils.writeUIntToStream(lookupOutStream, index, SIZE_OF_INT_IN_BYTES); - } - - for (int i = 0; i < contentOutStreams.length; ++i) { - for (final int data : mContentTables.get(i)) { - BinaryDictEncoderUtils.writeUIntToStream(contentOutStreams[i], data, - SIZE_OF_INT_IN_BYTES); - } - } - } - - @UsedForTesting - public void writeToFiles(final File lookupTableFile, final File[] contentFiles) - throws IOException { - FileOutputStream lookupTableOutStream = null; - final FileOutputStream[] contentTableOutStreams = new FileOutputStream[mContentTableCount]; - try { - lookupTableOutStream = new FileOutputStream(lookupTableFile); - for (int i = 0; i < contentFiles.length; ++i) { - contentTableOutStreams[i] = new FileOutputStream(contentFiles[i]); - } - write(lookupTableOutStream, contentTableOutStreams); - } finally { - if (lookupTableOutStream != null) { - lookupTableOutStream.close(); - } - for (int i = 0; i < contentTableOutStreams.length; ++i) { - if (contentTableOutStreams[i] != null) { - contentTableOutStreams[i].close(); - } - } - } - } - - private static byte[] readFileToByteArray(final File file) throws IOException { - final byte[] contents = new byte[(int) file.length()]; - FileInputStream inStream = null; - try { - inStream = new FileInputStream(file); - inStream.read(contents); - } finally { - if (inStream != null) { - inStream.close(); - } - } - return contents; - } - - @UsedForTesting - public static SparseTable readFromFiles(final File lookupTableFile, final File[] contentFiles, - final int blockSize) throws IOException { - final ArrayList<ArrayList<Integer>> contentTables = - new ArrayList<ArrayList<Integer>>(contentFiles.length); - for (int i = 0; i < contentFiles.length; ++i) { - contentTables.add(convertByteArrayToIntegerArray(readFileToByteArray(contentFiles[i]))); - } - return new SparseTable(convertByteArrayToIntegerArray(readFileToByteArray(lookupTableFile)), - contentTables, blockSize); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver3DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver3DictDecoder.java deleted file mode 100644 index acab4f8a5..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver3DictDecoder.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; -import com.android.inputmethod.latin.utils.JniUtils; - -import android.util.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * An implementation of DictDecoder for version 3 binary dictionary. - */ -@UsedForTesting -public class Ver3DictDecoder extends AbstractDictDecoder { - private static final String TAG = Ver3DictDecoder.class.getSimpleName(); - - static { - JniUtils.loadNativeLibrary(); - } - - // TODO: implement something sensical instead of just a phony method - private static native int doNothing(); - - protected static class PtNodeReader extends AbstractDictDecoder.PtNodeReader { - private static int readFrequency(final DictBuffer dictBuffer) { - return dictBuffer.readUnsignedByte(); - } - } - - protected final File mDictionaryBinaryFile; - private final DictionaryBufferFactory mBufferFactory; - protected DictBuffer mDictBuffer; - - /* package */ Ver3DictDecoder(final File file, final int factoryFlag) { - mDictionaryBinaryFile = file; - mDictBuffer = null; - - if ((factoryFlag & MASK_DICTBUFFER) == USE_READONLY_BYTEBUFFER) { - mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory(); - } else if ((factoryFlag & MASK_DICTBUFFER) == USE_BYTEARRAY) { - mBufferFactory = new DictionaryBufferFromByteArrayFactory(); - } else if ((factoryFlag & MASK_DICTBUFFER) == USE_WRITABLE_BYTEBUFFER) { - mBufferFactory = new DictionaryBufferFromWritableByteBufferFactory(); - } else { - mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory(); - } - } - - /* package */ Ver3DictDecoder(final File file, final DictionaryBufferFactory factory) { - mDictionaryBinaryFile = file; - mBufferFactory = factory; - } - - @Override - public void openDictBuffer() throws FileNotFoundException, IOException { - mDictBuffer = mBufferFactory.getDictionaryBuffer(mDictionaryBinaryFile); - } - - @Override - public boolean isDictBufferOpen() { - return mDictBuffer != null; - } - - /* package */ DictBuffer getDictBuffer() { - return mDictBuffer; - } - - @UsedForTesting - /* package */ DictBuffer openAndGetDictBuffer() throws FileNotFoundException, IOException { - openDictBuffer(); - return getDictBuffer(); - } - - @Override - public FileHeader readHeader() throws IOException, UnsupportedFormatException { - if (mDictBuffer == null) { - openDictBuffer(); - } - final FileHeader header = super.readHeader(mDictBuffer); - final int version = header.mFormatOptions.mVersion; - if (!(version >= 2 && version <= 3)) { - throw new UnsupportedFormatException("File header has a wrong version : " + version); - } - return header; - } - - // TODO: Make this buffer multi thread safe. - private final int[] mCharacterBuffer = new int[FormatSpec.MAX_WORD_LENGTH]; - @Override - public PtNodeInfo readPtNode(final int ptNodePos, final FormatOptions options) { - int addressPointer = ptNodePos; - final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer); - addressPointer += FormatSpec.PTNODE_FLAGS_SIZE; - - final int parentAddress = PtNodeReader.readParentAddress(mDictBuffer, options); - if (BinaryDictIOUtils.supportsDynamicUpdate(options)) { - addressPointer += FormatSpec.PARENT_ADDRESS_SIZE; - } - - final int characters[]; - if (0 != (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS)) { - int index = 0; - int character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - while (FormatSpec.INVALID_CHARACTER != character) { - // FusionDictionary is making sure that the length of the word is smaller than - // MAX_WORD_LENGTH. - // So we'll never write past the end of mCharacterBuffer. - mCharacterBuffer[index++] = character; - character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - } - characters = Arrays.copyOfRange(mCharacterBuffer, 0, index); - } else { - final int character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - characters = new int[] { character }; - } - final int frequency; - if (0 != (FormatSpec.FLAG_IS_TERMINAL & flags)) { - frequency = PtNodeReader.readFrequency(mDictBuffer); - addressPointer += FormatSpec.PTNODE_FREQUENCY_SIZE; - } else { - frequency = PtNode.NOT_A_TERMINAL; - } - int childrenAddress = PtNodeReader.readChildrenAddress(mDictBuffer, flags, options); - if (childrenAddress != FormatSpec.NO_CHILDREN_ADDRESS) { - childrenAddress += addressPointer; - } - addressPointer += BinaryDictIOUtils.getChildrenAddressSize(flags, options); - final ArrayList<WeightedString> shortcutTargets; - if (0 != (flags & FormatSpec.FLAG_HAS_SHORTCUT_TARGETS)) { - // readShortcut will add shortcuts to shortcutTargets. - shortcutTargets = new ArrayList<WeightedString>(); - addressPointer += PtNodeReader.readShortcut(mDictBuffer, shortcutTargets); - } else { - shortcutTargets = null; - } - - final ArrayList<PendingAttribute> bigrams; - if (0 != (flags & FormatSpec.FLAG_HAS_BIGRAMS)) { - bigrams = new ArrayList<PendingAttribute>(); - addressPointer += PtNodeReader.readBigramAddresses(mDictBuffer, bigrams, - addressPointer); - if (bigrams.size() >= FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - throw new RuntimeException("Too many bigrams in a PtNode (" + bigrams.size() - + " but max is " + FormatSpec.MAX_BIGRAMS_IN_A_PTNODE + ")"); - } - } else { - bigrams = null; - } - return new PtNodeInfo(ptNodePos, addressPointer, flags, characters, frequency, - parentAddress, childrenAddress, shortcutTargets, bigrams); - } - - @Override - public FusionDictionary readDictionaryBinary(final FusionDictionary dict, - final boolean deleteDictIfBroken) - throws FileNotFoundException, IOException, UnsupportedFormatException { - if (mDictBuffer == null) { - openDictBuffer(); - } - try { - return BinaryDictDecoderUtils.readDictionaryBinary(this, dict); - } catch (IOException e) { - Log.e(TAG, "The dictionary " + mDictionaryBinaryFile.getName() + " is broken.", e); - if (deleteDictIfBroken && !mDictionaryBinaryFile.delete()) { - Log.e(TAG, "Failed to delete the broken dictionary."); - } - throw e; - } catch (UnsupportedFormatException e) { - Log.e(TAG, "The dictionary " + mDictionaryBinaryFile.getName() + " is broken.", e); - if (deleteDictIfBroken && !mDictionaryBinaryFile.delete()) { - Log.e(TAG, "Failed to delete the broken dictionary."); - } - throw e; - } - } - - @Override - public void setPosition(int newPos) { - mDictBuffer.position(newPos); - } - - @Override - public int getPosition() { - return mDictBuffer.position(); - } - - @Override - public int readPtNodeCount() { - return BinaryDictDecoderUtils.readPtNodeCount(mDictBuffer); - } - - @Override - public boolean readAndFollowForwardLink() { - final int nextAddress = mDictBuffer.readUnsignedInt24(); - if (nextAddress >= 0 && nextAddress < mDictBuffer.limit()) { - mDictBuffer.position(nextAddress); - return true; - } - return false; - } - - @Override - public boolean hasNextPtNodeArray() { - return mDictBuffer.position() != FormatSpec.NO_FORWARD_LINK_ADDRESS; - } - - @Override - public void skipPtNode(final FormatOptions formatOptions) { - final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer); - PtNodeReader.readParentAddress(mDictBuffer, formatOptions); - BinaryDictIOUtils.skipString(mDictBuffer, - (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS) != 0); - PtNodeReader.readChildrenAddress(mDictBuffer, flags, formatOptions); - if ((flags & FormatSpec.FLAG_IS_TERMINAL) != 0) PtNodeReader.readFrequency(mDictBuffer); - if ((flags & FormatSpec.FLAG_HAS_SHORTCUT_TARGETS) != 0) { - final int shortcutsSize = mDictBuffer.readUnsignedShort(); - mDictBuffer.position(mDictBuffer.position() + shortcutsSize - - FormatSpec.PTNODE_SHORTCUT_LIST_SIZE_SIZE); - } - if ((flags & FormatSpec.FLAG_HAS_BIGRAMS) != 0) { - int bigramCount = 0; - while (bigramCount++ < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - final int bigramFlags = mDictBuffer.readUnsignedByte(); - switch (bigramFlags & FormatSpec.MASK_BIGRAM_ATTR_ADDRESS_TYPE) { - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_ONEBYTE: - mDictBuffer.readUnsignedByte(); - break; - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_TWOBYTES: - mDictBuffer.readUnsignedShort(); - break; - case FormatSpec.FLAG_BIGRAM_ATTR_ADDRESS_TYPE_THREEBYTES: - mDictBuffer.readUnsignedInt24(); - break; - } - if ((bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT) == 0) break; - } - if (bigramCount >= FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - throw new RuntimeException("Too many bigrams in a PtNode."); - } - } - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver3DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver3DictEncoder.java deleted file mode 100644 index 5da34534e..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver3DictEncoder.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * An implementation of DictEncoder for version 3 binary dictionary. - */ -public class Ver3DictEncoder implements DictEncoder { - - private final File mDictFile; - private OutputStream mOutStream; - private byte[] mBuffer; - private int mPosition; - - public Ver3DictEncoder(final File dictFile) { - mDictFile = dictFile; - mOutStream = null; - mBuffer = null; - } - - // This constructor is used only by BinaryDictOffdeviceUtilsTests. - // If you want to use this in the production code, you should consider keeping consistency of - // the interface of Ver3DictDecoder by using factory. - public Ver3DictEncoder(final OutputStream outStream) { - mDictFile = null; - mOutStream = outStream; - } - - private void openStream() throws FileNotFoundException { - mOutStream = new FileOutputStream(mDictFile); - } - - private void close() throws IOException { - if (mOutStream != null) { - mOutStream.close(); - mOutStream = null; - } - } - - @Override - public void writeDictionary(final FusionDictionary dict, final FormatOptions formatOptions) - throws IOException, UnsupportedFormatException { - if (formatOptions.mVersion > FormatSpec.VERSION3) { - throw new UnsupportedFormatException( - "The given format options has wrong version number : " - + formatOptions.mVersion); - } - - if (mOutStream == null) { - openStream(); - } - BinaryDictEncoderUtils.writeDictionaryHeader(mOutStream, dict, formatOptions); - - // Addresses are limited to 3 bytes, but since addresses can be relative to each node - // array, the structure itself is not limited to 16MB. However, if it is over 16MB deciding - // the order of the PtNode arrays becomes a quite complicated problem, because though the - // dictionary itself does not have a size limit, each node array must still be within 16MB - // of all its children and parents. As long as this is ensured, the dictionary file may - // grow to any size. - - // Leave the choice of the optimal node order to the flattenTree function. - MakedictLog.i("Flattening the tree..."); - ArrayList<PtNodeArray> flatNodes = BinaryDictEncoderUtils.flattenTree(dict.mRootNodeArray); - - MakedictLog.i("Computing addresses..."); - BinaryDictEncoderUtils.computeAddresses(dict, flatNodes, formatOptions); - MakedictLog.i("Checking PtNode array..."); - if (MakedictLog.DBG) BinaryDictEncoderUtils.checkFlatPtNodeArrayList(flatNodes); - - // Create a buffer that matches the final dictionary size. - final PtNodeArray lastNodeArray = flatNodes.get(flatNodes.size() - 1); - final int bufferSize = lastNodeArray.mCachedAddressAfterUpdate + lastNodeArray.mCachedSize; - mBuffer = new byte[bufferSize]; - - MakedictLog.i("Writing file..."); - - for (PtNodeArray nodeArray : flatNodes) { - BinaryDictEncoderUtils.writePlacedPtNodeArray(dict, this, nodeArray, formatOptions); - } - if (MakedictLog.DBG) BinaryDictEncoderUtils.showStatistics(flatNodes); - mOutStream.write(mBuffer, 0, mPosition); - - MakedictLog.i("Done"); - close(); - } - - @Override - public void setPosition(final int position) { - if (mBuffer == null || position < 0 || position >= mBuffer.length) return; - mPosition = position; - } - - @Override - public int getPosition() { - return mPosition; - } - - @Override - public void writePtNodeCount(final int ptNodeCount) { - final int countSize = BinaryDictIOUtils.getPtNodeCountSize(ptNodeCount); - if (countSize != 1 && countSize != 2) { - throw new RuntimeException("Strange size from getGroupCountSize : " + countSize); - } - final int encodedPtNodeCount = (countSize == 2) ? - (ptNodeCount | FormatSpec.LARGE_PTNODE_ARRAY_SIZE_FIELD_SIZE_FLAG) : ptNodeCount; - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, encodedPtNodeCount, - countSize); - } - - private void writePtNodeFlags(final PtNode ptNode, final FormatOptions formatOptions) { - final int childrenPos = BinaryDictEncoderUtils.getChildrenPosition(ptNode, formatOptions); - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, - BinaryDictEncoderUtils.makePtNodeFlags(ptNode, childrenPos, formatOptions), - FormatSpec.PTNODE_FLAGS_SIZE); - } - - private void writeParentPosition(final int parentPosition, final PtNode ptNode, - final FormatOptions formatOptions) { - if (parentPosition == FormatSpec.NO_PARENT_ADDRESS) { - mPosition = BinaryDictEncoderUtils.writeParentAddress(mBuffer, mPosition, - parentPosition, formatOptions); - } else { - mPosition = BinaryDictEncoderUtils.writeParentAddress(mBuffer, mPosition, - parentPosition - ptNode.mCachedAddressAfterUpdate, formatOptions); - } - } - - private void writeCharacters(final int[] codePoints, final boolean hasSeveralChars) { - mPosition = CharEncoding.writeCharArray(codePoints, mBuffer, mPosition); - if (hasSeveralChars) { - mBuffer[mPosition++] = FormatSpec.PTNODE_CHARACTERS_TERMINATOR; - } - } - - private void writeFrequency(final int frequency) { - if (frequency >= 0) { - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, frequency, - FormatSpec.PTNODE_FREQUENCY_SIZE); - } - } - - private void writeChildrenPosition(final PtNode ptNode, final FormatOptions formatOptions) { - final int childrenPos = BinaryDictEncoderUtils.getChildrenPosition(ptNode, formatOptions); - if (formatOptions.mSupportsDynamicUpdate) { - mPosition += BinaryDictEncoderUtils.writeSignedChildrenPosition(mBuffer, mPosition, - childrenPos); - } else { - mPosition += BinaryDictEncoderUtils.writeChildrenPosition(mBuffer, mPosition, - childrenPos); - } - } - - /** - * Write a shortcut attributes list to mBuffer. - * - * @param shortcuts the shortcut attributes list. - */ - private void writeShortcuts(final ArrayList<WeightedString> shortcuts) { - if (null == shortcuts || shortcuts.isEmpty()) return; - - final int indexOfShortcutByteSize = mPosition; - mPosition += FormatSpec.PTNODE_SHORTCUT_LIST_SIZE_SIZE; - final Iterator<WeightedString> shortcutIterator = shortcuts.iterator(); - while (shortcutIterator.hasNext()) { - final WeightedString target = shortcutIterator.next(); - final int shortcutFlags = BinaryDictEncoderUtils.makeShortcutFlags( - shortcutIterator.hasNext(), - target.mFrequency); - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, shortcutFlags, - FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); - final int shortcutShift = CharEncoding.writeString(mBuffer, mPosition, target.mWord); - mPosition += shortcutShift; - } - final int shortcutByteSize = mPosition - indexOfShortcutByteSize; - if (shortcutByteSize > FormatSpec.MAX_SHORTCUT_LIST_SIZE_IN_A_PTNODE) { - throw new RuntimeException("Shortcut list too large"); - } - BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, indexOfShortcutByteSize, shortcutByteSize, - FormatSpec.PTNODE_SHORTCUT_LIST_SIZE_SIZE); - } - - /** - * Write a bigram attributes list to mBuffer. - * - * @param bigrams the bigram attributes list. - * @param dict the dictionary the node array is a part of (for relative offsets). - */ - private void writeBigrams(final ArrayList<WeightedString> bigrams, - final FusionDictionary dict) { - if (bigrams == null) return; - - final Iterator<WeightedString> bigramIterator = bigrams.iterator(); - while (bigramIterator.hasNext()) { - final WeightedString bigram = bigramIterator.next(); - final PtNode target = - FusionDictionary.findWordInTree(dict.mRootNodeArray, bigram.mWord); - final int addressOfBigram = target.mCachedAddressAfterUpdate; - final int unigramFrequencyForThisWord = target.mFrequency; - final int offset = addressOfBigram - - (mPosition + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); - final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags(bigramIterator.hasNext(), - offset, bigram.mFrequency, unigramFrequencyForThisWord, bigram.mWord); - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, bigramFlags, - FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); - mPosition += BinaryDictEncoderUtils.writeChildrenPosition(mBuffer, mPosition, - Math.abs(offset)); - } - } - - @Override - public void writeForwardLinkAddress(final int forwardLinkAddress) { - mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, forwardLinkAddress, - FormatSpec.FORWARD_LINK_ADDRESS_SIZE); - } - - @Override - public void writePtNode(final PtNode ptNode, final int parentPosition, - final FormatOptions formatOptions, final FusionDictionary dict) { - writePtNodeFlags(ptNode, formatOptions); - writeParentPosition(parentPosition, ptNode, formatOptions); - writeCharacters(ptNode.mChars, ptNode.hasSeveralChars()); - writeFrequency(ptNode.mFrequency); - writeChildrenPosition(ptNode, formatOptions); - writeShortcuts(ptNode.mShortcutTargets); - writeBigrams(ptNode.mBigrams, dict); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver3DictUpdater.java b/java/src/com/android/inputmethod/latin/makedict/Ver3DictUpdater.java deleted file mode 100644 index 07adda625..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver3DictUpdater.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; - -/** - * An implementation of DictUpdater for version 3 binary dictionary. - */ -@UsedForTesting -public class Ver3DictUpdater extends Ver3DictDecoder implements DictUpdater { - private OutputStream mOutStream; - - @UsedForTesting - public Ver3DictUpdater(final File dictFile, final int factoryType) { - // DictUpdater must have an updatable DictBuffer. - super(dictFile, ((factoryType & MASK_DICTBUFFER) == USE_BYTEARRAY) - ? USE_BYTEARRAY : USE_WRITABLE_BYTEBUFFER); - mOutStream = null; - } - - private void openStreamAndBuffer() throws FileNotFoundException, IOException { - super.openDictBuffer(); - mOutStream = new FileOutputStream(mDictionaryBinaryFile, true /* append */); - } - - private void close() throws IOException { - if (mOutStream != null) { - mOutStream.close(); - mOutStream = null; - } - } - - @Override @UsedForTesting - public void deleteWord(final String word) throws IOException, UnsupportedFormatException { - if (mOutStream == null) openStreamAndBuffer(); - mDictBuffer.position(0); - readHeader(); - final int wordPos = getTerminalPosition(word); - if (wordPos != FormatSpec.NOT_VALID_WORD) { - mDictBuffer.position(wordPos); - final int flags = mDictBuffer.readUnsignedByte(); - mDictBuffer.position(wordPos); - mDictBuffer.put((byte) DynamicBinaryDictIOUtils.markAsDeleted(flags)); - } - close(); - } - - @Override @UsedForTesting - public void insertWord(final String word, final int frequency, - final ArrayList<WeightedString> bigramStrings, - final ArrayList<WeightedString> shortcuts, - final boolean isNotAWord, final boolean isBlackListEntry) - throws IOException, UnsupportedFormatException { - if (mOutStream == null) openStreamAndBuffer(); - DynamicBinaryDictIOUtils.insertWord(this, mOutStream, word, frequency, bigramStrings, - shortcuts, isNotAWord, isBlackListEntry); - close(); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java deleted file mode 100644 index 734223ec2..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import android.util.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * An implementation of binary dictionary decoder for version 4 binary dictionary. - */ -@UsedForTesting -public class Ver4DictDecoder extends AbstractDictDecoder { - private static final String TAG = Ver4DictDecoder.class.getSimpleName(); - - private static final int FILETYPE_TRIE = 1; - private static final int FILETYPE_FREQUENCY = 2; - private static final int FILETYPE_TERMINAL_ADDRESS_TABLE = 3; - private static final int FILETYPE_BIGRAM_FREQ = 4; - private static final int FILETYPE_SHORTCUT = 5; - - private final File mDictDirectory; - private final DictionaryBufferFactory mBufferFactory; - protected DictBuffer mDictBuffer; - private DictBuffer mFrequencyBuffer; - private DictBuffer mTerminalAddressTableBuffer; - private DictBuffer mBigramBuffer; - private DictBuffer mShortcutBuffer; - private SparseTable mBigramAddressTable; - private SparseTable mShortcutAddressTable; - - @UsedForTesting - /* package */ Ver4DictDecoder(final File dictDirectory, final int factoryFlag) { - mDictDirectory = dictDirectory; - mDictBuffer = mFrequencyBuffer = null; - - if ((factoryFlag & MASK_DICTBUFFER) == USE_READONLY_BYTEBUFFER) { - mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory(); - } else if ((factoryFlag & MASK_DICTBUFFER) == USE_BYTEARRAY) { - mBufferFactory = new DictionaryBufferFromByteArrayFactory(); - } else if ((factoryFlag & MASK_DICTBUFFER) == USE_WRITABLE_BYTEBUFFER) { - mBufferFactory = new DictionaryBufferFromWritableByteBufferFactory(); - } else { - mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory(); - } - } - - @UsedForTesting - /* package */ Ver4DictDecoder(final File dictDirectory, final DictionaryBufferFactory factory) { - mDictDirectory = dictDirectory; - mBufferFactory = factory; - mDictBuffer = mFrequencyBuffer = null; - } - - private File getFile(final int fileType) { - if (fileType == FILETYPE_TRIE) { - return new File(mDictDirectory, - mDictDirectory.getName() + FormatSpec.TRIE_FILE_EXTENSION); - } else if (fileType == FILETYPE_FREQUENCY) { - return new File(mDictDirectory, - mDictDirectory.getName() + FormatSpec.FREQ_FILE_EXTENSION); - } else if (fileType == FILETYPE_TERMINAL_ADDRESS_TABLE) { - return new File(mDictDirectory, - mDictDirectory.getName() + FormatSpec.TERMINAL_ADDRESS_TABLE_FILE_EXTENSION); - } else if (fileType == FILETYPE_BIGRAM_FREQ) { - return new File(mDictDirectory, - mDictDirectory.getName() + FormatSpec.BIGRAM_FILE_EXTENSION - + FormatSpec.BIGRAM_FREQ_CONTENT_ID); - } else if (fileType == FILETYPE_SHORTCUT) { - return new File(mDictDirectory, - mDictDirectory.getName() + FormatSpec.SHORTCUT_FILE_EXTENSION - + FormatSpec.SHORTCUT_CONTENT_ID); - } else { - throw new RuntimeException("Unsupported kind of file : " + fileType); - } - } - - @Override - public void openDictBuffer() throws FileNotFoundException, IOException { - mDictBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_TRIE)); - mFrequencyBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_FREQUENCY)); - mTerminalAddressTableBuffer = mBufferFactory.getDictionaryBuffer( - getFile(FILETYPE_TERMINAL_ADDRESS_TABLE)); - mBigramBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_BIGRAM_FREQ)); - loadBigramAddressSparseTable(); - mShortcutBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_SHORTCUT)); - loadShortcutAddressSparseTable(); - } - - @Override - public boolean isDictBufferOpen() { - return mDictBuffer != null; - } - - /* package */ DictBuffer getDictBuffer() { - return mDictBuffer; - } - - @Override - public FileHeader readHeader() throws IOException, UnsupportedFormatException { - if (mDictBuffer == null) { - openDictBuffer(); - } - final FileHeader header = super.readHeader(mDictBuffer); - final int version = header.mFormatOptions.mVersion; - if (version != 4) { - throw new UnsupportedFormatException("File header has a wrong version : " + version); - } - return header; - } - - private void loadBigramAddressSparseTable() throws IOException { - final File lookupIndexFile = new File(mDictDirectory, mDictDirectory.getName() - + FormatSpec.BIGRAM_FILE_EXTENSION + FormatSpec.LOOKUP_TABLE_FILE_SUFFIX); - final File freqsFile = new File(mDictDirectory, mDictDirectory.getName() - + FormatSpec.BIGRAM_FILE_EXTENSION + FormatSpec.CONTENT_TABLE_FILE_SUFFIX - + FormatSpec.BIGRAM_FREQ_CONTENT_ID); - mBigramAddressTable = SparseTable.readFromFiles(lookupIndexFile, new File[] { freqsFile }, - FormatSpec.BIGRAM_ADDRESS_TABLE_BLOCK_SIZE); - } - - // TODO: Let's have something like SparseTableContentsReader in this class. - private void loadShortcutAddressSparseTable() throws IOException { - final File lookupIndexFile = new File(mDictDirectory, mDictDirectory.getName() - + FormatSpec.SHORTCUT_FILE_EXTENSION + FormatSpec.LOOKUP_TABLE_FILE_SUFFIX); - final File contentFile = new File(mDictDirectory, mDictDirectory.getName() - + FormatSpec.SHORTCUT_FILE_EXTENSION + FormatSpec.CONTENT_TABLE_FILE_SUFFIX - + FormatSpec.SHORTCUT_CONTENT_ID); - final File timestampsFile = new File(mDictDirectory, mDictDirectory.getName() - + FormatSpec.SHORTCUT_FILE_EXTENSION + FormatSpec.CONTENT_TABLE_FILE_SUFFIX - + FormatSpec.SHORTCUT_CONTENT_ID); - mShortcutAddressTable = SparseTable.readFromFiles(lookupIndexFile, - new File[] { contentFile, timestampsFile }, - FormatSpec.SHORTCUT_ADDRESS_TABLE_BLOCK_SIZE); - } - - protected static class PtNodeReader extends AbstractDictDecoder.PtNodeReader { - protected static int readFrequency(final DictBuffer frequencyBuffer, final int terminalId) { - frequencyBuffer.position(terminalId * FormatSpec.FREQUENCY_AND_FLAGS_SIZE + 1); - return frequencyBuffer.readUnsignedByte(); - } - - protected static int readTerminalId(final DictBuffer dictBuffer) { - return dictBuffer.readInt(); - } - } - - private ArrayList<WeightedString> readShortcuts(final int terminalId) { - if (mShortcutAddressTable.get(0, terminalId) == SparseTable.NOT_EXIST) return null; - - final ArrayList<WeightedString> ret = CollectionUtils.newArrayList(); - final int posOfShortcuts = mShortcutAddressTable.get(FormatSpec.SHORTCUT_CONTENT_INDEX, - terminalId); - mShortcutBuffer.position(posOfShortcuts); - while (true) { - final int flags = mShortcutBuffer.readUnsignedByte(); - final String word = CharEncoding.readString(mShortcutBuffer); - ret.add(new WeightedString(word, - flags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY)); - if (0 == (flags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break; - } - return ret; - } - - // TODO: Make this buffer thread safe. - // TODO: Support words longer than FormatSpec.MAX_WORD_LENGTH. - private final int[] mCharacterBuffer = new int[FormatSpec.MAX_WORD_LENGTH]; - @Override - public PtNodeInfo readPtNode(int ptNodePos, FormatOptions options) { - int addressPointer = ptNodePos; - final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer); - addressPointer += FormatSpec.PTNODE_FLAGS_SIZE; - - final int parentAddress = PtNodeReader.readParentAddress(mDictBuffer, options); - if (BinaryDictIOUtils.supportsDynamicUpdate(options)) { - addressPointer += FormatSpec.PARENT_ADDRESS_SIZE; - } - - final int characters[]; - if (0 != (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS)) { - int index = 0; - int character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - while (FormatSpec.INVALID_CHARACTER != character - && index < FormatSpec.MAX_WORD_LENGTH) { - mCharacterBuffer[index++] = character; - character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - } - characters = Arrays.copyOfRange(mCharacterBuffer, 0, index); - } else { - final int character = CharEncoding.readChar(mDictBuffer); - addressPointer += CharEncoding.getCharSize(character); - characters = new int[] { character }; - } - final int terminalId; - if (0 != (FormatSpec.FLAG_IS_TERMINAL & flags)) { - terminalId = PtNodeReader.readTerminalId(mDictBuffer); - addressPointer += FormatSpec.PTNODE_TERMINAL_ID_SIZE; - } else { - terminalId = PtNode.NOT_A_TERMINAL; - } - - final int frequency; - if (0 != (FormatSpec.FLAG_IS_TERMINAL & flags)) { - frequency = PtNodeReader.readFrequency(mFrequencyBuffer, terminalId); - } else { - frequency = PtNode.NOT_A_TERMINAL; - } - int childrenAddress = PtNodeReader.readChildrenAddress(mDictBuffer, flags, options); - if (childrenAddress != FormatSpec.NO_CHILDREN_ADDRESS) { - childrenAddress += addressPointer; - } - addressPointer += BinaryDictIOUtils.getChildrenAddressSize(flags, options); - final ArrayList<WeightedString> shortcutTargets = readShortcuts(terminalId); - - final ArrayList<PendingAttribute> bigrams; - if (0 != (flags & FormatSpec.FLAG_HAS_BIGRAMS)) { - bigrams = new ArrayList<PendingAttribute>(); - final int posOfBigrams = mBigramAddressTable.get(0 /* contentTableIndex */, terminalId); - mBigramBuffer.position(posOfBigrams); - while (bigrams.size() < FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - // If bigrams.size() reaches FormatSpec.MAX_BIGRAMS_IN_A_PTNODE, - // remaining bigram entries are ignored. - final int bigramFlags = mBigramBuffer.readUnsignedByte(); - final int targetTerminalId = mBigramBuffer.readUnsignedInt24(); - mTerminalAddressTableBuffer.position( - targetTerminalId * FormatSpec.TERMINAL_ADDRESS_TABLE_ADDRESS_SIZE); - final int targetAddress = mTerminalAddressTableBuffer.readUnsignedInt24(); - bigrams.add(new PendingAttribute( - bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_FREQUENCY, - targetAddress)); - if (0 == (bigramFlags & FormatSpec.FLAG_BIGRAM_SHORTCUT_ATTR_HAS_NEXT)) break; - } - if (bigrams.size() >= FormatSpec.MAX_BIGRAMS_IN_A_PTNODE) { - throw new RuntimeException("Too many bigrams in a PtNode (" + bigrams.size() - + " but max is " + FormatSpec.MAX_BIGRAMS_IN_A_PTNODE + ")"); - } - } else { - bigrams = null; - } - return new PtNodeInfo(ptNodePos, addressPointer, flags, characters, frequency, - parentAddress, childrenAddress, shortcutTargets, bigrams); - } - - private void deleteDictFiles() { - final File[] files = mDictDirectory.listFiles(); - for (int i = 0; i < files.length; ++i) { - files[i].delete(); - } - } - - @Override - public FusionDictionary readDictionaryBinary(final FusionDictionary dict, - final boolean deleteDictIfBroken) - throws FileNotFoundException, IOException, UnsupportedFormatException { - if (mDictBuffer == null) { - openDictBuffer(); - } - try { - return BinaryDictDecoderUtils.readDictionaryBinary(this, dict); - } catch (IOException e) { - Log.e(TAG, "The dictionary " + mDictDirectory.getName() + " is broken.", e); - if (deleteDictIfBroken) { - deleteDictFiles(); - } - throw e; - } catch (UnsupportedFormatException e) { - Log.e(TAG, "The dictionary " + mDictDirectory.getName() + " is broken.", e); - if (deleteDictIfBroken) { - deleteDictFiles(); - } - throw e; - } - } - - @Override - public void setPosition(int newPos) { - mDictBuffer.position(newPos); - } - - @Override - public int getPosition() { - return mDictBuffer.position(); - } - - @Override - public int readPtNodeCount() { - return BinaryDictDecoderUtils.readPtNodeCount(mDictBuffer); - } - - @Override - public boolean readAndFollowForwardLink() { - final int nextAddress = mDictBuffer.readUnsignedInt24(); - if (nextAddress >= 0 && nextAddress < mDictBuffer.limit()) { - mDictBuffer.position(nextAddress); - return true; - } - return false; - } - - @Override - public boolean hasNextPtNodeArray() { - return mDictBuffer.position() != FormatSpec.NO_FORWARD_LINK_ADDRESS; - } - - @Override - public void skipPtNode(final FormatOptions formatOptions) { - final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer); - PtNodeReader.readParentAddress(mDictBuffer, formatOptions); - BinaryDictIOUtils.skipString(mDictBuffer, - (flags & FormatSpec.FLAG_HAS_MULTIPLE_CHARS) != 0); - if ((flags & FormatSpec.FLAG_IS_TERMINAL) != 0) PtNodeReader.readTerminalId(mDictBuffer); - PtNodeReader.readChildrenAddress(mDictBuffer, flags, formatOptions); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java deleted file mode 100644 index 8d5b48a9b..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java +++ /dev/null @@ -1,475 +0,0 @@ -/* -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.CharEncoding; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * An implementation of DictEncoder for version 4 binary dictionary. - */ -@UsedForTesting -public class Ver4DictEncoder implements DictEncoder { - private final File mDictPlacedDir; - private byte[] mTrieBuf; - private int mTriePos; - private int mHeaderSize; - private OutputStream mTrieOutStream; - private OutputStream mFreqOutStream; - private OutputStream mUnigramTimestampOutStream; - private OutputStream mTerminalAddressTableOutStream; - private File mDictDir; - private String mBaseFilename; - private BigramContentWriter mBigramWriter; - private ShortcutContentWriter mShortcutWriter; - - @UsedForTesting - public Ver4DictEncoder(final File dictPlacedDir) { - mDictPlacedDir = dictPlacedDir; - } - - private interface SparseTableContentWriterInterface { - public void write(final OutputStream outStream) throws IOException; - } - - private static class SparseTableContentWriter { - private final int mContentCount; - private final SparseTable mSparseTable; - private final File mLookupTableFile; - protected final File mBaseDir; - private final File[] mAddressTableFiles; - private final File[] mContentFiles; - protected final OutputStream[] mContentOutStreams; - - public SparseTableContentWriter(final String name, final int initialCapacity, - final int blockSize, final File baseDir, final String[] contentFilenames, - final String[] contentIds) { - if (contentFilenames.length != contentIds.length) { - throw new RuntimeException("The length of contentFilenames and the length of" - + " contentIds are different " + contentFilenames.length + ", " - + contentIds.length); - } - mContentCount = contentFilenames.length; - mSparseTable = new SparseTable(initialCapacity, blockSize, mContentCount); - mLookupTableFile = new File(baseDir, name + FormatSpec.LOOKUP_TABLE_FILE_SUFFIX); - mAddressTableFiles = new File[mContentCount]; - mContentFiles = new File[mContentCount]; - mBaseDir = baseDir; - for (int i = 0; i < mContentCount; ++i) { - mAddressTableFiles[i] = new File(mBaseDir, - name + FormatSpec.CONTENT_TABLE_FILE_SUFFIX + contentIds[i]); - mContentFiles[i] = new File(mBaseDir, contentFilenames[i] + contentIds[i]); - } - mContentOutStreams = new OutputStream[mContentCount]; - } - - public void openStreams() throws FileNotFoundException { - for (int i = 0; i < mContentCount; ++i) { - mContentOutStreams[i] = new FileOutputStream(mContentFiles[i]); - } - } - - protected void write(final int contentIndex, final int index, - final SparseTableContentWriterInterface writer) throws IOException { - mSparseTable.set(contentIndex, index, (int) mContentFiles[contentIndex].length()); - writer.write(mContentOutStreams[contentIndex]); - mContentOutStreams[contentIndex].flush(); - } - - public void closeStreams() throws IOException { - mSparseTable.writeToFiles(mLookupTableFile, mAddressTableFiles); - for (int i = 0; i < mContentCount; ++i) { - mContentOutStreams[i].close(); - } - } - } - - private static class BigramContentWriter extends SparseTableContentWriter { - private final boolean mWriteTimestamp; - - public BigramContentWriter(final String name, final int initialCapacity, - final File baseDir, final boolean writeTimestamp) { - super(name + FormatSpec.BIGRAM_FILE_EXTENSION, initialCapacity, - FormatSpec.BIGRAM_ADDRESS_TABLE_BLOCK_SIZE, baseDir, - getContentFilenames(name, writeTimestamp), getContentIds(writeTimestamp)); - mWriteTimestamp = writeTimestamp; - } - - private static String[] getContentFilenames(final String name, - final boolean writeTimestamp) { - final String[] contentFilenames; - if (writeTimestamp) { - contentFilenames = new String[] { name + FormatSpec.BIGRAM_FILE_EXTENSION, - name + FormatSpec.BIGRAM_FILE_EXTENSION }; - } else { - contentFilenames = new String[] { name + FormatSpec.BIGRAM_FILE_EXTENSION }; - } - return contentFilenames; - } - - private static String[] getContentIds(final boolean writeTimestamp) { - final String[] contentIds; - if (writeTimestamp) { - contentIds = new String[] { FormatSpec.BIGRAM_FREQ_CONTENT_ID, - FormatSpec.BIGRAM_TIMESTAMP_CONTENT_ID }; - } else { - contentIds = new String[] { FormatSpec.BIGRAM_FREQ_CONTENT_ID }; - } - return contentIds; - } - - public void writeBigramsForOneWord(final int terminalId, final int bigramCount, - final Iterator<WeightedString> bigramIterator, final FusionDictionary dict) - throws IOException { - write(FormatSpec.BIGRAM_FREQ_CONTENT_INDEX, terminalId, - new SparseTableContentWriterInterface() { - @Override - public void write(final OutputStream outStream) throws IOException { - writeBigramsForOneWordInternal(outStream, bigramIterator, dict); - }}); - if (mWriteTimestamp) { - write(FormatSpec.BIGRAM_TIMESTAMP_CONTENT_INDEX, terminalId, - new SparseTableContentWriterInterface() { - @Override - public void write(final OutputStream outStream) throws IOException { - initBigramTimestampsCountersAndLevelsForOneWordInternal(outStream, - bigramCount); - }}); - } - } - - private void writeBigramsForOneWordInternal(final OutputStream outStream, - final Iterator<WeightedString> bigramIterator, final FusionDictionary dict) - throws IOException { - while (bigramIterator.hasNext()) { - final WeightedString bigram = bigramIterator.next(); - final PtNode target = - FusionDictionary.findWordInTree(dict.mRootNodeArray, bigram.mWord); - final int unigramFrequencyForThisWord = target.mFrequency; - final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags( - bigramIterator.hasNext(), 0, bigram.mFrequency, - unigramFrequencyForThisWord, bigram.mWord); - BinaryDictEncoderUtils.writeUIntToStream(outStream, bigramFlags, - FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); - BinaryDictEncoderUtils.writeUIntToStream(outStream, target.mTerminalId, - FormatSpec.PTNODE_ATTRIBUTE_MAX_ADDRESS_SIZE); - } - } - - private void initBigramTimestampsCountersAndLevelsForOneWordInternal( - final OutputStream outStream, final int bigramCount) throws IOException { - for (int i = 0; i < bigramCount; ++i) { - // TODO: Figure out what initial values should be. - BinaryDictEncoderUtils.writeUIntToStream(outStream, 0 /* value */, - FormatSpec.BIGRAM_TIMESTAMP_SIZE); - BinaryDictEncoderUtils.writeUIntToStream(outStream, 0 /* value */, - FormatSpec.BIGRAM_COUNTER_SIZE); - BinaryDictEncoderUtils.writeUIntToStream(outStream, 0 /* value */, - FormatSpec.BIGRAM_LEVEL_SIZE); - } - } - } - - private static class ShortcutContentWriter extends SparseTableContentWriter { - public ShortcutContentWriter(final String name, final int initialCapacity, - final File baseDir) { - super(name + FormatSpec.SHORTCUT_FILE_EXTENSION, initialCapacity, - FormatSpec.SHORTCUT_ADDRESS_TABLE_BLOCK_SIZE, baseDir, - new String[] { name + FormatSpec.SHORTCUT_FILE_EXTENSION }, - new String[] { FormatSpec.SHORTCUT_CONTENT_ID }); - } - - public void writeShortcutForOneWord(final int terminalId, - final Iterator<WeightedString> shortcutIterator) throws IOException { - write(FormatSpec.SHORTCUT_CONTENT_INDEX, terminalId, - new SparseTableContentWriterInterface() { - @Override - public void write(final OutputStream outStream) throws IOException { - writeShortcutForOneWordInternal(outStream, shortcutIterator); - } - }); - } - - private void writeShortcutForOneWordInternal(final OutputStream outStream, - final Iterator<WeightedString> shortcutIterator) throws IOException { - while (shortcutIterator.hasNext()) { - final WeightedString target = shortcutIterator.next(); - final int shortcutFlags = BinaryDictEncoderUtils.makeShortcutFlags( - shortcutIterator.hasNext(), target.mFrequency); - BinaryDictEncoderUtils.writeUIntToStream(outStream, shortcutFlags, - FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); - CharEncoding.writeString(outStream, target.mWord); - } - } - } - - private void openStreams(final FormatOptions formatOptions, final DictionaryOptions dictOptions) - throws FileNotFoundException, IOException { - final FileHeader header = new FileHeader(0, dictOptions, formatOptions); - mBaseFilename = header.getId() + "." + header.getVersion(); - mDictDir = new File(mDictPlacedDir, mBaseFilename); - final File trieFile = new File(mDictDir, mBaseFilename + FormatSpec.TRIE_FILE_EXTENSION); - final File freqFile = new File(mDictDir, mBaseFilename + FormatSpec.FREQ_FILE_EXTENSION); - final File timestampFile = new File(mDictDir, - mBaseFilename + FormatSpec.UNIGRAM_TIMESTAMP_FILE_EXTENSION); - final File terminalAddressTableFile = new File(mDictDir, - mBaseFilename + FormatSpec.TERMINAL_ADDRESS_TABLE_FILE_EXTENSION); - if (!mDictDir.isDirectory()) { - if (mDictDir.exists()) mDictDir.delete(); - mDictDir.mkdirs(); - } - mTrieOutStream = new FileOutputStream(trieFile); - mFreqOutStream = new FileOutputStream(freqFile); - mTerminalAddressTableOutStream = new FileOutputStream(terminalAddressTableFile); - if (formatOptions.mHasTimestamp) { - mUnigramTimestampOutStream = new FileOutputStream(timestampFile); - } - } - - private void close() throws IOException { - try { - if (mTrieOutStream != null) { - mTrieOutStream.close(); - } - if (mFreqOutStream != null) { - mFreqOutStream.close(); - } - if (mTerminalAddressTableOutStream != null) { - mTerminalAddressTableOutStream.close(); - } - if (mUnigramTimestampOutStream != null) { - mUnigramTimestampOutStream.close(); - } - } finally { - mTrieOutStream = null; - mFreqOutStream = null; - mTerminalAddressTableOutStream = null; - } - } - - @Override - public void writeDictionary(final FusionDictionary dict, final FormatOptions formatOptions) - throws IOException, UnsupportedFormatException { - if (formatOptions.mVersion != FormatSpec.VERSION4) { - throw new UnsupportedFormatException("File header has a wrong version number : " - + formatOptions.mVersion); - } - if (!mDictPlacedDir.isDirectory()) { - throw new UnsupportedFormatException("Given path is not a directory."); - } - - if (mTrieOutStream == null) { - openStreams(formatOptions, dict.mOptions); - } - - mHeaderSize = BinaryDictEncoderUtils.writeDictionaryHeader(mTrieOutStream, dict, - formatOptions); - - MakedictLog.i("Flattening the tree..."); - ArrayList<PtNodeArray> flatNodes = BinaryDictEncoderUtils.flattenTree(dict.mRootNodeArray); - int terminalCount = 0; - for (final PtNodeArray array : flatNodes) { - for (final PtNode node : array.mData) { - if (node.isTerminal()) node.mTerminalId = terminalCount++; - } - } - - MakedictLog.i("Computing addresses..."); - BinaryDictEncoderUtils.computeAddresses(dict, flatNodes, formatOptions); - if (MakedictLog.DBG) BinaryDictEncoderUtils.checkFlatPtNodeArrayList(flatNodes); - - writeTerminalData(flatNodes, terminalCount); - if (formatOptions.mHasTimestamp) { - initUnigramTimestamps(terminalCount); - } - mBigramWriter = new BigramContentWriter(mBaseFilename, terminalCount, mDictDir, - formatOptions.mHasTimestamp); - writeBigrams(flatNodes, dict); - mShortcutWriter = new ShortcutContentWriter(mBaseFilename, terminalCount, mDictDir); - writeShortcuts(flatNodes); - - final PtNodeArray lastNodeArray = flatNodes.get(flatNodes.size() - 1); - final int bufferSize = lastNodeArray.mCachedAddressAfterUpdate + lastNodeArray.mCachedSize; - mTrieBuf = new byte[bufferSize]; - - MakedictLog.i("Writing file..."); - for (PtNodeArray nodeArray : flatNodes) { - BinaryDictEncoderUtils.writePlacedPtNodeArray(dict, this, nodeArray, formatOptions); - } - if (MakedictLog.DBG) { - BinaryDictEncoderUtils.showStatistics(flatNodes); - MakedictLog.i("has " + terminalCount + " terminals."); - } - mTrieOutStream.write(mTrieBuf); - - MakedictLog.i("Done"); - close(); - } - - @Override - public void setPosition(int position) { - if (mTrieBuf == null || position < 0 || position >- mTrieBuf.length) return; - mTriePos = position; - } - - @Override - public int getPosition() { - return mTriePos; - } - - @Override - public void writePtNodeCount(int ptNodeCount) { - final int countSize = BinaryDictIOUtils.getPtNodeCountSize(ptNodeCount); - // ptNodeCount must fit on one byte or two bytes. - // Please see comments in FormatSpec - if (countSize != 1 && countSize != 2) { - throw new RuntimeException("Strange size from getPtNodeCountSize : " + countSize); - } - final int encodedPtNodeCount = (countSize == 2) ? - (ptNodeCount | FormatSpec.LARGE_PTNODE_ARRAY_SIZE_FIELD_SIZE_FLAG) : ptNodeCount; - mTriePos = BinaryDictEncoderUtils.writeUIntToBuffer(mTrieBuf, mTriePos, encodedPtNodeCount, - countSize); - } - - private void writePtNodeFlags(final PtNode ptNode, final FormatOptions formatOptions) { - final int childrenPos = BinaryDictEncoderUtils.getChildrenPosition(ptNode, formatOptions); - mTriePos = BinaryDictEncoderUtils.writeUIntToBuffer(mTrieBuf, mTriePos, - BinaryDictEncoderUtils.makePtNodeFlags(ptNode, childrenPos, formatOptions), - FormatSpec.PTNODE_FLAGS_SIZE); - } - - private void writeParentPosition(int parentPos, final PtNode ptNode, - final FormatOptions formatOptions) { - if (parentPos != FormatSpec.NO_PARENT_ADDRESS) { - parentPos -= ptNode.mCachedAddressAfterUpdate; - } - mTriePos = BinaryDictEncoderUtils.writeParentAddress(mTrieBuf, mTriePos, parentPos, - formatOptions); - } - - private void writeCharacters(final int[] characters, final boolean hasSeveralChars) { - mTriePos = CharEncoding.writeCharArray(characters, mTrieBuf, mTriePos); - if (hasSeveralChars) { - mTrieBuf[mTriePos++] = FormatSpec.PTNODE_CHARACTERS_TERMINATOR; - } - } - - private void writeTerminalId(final int terminalId) { - mTriePos = BinaryDictEncoderUtils.writeUIntToBuffer(mTrieBuf, mTriePos, terminalId, - FormatSpec.PTNODE_TERMINAL_ID_SIZE); - } - - private void writeChildrenPosition(PtNode ptNode, FormatOptions formatOptions) { - final int childrenPos = BinaryDictEncoderUtils.getChildrenPosition(ptNode, formatOptions); - if (formatOptions.mSupportsDynamicUpdate) { - mTriePos += BinaryDictEncoderUtils.writeSignedChildrenPosition(mTrieBuf, - mTriePos, childrenPos); - } else { - mTriePos += BinaryDictEncoderUtils.writeChildrenPosition(mTrieBuf, - mTriePos, childrenPos); - } - } - - private void writeBigrams(final ArrayList<PtNodeArray> flatNodes, final FusionDictionary dict) - throws IOException { - mBigramWriter.openStreams(); - for (final PtNodeArray nodeArray : flatNodes) { - for (final PtNode ptNode : nodeArray.mData) { - if (ptNode.mBigrams != null) { - mBigramWriter.writeBigramsForOneWord(ptNode.mTerminalId, ptNode.mBigrams.size(), - ptNode.mBigrams.iterator(), dict); - } - } - } - mBigramWriter.closeStreams(); - } - - private void writeShortcuts(final ArrayList<PtNodeArray> flatNodes) throws IOException { - mShortcutWriter.openStreams(); - for (final PtNodeArray nodeArray : flatNodes) { - for (final PtNode ptNode : nodeArray.mData) { - if (ptNode.mShortcutTargets != null && !ptNode.mShortcutTargets.isEmpty()) { - mShortcutWriter.writeShortcutForOneWord(ptNode.mTerminalId, - ptNode.mShortcutTargets.iterator()); - } - } - } - mShortcutWriter.closeStreams(); - } - - @Override - public void writeForwardLinkAddress(int forwardLinkAddress) { - mTriePos = BinaryDictEncoderUtils.writeUIntToBuffer(mTrieBuf, mTriePos, - forwardLinkAddress, FormatSpec.FORWARD_LINK_ADDRESS_SIZE); - } - - @Override - public void writePtNode(final PtNode ptNode, final int parentPosition, - final FormatOptions formatOptions, final FusionDictionary dict) { - writePtNodeFlags(ptNode, formatOptions); - writeParentPosition(parentPosition, ptNode, formatOptions); - writeCharacters(ptNode.mChars, ptNode.hasSeveralChars()); - if (ptNode.isTerminal()) { - writeTerminalId(ptNode.mTerminalId); - } - writeChildrenPosition(ptNode, formatOptions); - } - - private void writeTerminalData(final ArrayList<PtNodeArray> flatNodes, - final int terminalCount) throws IOException { - final byte[] freqBuf = new byte[terminalCount * FormatSpec.FREQUENCY_AND_FLAGS_SIZE]; - final byte[] terminalAddressTableBuf = - new byte[terminalCount * FormatSpec.TERMINAL_ADDRESS_TABLE_ADDRESS_SIZE]; - for (final PtNodeArray nodeArray : flatNodes) { - for (final PtNode ptNode : nodeArray.mData) { - if (ptNode.isTerminal()) { - BinaryDictEncoderUtils.writeUIntToBuffer(freqBuf, - ptNode.mTerminalId * FormatSpec.FREQUENCY_AND_FLAGS_SIZE, - ptNode.mFrequency, FormatSpec.FREQUENCY_AND_FLAGS_SIZE); - BinaryDictEncoderUtils.writeUIntToBuffer(terminalAddressTableBuf, - ptNode.mTerminalId * FormatSpec.TERMINAL_ADDRESS_TABLE_ADDRESS_SIZE, - ptNode.mCachedAddressAfterUpdate + mHeaderSize, - FormatSpec.TERMINAL_ADDRESS_TABLE_ADDRESS_SIZE); - } - } - } - mFreqOutStream.write(freqBuf); - mTerminalAddressTableOutStream.write(terminalAddressTableBuf); - } - - private void initUnigramTimestamps(final int terminalCount) throws IOException { - // Initial value of time stamps for each word is 0. - final byte[] unigramTimestampBuf = - new byte[terminalCount * FormatSpec.UNIGRAM_TIMESTAMP_SIZE]; - mUnigramTimestampOutStream.write(unigramTimestampBuf); - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java deleted file mode 100644 index 3d8f186ba..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2013 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.makedict; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -/** - * An implementation of DictUpdater for version 4 binary dictionary. - */ -@UsedForTesting -public class Ver4DictUpdater extends Ver4DictDecoder implements DictUpdater { - - @UsedForTesting - public Ver4DictUpdater(final File dictDirectory, final int factoryType) { - // DictUpdater must have an updatable DictBuffer. - super(dictDirectory, ((factoryType & MASK_DICTBUFFER) == USE_BYTEARRAY) - ? USE_BYTEARRAY : USE_WRITABLE_BYTEBUFFER); - } - - @Override - public void deleteWord(final String word) throws IOException, UnsupportedFormatException { - if (mDictBuffer == null) openDictBuffer(); - readHeader(); - final int wordPos = getTerminalPosition(word); - if (wordPos != FormatSpec.NOT_VALID_WORD) { - mDictBuffer.position(wordPos); - final int flags = PtNodeReader.readPtNodeOptionFlags(mDictBuffer); - mDictBuffer.position(wordPos); - mDictBuffer.put((byte) DynamicBinaryDictIOUtils.markAsDeleted(flags)); - } - } - - @Override - public void insertWord(final String word, final int frequency, - final ArrayList<WeightedString> bigramStrings, final ArrayList<WeightedString> shortcuts, - final boolean isNotAWord, final boolean isBlackListEntry) - throws IOException, UnsupportedFormatException { - // TODO: Implement this method. - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/WeightedString.java b/java/src/com/android/inputmethod/latin/makedict/WeightedString.java new file mode 100644 index 000000000..f6782df9e --- /dev/null +++ b/java/src/com/android/inputmethod/latin/makedict/WeightedString.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2014 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.makedict; + +import com.android.inputmethod.annotations.UsedForTesting; + +import java.util.Arrays; + +/** + * A string with a probability. + * + * This represents an "attribute", that is either a bigram or a shortcut. + */ +public final class WeightedString { + public final String mWord; + public ProbabilityInfo mProbabilityInfo; + + public WeightedString(final String word, final int probability) { + this(word, new ProbabilityInfo(probability)); + } + + public WeightedString(final String word, final ProbabilityInfo probabilityInfo) { + mWord = word; + mProbabilityInfo = probabilityInfo; + } + + @UsedForTesting + public int getProbability() { + return mProbabilityInfo.mProbability; + } + + public void setProbability(final int probability) { + mProbabilityInfo = new ProbabilityInfo(probability); + } + + @Override + public int hashCode() { + return Arrays.hashCode(new Object[] { mWord, mProbabilityInfo}); + } + + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof WeightedString)) return false; + final WeightedString w = (WeightedString)o; + return mWord.equals(w.mWord) && mProbabilityInfo.equals(w.mProbabilityInfo); + } +}
\ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/makedict/Word.java b/java/src/com/android/inputmethod/latin/makedict/Word.java deleted file mode 100644 index 0eabb7bf3..000000000 --- a/java/src/com/android/inputmethod/latin/makedict/Word.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.makedict; - -import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; - -import java.util.ArrayList; -import java.util.Arrays; - -/** - * Utility class for a word with a frequency. - * - * This is chiefly used to iterate a dictionary. - */ -public final class Word implements Comparable<Word> { - public final String mWord; - public final int mFrequency; - public final ArrayList<WeightedString> mShortcutTargets; - public final ArrayList<WeightedString> mBigrams; - public final boolean mIsNotAWord; - public final boolean mIsBlacklistEntry; - - private int mHashCode = 0; - - public Word(final String word, final int frequency, - final ArrayList<WeightedString> shortcutTargets, - final ArrayList<WeightedString> bigrams, - final boolean isNotAWord, final boolean isBlacklistEntry) { - mWord = word; - mFrequency = frequency; - mShortcutTargets = shortcutTargets; - mBigrams = bigrams; - mIsNotAWord = isNotAWord; - mIsBlacklistEntry = isBlacklistEntry; - } - - private static int computeHashCode(Word word) { - return Arrays.hashCode(new Object[] { - word.mWord, - word.mFrequency, - word.mShortcutTargets.hashCode(), - word.mBigrams.hashCode(), - word.mIsNotAWord, - word.mIsBlacklistEntry - }); - } - - /** - * Three-way comparison. - * - * A Word x is greater than a word y if x has a higher frequency. If they have the same - * frequency, they are sorted in lexicographic order. - */ - @Override - public int compareTo(Word w) { - if (mFrequency < w.mFrequency) return 1; - if (mFrequency > w.mFrequency) return -1; - return mWord.compareTo(w.mWord); - } - - /** - * Equality test. - * - * Words are equal if they have the same frequency, the same spellings, and the same - * attributes. - */ - @Override - public boolean equals(Object o) { - if (o == this) return true; - if (!(o instanceof Word)) return false; - Word w = (Word)o; - return mFrequency == w.mFrequency && mWord.equals(w.mWord) - && mShortcutTargets.equals(w.mShortcutTargets) - && mBigrams.equals(w.mBigrams) - && mIsNotAWord == w.mIsNotAWord - && mIsBlacklistEntry == w.mIsBlacklistEntry; - } - - @Override - public int hashCode() { - if (mHashCode == 0) { - mHashCode = computeHashCode(this); - } - return mHashCode; - } -} diff --git a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java new file mode 100644 index 000000000..cd78e2235 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin.makedict; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.BinaryDictionary; +import com.android.inputmethod.latin.utils.CombinedFormatUtils; +import com.android.inputmethod.latin.utils.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Utility class for a word with a probability. + * + * This is chiefly used to iterate a dictionary. + */ +public final class WordProperty implements Comparable<WordProperty> { + public final String mWord; + public final ProbabilityInfo mProbabilityInfo; + public final ArrayList<WeightedString> mShortcutTargets; + public final ArrayList<WeightedString> mBigrams; + // TODO: Support mIsBeginningOfSentence. + public final boolean mIsBeginningOfSentence; + public final boolean mIsNotAWord; + public final boolean mIsBlacklistEntry; + public final boolean mHasShortcuts; + public final boolean mHasBigrams; + + private int mHashCode = 0; + + @UsedForTesting + public WordProperty(final String word, final ProbabilityInfo probabilityInfo, + final ArrayList<WeightedString> shortcutTargets, + final ArrayList<WeightedString> bigrams, + final boolean isNotAWord, final boolean isBlacklistEntry) { + mWord = word; + mProbabilityInfo = probabilityInfo; + mShortcutTargets = shortcutTargets; + mBigrams = bigrams; + mIsBeginningOfSentence = false; + mIsNotAWord = isNotAWord; + mIsBlacklistEntry = isBlacklistEntry; + mHasBigrams = bigrams != null && !bigrams.isEmpty(); + mHasShortcuts = shortcutTargets != null && !shortcutTargets.isEmpty(); + } + + private static ProbabilityInfo createProbabilityInfoFromArray(final int[] probabilityInfo) { + return new ProbabilityInfo( + probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_PROBABILITY_INDEX], + probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX], + probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_LEVEL_INDEX], + probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_COUNT_INDEX]); + } + + // Construct word property using information from native code. + // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY. + public WordProperty(final int[] codePoints, final boolean isNotAWord, + final boolean isBlacklisted, final boolean hasBigram, final boolean hasShortcuts, + final boolean isBeginningOfSentence, final int[] probabilityInfo, + final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo, + final ArrayList<int[]> shortcutTargets, + final ArrayList<Integer> shortcutProbabilities) { + mWord = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints); + mProbabilityInfo = createProbabilityInfoFromArray(probabilityInfo); + mShortcutTargets = new ArrayList<>(); + mBigrams = new ArrayList<>(); + mIsBeginningOfSentence = isBeginningOfSentence; + mIsNotAWord = isNotAWord; + mIsBlacklistEntry = isBlacklisted; + mHasShortcuts = hasShortcuts; + mHasBigrams = hasBigram; + + final int bigramTargetCount = bigramTargets.size(); + for (int i = 0; i < bigramTargetCount; i++) { + final String bigramTargetString = + StringUtils.getStringFromNullTerminatedCodePointArray(bigramTargets.get(i)); + mBigrams.add(new WeightedString(bigramTargetString, + createProbabilityInfoFromArray(bigramProbabilityInfo.get(i)))); + } + + final int shortcutTargetCount = shortcutTargets.size(); + for (int i = 0; i < shortcutTargetCount; i++) { + final String shortcutTargetString = + StringUtils.getStringFromNullTerminatedCodePointArray(shortcutTargets.get(i)); + mShortcutTargets.add( + new WeightedString(shortcutTargetString, shortcutProbabilities.get(i))); + } + } + + public int getProbability() { + return mProbabilityInfo.mProbability; + } + + private static int computeHashCode(WordProperty word) { + return Arrays.hashCode(new Object[] { + word.mWord, + word.mProbabilityInfo, + word.mShortcutTargets.hashCode(), + word.mBigrams.hashCode(), + word.mIsNotAWord, + word.mIsBlacklistEntry + }); + } + + /** + * Three-way comparison. + * + * A Word x is greater than a word y if x has a higher frequency. If they have the same + * frequency, they are sorted in lexicographic order. + */ + @Override + public int compareTo(final WordProperty w) { + if (getProbability() < w.getProbability()) return 1; + if (getProbability() > w.getProbability()) return -1; + return mWord.compareTo(w.mWord); + } + + /** + * Equality test. + * + * Words are equal if they have the same frequency, the same spellings, and the same + * attributes. + */ + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof WordProperty)) return false; + WordProperty w = (WordProperty)o; + return mProbabilityInfo.equals(w.mProbabilityInfo) && mWord.equals(w.mWord) + && mShortcutTargets.equals(w.mShortcutTargets) && mBigrams.equals(w.mBigrams) + && mIsNotAWord == w.mIsNotAWord && mIsBlacklistEntry == w.mIsBlacklistEntry + && mHasBigrams == w.mHasBigrams && mHasShortcuts && w.mHasBigrams; + } + + @Override + public int hashCode() { + if (mHashCode == 0) { + mHashCode = computeHashCode(this); + } + return mHashCode; + } + + @UsedForTesting + public boolean isValid() { + return getProbability() != BinaryDictionary.NOT_A_PROBABILITY; + } + + @Override + public String toString() { + return CombinedFormatUtils.formatWordProperty(this); + } +} diff --git a/java/src/com/android/inputmethod/latin/personalization/AccountUtils.java b/java/src/com/android/inputmethod/latin/personalization/AccountUtils.java index a446672cb..ab3ef964e 100644 --- a/java/src/com/android/inputmethod/latin/personalization/AccountUtils.java +++ b/java/src/com/android/inputmethod/latin/personalization/AccountUtils.java @@ -35,7 +35,7 @@ public class AccountUtils { } public static List<String> getDeviceAccountsEmailAddresses(final Context context) { - final ArrayList<String> retval = new ArrayList<String>(); + final ArrayList<String> retval = new ArrayList<>(); for (final Account account : getAccounts(context)) { final String name = account.name; if (Patterns.EMAIL_ADDRESS.matcher(name).matches()) { @@ -54,7 +54,7 @@ public class AccountUtils { */ public static List<String> getDeviceAccountsWithDomain( final Context context, final String domain) { - final ArrayList<String> retval = new ArrayList<String>(); + final ArrayList<String> retval = new ArrayList<>(); final String atDomain = "@" + domain.toLowerCase(Locale.ROOT); for (final Account account : getAccounts(context)) { if (account.name.toLowerCase(Locale.ROOT).endsWith(atDomain)) { diff --git a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java new file mode 100644 index 000000000..ac55b9333 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2014 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.personalization; + +import android.content.Context; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.ExpandableBinaryDictionary; + +import java.io.File; +import java.util.Locale; + +public class ContextualDictionary extends ExpandableBinaryDictionary { + /* package */ static final String NAME = ContextualDictionary.class.getSimpleName(); + + private ContextualDictionary(final Context context, final Locale locale, + final File dictFile) { + super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_CONTEXTUAL, + dictFile); + // Always reset the contents. + clear(); + } + + @UsedForTesting + public static ContextualDictionary getDictionary(final Context context, final Locale locale, + final File dictFile, final String dictNamePrefix) { + return new ContextualDictionary(context, locale, dictFile); + } + + @Override + public boolean isValidWord(final String word) { + // Strings out of this dictionary should not be considered existing words. + return false; + } + + @Override + protected void loadInitialContentsLocked() { + } +} diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegister.java b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionaryUpdater.java index c1833ff14..7dc120e06 100644 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegister.java +++ b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionaryUpdater.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2014 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,21 +17,21 @@ package com.android.inputmethod.latin.personalization; import android.content.Context; -import android.content.res.Configuration; -public class PersonalizationDictionarySessionRegister { - public static void init(Context context) { - } +import com.android.inputmethod.latin.DictionaryFacilitator; - public static void onConfigurationChanged(final Context context, final Configuration conf) { +public class ContextualDictionaryUpdater { + public ContextualDictionaryUpdater(final Context context, + final DictionaryFacilitator dictionaryFacilitator, + final Runnable onUpdateRunnable) { } - public static void onUpdateData(Context context, String type) { + public void onLoadSettings(final boolean usePersonalizedDicts) { } - public static void onRemoveData(Context context, String type) { + public void onStartInputView(final String packageName) { } - public static void onDestroy(Context context) { + public void onDestroy() { } } diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java index 1de15a333..1ba7b366f 100644 --- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java +++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java @@ -17,25 +17,13 @@ package com.android.inputmethod.latin.personalization; import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.latin.ExpandableBinaryDictionary; -import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.makedict.DictDecoder; -import com.android.inputmethod.latin.makedict.FormatSpec; -import com.android.inputmethod.latin.settings.Settings; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils; -import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils.OnAddWordListener; +import com.android.inputmethod.latin.makedict.DictionaryHeader; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.Locale; import java.util.Map; /** @@ -43,10 +31,7 @@ import java.util.Map; * model. */ public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableBinaryDictionary { - private static final String TAG = DecayingExpandableBinaryDictionaryBase.class.getSimpleName(); - public static final boolean DBG_SAVE_RESTORE = false; - private static final boolean DBG_STRESS_TEST = false; - private static final boolean PROFILE_SAVE_RESTORE = LatinImeLogger.sDBG; + private static final boolean DBG_DUMP_ON_CLOSE = false; /** Any pair being typed or picked */ public static final int FREQUENCY_FOR_TYPED = 2; @@ -54,182 +39,51 @@ public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableB public static final int FREQUENCY_FOR_WORDS_IN_DICTS = FREQUENCY_FOR_TYPED; public static final int FREQUENCY_FOR_WORDS_NOT_IN_DICTS = Dictionary.NOT_A_PROBABILITY; - /** Locale for which this user history dictionary is storing words */ - private final String mLocale; + /** The locale for this dictionary. */ + public final Locale mLocale; - private final String mFileName; - - private final SharedPreferences mPrefs; - - private final ArrayList<PersonalizationDictionaryUpdateSession> mSessions = - CollectionUtils.newArrayList(); - - // Should always be false except when we use this class for test - @UsedForTesting boolean mIsTest = false; - - /* package */ DecayingExpandableBinaryDictionaryBase(final Context context, - final String locale, final SharedPreferences sp, final String dictionaryType, - final String fileName) { - super(context, fileName, dictionaryType, true); + protected DecayingExpandableBinaryDictionaryBase(final Context context, + final String dictName, final Locale locale, final String dictionaryType, + final File dictFile) { + super(context, dictName, locale, dictionaryType, dictFile); mLocale = locale; - mFileName = fileName; - mPrefs = sp; - if (mLocale != null && mLocale.length() > 1) { - asyncLoadDictionaryToMemory(); + if (mLocale != null && mLocale.toString().length() > 1) { reloadDictionaryIfRequired(); } } @Override public void close() { - if (!ExpandableBinaryDictionary.ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) { - closeBinaryDictionary(); + if (DBG_DUMP_ON_CLOSE) { + dumpAllWordsForDebug(); } // Flush pending writes. - // TODO: Remove after this class become to use a dynamic binary dictionary. - asyncFlashAllBinaryDictionary(); - Settings.writeLastUserHistoryWriteTime(mPrefs, mLocale); + asyncFlushBinaryDictionary(); + super.close(); } @Override protected Map<String, String> getHeaderAttributeMap() { - HashMap<String, String> attributeMap = new HashMap<String, String>(); - attributeMap.put(FormatSpec.FileHeader.SUPPORTS_DYNAMIC_UPDATE_ATTRIBUTE, - FormatSpec.FileHeader.ATTRIBUTE_VALUE_TRUE); - attributeMap.put(FormatSpec.FileHeader.USES_FORGETTING_CURVE_ATTRIBUTE, - FormatSpec.FileHeader.ATTRIBUTE_VALUE_TRUE); - attributeMap.put(FormatSpec.FileHeader.DICTIONARY_ID_ATTRIBUTE, mFileName); - attributeMap.put(FormatSpec.FileHeader.DICTIONARY_LOCALE_ATTRIBUTE, mLocale); + final Map<String, String> attributeMap = super.getHeaderAttributeMap(); + attributeMap.put(DictionaryHeader.USES_FORGETTING_CURVE_KEY, + DictionaryHeader.ATTRIBUTE_VALUE_TRUE); + attributeMap.put(DictionaryHeader.HAS_HISTORICAL_INFO_KEY, + DictionaryHeader.ATTRIBUTE_VALUE_TRUE); return attributeMap; } @Override - protected boolean hasContentChanged() { - return false; - } - - @Override - protected boolean needsToReloadBeforeWriting() { - return false; + protected void loadInitialContentsLocked() { + // No initial contents. } - /** - * Pair will be added to the decaying dictionary. - * - * The first word may be null. That means we don't know the context, in other words, - * it's only a unigram. The first word may also be an empty string : this means start - * context, as in beginning of a sentence for example. - * The second word may not be null (a NullPointerException would be thrown). - */ - public void addToDictionary(final String word0, final String word1, final boolean isValid) { - if (word1.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH || - (word0 != null && word0.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH)) { - return; - } - final int frequency = ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE ? - (isValid ? FREQUENCY_FOR_WORDS_IN_DICTS : FREQUENCY_FOR_WORDS_NOT_IN_DICTS) : - FREQUENCY_FOR_TYPED; - addWordDynamically(word1, null /* shortcutTarget */, frequency, 0 /* shortcutFreq */, - false /* isNotAWord */); - // Do not insert a word as a bigram of itself - if (word1.equals(word0)) { - return; - } - if (null != word0) { - addBigramDynamically(word0, word1, frequency, isValid); - } - } - - public void cancelAddingUserHistory(final String word0, final String word1) { - removeBigramDynamically(word0, word1); + /* package */ void runGCIfRequired() { + runGCIfRequired(false /* mindsBlockByGC */); } @Override - protected void loadDictionaryAsync() { - final int[] profTotalCount = { 0 }; - final String locale = getLocale(); - if (DBG_STRESS_TEST) { - try { - Log.w(TAG, "Start stress in loading: " + locale); - Thread.sleep(15000); - Log.w(TAG, "End stress in loading"); - } catch (InterruptedException e) { - } - } - final long last = Settings.readLastUserHistoryWriteTime(mPrefs, locale); - final long now = System.currentTimeMillis(); - final ExpandableBinaryDictionary dictionary = this; - final OnAddWordListener listener = new OnAddWordListener() { - @Override - public void setUnigram(final String word, final String shortcutTarget, - final int frequency, final int shortcutFreq) { - if (DBG_SAVE_RESTORE) { - Log.d(TAG, "load unigram: " + word + "," + frequency); - } - addWord(word, shortcutTarget, frequency, shortcutFreq, false /* isNotAWord */); - ++profTotalCount[0]; - } - - @Override - public void setBigram(final String word0, final String word1, final int frequency) { - if (word0.length() < Constants.DICTIONARY_MAX_WORD_LENGTH - && word1.length() < Constants.DICTIONARY_MAX_WORD_LENGTH) { - if (DBG_SAVE_RESTORE) { - Log.d(TAG, "load bigram: " + word0 + "," + word1 + "," + frequency); - } - ++profTotalCount[0]; - addBigram(word0, word1, frequency, last); - } - } - }; - - // Load the dictionary from binary file - final File dictFile = new File(mContext.getFilesDir(), mFileName); - final DictDecoder dictDecoder = FormatSpec.getDictDecoder(dictFile, - DictDecoder.USE_BYTEARRAY); - if (dictDecoder == null) { - // This is an expected condition: we don't have a user history dictionary for this - // language yet. It will be created sometime later. - return; - } - - try { - dictDecoder.openDictBuffer(); - UserHistoryDictIOUtils.readDictionaryBinary(dictDecoder, listener); - } catch (IOException e) { - Log.d(TAG, "IOException on opening a bytebuffer", e); - } finally { - if (PROFILE_SAVE_RESTORE) { - final long diff = System.currentTimeMillis() - now; - Log.d(TAG, "PROF: Load UserHistoryDictionary: " - + locale + ", " + diff + "ms. load " + profTotalCount[0] + "entries."); - } - } - } - - protected String getLocale() { - return mLocale; - } - - public void registerUpdateSession(PersonalizationDictionaryUpdateSession session) { - session.setPredictionDictionary(this); - mSessions.add(session); - session.onDictionaryReady(); - } - - public void unRegisterUpdateSession(PersonalizationDictionaryUpdateSession session) { - mSessions.remove(session); - } - - @UsedForTesting - public void clearAndFlushDictionary() { - // Clear the node structure on memory - clear(); - // Then flush the cleared state of the dictionary on disk. - asyncFlashAllBinaryDictionary(); - } - - /* package */ void decayIfNeeded() { - runGCIfRequired(false /* mindsBlockByGC */); + public boolean isValidWord(final String word) { + // Strings out of this dictionary should not be considered existing words. + return false; } } diff --git a/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java b/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java index e9ca662e7..221bb9a8f 100644 --- a/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java +++ b/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java @@ -43,7 +43,7 @@ public class DictionaryDecayBroadcastReciever extends BroadcastReceiver { /** * Interval to update for decaying dictionaries. */ - private static final long DICTIONARY_DECAY_INTERVAL = TimeUnit.MINUTES.toMillis(60); + /* package */ static final long DICTIONARY_DECAY_INTERVAL = TimeUnit.MINUTES.toMillis(60); public static void setUpIntervalAlarmForDictionaryDecaying(Context context) { AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); @@ -60,7 +60,8 @@ public class DictionaryDecayBroadcastReciever extends BroadcastReceiver { public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if (action.equals(DICTIONARY_DECAY_INTENT_ACTION)) { - PersonalizationHelper.tryDecayingAllOpeningUserHistoryDictionary(); + PersonalizationHelper.runGCOnAllOpenedUserHistoryDictionaries(); + PersonalizationHelper.runGCOnAllOpenedPersonalizationDictionaries(); } } } diff --git a/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java b/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java deleted file mode 100644 index 6f152bb91..000000000 --- a/java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2013 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.personalization; - -import android.content.Context; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.compat.ActivityManagerCompatUtils; -import com.android.inputmethod.keyboard.ProximityInfo; -import com.android.inputmethod.latin.AbstractDictionaryWriter; -import com.android.inputmethod.latin.ExpandableDictionary; -import com.android.inputmethod.latin.WordComposer; -import com.android.inputmethod.latin.ExpandableDictionary.NextWord; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.makedict.DictEncoder; -import com.android.inputmethod.latin.makedict.FormatSpec; -import com.android.inputmethod.latin.makedict.UnsupportedFormatException; -import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils; -import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils.BigramDictionaryInterface; -import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils; -import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils.ForgettingCurveParams; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Map; - -// Currently this class is used to implement dynamic prodiction dictionary. -// TODO: Move to native code. -public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { - private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); - /** Maximum number of pairs. Pruning will start when databases goes above this number. */ - public static final int DEFAULT_MAX_HISTORY_BIGRAMS = 10000; - public static final int LOW_MEMORY_MAX_HISTORY_BIGRAMS = 2000; - - /** Any pair being typed or picked */ - private static final int FREQUENCY_FOR_TYPED = 2; - - private static final int BINARY_DICT_VERSION = 3; - private static final FormatSpec.FormatOptions FORMAT_OPTIONS = - new FormatSpec.FormatOptions(BINARY_DICT_VERSION, true /* supportsDynamicUpdate */); - - private final UserHistoryDictionaryBigramList mBigramList = - new UserHistoryDictionaryBigramList(); - private final ExpandableDictionary mExpandableDictionary; - private final int mMaxHistoryBigrams; - - public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { - super(context, dictType); - mExpandableDictionary = new ExpandableDictionary(dictType); - final boolean isLowRamDevice = ActivityManagerCompatUtils.isLowRamDevice(context); - mMaxHistoryBigrams = isLowRamDevice ? - LOW_MEMORY_MAX_HISTORY_BIGRAMS : DEFAULT_MAX_HISTORY_BIGRAMS; - } - - @Override - public void clear() { - mBigramList.evictAll(); - mExpandableDictionary.clearDictionary(); - } - - /** - * Adds a word unigram to the fusion dictionary. Call updateBinaryDictionary when all changes - * are done to update the binary dictionary. - * @param word The word to add. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this unigram. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored - * if shortcutTarget is null. - * @param isNotAWord true if this is not a word, i.e. shortcut only. - */ - @Override - public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, - final int shortcutFreq, final boolean isNotAWord) { - if (mBigramList.size() > mMaxHistoryBigrams * 2) { - // Too many entries: just stop adding new vocabulary and wait next refresh. - return; - } - mExpandableDictionary.addWord(word, shortcutTarget, frequency, shortcutFreq); - mBigramList.addBigram(null, word, (byte)frequency); - } - - @Override - public void addBigramWords(final String word0, final String word1, final int frequency, - final boolean isValid, final long lastModifiedTime) { - if (mBigramList.size() > mMaxHistoryBigrams * 2) { - // Too many entries: just stop adding new vocabulary and wait next refresh. - return; - } - if (lastModifiedTime > 0) { - mExpandableDictionary.setBigramAndGetFrequency(word0, word1, - new ForgettingCurveParams(frequency, System.currentTimeMillis(), - lastModifiedTime)); - mBigramList.addBigram(word0, word1, (byte)frequency); - } else { - mExpandableDictionary.setBigramAndGetFrequency(word0, word1, - new ForgettingCurveParams(isValid)); - mBigramList.addBigram(word0, word1, (byte)frequency); - } - } - - @Override - public void removeBigramWords(final String word0, final String word1) { - if (mBigramList.removeBigram(word0, word1)) { - mExpandableDictionary.removeBigram(word0, word1); - } - } - - @Override - protected void writeDictionary(final DictEncoder dictEncoder, - final Map<String, String> attributeMap) throws IOException, UnsupportedFormatException { - UserHistoryDictIOUtils.writeDictionary(dictEncoder, - new FrequencyProvider(mBigramList, mExpandableDictionary, mMaxHistoryBigrams), - mBigramList, FORMAT_OPTIONS); - } - - private static class FrequencyProvider implements BigramDictionaryInterface { - private final UserHistoryDictionaryBigramList mBigramList; - private final ExpandableDictionary mExpandableDictionary; - private final int mMaxHistoryBigrams; - - public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, - final ExpandableDictionary expandableDictionary, final int maxHistoryBigrams) { - mBigramList = bigramList; - mExpandableDictionary = expandableDictionary; - mMaxHistoryBigrams = maxHistoryBigrams; - } - - @Override - public int getFrequency(final String word0, final String word1) { - final int freq; - if (word0 == null) { // unigram - freq = FREQUENCY_FOR_TYPED; - } else { // bigram - final NextWord nw = mExpandableDictionary.getBigramWord(word0, word1); - if (nw != null) { - final ForgettingCurveParams forgettingCurveParams = nw.getFcParams(); - final byte prevFc = mBigramList.getBigrams(word0).get(word1); - final byte fc = forgettingCurveParams.getFc(); - final boolean isValid = forgettingCurveParams.isValid(); - if (prevFc > 0 && prevFc == fc) { - freq = fc & 0xFF; - } else if (UserHistoryForgettingCurveUtils. - needsToSave(fc, isValid, mBigramList.size() <= mMaxHistoryBigrams)) { - freq = fc & 0xFF; - } else { - // Delete this entry - freq = -1; - } - } else { - // Delete this entry - freq = -1; - } - } - return freq; - } - } - - @Override - public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - return mExpandableDictionary.getSuggestions(composer, prevWord, proximityInfo, - blockOffensiveWords, additionalFeaturesOptions); - } - - @Override - public boolean isValidWord(final String word) { - return mExpandableDictionary.isValidWord(word); - } - - @UsedForTesting - public boolean isInBigramListForTests(final String word) { - // TODO: Use native method to determine whether the word is in dictionary or not - return mBigramList.containsKey(word) || mBigramList.getBigrams(null).containsKey(word); - } -} diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java new file mode 100644 index 000000000..9d72de8c5 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2014 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.personalization; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +public class PersonalizationDataChunk { + public final boolean mInputByUser; + public final List<String> mTokens; + public final int mTimestampInSeconds; + public final String mPackageName; + public final Locale mlocale = null; + + public PersonalizationDataChunk(boolean inputByUser, final List<String> tokens, + final int timestampInSeconds, final String packageName) { + mInputByUser = inputByUser; + mTokens = Collections.unmodifiableList(tokens); + mTimestampInSeconds = timestampInSeconds; + mPackageName = packageName; + } +} diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java index f257165cb..f2ad22ac7 100644 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java @@ -16,58 +16,26 @@ package com.android.inputmethod.latin.personalization; -import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.ExpandableBinaryDictionary; -import com.android.inputmethod.latin.utils.CollectionUtils; - import android.content.Context; -import android.content.SharedPreferences; - -import java.util.ArrayList; - -/** - * This class is a dictionary for the personalized language model that uses binary dictionary. - */ -public class PersonalizationDictionary extends ExpandableBinaryDictionary { - private static final String NAME = "personalization"; - private final ArrayList<PersonalizationDictionaryUpdateSession> mSessions = - CollectionUtils.newArrayList(); - - /** Locale for which this user history dictionary is storing words */ - private final String mLocale; - public PersonalizationDictionary(final Context context, final String locale, - final SharedPreferences prefs) { - // TODO: Make isUpdatable true. - super(context, getFilenameWithLocale(NAME, locale), Dictionary.TYPE_PERSONALIZATION, - false /* isUpdatable */); - mLocale = locale; - // TODO: Restore last updated time - loadDictionary(); - } - - @Override - protected void loadDictionaryAsync() { - // TODO: Implement - } +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Dictionary; - @Override - protected boolean hasContentChanged() { - return false; - } +import java.io.File; +import java.util.Locale; - @Override - protected boolean needsToReloadBeforeWriting() { - return false; - } +public class PersonalizationDictionary extends DecayingExpandableBinaryDictionaryBase { + /* package */ static final String NAME = PersonalizationDictionary.class.getSimpleName(); - public void registerUpdateSession(PersonalizationDictionaryUpdateSession session) { - session.setDictionary(this); - mSessions.add(session); - session.onDictionaryReady(); + // TODO: Make this constructor private + /* package */ PersonalizationDictionary(final Context context, final Locale locale) { + super(context, getDictName(NAME, locale, null /* dictFile */), locale, + Dictionary.TYPE_PERSONALIZATION, null /* dictFile */); } - public void unRegisterUpdateSession(PersonalizationDictionaryUpdateSession session) { - mSessions.remove(session); + @UsedForTesting + public static PersonalizationDictionary getDictionary(final Context context, + final Locale locale, final File dictFile, final String dictNamePrefix) { + return PersonalizationHelper.getPersonalizationDictionary(context, locale); } } diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdateSession.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdateSession.java deleted file mode 100644 index a86f6e584..000000000 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdateSession.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2013 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.personalization; - -import android.content.Context; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; - -/** - * This class is a session where a data provider can communicate with a personalization - * dictionary. - */ -public abstract class PersonalizationDictionaryUpdateSession { - /** - * This class is a parameter for a new unigram or bigram word which will be added - * to the personalization dictionary. - */ - public static class PersonalizationLanguageModelParam { - public final String mWord0; - public final String mWord1; - public final boolean mIsValid; - public final int mFrequency; - public PersonalizationLanguageModelParam(String word0, String word1, boolean isValid, - int frequency) { - mWord0 = word0; - mWord1 = word1; - mIsValid = isValid; - mFrequency = frequency; - } - } - - // TODO: Use a dynamic binary dictionary instead - public WeakReference<PersonalizationDictionary> mDictionary; - public WeakReference<DecayingExpandableBinaryDictionaryBase> mPredictionDictionary; - public final String mSystemLocale; - public PersonalizationDictionaryUpdateSession(String locale) { - mSystemLocale = locale; - } - - public abstract void onDictionaryReady(); - - public abstract void onDictionaryClosed(Context context); - - public void setDictionary(PersonalizationDictionary dictionary) { - mDictionary = new WeakReference<PersonalizationDictionary>(dictionary); - } - - public void setPredictionDictionary(DecayingExpandableBinaryDictionaryBase dictionary) { - mPredictionDictionary = - new WeakReference<DecayingExpandableBinaryDictionaryBase>(dictionary); - } - - protected PersonalizationDictionary getDictionary() { - return mDictionary == null ? null : mDictionary.get(); - } - - protected DecayingExpandableBinaryDictionaryBase getPredictionDictionary() { - return mPredictionDictionary == null ? null : mPredictionDictionary.get(); - } - - private void unsetDictionary() { - final PersonalizationDictionary dictionary = getDictionary(); - if (dictionary == null) { - return; - } - dictionary.unRegisterUpdateSession(this); - } - - private void unsetPredictionDictionary() { - final DecayingExpandableBinaryDictionaryBase dictionary = getPredictionDictionary(); - if (dictionary == null) { - return; - } - dictionary.unRegisterUpdateSession(this); - } - - public void clearAndFlushPredictionDictionary(Context context) { - final DecayingExpandableBinaryDictionaryBase dictionary = getPredictionDictionary(); - if (dictionary == null) { - return; - } - dictionary.clearAndFlushDictionary(); - } - - public void closeSession(Context context) { - unsetDictionary(); - unsetPredictionDictionary(); - onDictionaryClosed(context); - } - - // TODO: Support multi locale to add bigram - public void addBigramToPersonalizationDictionary(String word0, String word1, boolean isValid, - int frequency) { - final DecayingExpandableBinaryDictionaryBase dictionary = getPredictionDictionary(); - if (dictionary == null) { - return; - } - dictionary.addToDictionary(word0, word1, isValid); - } - - // Bulk import - // TODO: Support multi locale to add bigram - public void addBigramsToPersonalizationDictionary( - final ArrayList<PersonalizationLanguageModelParam> lmParams) { - final DecayingExpandableBinaryDictionaryBase dictionary = getPredictionDictionary(); - if (dictionary == null) { - return; - } - for (final PersonalizationLanguageModelParam lmParam : lmParams) { - dictionary.addToDictionary(lmParam.mWord0, lmParam.mWord1, lmParam.mIsValid); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java new file mode 100644 index 000000000..c97a0d232 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2014 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.personalization; + +import java.util.Locale; + +import android.content.Context; + +import com.android.inputmethod.latin.DictionaryFacilitator; + +public class PersonalizationDictionaryUpdater { + final Context mContext; + final DictionaryFacilitator mDictionaryFacilitator; + boolean mDictCleared = false; + + public PersonalizationDictionaryUpdater(final Context context, + final DictionaryFacilitator dictionaryFacilitator) { + mContext = context; + mDictionaryFacilitator = dictionaryFacilitator; + } + + public Locale getLocale() { + return null; + } + + public void onLoadSettings(final boolean usePersonalizedDicts, + final boolean isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes) { + if (!mDictCleared) { + // Clear and never update the personalization dictionary. + PersonalizationHelper.removeAllPersonalizationDictionaries(mContext); + mDictionaryFacilitator.clearPersonalizationDictionary(); + mDictCleared = true; + } + } + + public void onDestroy() { + } +} diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java index 221ddeeba..aac40940b 100644 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java @@ -16,36 +16,33 @@ package com.android.inputmethod.latin.personalization; -import com.android.inputmethod.latin.utils.CollectionUtils; - import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; import android.util.Log; +import com.android.inputmethod.latin.utils.FileUtils; + +import java.io.File; +import java.io.FilenameFilter; import java.lang.ref.SoftReference; +import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; public class PersonalizationHelper { private static final String TAG = PersonalizationHelper.class.getSimpleName(); private static final boolean DEBUG = false; private static final ConcurrentHashMap<String, SoftReference<UserHistoryDictionary>> - sLangUserHistoryDictCache = CollectionUtils.newConcurrentHashMap(); - + sLangUserHistoryDictCache = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, SoftReference<PersonalizationDictionary>> - sLangPersonalizationDictCache = CollectionUtils.newConcurrentHashMap(); - - private static final ConcurrentHashMap<String, - SoftReference<PersonalizationPredictionDictionary>> - sLangPersonalizationPredictionDictCache = - CollectionUtils.newConcurrentHashMap(); + sLangPersonalizationDictCache = new ConcurrentHashMap<>(); public static UserHistoryDictionary getUserHistoryDictionary( - final Context context, final String locale, final SharedPreferences sp) { + final Context context, final Locale locale) { + final String localeStr = locale.toString(); synchronized (sLangUserHistoryDictCache) { - if (sLangUserHistoryDictCache.containsKey(locale)) { + if (sLangUserHistoryDictCache.containsKey(localeStr)) { final SoftReference<UserHistoryDictionary> ref = - sLangUserHistoryDictCache.get(locale); + sLangUserHistoryDictCache.get(localeStr); final UserHistoryDictionary dict = ref == null ? null : ref.get(); if (dict != null) { if (DEBUG) { @@ -55,77 +52,110 @@ public class PersonalizationHelper { return dict; } } - final UserHistoryDictionary dict = new UserHistoryDictionary(context, locale, sp); - sLangUserHistoryDictCache.put(locale, new SoftReference<UserHistoryDictionary>(dict)); + final UserHistoryDictionary dict = new UserHistoryDictionary(context, locale); + sLangUserHistoryDictCache.put(localeStr, new SoftReference<>(dict)); return dict; } } - public static void tryDecayingAllOpeningUserHistoryDictionary() { - for (final ConcurrentHashMap.Entry<String, SoftReference<UserHistoryDictionary>> entry - : sLangUserHistoryDictCache.entrySet()) { - if (entry.getValue() != null) { - final UserHistoryDictionary dict = entry.getValue().get(); - if (dict != null) { - dict.decayIfNeeded(); - } - } + private static int sCurrentTimestampForTesting = 0; + public static void currentTimeChangedForTesting(final int currentTimestamp) { + if (TimeUnit.MILLISECONDS.toSeconds( + DictionaryDecayBroadcastReciever.DICTIONARY_DECAY_INTERVAL) + < currentTimestamp - sCurrentTimestampForTesting) { + runGCOnAllOpenedUserHistoryDictionaries(); + runGCOnAllOpenedPersonalizationDictionaries(); } } - public static void registerPersonalizationDictionaryUpdateSession(final Context context, - final PersonalizationDictionaryUpdateSession session, String locale) { - final PersonalizationPredictionDictionary predictionDictionary = - getPersonalizationPredictionDictionary(context, locale, - PreferenceManager.getDefaultSharedPreferences(context)); - predictionDictionary.registerUpdateSession(session); - final PersonalizationDictionary dictionary = - getPersonalizationDictionary(context, locale, - PreferenceManager.getDefaultSharedPreferences(context)); - dictionary.registerUpdateSession(session); + public static void runGCOnAllOpenedUserHistoryDictionaries() { + runGCOnAllDictionariesIfRequired(sLangUserHistoryDictCache); + } + + public static void runGCOnAllOpenedPersonalizationDictionaries() { + runGCOnAllDictionariesIfRequired(sLangPersonalizationDictCache); + } + + private static <T extends DecayingExpandableBinaryDictionaryBase> + void runGCOnAllDictionariesIfRequired( + final ConcurrentHashMap<String, SoftReference<T>> dictionaryMap) { + for (final ConcurrentHashMap.Entry<String, SoftReference<T>> entry + : dictionaryMap.entrySet()) { + final DecayingExpandableBinaryDictionaryBase dict = entry.getValue().get(); + if (dict != null) { + dict.runGCIfRequired(); + } else { + dictionaryMap.remove(entry.getKey()); + } + } } public static PersonalizationDictionary getPersonalizationDictionary( - final Context context, final String locale, final SharedPreferences sp) { + final Context context, final Locale locale) { + final String localeStr = locale.toString(); synchronized (sLangPersonalizationDictCache) { - if (sLangPersonalizationDictCache.containsKey(locale)) { + if (sLangPersonalizationDictCache.containsKey(localeStr)) { final SoftReference<PersonalizationDictionary> ref = - sLangPersonalizationDictCache.get(locale); + sLangPersonalizationDictCache.get(localeStr); final PersonalizationDictionary dict = ref == null ? null : ref.get(); if (dict != null) { if (DEBUG) { - Log.w(TAG, "Use cached PersonalizationDictCache for " + locale); + Log.w(TAG, "Use cached PersonalizationDictionary for " + locale); } return dict; } } - final PersonalizationDictionary dict = - new PersonalizationDictionary(context, locale, sp); - sLangPersonalizationDictCache.put( - locale, new SoftReference<PersonalizationDictionary>(dict)); + final PersonalizationDictionary dict = new PersonalizationDictionary(context, locale); + sLangPersonalizationDictCache.put(localeStr, new SoftReference<>(dict)); return dict; } } - public static PersonalizationPredictionDictionary getPersonalizationPredictionDictionary( - final Context context, final String locale, final SharedPreferences sp) { - synchronized (sLangPersonalizationPredictionDictCache) { - if (sLangPersonalizationPredictionDictCache.containsKey(locale)) { - final SoftReference<PersonalizationPredictionDictionary> ref = - sLangPersonalizationPredictionDictCache.get(locale); - final PersonalizationPredictionDictionary dict = ref == null ? null : ref.get(); - if (dict != null) { - if (DEBUG) { - Log.w(TAG, "Use cached PersonalizationPredictionDictionary for " + locale); + public static void removeAllPersonalizationDictionaries(final Context context) { + removeAllDictionaries(context, sLangPersonalizationDictCache, + PersonalizationDictionary.NAME); + } + + public static void removeAllUserHistoryDictionaries(final Context context) { + removeAllDictionaries(context, sLangUserHistoryDictCache, + UserHistoryDictionary.NAME); + } + + private static <T extends DecayingExpandableBinaryDictionaryBase> void removeAllDictionaries( + final Context context, final ConcurrentHashMap<String, SoftReference<T>> dictionaryMap, + final String dictNamePrefix) { + synchronized (dictionaryMap) { + for (final ConcurrentHashMap.Entry<String, SoftReference<T>> entry + : dictionaryMap.entrySet()) { + if (entry.getValue() != null) { + final DecayingExpandableBinaryDictionaryBase dict = entry.getValue().get(); + if (dict != null) { + dict.clear(); } - return dict; } } - final PersonalizationPredictionDictionary dict = - new PersonalizationPredictionDictionary(context, locale, sp); - sLangPersonalizationPredictionDictCache.put( - locale, new SoftReference<PersonalizationPredictionDictionary>(dict)); - return dict; + dictionaryMap.clear(); + final File filesDir = context.getFilesDir(); + if (filesDir == null) { + Log.e(TAG, "context.getFilesDir() returned null."); + } + if (!FileUtils.deleteFilteredFiles(filesDir, new DictFilter(dictNamePrefix))) { + Log.e(TAG, "Cannot remove all existing dictionary files. filesDir: " + + filesDir.getAbsolutePath() + ", dictNamePrefix: " + dictNamePrefix); + } + } + } + + private static class DictFilter implements FilenameFilter { + private final String mName; + + DictFilter(final String name) { + mName = name; + } + + @Override + public boolean accept(final File dir, final String name) { + return name.startsWith(mName); } } } diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationPredictionDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationPredictionDictionary.java deleted file mode 100644 index 432954453..000000000 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationPredictionDictionary.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.personalization; - -import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.ExpandableBinaryDictionary; - -import android.content.Context; -import android.content.SharedPreferences; - -public class PersonalizationPredictionDictionary extends DecayingExpandableBinaryDictionaryBase { - private static final String NAME = PersonalizationPredictionDictionary.class.getSimpleName(); - - /* package */ PersonalizationPredictionDictionary(final Context context, final String locale, - final SharedPreferences sp) { - super(context, locale, sp, Dictionary.TYPE_PERSONALIZATION_PREDICTION_IN_JAVA, - getDictionaryFileName(locale)); - } - - private static String getDictionaryFileName(final String locale) { - return NAME + "." + locale + ExpandableBinaryDictionary.DICT_FILE_EXTENSION; - } -} diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java index a60226d7e..a98b0f156 100644 --- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java +++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java @@ -16,25 +16,72 @@ package com.android.inputmethod.latin.personalization; +import android.content.Context; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.latin.ExpandableBinaryDictionary; +import com.android.inputmethod.latin.PrevWordsInfo; +import com.android.inputmethod.latin.utils.DistracterFilter; -import android.content.Context; -import android.content.SharedPreferences; +import java.io.File; +import java.util.Locale; /** * Locally gathers stats about the words user types and various other signals like auto-correction * cancellation or manual picks. This allows the keyboard to adapt to the typist over time. */ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBase { - /* package for tests */ static final String NAME = - UserHistoryDictionary.class.getSimpleName(); - /* package */ UserHistoryDictionary(final Context context, final String locale, - final SharedPreferences sp) { - super(context, locale, sp, Dictionary.TYPE_USER_HISTORY, getDictionaryFileName(locale)); + /* package */ static final String NAME = UserHistoryDictionary.class.getSimpleName(); + + // TODO: Make this constructor private + /* package */ UserHistoryDictionary(final Context context, final Locale locale) { + super(context, getDictName(NAME, locale, null /* dictFile */), locale, + Dictionary.TYPE_USER_HISTORY, null /* dictFile */); + } + + @UsedForTesting + public static UserHistoryDictionary getDictionary(final Context context, final Locale locale, + final File dictFile, final String dictNamePrefix) { + return PersonalizationHelper.getUserHistoryDictionary(context, locale); } - private static String getDictionaryFileName(final String locale) { - return NAME + "." + locale + ExpandableBinaryDictionary.DICT_FILE_EXTENSION; + /** + * Add a word to the user history dictionary. + * + * @param userHistoryDictionary the user history dictionary + * @param prevWordsInfo the information of previous words + * @param word the word the user inputted + * @param isValid whether the word is valid or not + * @param timestamp the timestamp when the word has been inputted + * @param distracterFilter the filter to check whether the word is a distracter + */ + public static void addToDictionary(final ExpandableBinaryDictionary userHistoryDictionary, + final PrevWordsInfo prevWordsInfo, final String word, final boolean isValid, + final int timestamp, final DistracterFilter distracterFilter) { + final String prevWord = prevWordsInfo.mPrevWordsInfo[0].mWord; + if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH || + (prevWord != null && prevWord.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH)) { + return; + } + final int frequency = isValid ? + FREQUENCY_FOR_WORDS_IN_DICTS : FREQUENCY_FOR_WORDS_NOT_IN_DICTS; + userHistoryDictionary.addUnigramEntryWithCheckingDistracter(word, frequency, + null /* shortcutTarget */, 0 /* shortcutFreq */, false /* isNotAWord */, + false /* isBlacklisted */, timestamp, distracterFilter); + // Do not insert a word as a bigram of itself + if (word.equals(prevWord)) { + return; + } + if (null != prevWord) { + if (prevWordsInfo.mPrevWordsInfo[0].mIsBeginningOfSentence) { + // Beginning-of-Sentence n-gram entry is treated as a n-gram entry of invalid word. + userHistoryDictionary.addNgramEntry(prevWordsInfo, word, + FREQUENCY_FOR_WORDS_NOT_IN_DICTS, timestamp); + } else { + userHistoryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp); + } + } } } diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryBigramList.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryBigramList.java deleted file mode 100644 index 55a90ee51..000000000 --- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryBigramList.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.personalization; - -import android.util.Log; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.utils.CollectionUtils; - -import java.util.HashMap; -import java.util.Set; - -/** - * A store of bigrams which will be updated when the user history dictionary is closed - * All bigrams including stale ones in SQL DB should be stored in this class to avoid adding stale - * bigrams when we write to the SQL DB. - */ -@UsedForTesting -public final class UserHistoryDictionaryBigramList { - public static final byte FORGETTING_CURVE_INITIAL_VALUE = 0; - private static final String TAG = UserHistoryDictionaryBigramList.class.getSimpleName(); - private static final HashMap<String, Byte> EMPTY_BIGRAM_MAP = CollectionUtils.newHashMap(); - private final HashMap<String, HashMap<String, Byte>> mBigramMap = CollectionUtils.newHashMap(); - private int mSize = 0; - - public void evictAll() { - mSize = 0; - mBigramMap.clear(); - } - - /** - * Called when the user typed a word. - */ - @UsedForTesting - public void addBigram(String word1, String word2) { - addBigram(word1, word2, FORGETTING_CURVE_INITIAL_VALUE); - } - - /** - * Called when loaded from the SQL DB. - */ - public void addBigram(String word1, String word2, byte fcValue) { - if (DecayingExpandableBinaryDictionaryBase.DBG_SAVE_RESTORE) { - Log.d(TAG, "--- add bigram: " + word1 + ", " + word2 + ", " + fcValue); - } - final HashMap<String, Byte> map; - if (mBigramMap.containsKey(word1)) { - map = mBigramMap.get(word1); - } else { - map = CollectionUtils.newHashMap(); - mBigramMap.put(word1, map); - } - if (!map.containsKey(word2)) { - ++mSize; - map.put(word2, fcValue); - } - } - - /** - * Called when inserted to the SQL DB. - */ - public void updateBigram(String word1, String word2, byte fcValue) { - if (DecayingExpandableBinaryDictionaryBase.DBG_SAVE_RESTORE) { - Log.d(TAG, "--- update bigram: " + word1 + ", " + word2 + ", " + fcValue); - } - final HashMap<String, Byte> map; - if (mBigramMap.containsKey(word1)) { - map = mBigramMap.get(word1); - } else { - return; - } - if (!map.containsKey(word2)) { - return; - } - map.put(word2, fcValue); - } - - public int size() { - return mSize; - } - - public boolean isEmpty() { - return mBigramMap.isEmpty(); - } - - public boolean containsKey(String word) { - return mBigramMap.containsKey(word); - } - - public Set<String> keySet() { - return mBigramMap.keySet(); - } - - public HashMap<String, Byte> getBigrams(String word1) { - if (mBigramMap.containsKey(word1)) return mBigramMap.get(word1); - // TODO: lower case according to locale - final String lowerWord1 = word1.toLowerCase(); - if (mBigramMap.containsKey(lowerWord1)) return mBigramMap.get(lowerWord1); - return EMPTY_BIGRAM_MAP; - } - - public boolean removeBigram(String word1, String word2) { - final HashMap<String, Byte> set = getBigrams(word1); - if (set.isEmpty()) { - return false; - } - if (set.containsKey(word2)) { - set.remove(word2); - --mSize; - return true; - } - return false; - } -} diff --git a/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java index 4bf524cbb..ad411f9ee 100644 --- a/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java +++ b/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java @@ -16,8 +16,6 @@ package com.android.inputmethod.latin.settings; -import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.ASCII_CAPABLE; - import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; @@ -44,10 +42,12 @@ import android.widget.Spinner; import android.widget.SpinnerAdapter; import android.widget.Toast; +import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodManager; import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.utils.DialogUtils; import com.android.inputmethod.latin.utils.IntentUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; @@ -100,7 +100,7 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { super(context, android.R.layout.simple_spinner_item); setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - final TreeSet<SubtypeLocaleItem> items = CollectionUtils.newTreeSet(); + final TreeSet<SubtypeLocaleItem> items = new TreeSet<>(); final InputMethodInfo imi = RichInputMethodManager.getInstance() .getInputMethodInfoOfThisIme(); final int count = imi.getSubtypeCount(); @@ -111,7 +111,7 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { subtype.getLocale(), subtype.hashCode(), subtype.hashCode(), SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype))); } - if (subtype.containsExtraValueKey(ASCII_CAPABLE)) { + if (InputMethodSubtypeCompatUtils.isAsciiCapable(subtype)) { items.add(createItem(context, subtype.getLocale())); } } @@ -150,8 +150,9 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { // TODO: Should filter out already existing combinations of locale and layout. for (final String layout : SubtypeLocaleUtils.getPredefinedKeyboardLayoutSet()) { // This is a dummy subtype with NO_LANGUAGE, only for display. - final InputMethodSubtype subtype = AdditionalSubtypeUtils.createAdditionalSubtype( - SubtypeLocaleUtils.NO_LANGUAGE, layout, null); + final InputMethodSubtype subtype = + AdditionalSubtypeUtils.createDummyAdditionalSubtype( + SubtypeLocaleUtils.NO_LANGUAGE, layout); add(new KeyboardLayoutSetItem(subtype)); } } @@ -286,8 +287,9 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { (SubtypeLocaleItem) mSubtypeLocaleSpinner.getSelectedItem(); final KeyboardLayoutSetItem layout = (KeyboardLayoutSetItem) mKeyboardLayoutSetSpinner.getSelectedItem(); - final InputMethodSubtype subtype = AdditionalSubtypeUtils.createAdditionalSubtype( - locale.first, layout.first, ASCII_CAPABLE); + final InputMethodSubtype subtype = + AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype( + locale.first, layout.first); setSubtype(subtype); notifyChanged(); if (isEditing) { @@ -368,7 +370,6 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { mSubtype = (InputMethodSubtype)source.readParcelable(null); } - @SuppressWarnings("hiding") public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { @Override @@ -515,9 +516,9 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { localeString, keyboardLayoutSetName); } - private AlertDialog createDialog( - @SuppressWarnings("unused") final SubtypePreference subtypePref) { - final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + private AlertDialog createDialog(final SubtypePreference subtypePref) { + final AlertDialog.Builder builder = new AlertDialog.Builder( + DialogUtils.getPlatformDialogThemeContext(getActivity())); builder.setTitle(R.string.custom_input_styles_title) .setMessage(R.string.custom_input_style_note_message) .setNegativeButton(R.string.not_now, null) @@ -553,7 +554,7 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { private InputMethodSubtype[] getSubtypes() { final PreferenceGroup group = getPreferenceScreen(); - final ArrayList<InputMethodSubtype> subtypes = CollectionUtils.newArrayList(); + final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>(); final int count = group.getPreferenceCount(); for (int i = 0; i < count; i++) { final Preference pref = group.getPreference(i); diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java index da1fb73fe..c17e86892 100644 --- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java +++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java @@ -16,37 +16,47 @@ package com.android.inputmethod.latin.settings; +import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Resources; import android.os.Bundle; import android.os.Process; -import android.preference.CheckBoxPreference; import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; +import android.preference.TwoStatePreference; -import com.android.inputmethod.keyboard.KeyboardSwitcher; -import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver; +import com.android.inputmethod.latin.DictionaryFacilitator; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug; import com.android.inputmethod.latin.utils.ApplicationUtils; +import com.android.inputmethod.latin.utils.ResourceUtils; public final class DebugSettings extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { public static final String PREF_DEBUG_MODE = "debug_mode"; public static final String PREF_FORCE_NON_DISTINCT_MULTITOUCH = "force_non_distinct_multitouch"; - public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; - public static final String PREF_STATISTICS_LOGGING = "enable_logging"; - public static final String PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG = - "use_only_personalization_dictionary_for_debug"; - public static final String PREF_BOOST_PERSONALIZATION_DICTIONARY_FOR_DEBUG = - "boost_personalization_dictionary_for_debug"; + public static final String PREF_KEY_PREVIEW_SHOW_UP_START_SCALE = + "pref_key_preview_show_up_start_scale"; + public static final String PREF_KEY_PREVIEW_DISMISS_END_SCALE = + "pref_key_preview_dismiss_end_scale"; + public static final String PREF_KEY_PREVIEW_SHOW_UP_DURATION = + "pref_key_preview_show_up_duration"; + public static final String PREF_KEY_PREVIEW_DISMISS_DURATION = + "pref_key_preview_dismiss_duration"; private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary"; - private static final boolean SHOW_STATISTICS_LOGGING = false; + private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries"; + private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries"; + private static final String DICT_NAME_KEY_FOR_EXTRAS = "dict_name"; + public static final String PREF_SLIDING_KEY_INPUT_PREVIEW = "pref_sliding_key_input_preview"; + public static final String PREF_KEY_LONGPRESS_TIMEOUT = "pref_key_longpress_timeout"; private boolean mServiceNeedsRestart = false; - private CheckBoxPreference mDebugMode; - private CheckBoxPreference mStatisticsLoggingPref; + private TwoStatePreference mDebugMode; @Override public void onCreate(Bundle icicle) { @@ -55,21 +65,6 @@ public final class DebugSettings extends PreferenceFragment SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); prefs.registerOnSharedPreferenceChangeListener(this); - final Preference usabilityStudyPref = findPreference(PREF_USABILITY_STUDY_MODE); - if (usabilityStudyPref instanceof CheckBoxPreference) { - final CheckBoxPreference checkbox = (CheckBoxPreference)usabilityStudyPref; - checkbox.setChecked(prefs.getBoolean(PREF_USABILITY_STUDY_MODE, - LatinImeLogger.getUsabilityStudyMode(prefs))); - checkbox.setSummary(R.string.settings_warning_researcher_mode); - } - final Preference statisticsLoggingPref = findPreference(PREF_STATISTICS_LOGGING); - if (statisticsLoggingPref instanceof CheckBoxPreference) { - mStatisticsLoggingPref = (CheckBoxPreference) statisticsLoggingPref; - if (!SHOW_STATISTICS_LOGGING) { - getPreferenceScreen().removePreference(statisticsLoggingPref); - } - } - final PreferenceScreen readExternalDictionary = (PreferenceScreen) findPreference(PREF_READ_EXTERNAL_DICTIONARY); if (null != readExternalDictionary) { @@ -85,36 +80,75 @@ public final class DebugSettings extends PreferenceFragment }); } + final PreferenceGroup dictDumpPreferenceGroup = + (PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS); + final OnPreferenceClickListener dictDumpPrefClickListener = + new DictDumpPrefClickListener(this); + for (final String dictName : DictionaryFacilitator.DICT_TYPE_TO_CLASS.keySet()) { + final Preference preference = new Preference(getActivity()); + preference.setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName); + preference.setTitle("Dump " + dictName + " dictionary"); + preference.setOnPreferenceClickListener(dictDumpPrefClickListener); + preference.getExtras().putString(DICT_NAME_KEY_FOR_EXTRAS, dictName); + dictDumpPreferenceGroup.addPreference(preference); + } + final Resources res = getResources(); + setupKeyLongpressTimeoutSettings(prefs, res); + setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_DURATION, + res.getInteger(R.integer.config_key_preview_show_up_duration)); + setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_DISMISS_DURATION, + res.getInteger(R.integer.config_key_preview_dismiss_duration)); + setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_START_SCALE, + ResourceUtils.getFloatFromFraction( + res, R.fraction.config_key_preview_show_up_start_scale)); + setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_DISMISS_END_SCALE, + ResourceUtils.getFloatFromFraction( + res, R.fraction.config_key_preview_dismiss_end_scale)); + mServiceNeedsRestart = false; - mDebugMode = (CheckBoxPreference) findPreference(PREF_DEBUG_MODE); + mDebugMode = (TwoStatePreference) findPreference(PREF_DEBUG_MODE); updateDebugMode(); } + private static class DictDumpPrefClickListener implements OnPreferenceClickListener { + final PreferenceFragment mPreferenceFragment; + + public DictDumpPrefClickListener(final PreferenceFragment preferenceFragment) { + mPreferenceFragment = preferenceFragment; + } + + @Override + public boolean onPreferenceClick(final Preference arg0) { + final String dictName = arg0.getExtras().getString(DICT_NAME_KEY_FOR_EXTRAS); + if (dictName != null) { + final Intent intent = + new Intent(DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION); + intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName); + mPreferenceFragment.getActivity().sendBroadcast(intent); + } + return true; + } + } + @Override public void onStop() { super.onStop(); - if (mServiceNeedsRestart) Process.killProcess(Process.myPid()); + if (mServiceNeedsRestart) { + Process.killProcess(Process.myPid()); + } } @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { - if (key.equals(PREF_DEBUG_MODE)) { - if (mDebugMode != null) { - mDebugMode.setChecked(prefs.getBoolean(PREF_DEBUG_MODE, false)); - final boolean checked = mDebugMode.isChecked(); - if (mStatisticsLoggingPref != null) { - if (checked) { - getPreferenceScreen().addPreference(mStatisticsLoggingPref); - } else { - getPreferenceScreen().removePreference(mStatisticsLoggingPref); - } - } - updateDebugMode(); - mServiceNeedsRestart = true; - } - } else if (key.equals(PREF_FORCE_NON_DISTINCT_MULTITOUCH) - || key.equals(PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG)) { + if (key.equals(PREF_DEBUG_MODE) && mDebugMode != null) { + mDebugMode.setChecked(prefs.getBoolean(PREF_DEBUG_MODE, false)); + updateDebugMode(); + mServiceNeedsRestart = true; + return; + } + if (key.equals(PREF_FORCE_NON_DISTINCT_MULTITOUCH)) { mServiceNeedsRestart = true; + return; } } @@ -133,4 +167,130 @@ public final class DebugSettings extends PreferenceFragment mDebugMode.setSummary(version); } } + + private void setupKeyLongpressTimeoutSettings(final SharedPreferences sp, + final Resources res) { + final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( + PREF_KEY_LONGPRESS_TIMEOUT); + if (pref == null) { + return; + } + pref.setInterface(new SeekBarDialogPreference.ValueProxy() { + @Override + public void writeValue(final int value, final String key) { + sp.edit().putInt(key, value).apply(); + } + + @Override + public void writeDefaultValue(final String key) { + sp.edit().remove(key).apply(); + } + + @Override + public int readValue(final String key) { + return Settings.readKeyLongpressTimeout(sp, res); + } + + @Override + public int readDefaultValue(final String key) { + return Settings.readDefaultKeyLongpressTimeout(res); + } + + @Override + public String getValueText(final int value) { + return res.getString(R.string.abbreviation_unit_milliseconds, value); + } + + @Override + public void feedbackValue(final int value) {} + }); + } + + private void setupKeyPreviewAnimationScale(final SharedPreferences sp, final Resources res, + final String prefKey, final float defaultValue) { + final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); + if (pref == null) { + return; + } + pref.setInterface(new SeekBarDialogPreference.ValueProxy() { + private static final float PERCENTAGE_FLOAT = 100.0f; + + private float getValueFromPercentage(final int percentage) { + return percentage / PERCENTAGE_FLOAT; + } + + private int getPercentageFromValue(final float floatValue) { + return (int)(floatValue * PERCENTAGE_FLOAT); + } + + @Override + public void writeValue(final int value, final String key) { + sp.edit().putFloat(key, getValueFromPercentage(value)).apply(); + } + + @Override + public void writeDefaultValue(final String key) { + sp.edit().remove(key).apply(); + } + + @Override + public int readValue(final String key) { + return getPercentageFromValue( + Settings.readKeyPreviewAnimationScale(sp, key, defaultValue)); + } + + @Override + public int readDefaultValue(final String key) { + return getPercentageFromValue(defaultValue); + } + + @Override + public String getValueText(final int value) { + if (value < 0) { + return res.getString(R.string.settings_system_default); + } + return String.format("%d%%", value); + } + + @Override + public void feedbackValue(final int value) {} + }); + } + + private void setupKeyPreviewAnimationDuration(final SharedPreferences sp, final Resources res, + final String prefKey, final int defaultValue) { + final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); + if (pref == null) { + return; + } + pref.setInterface(new SeekBarDialogPreference.ValueProxy() { + @Override + public void writeValue(final int value, final String key) { + sp.edit().putInt(key, value).apply(); + } + + @Override + public void writeDefaultValue(final String key) { + sp.edit().remove(key).apply(); + } + + @Override + public int readValue(final String key) { + return Settings.readKeyPreviewAnimationDuration(sp, key, defaultValue); + } + + @Override + public int readDefaultValue(final String key) { + return defaultValue; + } + + @Override + public String getValueText(final int value) { + return res.getString(R.string.abbreviation_unit_milliseconds, value); + } + + @Override + public void feedbackValue(final int value) {} + }); + } } diff --git a/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java b/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java index cd726c969..04a2ee3ce 100644 --- a/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java +++ b/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java @@ -20,7 +20,8 @@ public class NativeSuggestOptions { // Need to update suggest_options.h when you add, remove or reorder options. private static final int IS_GESTURE = 0; private static final int USE_FULL_EDIT_DISTANCE = 1; - private static final int OPTIONS_SIZE = 2; + private static final int BLOCK_OFFENSIVE_WORDS = 2; + private static final int OPTIONS_SIZE = 3; private final int[] mOptions = new int[OPTIONS_SIZE + AdditionalFeaturesSettingUtils.ADDITIONAL_FEATURES_SETTINGS_SIZE]; @@ -33,6 +34,10 @@ public class NativeSuggestOptions { setBooleanOption(USE_FULL_EDIT_DISTANCE, value); } + public void setBlockOffensiveWords(final boolean value) { + setBooleanOption(BLOCK_OFFENSIVE_WORDS, value); + } + public void setAdditionalFeaturesOptions(final int[] additionalOptions) { if (additionalOptions == null) { return; diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java index df2c6907f..fb1a210bb 100644 --- a/java/src/com/android/inputmethod/latin/settings/Settings.java +++ b/java/src/com/android/inputmethod/latin/settings/Settings.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.res.Resources; +import android.os.Build; import android.preference.PreferenceManager; import android.util.Log; @@ -27,19 +28,25 @@ import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils; -import com.android.inputmethod.latin.utils.LocaleUtils; import com.android.inputmethod.latin.utils.ResourceUtils; import com.android.inputmethod.latin.utils.RunInLocale; import com.android.inputmethod.latin.utils.StringUtils; -import java.util.HashMap; +import java.util.Collections; import java.util.Locale; +import java.util.Set; import java.util.concurrent.locks.ReentrantLock; public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String TAG = Settings.class.getSimpleName(); + // Settings screens + public static final String SCREEN_INPUT = "screen_input"; + public static final String SCREEN_MULTI_LINGUAL = "screen_multi_lingual"; + public static final String SCREEN_GESTURE = "screen_gesture"; + public static final String SCREEN_CORRECTION = "screen_correction"; + public static final String SCREEN_ADVANCED = "screen_advanced"; + public static final String SCREEN_DEBUG = "screen_debug"; // In the same order as xml/prefs.xml - public static final String PREF_GENERAL_SETTINGS = "general_settings"; public static final String PREF_AUTO_CAP = "auto_cap"; public static final String PREF_VIBRATE_ON = "vibrate_on"; public static final String PREF_SOUND_ON = "sound_on"; @@ -47,33 +54,31 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang // PREF_VOICE_MODE_OBSOLETE is obsolete. Use PREF_VOICE_INPUT_KEY instead. public static final String PREF_VOICE_MODE_OBSOLETE = "voice_mode"; public static final String PREF_VOICE_INPUT_KEY = "pref_voice_input_key"; - public static final String PREF_CORRECTION_SETTINGS = "correction_settings"; public static final String PREF_EDIT_PERSONAL_DICTIONARY = "edit_personal_dictionary"; public static final String PREF_CONFIGURE_DICTIONARIES_KEY = "configure_dictionaries_key"; public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold"; public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting"; - public static final String PREF_MISC_SETTINGS = "misc_settings"; - public static final String PREF_LAST_USER_DICTIONARY_WRITE_TIME = - "last_user_dictionary_write_time"; - public static final String PREF_ADVANCED_SETTINGS = "pref_advanced_settings"; public static final String PREF_KEY_USE_CONTACTS_DICT = "pref_key_use_contacts_dict"; + public static final String PREF_KEY_USE_PERSONALIZED_DICTS = "pref_key_use_personalized_dicts"; public static final String PREF_KEY_USE_DOUBLE_SPACE_PERIOD = "pref_key_use_double_space_period"; public static final String PREF_BLOCK_POTENTIALLY_OFFENSIVE = "pref_key_block_potentially_offensive"; + public static final boolean ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS = + (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) + || (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT + && Build.VERSION.CODENAME.equals("REL")); public static final String PREF_SHOW_LANGUAGE_SWITCH_KEY = "pref_show_language_switch_key"; public static final String PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST = "pref_include_other_imes_in_language_switch_list"; - public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916"; + public static final String PREF_KEYBOARD_THEME = "pref_keyboard_theme"; public static final String PREF_CUSTOM_INPUT_STYLES = "custom_input_styles"; + // TODO: consolidate key preview dismiss delay with the key preview animation parameters. public static final String PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY = "pref_key_preview_popup_dismiss_delay"; public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction"; - public static final String PREF_GESTURE_SETTINGS = "gesture_typing_settings"; public static final String PREF_GESTURE_INPUT = "gesture_input"; - public static final String PREF_SLIDING_KEY_INPUT_PREVIEW = "pref_sliding_key_input_preview"; - public static final String PREF_KEY_LONGPRESS_TIMEOUT = "pref_key_longpress_timeout"; public static final String PREF_VIBRATION_DURATION_SETTINGS = "pref_vibration_duration_settings"; public static final String PREF_KEYPRESS_SOUND_VOLUME = @@ -86,9 +91,10 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_INPUT_LANGUAGE = "input_language"; public static final String PREF_SELECTED_LANGUAGES = "selected_languages"; - public static final String PREF_DEBUG_SETTINGS = "debug_settings"; public static final String PREF_KEY_IS_INTERNAL = "pref_key_is_internal"; + public static final String PREF_ENABLE_METRICS_LOGGING = "pref_enable_metrics_logging"; + // This preference key is deprecated. Use {@link #PREF_SHOW_LANGUAGE_SWITCH_KEY} instead. // This is being used only for the backward compatibility. private static final String PREF_SUPPRESS_LANGUAGE_SWITCH_KEY = @@ -96,14 +102,20 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang private static final String PREF_LAST_USED_PERSONALIZATION_TOKEN = "pref_last_used_personalization_token"; - public static final String PREF_SEND_FEEDBACK = "send_feedback"; - public static final String PREF_ABOUT_KEYBOARD = "about_keyboard"; + private static final String PREF_LAST_PERSONALIZATION_DICT_WIPED_TIME = + "pref_last_used_personalization_dict_wiped_time"; + private static final String PREF_CORPUS_HANDLES_FOR_PERSONALIZATION = + "pref_corpus_handles_for_personalization"; // Emoji public static final String PREF_EMOJI_RECENT_KEYS = "emoji_recent_keys"; public static final String PREF_EMOJI_CATEGORY_LAST_TYPED_ID = "emoji_category_last_typed_id"; public static final String PREF_LAST_SHOWN_EMOJI_CATEGORY_ID = "last_shown_emoji_category_id"; + private static final float UNDEFINED_PREFERENCE_VALUE_FLOAT = -1.0f; + private static final int UNDEFINED_PREFERENCE_VALUE_INT = -1; + + private Context mContext; private Resources mRes; private SharedPreferences mPrefs; private SettingsValues mSettingsValues; @@ -124,6 +136,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang } private void onCreate(final Context context) { + mContext = context; mRes = context.getResources(); mPrefs = PreferenceManager.getDefaultSharedPreferences(context); mPrefs.registerOnSharedPreferenceChangeListener(this); @@ -143,20 +156,22 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang Log.w(TAG, "onSharedPreferenceChanged called before loadSettings."); return; } - loadSettings(mSettingsValues.mLocale, mSettingsValues.mInputAttributes); + loadSettings(mContext, mSettingsValues.mLocale, mSettingsValues.mInputAttributes); } finally { mSettingsValuesLock.unlock(); } } - public void loadSettings(final Locale locale, final InputAttributes inputAttributes) { + public void loadSettings(final Context context, final Locale locale, + final InputAttributes inputAttributes) { mSettingsValuesLock.lock(); + mContext = context; try { final SharedPreferences prefs = mPrefs; final RunInLocale<SettingsValues> job = new RunInLocale<SettingsValues>() { @Override protected SettingsValues job(final Resources res) { - return new SettingsValues(prefs, locale, res, inputAttributes); + return new SettingsValues(context, prefs, res, inputAttributes); } }; mSettingsValues = job.runInLocale(mRes, locale); @@ -174,10 +189,6 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang return mSettingsValues.mIsInternal; } - public String getWordSeparators() { - return mSettingsValues.mWordSeparators; - } - public boolean isWordSeparator(final int code) { return mSettingsValues.isWordSeparator(code); } @@ -189,7 +200,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang // Accessed from the settings interface, hence public public static boolean readKeypressSoundEnabled(final SharedPreferences prefs, final Resources res) { - return prefs.getBoolean(Settings.PREF_SOUND_ON, + return prefs.getBoolean(PREF_SOUND_ON, res.getBoolean(R.bool.config_default_sound_enabled)); } @@ -209,7 +220,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static boolean readBlockPotentiallyOffensive(final SharedPreferences prefs, final Resources res) { - return prefs.getBoolean(Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE, + return prefs.getBoolean(PREF_BLOCK_POTENTIALLY_OFFENSIVE, res.getBoolean(R.bool.config_block_potentially_offensive)); } @@ -220,25 +231,24 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static boolean readGestureInputEnabled(final SharedPreferences prefs, final Resources res) { return readFromBuildConfigIfGestureInputEnabled(res) - && prefs.getBoolean(Settings.PREF_GESTURE_INPUT, true); + && prefs.getBoolean(PREF_GESTURE_INPUT, true); } public static boolean readPhraseGestureEnabled(final SharedPreferences prefs, final Resources res) { - return prefs.getBoolean(Settings.PREF_PHRASE_GESTURE_ENABLED, + return prefs.getBoolean(PREF_PHRASE_GESTURE_ENABLED, res.getBoolean(R.bool.config_default_phrase_gesture_enabled)); } - public static boolean readFromBuildConfigIfToShowKeyPreviewPopupSettingsOption( - final Resources res) { - return res.getBoolean(R.bool.config_enable_show_option_of_key_preview_popup); + public static boolean readFromBuildConfigIfToShowKeyPreviewPopupOption(final Resources res) { + return res.getBoolean(R.bool.config_enable_show_key_preview_popup_option); } public static boolean readKeyPreviewPopupEnabled(final SharedPreferences prefs, final Resources res) { final boolean defaultKeyPreviewPopup = res.getBoolean( R.bool.config_default_key_preview_popup); - if (!readFromBuildConfigIfToShowKeyPreviewPopupSettingsOption(res)) { + if (!readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) { return defaultKeyPreviewPopup; } return prefs.getBoolean(PREF_POPUP_ON, defaultKeyPreviewPopup); @@ -263,28 +273,6 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang return prefs.getBoolean(PREF_SHOW_LANGUAGE_SWITCH_KEY, true); } - public static int readKeyboardThemeIndex(final SharedPreferences prefs, final Resources res) { - final String defaultThemeIndex = res.getString( - R.string.config_default_keyboard_theme_index); - final String themeIndex = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultThemeIndex); - try { - return Integer.valueOf(themeIndex); - } catch (final NumberFormatException e) { - // Format error, returns default keyboard theme index. - Log.e(TAG, "Illegal keyboard theme in preference: " + themeIndex + ", default to " - + defaultThemeIndex, e); - return Integer.valueOf(defaultThemeIndex); - } - } - - public static int resetAndGetDefaultKeyboardThemeIndex(final SharedPreferences prefs, - final Resources res) { - final String defaultThemeIndex = res.getString( - R.string.config_default_keyboard_theme_index); - prefs.edit().putString(PREF_KEYBOARD_LAYOUT, defaultThemeIndex).apply(); - return Integer.valueOf(defaultThemeIndex); - } - public static String readPrefAdditionalSubtypes(final SharedPreferences prefs, final Resources res) { final String predefinedPrefSubtypes = AdditionalSubtypeUtils.createPrefSubtypes( @@ -294,24 +282,32 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static void writePrefAdditionalSubtypes(final SharedPreferences prefs, final String prefSubtypes) { - prefs.edit().putString(Settings.PREF_CUSTOM_INPUT_STYLES, prefSubtypes).apply(); + prefs.edit().putString(PREF_CUSTOM_INPUT_STYLES, prefSubtypes).apply(); } public static float readKeypressSoundVolume(final SharedPreferences prefs, final Resources res) { - final float volume = prefs.getFloat(PREF_KEYPRESS_SOUND_VOLUME, -1.0f); - return (volume >= 0) ? volume : readDefaultKeypressSoundVolume(res); + final float volume = prefs.getFloat( + PREF_KEYPRESS_SOUND_VOLUME, UNDEFINED_PREFERENCE_VALUE_FLOAT); + return (volume != UNDEFINED_PREFERENCE_VALUE_FLOAT) ? volume + : readDefaultKeypressSoundVolume(res); } + // Default keypress sound volume for unknown devices. + // The negative value means system default. + private static final String DEFAULT_KEYPRESS_SOUND_VOLUME = Float.toString(-1.0f); + public static float readDefaultKeypressSoundVolume(final Resources res) { - return Float.parseFloat( - ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_volumes)); + return Float.parseFloat(ResourceUtils.getDeviceOverrideValue(res, + R.array.keypress_volumes, DEFAULT_KEYPRESS_SOUND_VOLUME)); } public static int readKeyLongpressTimeout(final SharedPreferences prefs, final Resources res) { - final int ms = prefs.getInt(PREF_KEY_LONGPRESS_TIMEOUT, -1); - return (ms >= 0) ? ms : readDefaultKeyLongpressTimeout(res); + final int milliseconds = prefs.getInt( + DebugSettings.PREF_KEY_LONGPRESS_TIMEOUT, UNDEFINED_PREFERENCE_VALUE_INT); + return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds + : readDefaultKeyLongpressTimeout(res); } public static int readDefaultKeyLongpressTimeout(final Resources res) { @@ -320,36 +316,31 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static int readKeypressVibrationDuration(final SharedPreferences prefs, final Resources res) { - final int ms = prefs.getInt(PREF_VIBRATION_DURATION_SETTINGS, -1); - return (ms >= 0) ? ms : readDefaultKeypressVibrationDuration(res); + final int milliseconds = prefs.getInt( + PREF_VIBRATION_DURATION_SETTINGS, UNDEFINED_PREFERENCE_VALUE_INT); + return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds + : readDefaultKeypressVibrationDuration(res); } - public static int readDefaultKeypressVibrationDuration(final Resources res) { - return Integer.parseInt( - ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_vibration_durations)); - } + // Default keypress vibration duration for unknown devices. + // The negative value means system default. + private static final String DEFAULT_KEYPRESS_VIBRATION_DURATION = Integer.toString(-1); - public static boolean readUsabilityStudyMode(final SharedPreferences prefs) { - return prefs.getBoolean(DebugSettings.PREF_USABILITY_STUDY_MODE, true); + public static int readDefaultKeypressVibrationDuration(final Resources res) { + return Integer.parseInt(ResourceUtils.getDeviceOverrideValue(res, + R.array.keypress_vibration_durations, DEFAULT_KEYPRESS_VIBRATION_DURATION)); } - public static long readLastUserHistoryWriteTime(final SharedPreferences prefs, - final String locale) { - final String str = prefs.getString(PREF_LAST_USER_DICTIONARY_WRITE_TIME, ""); - final HashMap<String, Long> map = LocaleUtils.localeAndTimeStrToHashMap(str); - if (map.containsKey(locale)) { - return map.get(locale); - } - return 0; + public static float readKeyPreviewAnimationScale(final SharedPreferences prefs, + final String prefKey, final float defaultValue) { + final float fraction = prefs.getFloat(prefKey, UNDEFINED_PREFERENCE_VALUE_FLOAT); + return (fraction != UNDEFINED_PREFERENCE_VALUE_FLOAT) ? fraction : defaultValue; } - public static void writeLastUserHistoryWriteTime(final SharedPreferences prefs, - final String locale) { - final String oldStr = prefs.getString(PREF_LAST_USER_DICTIONARY_WRITE_TIME, ""); - final HashMap<String, Long> map = LocaleUtils.localeAndTimeStrToHashMap(oldStr); - map.put(locale, System.currentTimeMillis()); - final String newStr = LocaleUtils.localeAndTimeHashMapToStr(map); - prefs.edit().putString(PREF_LAST_USER_DICTIONARY_WRITE_TIME, newStr).apply(); + public static int readKeyPreviewAnimationDuration(final SharedPreferences prefs, + final String prefKey, final int defaultValue) { + final int milliseconds = prefs.getInt(prefKey, UNDEFINED_PREFERENCE_VALUE_INT); + return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds : defaultValue; } public static boolean readUseFullscreenMode(final Resources res) { @@ -363,35 +354,27 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang if (!enableSetupWizardByConfig) { return false; } - if (!prefs.contains(Settings.PREF_SHOW_SETUP_WIZARD_ICON)) { + if (!prefs.contains(PREF_SHOW_SETUP_WIZARD_ICON)) { final ApplicationInfo appInfo = context.getApplicationInfo(); final boolean isApplicationInSystemImage = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; // Default value return !isApplicationInSystemImage; } - return prefs.getBoolean(Settings.PREF_SHOW_SETUP_WIZARD_ICON, false); + return prefs.getBoolean(PREF_SHOW_SETUP_WIZARD_ICON, false); } public static boolean isInternal(final SharedPreferences prefs) { - return prefs.getBoolean(Settings.PREF_KEY_IS_INTERNAL, false); - } - - public static boolean readUseOnlyPersonalizationDictionaryForDebug( - final SharedPreferences prefs) { - return prefs.getBoolean( - DebugSettings.PREF_USE_ONLY_PERSONALIZATION_DICTIONARY_FOR_DEBUG, false); - } - - public static boolean readBoostPersonalizationDictionaryForDebug( - final SharedPreferences prefs) { - return prefs.getBoolean( - DebugSettings.PREF_BOOST_PERSONALIZATION_DICTIONARY_FOR_DEBUG, false); + return prefs.getBoolean(PREF_KEY_IS_INTERNAL, false); } public void writeLastUsedPersonalizationToken(byte[] token) { - final String tokenStr = StringUtils.byteArrayToHexString(token); - mPrefs.edit().putString(PREF_LAST_USED_PERSONALIZATION_TOKEN, tokenStr).apply(); + if (token == null) { + mPrefs.edit().remove(PREF_LAST_USED_PERSONALIZATION_TOKEN).apply(); + } else { + final String tokenStr = StringUtils.byteArrayToHexString(token); + mPrefs.edit().putString(PREF_LAST_USED_PERSONALIZATION_TOKEN, tokenStr).apply(); + } } public byte[] readLastUsedPersonalizationToken() { @@ -399,6 +382,23 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang return StringUtils.hexStringToByteArray(tokenStr); } + public void writeLastPersonalizationDictWipedTime(final long timestamp) { + mPrefs.edit().putLong(PREF_LAST_PERSONALIZATION_DICT_WIPED_TIME, timestamp).apply(); + } + + public long readLastPersonalizationDictGeneratedTime() { + return mPrefs.getLong(PREF_LAST_PERSONALIZATION_DICT_WIPED_TIME, 0); + } + + public void writeCorpusHandlesForPersonalization(final Set<String> corpusHandles) { + mPrefs.edit().putStringSet(PREF_CORPUS_HANDLES_FOR_PERSONALIZATION, corpusHandles).apply(); + } + + public Set<String> readCorpusHandlesForPersonalization() { + final Set<String> emptySet = Collections.emptySet(); + return mPrefs.getStringSet(PREF_CORPUS_HANDLES_FOR_PERSONALIZATION, emptySet); + } + public static void writeEmojiRecentKeys(final SharedPreferences prefs, String str) { prefs.edit().putString(PREF_EMOJI_RECENT_KEYS, str).apply(); } diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java index 5c60a7350..689f878be 100644 --- a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java +++ b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java @@ -27,16 +27,19 @@ import android.content.res.Resources; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; -import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; +import android.preference.TwoStatePreference; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.dictionarypack.DictionarySettingsActivity; +import com.android.inputmethod.keyboard.KeyboardTheme; import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SubtypeSwitcher; @@ -48,7 +51,6 @@ import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils; import com.android.inputmethod.latin.utils.ApplicationUtils; import com.android.inputmethod.latin.utils.FeedbackUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; -import com.android.inputmethod.research.ResearchLogger; import com.android.inputmethodcommon.InputMethodSettingsFragment; import java.util.TreeSet; @@ -59,14 +61,11 @@ public final class SettingsFragment extends InputMethodSettingsFragment private static final boolean DBG_USE_INTERNAL_PERSONAL_DICTIONARY_SETTINGS = false; private static final boolean USE_INTERNAL_PERSONAL_DICTIONARY_SETTIGS = DBG_USE_INTERNAL_PERSONAL_DICTIONARY_SETTINGS - || Build.VERSION.SDK_INT <= 18 /* Build.VERSION.JELLY_BEAN_MR2 */; + || Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2; - private CheckBoxPreference mVoiceInputKeyPreference; - private ListPreference mShowCorrectionSuggestionsPreference; - private ListPreference mAutoCorrectionThresholdPreference; - private ListPreference mKeyPreviewPopupDismissDelay; - // Use bigrams to predict the next word when there is no input for it yet - private CheckBoxPreference mBigramPrediction; + private static final int NO_MENU_GROUP = Menu.NONE; // We don't care about menu grouping. + private static final int MENU_FEEDBACK = Menu.FIRST; // The first menu item id and order. + private static final int MENU_ABOUT = Menu.FIRST + 1; // The second menu item id and order. private void setPreferenceEnabled(final String preferenceKey, final boolean enabled) { final Preference preference = findPreference(preferenceKey); @@ -75,6 +74,18 @@ public final class SettingsFragment extends InputMethodSettingsFragment } } + private void updateListPreferenceSummaryToCurrentValue(final String prefKey) { + // Because the "%s" summary trick of {@link ListPreference} doesn't work properly before + // KitKat, we need to update the summary programmatically. + final ListPreference listPreference = (ListPreference)findPreference(prefKey); + if (listPreference == null) { + return; + } + final CharSequence entries[] = listPreference.getEntries(); + final int entryIndex = listPreference.findIndexOfValue(listPreference.getValue()); + listPreference.setSummary(entryIndex < 0 ? null : entries[entryIndex]); + } + private static void removePreference(final String preferenceKey, final PreferenceGroup parent) { if (parent == null) { return; @@ -88,13 +99,14 @@ public final class SettingsFragment extends InputMethodSettingsFragment @Override public void onCreate(final Bundle icicle) { super.onCreate(icicle); + setHasOptionsMenu(true); setInputMethodSettingsCategoryTitle(R.string.language_selection_title); setSubtypeEnablerTitle(R.string.select_language); addPreferencesFromResource(R.xml.prefs); final PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { preferenceScreen.setTitle( - ApplicationUtils.getAcitivityTitleResId(getActivity(), SettingsActivity.class)); + ApplicationUtils.getActivityTitleResId(getActivity(), SettingsActivity.class)); } final Resources res = getResources(); @@ -107,115 +119,99 @@ public final class SettingsFragment extends InputMethodSettingsFragment SubtypeLocaleUtils.init(context); AudioAndHapticFeedbackManager.init(context); - mVoiceInputKeyPreference = - (CheckBoxPreference) findPreference(Settings.PREF_VOICE_INPUT_KEY); - mShowCorrectionSuggestionsPreference = - (ListPreference) findPreference(Settings.PREF_SHOW_SUGGESTIONS_SETTING); final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); prefs.registerOnSharedPreferenceChangeListener(this); - mAutoCorrectionThresholdPreference = - (ListPreference) findPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD); - mBigramPrediction = (CheckBoxPreference) findPreference(Settings.PREF_BIGRAM_PREDICTIONS); ensureConsistencyOfAutoCorrectionSettings(); - final PreferenceGroup generalSettings = - (PreferenceGroup) findPreference(Settings.PREF_GENERAL_SETTINGS); - final PreferenceGroup miscSettings = - (PreferenceGroup) findPreference(Settings.PREF_MISC_SETTINGS); - - final Preference debugSettings = findPreference(Settings.PREF_DEBUG_SETTINGS); - if (debugSettings != null) { - if (Settings.isInternal(prefs)) { - final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN); - debugSettingsIntent.setClassName( - context.getPackageName(), DebugSettingsActivity.class.getName()); - debugSettings.setIntent(debugSettingsIntent); - } else { - miscSettings.removePreference(debugSettings); - } - } - - final Preference feedbackSettings = findPreference(Settings.PREF_SEND_FEEDBACK); - final Preference aboutSettings = findPreference(Settings.PREF_ABOUT_KEYBOARD); - if (feedbackSettings != null) { - if (FeedbackUtils.isFeedbackFormSupported()) { - feedbackSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(final Preference pref) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - // Use development-only feedback mechanism - ResearchLogger.getInstance().presentFeedbackDialogFromSettings(); - } else { - FeedbackUtils.showFeedbackForm(getActivity()); - } - return true; - } - }); - aboutSettings.setTitle(FeedbackUtils.getAboutKeyboardTitleResId()); - aboutSettings.setIntent(FeedbackUtils.getAboutKeyboardIntent(getActivity())); - } else { - miscSettings.removePreference(feedbackSettings); - miscSettings.removePreference(aboutSettings); - } - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - // The about screen contains items that may be confusing in development-only versions. - miscSettings.removePreference(aboutSettings); + final PreferenceScreen inputScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_INPUT); + final PreferenceScreen multiLingualScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_MULTI_LINGUAL); + final PreferenceScreen gestureScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_GESTURE); + final PreferenceScreen correctionScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_CORRECTION); + final PreferenceScreen advancedScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_ADVANCED); + final PreferenceScreen debugScreen = + (PreferenceScreen) findPreference(Settings.SCREEN_DEBUG); + + if (Settings.isInternal(prefs)) { + final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN); + debugSettingsIntent.setClassName( + context.getPackageName(), DebugSettingsActivity.class.getName()); + debugScreen.setIntent(debugSettingsIntent); + } else { + advancedScreen.removePreference(debugScreen); } final boolean showVoiceKeyOption = res.getBoolean( R.bool.config_enable_show_voice_key_option); if (!showVoiceKeyOption) { - generalSettings.removePreference(mVoiceInputKeyPreference); + removePreference(Settings.PREF_VOICE_INPUT_KEY, inputScreen); } - final PreferenceGroup advancedSettings = - (PreferenceGroup) findPreference(Settings.PREF_ADVANCED_SETTINGS); if (!AudioAndHapticFeedbackManager.getInstance().hasVibrator()) { - removePreference(Settings.PREF_VIBRATE_ON, generalSettings); - removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS, advancedSettings); + removePreference(Settings.PREF_VIBRATE_ON, inputScreen); + removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS, advancedScreen); + } + if (!Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS) { + removePreference(Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY, multiLingualScreen); + removePreference( + Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, multiLingualScreen); } - mKeyPreviewPopupDismissDelay = - (ListPreference) findPreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); - if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupSettingsOption(res)) { - removePreference(Settings.PREF_POPUP_ON, generalSettings); - removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, advancedSettings); + // TODO: consolidate key preview dismiss delay with the key preview animation parameters. + if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) { + removePreference(Settings.PREF_POPUP_ON, inputScreen); + removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, advancedScreen); } else { + // TODO: Cleanup this setup. + final ListPreference keyPreviewPopupDismissDelay = + (ListPreference) findPreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger( R.integer.config_key_preview_linger_timeout)); - mKeyPreviewPopupDismissDelay.setEntries(new String[] { + keyPreviewPopupDismissDelay.setEntries(new String[] { res.getString(R.string.key_preview_popup_dismiss_no_delay), res.getString(R.string.key_preview_popup_dismiss_default_delay), }); - mKeyPreviewPopupDismissDelay.setEntryValues(new String[] { + keyPreviewPopupDismissDelay.setEntryValues(new String[] { "0", popupDismissDelayDefaultValue }); - if (null == mKeyPreviewPopupDismissDelay.getValue()) { - mKeyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue); + if (null == keyPreviewPopupDismissDelay.getValue()) { + keyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue); } - mKeyPreviewPopupDismissDelay.setEnabled( + keyPreviewPopupDismissDelay.setEnabled( Settings.readKeyPreviewPopupEnabled(prefs, res)); } if (!res.getBoolean(R.bool.config_setup_wizard_available)) { - removePreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON, advancedSettings); + removePreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON, advancedScreen); } - setPreferenceEnabled(Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, - Settings.readShowsLanguageSwitchKey(prefs)); - - final PreferenceGroup textCorrectionGroup = - (PreferenceGroup) findPreference(Settings.PREF_CORRECTION_SETTINGS); final PreferenceScreen dictionaryLink = (PreferenceScreen) findPreference(Settings.PREF_CONFIGURE_DICTIONARIES_KEY); final Intent intent = dictionaryLink.getIntent(); intent.setClassName(context.getPackageName(), DictionarySettingsActivity.class.getName()); final int number = context.getPackageManager().queryIntentActivities(intent, 0).size(); if (0 >= number) { - textCorrectionGroup.removePreference(dictionaryLink); + correctionScreen.removePreference(dictionaryLink); + } + + if (ProductionFlag.IS_METRICS_LOGGING_SUPPORTED) { + final Preference enableMetricsLogging = + findPreference(Settings.PREF_ENABLE_METRICS_LOGGING); + if (enableMetricsLogging != null) { + final int applicationLabelRes = context.getApplicationInfo().labelRes; + final String applicationName = res.getString(applicationLabelRes); + final String enableMetricsLoggingTitle = res.getString( + R.string.enable_metrics_logging, applicationName); + enableMetricsLogging.setTitle(enableMetricsLoggingTitle); + } + } else { + removePreference(Settings.PREF_ENABLE_METRICS_LOGGING, advancedScreen); } final Preference editPersonalDictionary = @@ -229,12 +225,11 @@ public final class SettingsFragment extends InputMethodSettingsFragment } if (!Settings.readFromBuildConfigIfGestureInputEnabled(res)) { - removePreference(Settings.PREF_GESTURE_SETTINGS, getPreferenceScreen()); + getPreferenceScreen().removePreference(gestureScreen); } AdditionalFeaturesSettingUtils.addAdditionalFeaturesPreferences(context, this); - setupKeyLongpressTimeoutSettings(prefs, res); setupKeypressVibrationDurationSettings(prefs, res); setupKeypressSoundVolumeSettings(prefs, res); refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, res); @@ -243,20 +238,45 @@ public final class SettingsFragment extends InputMethodSettingsFragment @Override public void onResume() { super.onResume(); - final boolean isShortcutImeEnabled = SubtypeSwitcher.getInstance().isShortcutImeEnabled(); - if (!isShortcutImeEnabled) { - getPreferenceScreen().removePreference(mVoiceInputKeyPreference); - } final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); - final CheckBoxPreference showSetupWizardIcon = - (CheckBoxPreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON); + final Resources res = getResources(); + final Preference voiceInputKeyOption = findPreference(Settings.PREF_VOICE_INPUT_KEY); + if (voiceInputKeyOption != null) { + final boolean isShortcutImeEnabled = SubtypeSwitcher.getInstance() + .isShortcutImeEnabled(); + voiceInputKeyOption.setEnabled(isShortcutImeEnabled); + voiceInputKeyOption.setSummary(isShortcutImeEnabled ? null + : res.getText(R.string.voice_input_disabled_summary)); + } + final TwoStatePreference showSetupWizardIcon = + (TwoStatePreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON); if (showSetupWizardIcon != null) { showSetupWizardIcon.setChecked(Settings.readShowSetupWizardIcon(prefs, getActivity())); } - updateShowCorrectionSuggestionsSummary(); - updateKeyPreviewPopupDelaySummary(); - updateColorSchemeSummary(prefs, getResources()); - updateCustomInputStylesSummary(); + updateListPreferenceSummaryToCurrentValue(Settings.PREF_SHOW_SUGGESTIONS_SETTING); + updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); + final ListPreference keyboardThemePref = (ListPreference)findPreference( + Settings.PREF_KEYBOARD_THEME); + if (keyboardThemePref != null) { + final KeyboardTheme keyboardTheme = KeyboardTheme.getKeyboardTheme(prefs); + final String value = Integer.toString(keyboardTheme.mThemeId); + final CharSequence entries[] = keyboardThemePref.getEntries(); + final int entryIndex = keyboardThemePref.findIndexOfValue(value); + keyboardThemePref.setSummary(entryIndex < 0 ? null : entries[entryIndex]); + keyboardThemePref.setValue(value); + } + updateCustomInputStylesSummary(prefs, res); + } + + @Override + public void onPause() { + super.onPause(); + final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + final ListPreference keyboardThemePref = (ListPreference)findPreference( + Settings.PREF_KEYBOARD_THEME); + if (keyboardThemePref != null) { + KeyboardTheme.saveKeyboardThemeId(keyboardThemePref.getValue(), prefs); + } } @Override @@ -280,57 +300,30 @@ public final class SettingsFragment extends InputMethodSettingsFragment if (key.equals(Settings.PREF_POPUP_ON)) { setPreferenceEnabled(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, Settings.readKeyPreviewPopupEnabled(prefs, res)); - } else if (key.equals(Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY)) { - setPreferenceEnabled(Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, - Settings.readShowsLanguageSwitchKey(prefs)); } else if (key.equals(Settings.PREF_SHOW_SETUP_WIZARD_ICON)) { LauncherIconVisibilityManager.updateSetupWizardIconVisibility(getActivity()); } ensureConsistencyOfAutoCorrectionSettings(); - updateShowCorrectionSuggestionsSummary(); - updateKeyPreviewPopupDelaySummary(); - updateColorSchemeSummary(prefs, res); + updateListPreferenceSummaryToCurrentValue(Settings.PREF_SHOW_SUGGESTIONS_SETTING); + updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY); + updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEYBOARD_THEME); refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, getResources()); } private void ensureConsistencyOfAutoCorrectionSettings() { final String autoCorrectionOff = getResources().getString( R.string.auto_correction_threshold_mode_index_off); - final String currentSetting = mAutoCorrectionThresholdPreference.getValue(); - mBigramPrediction.setEnabled(!currentSetting.equals(autoCorrectionOff)); + final ListPreference autoCorrectionThresholdPref = (ListPreference)findPreference( + Settings.PREF_AUTO_CORRECTION_THRESHOLD); + final String currentSetting = autoCorrectionThresholdPref.getValue(); + setPreferenceEnabled( + Settings.PREF_BIGRAM_PREDICTIONS, !currentSetting.equals(autoCorrectionOff)); } - private void updateShowCorrectionSuggestionsSummary() { - mShowCorrectionSuggestionsPreference.setSummary( - getResources().getStringArray(R.array.prefs_suggestion_visibilities) - [mShowCorrectionSuggestionsPreference.findIndexOfValue( - mShowCorrectionSuggestionsPreference.getValue())]); - } - - private void updateColorSchemeSummary(final SharedPreferences prefs, final Resources res) { - // Because the "%s" summary trick of {@link ListPreference} doesn't work properly before - // KitKat, we need to update the summary by code. - final Preference preference = findPreference(Settings.PREF_KEYBOARD_LAYOUT); - if (!(preference instanceof ListPreference)) { - Log.w(TAG, "Can't find Keyboard Color Scheme preference"); - return; - } - final ListPreference colorSchemePreference = (ListPreference)preference; - final int themeIndex = Settings.readKeyboardThemeIndex(prefs, res); - int entryIndex = colorSchemePreference.findIndexOfValue(Integer.toString(themeIndex)); - if (entryIndex < 0) { - final int defaultThemeIndex = Settings.resetAndGetDefaultKeyboardThemeIndex(prefs, res); - entryIndex = colorSchemePreference.findIndexOfValue( - Integer.toString(defaultThemeIndex)); - } - colorSchemePreference.setSummary(colorSchemePreference.getEntries()[entryIndex]); - } - - private void updateCustomInputStylesSummary() { + private void updateCustomInputStylesSummary(final SharedPreferences prefs, + final Resources res) { final PreferenceScreen customInputStyles = (PreferenceScreen)findPreference(Settings.PREF_CUSTOM_INPUT_STYLES); - final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); - final Resources res = getResources(); final String prefSubtype = Settings.readPrefAdditionalSubtypes(prefs, res); final InputMethodSubtype[] subtypes = AdditionalSubtypeUtils.createAdditionalSubtypesArray(prefSubtype); @@ -342,13 +335,6 @@ public final class SettingsFragment extends InputMethodSettingsFragment customInputStyles.setSummary(styles); } - private void updateKeyPreviewPopupDelaySummary() { - final ListPreference lp = mKeyPreviewPopupDismissDelay; - final CharSequence[] entries = lp.getEntries(); - if (entries == null || entries.length <= 0) return; - lp.setSummary(entries[lp.findIndexOfValue(lp.getValue())]); - } - private void refreshEnablingsOfKeypressSoundAndVibrationSettings( final SharedPreferences sp, final Resources res) { setPreferenceEnabled(Settings.PREF_VIBRATION_DURATION_SETTINGS, @@ -400,44 +386,6 @@ public final class SettingsFragment extends InputMethodSettingsFragment }); } - private void setupKeyLongpressTimeoutSettings(final SharedPreferences sp, - final Resources res) { - final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( - Settings.PREF_KEY_LONGPRESS_TIMEOUT); - if (pref == null) { - return; - } - pref.setInterface(new SeekBarDialogPreference.ValueProxy() { - @Override - public void writeValue(final int value, final String key) { - sp.edit().putInt(key, value).apply(); - } - - @Override - public void writeDefaultValue(final String key) { - sp.edit().remove(key).apply(); - } - - @Override - public int readValue(final String key) { - return Settings.readKeyLongpressTimeout(sp, res); - } - - @Override - public int readDefaultValue(final String key) { - return Settings.readDefaultKeyLongpressTimeout(res); - } - - @Override - public String getValueText(final int value) { - return res.getString(R.string.abbreviation_unit_milliseconds, value); - } - - @Override - public void feedbackValue(final int value) {} - }); - } - private void setupKeypressSoundVolumeSettings(final SharedPreferences sp, final Resources res) { final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( Settings.PREF_KEYPRESS_SOUND_VOLUME); @@ -515,4 +463,33 @@ public final class SettingsFragment extends InputMethodSettingsFragment userDictionaryPreference.setFragment(UserDictionaryList.class.getName()); } } + + @Override + public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { + if (FeedbackUtils.isFeedbackFormSupported()) { + menu.add(NO_MENU_GROUP, MENU_FEEDBACK /* itemId */, MENU_FEEDBACK /* order */, + R.string.send_feedback); + } + final int aboutResId = FeedbackUtils.getAboutKeyboardTitleResId(); + if (aboutResId != 0) { + menu.add(NO_MENU_GROUP, MENU_ABOUT /* itemId */, MENU_ABOUT /* order */, aboutResId); + } + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + final int itemId = item.getItemId(); + if (itemId == MENU_FEEDBACK) { + FeedbackUtils.showFeedbackForm(getActivity()); + return true; + } + if (itemId == MENU_ABOUT) { + final Intent aboutIntent = FeedbackUtils.getAboutKeyboardIntent(getActivity()); + if (aboutIntent != null) { + startActivity(aboutIntent); + return true; + } + } + return super.onOptionsItemSelected(item); + } } diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java index f331c78e5..8de5fed07 100644 --- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java +++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java @@ -16,27 +16,23 @@ package com.android.inputmethod.latin.settings; +import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.util.Log; import android.view.inputmethod.EditorInfo; -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.keyboard.internal.KeySpecParser; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.compat.AppWorkaroundsUtils; import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodManager; import com.android.inputmethod.latin.SubtypeSwitcher; -import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.InputTypeUtils; -import com.android.inputmethod.latin.utils.StringUtils; +import com.android.inputmethod.latin.utils.AsyncResultHolder; +import com.android.inputmethod.latin.utils.ResourceUtils; +import com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask; -import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; @@ -50,27 +46,23 @@ public final class SettingsValues { // Float.NEGATIVE_INFINITE and Float.MAX_VALUE. Currently used for auto-correction settings. private static final String FLOAT_MAX_VALUE_MARKER_STRING = "floatMaxValue"; private static final String FLOAT_NEGATIVE_INFINITY_MARKER_STRING = "floatNegativeInfinity"; + private static final int TIMEOUT_TO_GET_TARGET_PACKAGE = 5; // seconds // From resources: + public final SpacingAndPunctuations mSpacingAndPunctuations; public final int mDelayUpdateOldSuggestions; - public final int[] mSymbolsPrecededBySpace; - public final int[] mSymbolsFollowedBySpace; - public final int[] mWordConnectors; - public final SuggestedWords mSuggestPuncList; - public final String mWordSeparators; - public final int mSentenceSeparator; - public final CharSequence mHintToSaveText; - public final boolean mCurrentLanguageHasSpaces; + public final long mDoubleSpacePeriodTimeout; // From preferences, in the same order as xml/prefs.xml: public final boolean mAutoCap; public final boolean mVibrateOn; public final boolean mSoundOn; public final boolean mKeyPreviewPopupOn; - private final boolean mShowsVoiceInputKey; + public final boolean mShowsVoiceInputKey; public final boolean mIncludesOtherImesInLanguageSwitchList; public final boolean mShowsLanguageSwitchKey; public final boolean mUseContactsDict; + public final boolean mUsePersonalizedDicts; public final boolean mUseDoubleSpacePeriod; public final boolean mBlockPotentiallyOffensive; // Use bigrams to predict the next word when there is no input for it yet @@ -82,6 +74,7 @@ public final class SettingsValues { public final boolean mPhraseGestureEnabled; public final int mKeyLongpressTimeout; public final Locale mLocale; + public final boolean mEnableMetricsLogging; // From the input box public final InputAttributes mInputAttributes; @@ -92,10 +85,11 @@ public final class SettingsValues { public final int mKeyPreviewPopupDismissDelay; private final boolean mAutoCorrectEnabled; public final float mAutoCorrectionThreshold; - public final boolean mCorrectionEnabled; + // TODO: Rename this to mAutoCorrectionEnabledPerUserSettings. + public final boolean mAutoCorrectionEnabled; public final int mSuggestionVisibility; - public final boolean mBoostPersonalizationDictionaryForDebug; - public final boolean mUseOnlyPersonalizationDictionaryForDebug; + public final int mDisplayOrientation; + private final AsyncResultHolder<AppWorkaroundsUtils> mAppWorkarounds; // Setting values for additional features public final int[] mAdditionalFeaturesSettingValues = @@ -103,32 +97,22 @@ public final class SettingsValues { // Debug settings public final boolean mIsInternal; + public final int mKeyPreviewShowUpDuration; + public final int mKeyPreviewDismissDuration; + public final float mKeyPreviewShowUpStartScale; + public final float mKeyPreviewDismissEndScale; - public SettingsValues(final SharedPreferences prefs, final Locale locale, final Resources res, + public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res, final InputAttributes inputAttributes) { - mLocale = locale; + mLocale = res.getConfiguration().locale; // Get the resources mDelayUpdateOldSuggestions = res.getInteger(R.integer.config_delay_update_old_suggestions); - mSymbolsPrecededBySpace = - StringUtils.toCodePointArray(res.getString(R.string.symbols_preceded_by_space)); - Arrays.sort(mSymbolsPrecededBySpace); - mSymbolsFollowedBySpace = - StringUtils.toCodePointArray(res.getString(R.string.symbols_followed_by_space)); - Arrays.sort(mSymbolsFollowedBySpace); - mWordConnectors = - StringUtils.toCodePointArray(res.getString(R.string.symbols_word_connectors)); - Arrays.sort(mWordConnectors); - final String[] suggestPuncsSpec = KeySpecParser.splitKeySpecs(res.getString( - R.string.suggested_punctuations)); - mSuggestPuncList = createSuggestPuncList(suggestPuncsSpec); - mWordSeparators = res.getString(R.string.symbols_word_separators); - mSentenceSeparator = res.getInteger(R.integer.sentence_separator); - mHintToSaveText = res.getText(R.string.hint_add_to_dictionary); - mCurrentLanguageHasSpaces = res.getBoolean(R.bool.current_language_has_spaces); + mSpacingAndPunctuations = new SpacingAndPunctuations(res); // Store the input attributes if (null == inputAttributes) { - mInputAttributes = new InputAttributes(null, false /* isFullscreenMode */); + mInputAttributes = new InputAttributes( + null, false /* isFullscreenMode */, context.getPackageName()); } else { mInputAttributes = inputAttributes; } @@ -139,20 +123,26 @@ public final class SettingsValues { mSoundOn = Settings.readKeypressSoundEnabled(prefs, res); mKeyPreviewPopupOn = Settings.readKeyPreviewPopupEnabled(prefs, res); mSlidingKeyInputPreviewEnabled = prefs.getBoolean( - Settings.PREF_SLIDING_KEY_INPUT_PREVIEW, true); - mShowsVoiceInputKey = needsToShowVoiceInputKey(prefs, res); + DebugSettings.PREF_SLIDING_KEY_INPUT_PREVIEW, true); + mShowsVoiceInputKey = needsToShowVoiceInputKey(prefs, res) + && mInputAttributes.mShouldShowVoiceInputKey + && SubtypeSwitcher.getInstance().isShortcutImeEnabled(); final String autoCorrectionThresholdRawValue = prefs.getString( Settings.PREF_AUTO_CORRECTION_THRESHOLD, res.getString(R.string.auto_correction_threshold_mode_index_modest)); - mIncludesOtherImesInLanguageSwitchList = prefs.getBoolean( - Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, false); - mShowsLanguageSwitchKey = Settings.readShowsLanguageSwitchKey(prefs); + mIncludesOtherImesInLanguageSwitchList = Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS + ? prefs.getBoolean(Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, false) + : true /* forcibly */; + mShowsLanguageSwitchKey = Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS + ? Settings.readShowsLanguageSwitchKey(prefs) : true /* forcibly */; mUseContactsDict = prefs.getBoolean(Settings.PREF_KEY_USE_CONTACTS_DICT, true); + mUsePersonalizedDicts = prefs.getBoolean(Settings.PREF_KEY_USE_PERSONALIZED_DICTS, true); mUseDoubleSpacePeriod = prefs.getBoolean(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true); mBlockPotentiallyOffensive = Settings.readBlockPotentiallyOffensive(prefs, res); mAutoCorrectEnabled = Settings.readAutoCorrectEnabled(autoCorrectionThresholdRawValue, res); mBigramPredictionEnabled = readBigramPredictionEnabled(prefs, res); - + mDoubleSpacePeriodTimeout = res.getInteger(R.integer.config_double_space_period_timeout); + mEnableMetricsLogging = prefs.getBoolean(Settings.PREF_ENABLE_METRICS_LOGGING, true); // Compute other readable settings mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res); mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs, res); @@ -165,7 +155,7 @@ public final class SettingsValues { mGestureFloatingPreviewTextEnabled = prefs.getBoolean( Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT, true); mPhraseGestureEnabled = Settings.readPhraseGestureEnabled(prefs, res); - mCorrectionEnabled = mAutoCorrectEnabled && !mInputAttributes.mInputTypeNoAutoCorrect; + mAutoCorrectionEnabled = mAutoCorrectEnabled && !mInputAttributes.mInputTypeNoAutoCorrect; final String showSuggestionsSetting = prefs.getString( Settings.PREF_SHOW_SUGGESTIONS_SETTING, res.getString(R.string.prefs_suggestion_visibility_default_value)); @@ -173,111 +163,74 @@ public final class SettingsValues { AdditionalFeaturesSettingUtils.readAdditionalFeaturesPreferencesIntoArray( prefs, mAdditionalFeaturesSettingValues); mIsInternal = Settings.isInternal(prefs); - mBoostPersonalizationDictionaryForDebug = - Settings.readBoostPersonalizationDictionaryForDebug(prefs); - mUseOnlyPersonalizationDictionaryForDebug = - Settings.readUseOnlyPersonalizationDictionaryForDebug(prefs); - } - - // Only for tests - private SettingsValues(final Locale locale) { - // TODO: locale is saved, but not used yet. May have to change this if tests require. - mLocale = locale; - mDelayUpdateOldSuggestions = 0; - mSymbolsPrecededBySpace = new int[] { '(', '[', '{', '&' }; - Arrays.sort(mSymbolsPrecededBySpace); - mSymbolsFollowedBySpace = new int[] { '.', ',', ';', ':', '!', '?', ')', ']', '}', '&' }; - Arrays.sort(mSymbolsFollowedBySpace); - mWordConnectors = new int[] { '\'', '-' }; - Arrays.sort(mWordConnectors); - mSentenceSeparator = Constants.CODE_PERIOD; - final String[] suggestPuncsSpec = new String[] { "!", "?", ",", ":", ";" }; - mSuggestPuncList = createSuggestPuncList(suggestPuncsSpec); - mWordSeparators = "&\t \n()[]{}*&<>+=|.,;:!?/_\""; - mHintToSaveText = "Touch again to save"; - mCurrentLanguageHasSpaces = true; - mInputAttributes = new InputAttributes(null, false /* isFullscreenMode */); - mAutoCap = true; - mVibrateOn = true; - mSoundOn = true; - mKeyPreviewPopupOn = true; - mSlidingKeyInputPreviewEnabled = true; - mShowsVoiceInputKey = true; - mIncludesOtherImesInLanguageSwitchList = false; - mShowsLanguageSwitchKey = true; - mUseContactsDict = true; - mUseDoubleSpacePeriod = true; - mBlockPotentiallyOffensive = true; - mAutoCorrectEnabled = true; - mBigramPredictionEnabled = true; - mKeyLongpressTimeout = 300; - mKeypressVibrationDuration = 5; - mKeypressSoundVolume = 1; - mKeyPreviewPopupDismissDelay = 70; - mAutoCorrectionThreshold = 1; - mGestureInputEnabled = true; - mGestureTrailEnabled = true; - mGestureFloatingPreviewTextEnabled = true; - mPhraseGestureEnabled = true; - mCorrectionEnabled = mAutoCorrectEnabled && !mInputAttributes.mInputTypeNoAutoCorrect; - mSuggestionVisibility = 0; - mIsInternal = false; - mBoostPersonalizationDictionaryForDebug = false; - mUseOnlyPersonalizationDictionaryForDebug = false; - } - - @UsedForTesting - public static SettingsValues makeDummySettingsValuesForTest(final Locale locale) { - return new SettingsValues(locale); + mKeyPreviewShowUpDuration = Settings.readKeyPreviewAnimationDuration( + prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION, + res.getInteger(R.integer.config_key_preview_show_up_duration)); + mKeyPreviewDismissDuration = Settings.readKeyPreviewAnimationDuration( + prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION, + res.getInteger(R.integer.config_key_preview_dismiss_duration)); + mKeyPreviewShowUpStartScale = Settings.readKeyPreviewAnimationScale( + prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_SCALE, + ResourceUtils.getFloatFromFraction( + res, R.fraction.config_key_preview_show_up_start_scale)); + mKeyPreviewDismissEndScale = Settings.readKeyPreviewAnimationScale( + prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_SCALE, + ResourceUtils.getFloatFromFraction( + res, R.fraction.config_key_preview_dismiss_end_scale)); + mDisplayOrientation = res.getConfiguration().orientation; + mAppWorkarounds = new AsyncResultHolder<>(); + final PackageInfo packageInfo = TargetPackageInfoGetterTask.getCachedPackageInfo( + mInputAttributes.mTargetApplicationPackageName); + if (null != packageInfo) { + mAppWorkarounds.set(new AppWorkaroundsUtils(packageInfo)); + } else { + new TargetPackageInfoGetterTask(context, mAppWorkarounds) + .execute(mInputAttributes.mTargetApplicationPackageName); + } } public boolean isApplicationSpecifiedCompletionsOn() { return mInputAttributes.mApplicationSpecifiedCompletionOn; } - public boolean isSuggestionsRequested(final int displayOrientation) { - return mInputAttributes.mIsSettingsSuggestionStripOn - && (mCorrectionEnabled - || isSuggestionStripVisibleInOrientation(displayOrientation)); + // TODO: Rename this to needsToLookupSuggestions(). + public boolean isSuggestionsRequested() { + return mInputAttributes.mShouldShowSuggestions + && (mAutoCorrectionEnabled + || isCurrentOrientationAllowingSuggestionsPerUserSettings()); } - public boolean isSuggestionStripVisibleInOrientation(final int orientation) { + public boolean isCurrentOrientationAllowingSuggestionsPerUserSettings() { return (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_VALUE) || (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_ONLY_PORTRAIT_VALUE - && orientation == Configuration.ORIENTATION_PORTRAIT); + && mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT); } public boolean isWordSeparator(final int code) { - return mWordSeparators.contains(String.valueOf((char)code)); + return mSpacingAndPunctuations.isWordSeparator(code); } public boolean isWordConnector(final int code) { - return Arrays.binarySearch(mWordConnectors, code) >= 0; + return mSpacingAndPunctuations.isWordConnector(code); } public boolean isWordCodePoint(final int code) { - return Character.isLetter(code) || isWordConnector(code); + return Character.isLetter(code) || isWordConnector(code) + || Character.COMBINING_SPACING_MARK == Character.getType(code); } public boolean isUsuallyPrecededBySpace(final int code) { - return Arrays.binarySearch(mSymbolsPrecededBySpace, code) >= 0; + return mSpacingAndPunctuations.isUsuallyPrecededBySpace(code); } public boolean isUsuallyFollowedBySpace(final int code) { - return Arrays.binarySearch(mSymbolsFollowedBySpace, code) >= 0; + return mSpacingAndPunctuations.isUsuallyFollowedBySpace(code); } public boolean shouldInsertSpacesAutomatically() { return mInputAttributes.mShouldInsertSpacesAutomatically; } - public boolean isVoiceKeyEnabled(final EditorInfo editorInfo) { - final boolean shortcutImeEnabled = SubtypeSwitcher.getInstance().isShortcutImeEnabled(); - final int inputType = (editorInfo != null) ? editorInfo.inputType : 0; - return shortcutImeEnabled && mShowsVoiceInputKey - && !InputTypeUtils.isPasswordInputType(inputType); - } - public boolean isLanguageSwitchKeyEnabled() { if (!mShowsLanguageSwitchKey) { return false; @@ -294,25 +247,20 @@ public final class SettingsValues { return mInputAttributes.isSameInputType(editorInfo); } - // Helper functions to create member values. - private static SuggestedWords createSuggestPuncList(final String[] puncs) { - final ArrayList<SuggestedWordInfo> puncList = CollectionUtils.newArrayList(); - if (puncs != null) { - for (final String puncSpec : puncs) { - // TODO: Stop using KeySpceParser.getLabel(). - puncList.add(new SuggestedWordInfo(KeySpecParser.getLabel(puncSpec), - SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_HARDCODED, - Dictionary.DICTIONARY_HARDCODED, - SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */, - SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */)); - } - } - return new SuggestedWords(puncList, - false /* typedWordValid */, - false /* hasAutoCorrectionCandidate */, - true /* isPunctuationSuggestions */, - false /* isObsoleteSuggestions */, - false /* isPrediction */); + public boolean hasSameOrientation(final Configuration configuration) { + return mDisplayOrientation == configuration.orientation; + } + + public boolean isBeforeJellyBean() { + final AppWorkaroundsUtils appWorkaroundUtils + = mAppWorkarounds.get(null, TIMEOUT_TO_GET_TARGET_PACKAGE); + return null == appWorkaroundUtils ? false : appWorkaroundUtils.isBeforeJellyBean(); + } + + public boolean isBrokenByRecorrection() { + final AppWorkaroundsUtils appWorkaroundUtils + = mAppWorkarounds.get(null, TIMEOUT_TO_GET_TARGET_PACKAGE); + return null == appWorkaroundUtils ? false : appWorkaroundUtils.isBrokenByRecorrection(); } private static final int SUGGESTION_VISIBILITY_SHOW_VALUE = @@ -350,7 +298,7 @@ public final class SettingsValues { // When autoCorrectionThreshold is greater than 1.0, it's like auto correction is off. final float autoCorrectionThreshold; try { - final int arrayIndex = Integer.valueOf(currentAutoCorrectionSetting); + final int arrayIndex = Integer.parseInt(currentAutoCorrectionSetting); if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) { final String val = autoCorrectionThresholdValues[arrayIndex]; if (FLOAT_MAX_VALUE_MARKER_STRING.equals(val)) { @@ -374,17 +322,101 @@ public final class SettingsValues { return autoCorrectionThreshold; } - private static boolean needsToShowVoiceInputKey(SharedPreferences prefs, Resources res) { - final String voiceModeMain = res.getString(R.string.voice_mode_main); - final String voiceMode = prefs.getString(Settings.PREF_VOICE_MODE_OBSOLETE, voiceModeMain); - final boolean showsVoiceInputKey = voiceMode == null || voiceMode.equals(voiceModeMain); - if (!showsVoiceInputKey) { - // Migrate settings from PREF_VOICE_MODE_OBSOLETE to PREF_VOICE_INPUT_KEY - // Set voiceModeMain as a value of obsolete voice mode settings. - prefs.edit().putString(Settings.PREF_VOICE_MODE_OBSOLETE, voiceModeMain).apply(); - // Disable voice input key. - prefs.edit().putBoolean(Settings.PREF_VOICE_INPUT_KEY, false).apply(); + private static boolean needsToShowVoiceInputKey(final SharedPreferences prefs, + final Resources res) { + // Migrate preference from {@link Settings#PREF_VOICE_MODE_OBSOLETE} to + // {@link Settings#PREF_VOICE_INPUT_KEY}. + if (prefs.contains(Settings.PREF_VOICE_MODE_OBSOLETE)) { + final String voiceModeMain = res.getString(R.string.voice_mode_main); + final String voiceMode = prefs.getString( + Settings.PREF_VOICE_MODE_OBSOLETE, voiceModeMain); + final boolean shouldShowVoiceInputKey = voiceModeMain.equals(voiceMode); + prefs.edit() + .putBoolean(Settings.PREF_VOICE_INPUT_KEY, shouldShowVoiceInputKey) + // Remove the obsolete preference if exists. + .remove(Settings.PREF_VOICE_MODE_OBSOLETE) + .apply(); } return prefs.getBoolean(Settings.PREF_VOICE_INPUT_KEY, true); } + + public String dump() { + final StringBuilder sb = new StringBuilder("Current settings :"); + sb.append("\n mSpacingAndPunctuations = "); + sb.append("" + mSpacingAndPunctuations.dump()); + sb.append("\n mDelayUpdateOldSuggestions = "); + sb.append("" + mDelayUpdateOldSuggestions); + sb.append("\n mAutoCap = "); + sb.append("" + mAutoCap); + sb.append("\n mVibrateOn = "); + sb.append("" + mVibrateOn); + sb.append("\n mSoundOn = "); + sb.append("" + mSoundOn); + sb.append("\n mKeyPreviewPopupOn = "); + sb.append("" + mKeyPreviewPopupOn); + sb.append("\n mShowsVoiceInputKey = "); + sb.append("" + mShowsVoiceInputKey); + sb.append("\n mIncludesOtherImesInLanguageSwitchList = "); + sb.append("" + mIncludesOtherImesInLanguageSwitchList); + sb.append("\n mShowsLanguageSwitchKey = "); + sb.append("" + mShowsLanguageSwitchKey); + sb.append("\n mUseContactsDict = "); + sb.append("" + mUseContactsDict); + sb.append("\n mUsePersonalizedDicts = "); + sb.append("" + mUsePersonalizedDicts); + sb.append("\n mUseDoubleSpacePeriod = "); + sb.append("" + mUseDoubleSpacePeriod); + sb.append("\n mBlockPotentiallyOffensive = "); + sb.append("" + mBlockPotentiallyOffensive); + sb.append("\n mBigramPredictionEnabled = "); + sb.append("" + mBigramPredictionEnabled); + sb.append("\n mGestureInputEnabled = "); + sb.append("" + mGestureInputEnabled); + sb.append("\n mGestureTrailEnabled = "); + sb.append("" + mGestureTrailEnabled); + sb.append("\n mGestureFloatingPreviewTextEnabled = "); + sb.append("" + mGestureFloatingPreviewTextEnabled); + sb.append("\n mSlidingKeyInputPreviewEnabled = "); + sb.append("" + mSlidingKeyInputPreviewEnabled); + sb.append("\n mPhraseGestureEnabled = "); + sb.append("" + mPhraseGestureEnabled); + sb.append("\n mKeyLongpressTimeout = "); + sb.append("" + mKeyLongpressTimeout); + sb.append("\n mLocale = "); + sb.append("" + mLocale); + sb.append("\n mInputAttributes = "); + sb.append("" + mInputAttributes); + sb.append("\n mKeypressVibrationDuration = "); + sb.append("" + mKeypressVibrationDuration); + sb.append("\n mKeypressSoundVolume = "); + sb.append("" + mKeypressSoundVolume); + sb.append("\n mKeyPreviewPopupDismissDelay = "); + sb.append("" + mKeyPreviewPopupDismissDelay); + sb.append("\n mAutoCorrectEnabled = "); + sb.append("" + mAutoCorrectEnabled); + sb.append("\n mAutoCorrectionThreshold = "); + sb.append("" + mAutoCorrectionThreshold); + sb.append("\n mAutoCorrectionEnabled = "); + sb.append("" + mAutoCorrectionEnabled); + sb.append("\n mSuggestionVisibility = "); + sb.append("" + mSuggestionVisibility); + sb.append("\n mDisplayOrientation = "); + sb.append("" + mDisplayOrientation); + sb.append("\n mAppWorkarounds = "); + final AppWorkaroundsUtils awu = mAppWorkarounds.get(null, 0); + sb.append("" + (null == awu ? "null" : awu.toString())); + sb.append("\n mAdditionalFeaturesSettingValues = "); + sb.append("" + Arrays.toString(mAdditionalFeaturesSettingValues)); + sb.append("\n mIsInternal = "); + sb.append("" + mIsInternal); + sb.append("\n mKeyPreviewShowUpDuration = "); + sb.append("" + mKeyPreviewShowUpDuration); + sb.append("\n mKeyPreviewDismissDuration = "); + sb.append("" + mKeyPreviewDismissDuration); + sb.append("\n mKeyPreviewShowUpStartScale = "); + sb.append("" + mKeyPreviewShowUpStartScale); + sb.append("\n mKeyPreviewDismissEndScale = "); + sb.append("" + mKeyPreviewDismissEndScale); + return sb.toString(); + } } diff --git a/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java new file mode 100644 index 000000000..b8d2a2248 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/settings/SpacingAndPunctuations.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2014 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.settings; + +import android.content.res.Resources; + +import com.android.inputmethod.keyboard.internal.MoreKeySpec; +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.PunctuationSuggestions; +import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.utils.StringUtils; + +import java.util.Arrays; +import java.util.Locale; + +public final class SpacingAndPunctuations { + private final int[] mSortedSymbolsPrecededBySpace; + private final int[] mSortedSymbolsFollowedBySpace; + private final int[] mSortedSymbolsClusteringTogether; + private final int[] mSortedWordConnectors; + public final int[] mSortedWordSeparators; + public final PunctuationSuggestions mSuggestPuncList; + private final int mSentenceSeparator; + public final String mSentenceSeparatorAndSpace; + public final boolean mCurrentLanguageHasSpaces; + public final boolean mUsesAmericanTypography; + public final boolean mUsesGermanRules; + + public SpacingAndPunctuations(final Resources res) { + // To be able to binary search the code point. See {@link #isUsuallyPrecededBySpace(int)}. + mSortedSymbolsPrecededBySpace = StringUtils.toSortedCodePointArray( + res.getString(R.string.symbols_preceded_by_space)); + // To be able to binary search the code point. See {@link #isUsuallyFollowedBySpace(int)}. + mSortedSymbolsFollowedBySpace = StringUtils.toSortedCodePointArray( + res.getString(R.string.symbols_followed_by_space)); + mSortedSymbolsClusteringTogether = StringUtils.toSortedCodePointArray( + res.getString(R.string.symbols_clustering_together)); + // To be able to binary search the code point. See {@link #isWordConnector(int)}. + mSortedWordConnectors = StringUtils.toSortedCodePointArray( + res.getString(R.string.symbols_word_connectors)); + mSortedWordSeparators = StringUtils.toSortedCodePointArray( + res.getString(R.string.symbols_word_separators)); + mSentenceSeparator = res.getInteger(R.integer.sentence_separator); + mSentenceSeparatorAndSpace = new String(new int[] { + mSentenceSeparator, Constants.CODE_SPACE }, 0, 2); + mCurrentLanguageHasSpaces = res.getBoolean(R.bool.current_language_has_spaces); + final Locale locale = res.getConfiguration().locale; + // Heuristic: we use American Typography rules because it's the most common rules for all + // English variants. German rules (not "German typography") also have small gotchas. + mUsesAmericanTypography = Locale.ENGLISH.getLanguage().equals(locale.getLanguage()); + mUsesGermanRules = Locale.GERMAN.getLanguage().equals(locale.getLanguage()); + final String[] suggestPuncsSpec = MoreKeySpec.splitKeySpecs( + res.getString(R.string.suggested_punctuations)); + mSuggestPuncList = PunctuationSuggestions.newPunctuationSuggestions(suggestPuncsSpec); + } + + public boolean isWordSeparator(final int code) { + return Arrays.binarySearch(mSortedWordSeparators, code) >= 0; + } + + public boolean isWordConnector(final int code) { + return Arrays.binarySearch(mSortedWordConnectors, code) >= 0; + } + + public boolean isWordCodePoint(final int code) { + return Character.isLetter(code) || isWordConnector(code); + } + + public boolean isUsuallyPrecededBySpace(final int code) { + return Arrays.binarySearch(mSortedSymbolsPrecededBySpace, code) >= 0; + } + + public boolean isUsuallyFollowedBySpace(final int code) { + return Arrays.binarySearch(mSortedSymbolsFollowedBySpace, code) >= 0; + } + + public boolean isClusteringSymbol(final int code) { + return Arrays.binarySearch(mSortedSymbolsClusteringTogether, code) >= 0; + } + + public boolean isSentenceSeparator(final int code) { + return code == mSentenceSeparator; + } + + public String dump() { + final StringBuilder sb = new StringBuilder(); + sb.append("mSortedSymbolsPrecededBySpace = "); + sb.append("" + Arrays.toString(mSortedSymbolsPrecededBySpace)); + sb.append("\n mSortedSymbolsFollowedBySpace = "); + sb.append("" + Arrays.toString(mSortedSymbolsFollowedBySpace)); + sb.append("\n mSortedWordConnectors = "); + sb.append("" + Arrays.toString(mSortedWordConnectors)); + sb.append("\n mSortedWordSeparators = "); + sb.append("" + Arrays.toString(mSortedWordSeparators)); + sb.append("\n mSuggestPuncList = "); + sb.append("" + mSuggestPuncList); + sb.append("\n mSentenceSeparator = "); + sb.append("" + mSentenceSeparator); + sb.append("\n mSentenceSeparatorAndSpace = "); + sb.append("" + mSentenceSeparatorAndSpace); + sb.append("\n mCurrentLanguageHasSpaces = "); + sb.append("" + mCurrentLanguageHasSpaces); + sb.append("\n mUsesAmericanTypography = "); + sb.append("" + mUsesAmericanTypography); + sb.append("\n mUsesGermanRules = "); + sb.append("" + mUsesGermanRules); + return sb.toString(); + } +} diff --git a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java index 050d8d26f..9585736e7 100644 --- a/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java +++ b/java/src/com/android/inputmethod/latin/setup/LauncherIconVisibilityManager.java @@ -16,85 +16,51 @@ package com.android.inputmethod.latin.setup; -import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.os.Process; import android.preference.PreferenceManager; import android.util.Log; -import android.view.inputmethod.InputMethodManager; import com.android.inputmethod.compat.IntentCompatUtils; import com.android.inputmethod.latin.settings.Settings; /** - * This class detects the {@link Intent#ACTION_MY_PACKAGE_REPLACED} broadcast intent when this IME - * package has been replaced by a newer version of the same package. This class also detects + * This class handles the {@link Intent#ACTION_MY_PACKAGE_REPLACED} broadcast intent when this IME + * package has been replaced by a newer version of the same package. This class also handles * {@link Intent#ACTION_BOOT_COMPLETED} and {@link Intent#ACTION_USER_INITIALIZE} broadcast intent. * * If this IME has already been installed in the system image and a new version of this IME has - * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver and it - * will hide the setup wizard's icon. + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received to this class to hide the + * setup wizard's icon. * * If this IME has already been installed in the data partition and a new version of this IME has - * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is received by this receiver but it + * been installed, {@link Intent#ACTION_MY_PACKAGE_REPLACED} is forwarded to this class but it * will not hide the setup wizard's icon, and the icon will appear on the launcher. * * If this IME hasn't been installed yet and has been newly installed, no * {@link Intent#ACTION_MY_PACKAGE_REPLACED} will be sent and the setup wizard's icon will appear * on the launcher. * - * When the device has been booted, {@link Intent#ACTION_BOOT_COMPLETED} is received by this - * receiver and it checks whether the setup wizard's icon should be appeared or not on the launcher + * When the device has been booted, {@link Intent#ACTION_BOOT_COMPLETED} is forwarded to this class + * to check whether the setup wizard's icon should be appeared or not on the launcher * depending on which partition this IME is installed. * - * When a multiuser account has been created, {@link Intent#ACTION_USER_INITIALIZE} is received - * by this receiver and it checks the whether the setup wizard's icon should be appeared or not on - * the launcher depending on which partition this IME is installed. + * When a multiuser account has been created, {@link Intent#ACTION_USER_INITIALIZE} is forwarded to + * this class to check whether the setup wizard's icon should be appeared or not on the launcher + * depending on which partition this IME is installed. */ -public final class LauncherIconVisibilityManager extends BroadcastReceiver { +public final class LauncherIconVisibilityManager { private static final String TAG = LauncherIconVisibilityManager.class.getSimpleName(); - @Override - public void onReceive(final Context context, final Intent intent) { - if (shouldHandleThisIntent(intent, context)) { + public static void onReceiveGlobalIntent(final String action, final Context context) { + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action) || + Intent.ACTION_BOOT_COMPLETED.equals(action) || + IntentCompatUtils.is_ACTION_USER_INITIALIZE(action)) { updateSetupWizardIconVisibility(context); } - - // The process that hosts this broadcast receiver is invoked and remains alive even after - // 1) the package has been re-installed, 2) the device has just booted, - // 3) a new user has been created. - // There is no good reason to keep the process alive if this IME isn't a current IME. - final InputMethodManager imm = - (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); - // Called to check whether this IME has been triggered by the current user or not - final boolean isInputMethodManagerValidForUserOfThisProcess = - !imm.getInputMethodList().isEmpty(); - final boolean isCurrentImeOfCurrentUser = isInputMethodManagerValidForUserOfThisProcess - && SetupActivity.isThisImeCurrent(context, imm); - if (!isCurrentImeOfCurrentUser) { - final int myPid = Process.myPid(); - Log.i(TAG, "Killing my process: pid=" + myPid); - Process.killProcess(myPid); - } - } - - private static boolean shouldHandleThisIntent(final Intent intent, final Context context) { - final String action = intent.getAction(); - if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action)) { - Log.i(TAG, "Package has been replaced: " + context.getPackageName()); - return true; - } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { - Log.i(TAG, "Boot has been completed"); - return true; - } else if (IntentCompatUtils.is_ACTION_USER_INITIALIZE(action)) { - Log.i(TAG, "User initialize"); - return true; - } - return false; } public static void updateSetupWizardIconVisibility(final Context context) { diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java index a68f98fe7..b770ea512 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java @@ -37,65 +37,4 @@ public final class SetupActivity extends Activity { finish(); } } - - /* - * We may not be able to get our own {@link InputMethodInfo} just after this IME is installed - * because {@link InputMethodManagerService} may not be aware of this IME yet. - * Note: {@link RichInputMethodManager} has similar methods. Here in setup wizard, we can't - * use it for the reason above. - */ - - /** - * Check if the IME specified by the context is enabled. - * CAVEAT: This may cause a round trip IPC. - * - * @param context package context of the IME to be checked. - * @param imm the {@link InputMethodManager}. - * @return true if this IME is enabled. - */ - /* package */ static boolean isThisImeEnabled(final Context context, - final InputMethodManager imm) { - final String packageName = context.getPackageName(); - for (final InputMethodInfo imi : imm.getEnabledInputMethodList()) { - if (packageName.equals(imi.getPackageName())) { - return true; - } - } - return false; - } - - /** - * Check if the IME specified by the context is the current IME. - * CAVEAT: This may cause a round trip IPC. - * - * @param context package context of the IME to be checked. - * @param imm the {@link InputMethodManager}. - * @return true if this IME is the current IME. - */ - /* package */ static boolean isThisImeCurrent(final Context context, - final InputMethodManager imm) { - final InputMethodInfo imi = getInputMethodInfoOf(context.getPackageName(), imm); - final String currentImeId = Settings.Secure.getString( - context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); - return imi != null && imi.getId().equals(currentImeId); - } - - /** - * Get {@link InputMethodInfo} of the IME specified by the package name. - * CAVEAT: This may cause a round trip IPC. - * - * @param packageName package name of the IME. - * @param imm the {@link InputMethodManager}. - * @return the {@link InputMethodInfo} of the IME specified by the <code>packageName</code>, - * or null if not found. - */ - /* package */ static InputMethodInfo getInputMethodInfoOf(final String packageName, - final InputMethodManager imm) { - for (final InputMethodInfo imi : imm.getInputMethodList()) { - if (packageName.equals(imi.getPackageName())) { - return imi; - } - } - return null; - } } diff --git a/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java b/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java index 974dfddd3..73d25f6aa 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupStartIndicatorView.java @@ -21,13 +21,13 @@ import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; +import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.inputmethod.compat.ViewCompatUtils; import com.android.inputmethod.latin.R; public final class SetupStartIndicatorView extends LinearLayout { @@ -96,13 +96,13 @@ public final class SetupStartIndicatorView extends LinearLayout { @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); - final int layoutDirection = ViewCompatUtils.getLayoutDirection(this); + final int layoutDirection = ViewCompat.getLayoutDirection(this); final int width = getWidth(); final int height = getHeight(); final float halfHeight = height / 2.0f; final Path path = mIndicatorPath; path.rewind(); - if (layoutDirection == ViewCompatUtils.LAYOUT_DIRECTION_RTL) { + if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) { // Left arrow path.moveTo(width, 0.0f); path.lineTo(0.0f, halfHeight); diff --git a/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java b/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java index c909507c6..6734e61b8 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupStepIndicatorView.java @@ -20,10 +20,10 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; +import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; -import com.android.inputmethod.compat.ViewCompatUtils; import com.android.inputmethod.latin.R; public final class SetupStepIndicatorView extends View { @@ -38,12 +38,12 @@ public final class SetupStepIndicatorView extends View { } public void setIndicatorPosition(final int stepPos, final int totalStepNum) { - final int layoutDirection = ViewCompatUtils.getLayoutDirection(this); + final int layoutDirection = ViewCompat.getLayoutDirection(this); // The indicator position is the center of the partition that is equally divided into // the total step number. final float partionWidth = 1.0f / totalStepNum; final float pos = stepPos * partionWidth + partionWidth / 2.0f; - mXRatio = (layoutDirection == ViewCompatUtils.LAYOUT_DIRECTION_RTL) ? 1.0f - pos : pos; + mXRatio = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) ? 1.0f - pos : pos; invalidate(); } diff --git a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java index c4a813c24..e455e53d3 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java @@ -37,8 +37,8 @@ import com.android.inputmethod.compat.TextViewCompatUtils; import com.android.inputmethod.compat.ViewCompatUtils; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.settings.SettingsActivity; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.StaticInnerHandlerWrapper; +import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; +import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils; import java.util.ArrayList; @@ -74,27 +74,28 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL private SettingsPoolingHandler mHandler; private static final class SettingsPoolingHandler - extends StaticInnerHandlerWrapper<SetupWizardActivity> { + extends LeakGuardHandlerWrapper<SetupWizardActivity> { private static final int MSG_POLLING_IME_SETTINGS = 0; private static final long IME_SETTINGS_POLLING_INTERVAL = 200; private final InputMethodManager mImmInHandler; - public SettingsPoolingHandler(final SetupWizardActivity outerInstance, + public SettingsPoolingHandler(final SetupWizardActivity ownerInstance, final InputMethodManager imm) { - super(outerInstance); + super(ownerInstance); mImmInHandler = imm; } @Override public void handleMessage(final Message msg) { - final SetupWizardActivity setupWizardActivity = getOuterInstance(); + final SetupWizardActivity setupWizardActivity = getOwnerInstance(); if (setupWizardActivity == null) { return; } switch (msg.what) { case MSG_POLLING_IME_SETTINGS: - if (SetupActivity.isThisImeEnabled(setupWizardActivity, mImmInHandler)) { + if (UncachedInputMethodManagerUtils.isThisImeEnabled(setupWizardActivity, + mImmInHandler)) { setupWizardActivity.invokeSetupWizardOfThisIme(); return; } @@ -278,7 +279,8 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL } void invokeSubtypeEnablerOfThisIme() { - final InputMethodInfo imi = SetupActivity.getInputMethodInfoOf(getPackageName(), mImm); + final InputMethodInfo imi = + UncachedInputMethodManagerUtils.getInputMethodInfoOf(getPackageName(), mImm); if (imi == null) { return; } @@ -302,10 +304,10 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL private int determineSetupStepNumber() { mHandler.cancelPollingImeSettings(); - if (!SetupActivity.isThisImeEnabled(this, mImm)) { + if (!UncachedInputMethodManagerUtils.isThisImeEnabled(this, mImm)) { return STEP_1; } - if (!SetupActivity.isThisImeCurrent(this, mImm)) { + if (!UncachedInputMethodManagerUtils.isThisImeCurrent(this, mImm)) { return STEP_2; } return STEP_3; @@ -482,7 +484,7 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL static final class SetupStepGroup { private final SetupStepIndicatorView mIndicatorView; - private final ArrayList<SetupStep> mGroup = CollectionUtils.newArrayList(); + private final ArrayList<SetupStep> mGroup = new ArrayList<>(); public SetupStepGroup(final SetupStepIndicatorView indicatorView) { mIndicatorView = indicatorView; diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index 503b18b1b..90c8f618f 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -27,18 +27,17 @@ import android.view.inputmethod.InputMethodSubtype; import android.view.textservice.SuggestionsInfo; import com.android.inputmethod.keyboard.KeyboardLayoutSet; -import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.ContactsBinaryDictionary; import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.latin.DictionaryCollection; import com.android.inputmethod.latin.DictionaryFactory; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.SynchronouslyLoadedContactsBinaryDictionary; -import com.android.inputmethod.latin.SynchronouslyLoadedUserBinaryDictionary; import com.android.inputmethod.latin.UserBinaryDictionary; import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils; +import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.LocaleUtils; +import com.android.inputmethod.latin.utils.ScriptUtils; import com.android.inputmethod.latin.utils.StringUtils; import java.lang.ref.WeakReference; @@ -49,7 +48,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Locale; import java.util.Map; -import java.util.TreeMap; /** * Service for spell checking, using LatinIME's dictionaries and mechanisms. @@ -78,42 +76,10 @@ public final class AndroidSpellCheckerService extends SpellCheckerService private final Object mUseContactsLock = new Object(); private final HashSet<WeakReference<DictionaryCollection>> mDictionaryCollectionsList = - CollectionUtils.newHashSet(); + new HashSet<>(); - public static final int SCRIPT_LATIN = 0; - public static final int SCRIPT_CYRILLIC = 1; - public static final int SCRIPT_GREEK = 2; public static final String SINGLE_QUOTE = "\u0027"; public static final String APOSTROPHE = "\u2019"; - private static final TreeMap<String, Integer> mLanguageToScript; - static { - // List of the supported languages and their associated script. We won't check - // words written in another script than the selected script, because we know we - // don't have those in our dictionary so we will underline everything and we - // will never have any suggestions, so it makes no sense checking them, and this - // is done in {@link #shouldFilterOut}. Also, the script is used to choose which - // proximity to pass to the dictionary descent algorithm. - // IMPORTANT: this only contains languages - do not write countries in there. - // Only the language is searched from the map. - mLanguageToScript = CollectionUtils.newTreeMap(); - mLanguageToScript.put("cs", SCRIPT_LATIN); - mLanguageToScript.put("da", SCRIPT_LATIN); - mLanguageToScript.put("de", SCRIPT_LATIN); - mLanguageToScript.put("el", SCRIPT_GREEK); - mLanguageToScript.put("en", SCRIPT_LATIN); - mLanguageToScript.put("es", SCRIPT_LATIN); - mLanguageToScript.put("fi", SCRIPT_LATIN); - mLanguageToScript.put("fr", SCRIPT_LATIN); - mLanguageToScript.put("hr", SCRIPT_LATIN); - mLanguageToScript.put("it", SCRIPT_LATIN); - mLanguageToScript.put("lt", SCRIPT_LATIN); - mLanguageToScript.put("lv", SCRIPT_LATIN); - mLanguageToScript.put("nb", SCRIPT_LATIN); - mLanguageToScript.put("nl", SCRIPT_LATIN); - mLanguageToScript.put("pt", SCRIPT_LATIN); - mLanguageToScript.put("sl", SCRIPT_LATIN); - mLanguageToScript.put("ru", SCRIPT_CYRILLIC); - } @Override public void onCreate() { super.onCreate(); @@ -124,22 +90,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService onSharedPreferenceChanged(prefs, PREF_USE_CONTACTS_KEY); } - public static int getScriptFromLocale(final Locale locale) { - final Integer script = mLanguageToScript.get(locale.getLanguage()); - if (null == script) { - throw new RuntimeException("We have been called with an unsupported language: \"" - + locale.getLanguage() + "\". Framework bug?"); - } - return script; - } - private static String getKeyboardLayoutNameForScript(final int script) { switch (script) { - case AndroidSpellCheckerService.SCRIPT_LATIN: + case ScriptUtils.SCRIPT_LATIN: return "qwerty"; - case AndroidSpellCheckerService.SCRIPT_CYRILLIC: + case ScriptUtils.SCRIPT_CYRILLIC: return "east_slavic"; - case AndroidSpellCheckerService.SCRIPT_GREEK: + case ScriptUtils.SCRIPT_GREEK: return "greek"; default: throw new RuntimeException("Wrong script supplied: " + script); @@ -256,7 +213,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService mOriginalText = originalText; mRecommendedThreshold = recommendedThreshold; mMaxLength = maxLength; - mSuggestions = CollectionUtils.newArrayList(maxLength + 1); + mSuggestions = new ArrayList<>(maxLength + 1); mScores = new int[mMaxLength]; } @@ -267,6 +224,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService // if it doesn't. See documentation for binarySearch. final int insertIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1; + // Weak <- insertIndex == 0, ..., insertIndex == mLength -> Strong if (insertIndex == 0 && mLength >= mMaxLength) { // In the future, we may want to keep track of the best suggestion score even if // we are asked for 0 suggestions. In this case, we can use the following @@ -284,11 +242,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService // } return true; } - if (insertIndex >= mMaxLength) { - // We found a suggestion, but its score is too weak to be kept considering - // the suggestion limit. - return true; - } final String wordString = new String(word, wordOffset, wordLength); if (mLength < mMaxLength) { @@ -296,12 +249,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService ++mLength; System.arraycopy(mScores, insertIndex, mScores, insertIndex + 1, copyLen); mSuggestions.add(insertIndex, wordString); + mScores[insertIndex] = score; } else { - System.arraycopy(mScores, 1, mScores, 0, insertIndex); + System.arraycopy(mScores, 1, mScores, 0, insertIndex - 1); mSuggestions.add(insertIndex, wordString); mSuggestions.remove(0); + mScores[insertIndex - 1] = score; } - mScores[insertIndex] = score; return true; } @@ -320,7 +274,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService hasRecommendedSuggestions = false; } else { gatheredSuggestions = EMPTY_STRING_ARRAY; - final float normalizedScore = BinaryDictionary.calcNormalizedScore( + final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore( mOriginalText, mBestSuggestion, mBestScore); hasRecommendedSuggestions = (normalizedScore > mRecommendedThreshold); } @@ -355,7 +309,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService final int bestScore = mScores[mLength - 1]; final String bestSuggestion = mSuggestions.get(0); final float normalizedScore = - BinaryDictionary.calcNormalizedScore( + BinaryDictionaryUtils.calcNormalizedScore( mOriginalText, bestSuggestion.toString(), bestScore); hasRecommendedSuggestions = (normalizedScore > mRecommendedThreshold); if (DBG) { @@ -383,6 +337,8 @@ public final class AndroidSpellCheckerService extends SpellCheckerService new Thread("spellchecker_close_dicts") { @Override public void run() { + // Contacts dictionary can be closed multiple times here. If the dictionary is + // already closed, extra closings are no-ops, so it's safe. for (DictionaryPool pool : oldPools.values()) { pool.close(); } @@ -416,10 +372,10 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } public DictAndKeyboard createDictAndKeyboard(final Locale locale) { - final int script = getScriptFromLocale(locale); + final int script = ScriptUtils.getScriptFromSpellCheckerLocale(locale); final String keyboardLayoutName = getKeyboardLayoutNameForScript(script); - final InputMethodSubtype subtype = AdditionalSubtypeUtils.createAdditionalSubtype( - locale.toString(), keyboardLayoutName, null); + final InputMethodSubtype subtype = AdditionalSubtypeUtils.createDummyAdditionalSubtype( + locale.toString(), keyboardLayoutName); final KeyboardLayoutSet keyboardLayoutSet = createKeyboardSetForSpellChecker(subtype); final DictionaryCollection dictionaryCollection = @@ -428,7 +384,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService final String localeStr = locale.toString(); UserBinaryDictionary userDictionary = mUserDictionaries.get(localeStr); if (null == userDictionary) { - userDictionary = new SynchronouslyLoadedUserBinaryDictionary(this, localeStr, true); + userDictionary = new SynchronouslyLoadedUserBinaryDictionary(this, locale, true); mUserDictionaries.put(localeStr, userDictionary); } dictionaryCollection.addDictionary(userDictionary); @@ -443,8 +399,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } } dictionaryCollection.addDictionary(mContactsDictionary); - mDictionaryCollectionsList.add( - new WeakReference<DictionaryCollection>(dictionaryCollection)); + mDictionaryCollectionsList.add(new WeakReference<>(dictionaryCollection)); } return new DictAndKeyboard(dictionaryCollection, keyboardLayoutSet); } diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java index ddda52d71..6bfd354ea 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin.spellcheck; +import android.content.res.Resources; import android.os.Binder; import android.text.TextUtils; import android.util.Log; @@ -23,17 +24,21 @@ import android.view.textservice.SentenceSuggestionsInfo; import android.view.textservice.SuggestionsInfo; import android.view.textservice.TextInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.PrevWordsInfo; import java.util.ArrayList; +import java.util.Locale; public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheckerSession { private static final String TAG = AndroidSpellCheckerSession.class.getSimpleName(); private static final boolean DBG = false; private final static String[] EMPTY_STRING_ARRAY = new String[0]; + private final Resources mResources; + private SentenceLevelAdapter mSentenceLevelAdapter; public AndroidSpellCheckerSession(AndroidSpellCheckerService service) { super(service); + mResources = service.getResources(); } private SentenceSuggestionsInfo fixWronglyInvalidatedWordWithSingleQuote(TextInfo ti, @@ -43,10 +48,9 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck return null; } final int N = ssi.getSuggestionsCount(); - final ArrayList<Integer> additionalOffsets = CollectionUtils.newArrayList(); - final ArrayList<Integer> additionalLengths = CollectionUtils.newArrayList(); - final ArrayList<SuggestionsInfo> additionalSuggestionsInfos = - CollectionUtils.newArrayList(); + final ArrayList<Integer> additionalOffsets = new ArrayList<>(); + final ArrayList<Integer> additionalLengths = new ArrayList<>(); + final ArrayList<SuggestionsInfo> additionalSuggestionsInfos = new ArrayList<>(); String currentWord = null; for (int i = 0; i < N; ++i) { final SuggestionsInfo si = ssi.getSuggestionsInfoAt(i); @@ -57,7 +61,8 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck final int offset = ssi.getOffsetAt(i); final int length = ssi.getLengthAt(i); final String subText = typedText.substring(offset, offset + length); - final String prevWord = currentWord; + final PrevWordsInfo prevWordsInfo = + new PrevWordsInfo(new PrevWordsInfo.WordInfo(currentWord)); currentWord = subText; if (!subText.contains(AndroidSpellCheckerService.SINGLE_QUOTE)) { continue; @@ -73,7 +78,7 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck if (TextUtils.isEmpty(splitText)) { continue; } - if (mSuggestionsCache.getSuggestionsFromCache(splitText, prevWord) == null) { + if (mSuggestionsCache.getSuggestionsFromCache(splitText, prevWordsInfo) == null) { continue; } final int newLength = splitText.length(); @@ -116,8 +121,7 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck @Override public SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple(TextInfo[] textInfos, int suggestionsLimit) { - final SentenceSuggestionsInfo[] retval = - super.onGetSentenceSuggestionsMultiple(textInfos, suggestionsLimit); + final SentenceSuggestionsInfo[] retval = splitAndSuggest(textInfos, suggestionsLimit); if (retval == null || retval.length != textInfos.length) { return retval; } @@ -131,6 +135,58 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck return retval; } + /** + * Get sentence suggestions for specified texts in an array of TextInfo. This is taken from + * SpellCheckerService#onGetSentenceSuggestionsMultiple that we can't use because it's + * using private variables. + * The default implementation splits the input text to words and returns + * {@link SentenceSuggestionsInfo} which contains suggestions for each word. + * This function will run on the incoming IPC thread. + * So, this is not called on the main thread, + * but will be called in series on another thread. + * @param textInfos an array of the text metadata + * @param suggestionsLimit the maximum number of suggestions to be returned + * @return an array of {@link SentenceSuggestionsInfo} returned by + * {@link SpellCheckerService.Session#onGetSuggestions(TextInfo, int)} + */ + private SentenceSuggestionsInfo[] splitAndSuggest(TextInfo[] textInfos, int suggestionsLimit) { + if (textInfos == null || textInfos.length == 0) { + return SentenceLevelAdapter.EMPTY_SENTENCE_SUGGESTIONS_INFOS; + } + SentenceLevelAdapter sentenceLevelAdapter; + synchronized(this) { + sentenceLevelAdapter = mSentenceLevelAdapter; + if (sentenceLevelAdapter == null) { + final String localeStr = getLocale(); + if (!TextUtils.isEmpty(localeStr)) { + sentenceLevelAdapter = new SentenceLevelAdapter(mResources, + new Locale(localeStr)); + mSentenceLevelAdapter = sentenceLevelAdapter; + } + } + } + if (sentenceLevelAdapter == null) { + return SentenceLevelAdapter.EMPTY_SENTENCE_SUGGESTIONS_INFOS; + } + final int infosSize = textInfos.length; + final SentenceSuggestionsInfo[] retval = new SentenceSuggestionsInfo[infosSize]; + for (int i = 0; i < infosSize; ++i) { + final SentenceLevelAdapter.SentenceTextInfoParams textInfoParams = + sentenceLevelAdapter.getSplitWords(textInfos[i]); + final ArrayList<SentenceLevelAdapter.SentenceWordItem> mItems = + textInfoParams.mItems; + final int itemsSize = mItems.size(); + final TextInfo[] splitTextInfos = new TextInfo[itemsSize]; + for (int j = 0; j < itemsSize; ++j) { + splitTextInfos[j] = mItems.get(j).mTextInfo; + } + retval[i] = SentenceLevelAdapter.reconstructSuggestions( + textInfoParams, onGetSuggestionsMultiple( + splitTextInfos, suggestionsLimit, true)); + } + return retval; + } + @Override public SuggestionsInfo[] onGetSuggestionsMultiple(TextInfo[] textInfos, int suggestionsLimit, boolean sequentialWords) { @@ -148,7 +204,9 @@ public final class AndroidSpellCheckerSession extends AndroidWordLevelSpellCheck } else { prevWord = null; } - retval[i] = onGetSuggestionsInternal(textInfos[i], prevWord, suggestionsLimit); + final PrevWordsInfo prevWordsInfo = + new PrevWordsInfo(new PrevWordsInfo.WordInfo(prevWord)); + retval[i] = onGetSuggestionsInternal(textInfos[i], prevWordsInfo, suggestionsLimit); retval[i].setCookieAndSequence(textInfos[i].getCookie(), textInfos[i].getSequence()); } diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java index d6e5b75ad..4825b9e2c 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java @@ -30,10 +30,13 @@ import android.view.textservice.TextInfo; import com.android.inputmethod.compat.SuggestionsInfoCompatUtils; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.PrevWordsInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.WordComposer; import com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService.SuggestionsGatherer; +import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.LocaleUtils; +import com.android.inputmethod.latin.utils.ScriptUtils; import com.android.inputmethod.latin.utils.StringUtils; import java.util.ArrayList; @@ -66,29 +69,29 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { private static final char CHAR_DELIMITER = '\uFFFC'; private static final int MAX_CACHE_SIZE = 50; private final LruCache<String, SuggestionsParams> mUnigramSuggestionsInfoCache = - new LruCache<String, SuggestionsParams>(MAX_CACHE_SIZE); + new LruCache<>(MAX_CACHE_SIZE); // TODO: Support n-gram input - private static String generateKey(String query, String prevWord) { - if (TextUtils.isEmpty(query) || TextUtils.isEmpty(prevWord)) { + private static String generateKey(final String query, final PrevWordsInfo prevWordsInfo) { + if (TextUtils.isEmpty(query) || !prevWordsInfo.isValid()) { return query; } - return query + CHAR_DELIMITER + prevWord; + return query + CHAR_DELIMITER + prevWordsInfo; } - // TODO: Support n-gram input - public SuggestionsParams getSuggestionsFromCache(String query, String prevWord) { - return mUnigramSuggestionsInfoCache.get(generateKey(query, prevWord)); + public SuggestionsParams getSuggestionsFromCache(String query, + final PrevWordsInfo prevWordsInfo) { + return mUnigramSuggestionsInfoCache.get(generateKey(query, prevWordsInfo)); } - // TODO: Support n-gram input public void putSuggestionsToCache( - String query, String prevWord, String[] suggestions, int flags) { + final String query, final PrevWordsInfo prevWordsInfo, + final String[] suggestions, final int flags) { if (suggestions == null || TextUtils.isEmpty(query)) { return; } mUnigramSuggestionsInfoCache.put( - generateKey(query, prevWord), new SuggestionsParams(suggestions, flags)); + generateKey(query, prevWordsInfo), new SuggestionsParams(suggestions, flags)); } public void clearCache() { @@ -114,7 +117,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { final String localeString = getLocale(); mDictionaryPool = mService.getDictionaryPool(localeString); mLocale = LocaleUtils.constructLocaleFromString(localeString); - mScript = AndroidSpellCheckerService.getScriptFromLocale(mLocale); + mScript = ScriptUtils.getScriptFromSpellCheckerLocale(mLocale); } @Override @@ -123,44 +126,6 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { cres.unregisterContentObserver(mObserver); } - /* - * Returns whether the code point is a letter that makes sense for the specified - * locale for this spell checker. - * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml - * and is limited to EFIGS languages and Russian. - * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters - * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters. - */ - private static boolean isLetterCheckableByLanguage(final int codePoint, - final int script) { - switch (script) { - case AndroidSpellCheckerService.SCRIPT_LATIN: - // Our supported latin script dictionaries (EFIGS) at the moment only include - // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode - // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF, - // so the below is a very efficient way to test for it. As for the 0-0x3F, it's - // excluded from isLetter anyway. - return codePoint <= 0x2AF && Character.isLetter(codePoint); - case AndroidSpellCheckerService.SCRIPT_CYRILLIC: - // All Cyrillic characters are in the 400~52F block. There are some in the upper - // Unicode range, but they are archaic characters that are not used in modern - // Russian and are not used by our dictionary. - return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint); - case AndroidSpellCheckerService.SCRIPT_GREEK: - // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the - // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters. - // Our dictionary also contains a few words with 0xF2; it would be best to check - // if that's correct, but a web search does return results for these words so - // they are probably okay. - return (codePoint >= 0x370 && codePoint <= 0x3FF) - || (codePoint >= 0x1F00 && codePoint <= 0x1FFF) - || codePoint == 0xF2; - default: - // Should never come here - throw new RuntimeException("Impossible value of script: " + script); - } - } - private static final int CHECKABILITY_CHECKABLE = 0; private static final int CHECKABILITY_TOO_MANY_NON_LETTERS = 1; private static final int CHECKABILITY_CONTAINS_PERIOD = 2; @@ -187,7 +152,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { // Filter by first letter final int firstCodePoint = text.codePointAt(0); // Filter out words that don't start with a letter or an apostrophe - if (!isLetterCheckableByLanguage(firstCodePoint, script) + if (!ScriptUtils.isLetterPartOfScript(firstCodePoint, script) && '\'' != firstCodePoint) return CHECKABILITY_FIRST_LETTER_UNCHECKABLE; // Filter contents @@ -208,7 +173,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { if (Constants.CODE_PERIOD == codePoint) { return CHECKABILITY_CONTAINS_PERIOD; } - if (isLetterCheckableByLanguage(codePoint, script)) ++letterCount; + if (ScriptUtils.isLetterPartOfScript(codePoint, script)) ++letterCount; } // Guestimate heuristic: perform spell checking if at least 3/4 of the characters // in this word are letters @@ -257,11 +222,12 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } protected SuggestionsInfo onGetSuggestionsInternal( - final TextInfo textInfo, final String prevWord, final int suggestionsLimit) { + final TextInfo textInfo, final PrevWordsInfo prevWordsInfo, + final int suggestionsLimit) { try { final String inText = textInfo.getText(); final SuggestionsParams cachedSuggestionsParams = - mSuggestionsCache.getSuggestionsFromCache(inText, prevWord); + mSuggestionsCache.getSuggestionsFromCache(inText, prevWordsInfo); if (cachedSuggestionsParams != null) { if (DBG) { Log.d(TAG, "Cache hit: " + inText + ", " + cachedSuggestionsParams.mFlags); @@ -279,6 +245,24 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { return AndroidSpellCheckerService.getNotInDictEmptySuggestions( false /* reportAsTypo */); } + if (CHECKABILITY_CONTAINS_PERIOD == checkability) { + final String[] splitText = inText.split(Constants.REGEXP_PERIOD); + boolean allWordsAreValid = true; + for (final String word : splitText) { + if (!dictInfo.mDictionary.isValidWord(word)) { + allWordsAreValid = false; + break; + } + } + if (allWordsAreValid) { + return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO + | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS, + new String[] { + TextUtils.join(Constants.STRING_SPACE, splitText), + TextUtils.join(Constants.STRING_PERIOD_AND_SPACE, + splitText) }); + } + } return dictInfo.mDictionary.isValidWord(inText) ? AndroidSpellCheckerService.getInDictEmptySuggestions() : AndroidSpellCheckerService.getNotInDictEmptySuggestions( @@ -312,16 +296,21 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { false /* reportAsTypo */); } final WordComposer composer = new WordComposer(); - final int length = text.length(); - for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { - final int codePoint = text.codePointAt(i); - composer.addKeyInfo(codePoint, dictInfo.getKeyboard(codePoint)); + final int[] codePoints = StringUtils.toCodePointArray(text); + final int[] coordinates; + if (null == dictInfo.mKeyboard) { + coordinates = CoordinateUtils.newCoordinateArray(codePoints.length, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); + } else { + coordinates = dictInfo.mKeyboard.getCoordinates(codePoints); } + composer.setComposingWord(codePoints, coordinates); // TODO: make a spell checker option to block offensive words or not final ArrayList<SuggestedWordInfo> suggestions = - dictInfo.mDictionary.getSuggestions(composer, prevWord, + dictInfo.mDictionary.getSuggestions(composer, prevWordsInfo, dictInfo.getProximityInfo(), true /* blockOffensiveWords */, - null /* additionalFeaturesOptions */); + null /* additionalFeaturesOptions */, 0 /* sessionId */, + null /* inOutLanguageWeight */); if (suggestions != null) { for (final SuggestedWordInfo suggestion : suggestions) { final String suggestionStr = suggestion.mWord; @@ -362,7 +351,8 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { .getValueOf_RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS() : 0); final SuggestionsInfo retval = new SuggestionsInfo(flags, result.mSuggestions); - mSuggestionsCache.putSuggestionsToCache(text, prevWord, result.mSuggestions, flags); + mSuggestionsCache.putSuggestionsToCache(text, prevWordsInfo, result.mSuggestions, + flags); return retval; } catch (RuntimeException e) { // Don't kill the keyboard if there is a bug in the spell checker diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java b/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java index b77f3e2c5..b33739fc1 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java @@ -16,38 +16,27 @@ package com.android.inputmethod.latin.spellcheck; -import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.keyboard.KeyboardLayoutSet; import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.Dictionary; /** * A container for a Dictionary and a Keyboard. */ public final class DictAndKeyboard { public final Dictionary mDictionary; - private final Keyboard mKeyboard; - private final Keyboard mManualShiftedKeyboard; + public final Keyboard mKeyboard; public DictAndKeyboard( final Dictionary dictionary, final KeyboardLayoutSet keyboardLayoutSet) { mDictionary = dictionary; if (keyboardLayoutSet == null) { mKeyboard = null; - mManualShiftedKeyboard = null; return; } mKeyboard = keyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET); - mManualShiftedKeyboard = - keyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED); - } - - public Keyboard getKeyboard(final int codePoint) { - if (mKeyboard == null) { - return null; - } - return mKeyboard.getKey(codePoint) != null ? mKeyboard : mManualShiftedKeyboard; } public ProximityInfo getProximityInfo() { diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java index a0aed2829..cc52a3e0f 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java @@ -20,9 +20,9 @@ import android.util.Log; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.PrevWordsInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.WordComposer; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; import java.util.Locale; @@ -46,17 +46,19 @@ public final class DictionaryPool extends LinkedBlockingQueue<DictAndKeyboard> { private final Locale mLocale; private int mSize; private volatile boolean mClosed; - final static ArrayList<SuggestedWordInfo> noSuggestions = CollectionUtils.newArrayList(); + final static ArrayList<SuggestedWordInfo> noSuggestions = new ArrayList<>(); private final static DictAndKeyboard dummyDict = new DictAndKeyboard( new Dictionary(Dictionary.TYPE_MAIN) { + // TODO: this dummy dictionary should be a singleton in the Dictionary class. @Override public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, - final String prevWord, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { return noSuggestions; } @Override - public boolean isValidWord(final String word) { + public boolean isInDictionary(final String word) { // This is never called. However if for some strange reason it ever gets // called, returning true is less destructive (it will not underline the // word in red). diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SentenceLevelAdapter.java b/java/src/com/android/inputmethod/latin/spellcheck/SentenceLevelAdapter.java new file mode 100644 index 000000000..13352f39e --- /dev/null +++ b/java/src/com/android/inputmethod/latin/spellcheck/SentenceLevelAdapter.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin.spellcheck; + +import android.content.res.Resources; +import android.view.textservice.SentenceSuggestionsInfo; +import android.view.textservice.SuggestionsInfo; +import android.view.textservice.TextInfo; + +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; +import com.android.inputmethod.latin.utils.RunInLocale; + +import java.util.ArrayList; +import java.util.Locale; + +/** + * This code is mostly lifted directly from android.service.textservice.SpellCheckerService in + * the framework; maybe that should be protected instead, so that implementers don't have to + * rewrite everything for any small change. + */ +public class SentenceLevelAdapter { + public static final SentenceSuggestionsInfo[] EMPTY_SENTENCE_SUGGESTIONS_INFOS = + new SentenceSuggestionsInfo[] {}; + private static final SuggestionsInfo EMPTY_SUGGESTIONS_INFO = new SuggestionsInfo(0, null); + /** + * Container for split TextInfo parameters + */ + public static class SentenceWordItem { + public final TextInfo mTextInfo; + public final int mStart; + public final int mLength; + public SentenceWordItem(TextInfo ti, int start, int end) { + mTextInfo = ti; + mStart = start; + mLength = end - start; + } + } + + /** + * Container for originally queried TextInfo and parameters + */ + public static class SentenceTextInfoParams { + final TextInfo mOriginalTextInfo; + final ArrayList<SentenceWordItem> mItems; + final int mSize; + public SentenceTextInfoParams(TextInfo ti, ArrayList<SentenceWordItem> items) { + mOriginalTextInfo = ti; + mItems = items; + mSize = items.size(); + } + } + + private static class WordIterator { + private final SpacingAndPunctuations mSpacingAndPunctuations; + public WordIterator(final Resources res, final Locale locale) { + final RunInLocale<SpacingAndPunctuations> job + = new RunInLocale<SpacingAndPunctuations>() { + @Override + protected SpacingAndPunctuations job(final Resources res) { + return new SpacingAndPunctuations(res); + } + }; + mSpacingAndPunctuations = job.runInLocale(res, locale); + } + + public int getEndOfWord(final CharSequence sequence, int index) { + final int length = sequence.length(); + index = index < 0 ? 0 : Character.offsetByCodePoints(sequence, index, 1); + while (index < length) { + final int codePoint = Character.codePointAt(sequence, index); + if (mSpacingAndPunctuations.isWordSeparator(codePoint)) { + // If it's a period, we want to stop here only if it's followed by another + // word separator. In all other cases we stop here. + if (Constants.CODE_PERIOD == codePoint) { + final int indexOfNextCodePoint = + index + Character.charCount(Constants.CODE_PERIOD); + if (indexOfNextCodePoint < length + && mSpacingAndPunctuations.isWordSeparator( + Character.codePointAt(sequence, indexOfNextCodePoint))) { + return index; + } + } else { + return index; + } + } + index += Character.charCount(codePoint); + } + return index; + } + + public int getBeginningOfNextWord(final CharSequence sequence, int index) { + final int length = sequence.length(); + if (index >= length) { + return -1; + } + index = index < 0 ? 0 : Character.offsetByCodePoints(sequence, index, 1); + while (index < length) { + final int codePoint = Character.codePointAt(sequence, index); + if (!mSpacingAndPunctuations.isWordSeparator(codePoint)) { + return index; + } + index += Character.charCount(codePoint); + } + return -1; + } + } + + private final WordIterator mWordIterator; + public SentenceLevelAdapter(final Resources res, final Locale locale) { + mWordIterator = new WordIterator(res, locale); + } + + public SentenceTextInfoParams getSplitWords(TextInfo originalTextInfo) { + final WordIterator wordIterator = mWordIterator; + final CharSequence originalText = originalTextInfo.getText(); + final int cookie = originalTextInfo.getCookie(); + final int start = -1; + final int end = originalText.length(); + final ArrayList<SentenceWordItem> wordItems = new ArrayList<SentenceWordItem>(); + int wordStart = wordIterator.getBeginningOfNextWord(originalText, start); + int wordEnd = wordIterator.getEndOfWord(originalText, wordStart); + while (wordStart <= end && wordEnd != -1 && wordStart != -1) { + if (wordEnd >= start && wordEnd > wordStart) { + final String query = originalText.subSequence(wordStart, wordEnd).toString(); + final TextInfo ti = new TextInfo(query, cookie, query.hashCode()); + wordItems.add(new SentenceWordItem(ti, wordStart, wordEnd)); + } + wordStart = wordIterator.getBeginningOfNextWord(originalText, wordEnd); + if (wordStart == -1) { + break; + } + wordEnd = wordIterator.getEndOfWord(originalText, wordStart); + } + return new SentenceTextInfoParams(originalTextInfo, wordItems); + } + + public static SentenceSuggestionsInfo reconstructSuggestions( + SentenceTextInfoParams originalTextInfoParams, SuggestionsInfo[] results) { + if (results == null || results.length == 0) { + return null; + } + if (originalTextInfoParams == null) { + return null; + } + final int originalCookie = originalTextInfoParams.mOriginalTextInfo.getCookie(); + final int originalSequence = + originalTextInfoParams.mOriginalTextInfo.getSequence(); + + final int querySize = originalTextInfoParams.mSize; + final int[] offsets = new int[querySize]; + final int[] lengths = new int[querySize]; + final SuggestionsInfo[] reconstructedSuggestions = new SuggestionsInfo[querySize]; + for (int i = 0; i < querySize; ++i) { + final SentenceWordItem item = originalTextInfoParams.mItems.get(i); + SuggestionsInfo result = null; + for (int j = 0; j < results.length; ++j) { + final SuggestionsInfo cur = results[j]; + if (cur != null && cur.getSequence() == item.mTextInfo.getSequence()) { + result = cur; + result.setCookieAndSequence(originalCookie, originalSequence); + break; + } + } + offsets[i] = item.mStart; + lengths[i] = item.mLength; + reconstructedSuggestions[i] = result != null ? result : EMPTY_SUGGESTIONS_INFO; + } + return new SentenceSuggestionsInfo(reconstructedSuggestions, offsets, lengths); + } +} diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java index 999ca775b..186dafd29 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java @@ -39,7 +39,7 @@ public final class SpellCheckerSettingsFragment extends PreferenceFragment { addPreferencesFromResource(R.xml.spell_checker_settings); final PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { - preferenceScreen.setTitle(ApplicationUtils.getAcitivityTitleResId( + preferenceScreen.setTitle(ApplicationUtils.getActivityTitleResId( getActivity(), SpellCheckerSettingsActivity.class)); } } diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java index 3213c92c7..a6437bac3 100644 --- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedContactsBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java @@ -14,45 +14,42 @@ * limitations under the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.latin.spellcheck; import android.content.Context; import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.ContactsBinaryDictionary; +import com.android.inputmethod.latin.PrevWordsInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.WordComposer; import java.util.ArrayList; import java.util.Locale; public final class SynchronouslyLoadedContactsBinaryDictionary extends ContactsBinaryDictionary { - private boolean mClosed; + private static final String NAME = "spellcheck_contacts"; + private final Object mLock = new Object(); public SynchronouslyLoadedContactsBinaryDictionary(final Context context, final Locale locale) { - super(context, locale); + super(context, locale, null /* dictFile */, NAME); } @Override - public synchronized ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, - final String prevWordForBigrams, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - reloadDictionaryIfRequired(); - return super.getSuggestions(codes, prevWordForBigrams, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions); + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { + synchronized (mLock) { + return super.getSuggestions(codes, prevWordsInfo, proximityInfo, + blockOffensiveWords, additionalFeaturesOptions, sessionId, inOutLanguageWeight); + } } @Override - public synchronized boolean isValidWord(final String word) { - reloadDictionaryIfRequired(); - return isValidWordInner(word); - } - - // Protect against multiple closing - @Override - public synchronized void close() { - // Actually with the current implementation of ContactsDictionary it's safe to close - // several times, so the following protection is really only for foolproofing - if (mClosed) return; - mClosed = true; - super.close(); + public boolean isInDictionary(final String word) { + synchronized (mLock) { + return super.isInDictionary(word); + } } } diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java index 6405b5e46..8c9d5d681 100644 --- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java @@ -14,38 +14,47 @@ * limitations under the License. */ -package com.android.inputmethod.latin; +package com.android.inputmethod.latin.spellcheck; import android.content.Context; import com.android.inputmethod.keyboard.ProximityInfo; +import com.android.inputmethod.latin.PrevWordsInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.UserBinaryDictionary; +import com.android.inputmethod.latin.WordComposer; import java.util.ArrayList; +import java.util.Locale; public final class SynchronouslyLoadedUserBinaryDictionary extends UserBinaryDictionary { + private static final String NAME = "spellcheck_user"; + private final Object mLock = new Object(); - public SynchronouslyLoadedUserBinaryDictionary(final Context context, final String locale) { - this(context, locale, false); + public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale) { + this(context, locale, false /* alsoUseMoreRestrictiveLocales */); } - public SynchronouslyLoadedUserBinaryDictionary(final Context context, final String locale, + public SynchronouslyLoadedUserBinaryDictionary(final Context context, final Locale locale, final boolean alsoUseMoreRestrictiveLocales) { - super(context, locale, alsoUseMoreRestrictiveLocales); + super(context, locale, alsoUseMoreRestrictiveLocales, null /* dictFile */, NAME); } @Override - public synchronized ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, - final String prevWordForBigrams, final ProximityInfo proximityInfo, - final boolean blockOffensiveWords, final int[] additionalFeaturesOptions) { - reloadDictionaryIfRequired(); - return super.getSuggestions(codes, prevWordForBigrams, proximityInfo, blockOffensiveWords, - additionalFeaturesOptions); + public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes, + final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, + final boolean blockOffensiveWords, final int[] additionalFeaturesOptions, + final int sessionId, final float[] inOutLanguageWeight) { + synchronized (mLock) { + return super.getSuggestions(codes, prevWordsInfo, proximityInfo, + blockOffensiveWords, additionalFeaturesOptions, sessionId, inOutLanguageWeight); + } } @Override - public synchronized boolean isValidWord(final String word) { - reloadDictionaryIfRequired(); - return isValidWordInner(word); + public boolean isInDictionary(final String word) { + synchronized (mLock) { + return super.isInDictionary(word); + } } } diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java index acd47450b..346aea34a 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java +++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java @@ -23,34 +23,27 @@ import android.graphics.drawable.Drawable; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.KeyboardActionListener; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.keyboard.internal.KeyboardParams; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.utils.TypefaceUtils; public final class MoreSuggestions extends Keyboard { - public static final int SUGGESTION_CODE_BASE = 1024; - public final SuggestedWords mSuggestedWords; - public static abstract class MoreSuggestionsListener extends KeyboardActionListener.Adapter { - public abstract void onSuggestionSelected(final int index, final SuggestedWordInfo info); - } - MoreSuggestions(final MoreSuggestionsParam params, final SuggestedWords suggestedWords) { super(params); mSuggestedWords = suggestedWords; } private static final class MoreSuggestionsParam extends KeyboardParams { - private final int[] mWidths = new int[SuggestionStripView.MAX_SUGGESTIONS]; - private final int[] mRowNumbers = new int[SuggestionStripView.MAX_SUGGESTIONS]; - private final int[] mColumnOrders = new int[SuggestionStripView.MAX_SUGGESTIONS]; - private final int[] mNumColumnsInRow = new int[SuggestionStripView.MAX_SUGGESTIONS]; + private final int[] mWidths = new int[SuggestedWords.MAX_SUGGESTIONS]; + private final int[] mRowNumbers = new int[SuggestedWords.MAX_SUGGESTIONS]; + private final int[] mColumnOrders = new int[SuggestedWords.MAX_SUGGESTIONS]; + private final int[] mNumColumnsInRow = new int[SuggestedWords.MAX_SUGGESTIONS]; private static final int MAX_COLUMNS_IN_ROW = 3; private int mNumRows; public Drawable mDivider; @@ -66,16 +59,23 @@ public final class MoreSuggestions extends Keyboard { clearKeys(); mDivider = res.getDrawable(R.drawable.more_suggestions_divider); mDividerWidth = mDivider.getIntrinsicWidth(); - final float padding = res.getDimension(R.dimen.more_suggestions_key_horizontal_padding); + final float padding = res.getDimension( + R.dimen.config_more_suggestions_key_horizontal_padding); int row = 0; int index = fromIndex; int rowStartIndex = fromIndex; - final int size = Math.min(suggestedWords.size(), SuggestionStripView.MAX_SUGGESTIONS); + final int size = Math.min(suggestedWords.size(), SuggestedWords.MAX_SUGGESTIONS); while (index < size) { - final String word = suggestedWords.getWord(index); + final String word; + if (isIndexSubjectToAutoCorrection(suggestedWords, index)) { + // INDEX_OF_AUTO_CORRECTION and INDEX_OF_TYPED_WORD got swapped. + word = suggestedWords.getLabel(SuggestedWords.INDEX_OF_TYPED_WORD); + } else { + word = suggestedWords.getLabel(index); + } // TODO: Should take care of text x-scaling. - mWidths[index] = (int)(TypefaceUtils.getLabelWidth(word, paint) + padding); + mWidths[index] = (int)(TypefaceUtils.getStringWidth(word, paint) + padding); final int numColumn = index - rowStartIndex + 1; final int columnWidth = (maxWidth - mDividerWidth * (numColumn - 1)) / numColumn; @@ -171,6 +171,11 @@ public final class MoreSuggestions extends Keyboard { } } + static boolean isIndexSubjectToAutoCorrection(final SuggestedWords suggestedWords, + final int index) { + return suggestedWords.mWillAutoCorrect && index == SuggestedWords.INDEX_OF_AUTO_CORRECTION; + } + public static final class Builder extends KeyboardBuilder<MoreSuggestionsParam> { private final MoreSuggestionsView mPaneView; private SuggestedWords mSuggestedWords; @@ -188,7 +193,6 @@ public final class MoreSuggestions extends Keyboard { final int xmlId = R.xml.kbd_suggestions_pane_template; load(xmlId, parentKeyboard.mId); mParams.mVerticalGap = mParams.mTopPadding = parentKeyboard.mVerticalGap / 2; - mPaneView.updateKeyboardGeometry(mParams.mDefaultRowHeight); final int count = mParams.layout(suggestedWords, fromIndex, maxWidth, minWidth, maxRow, mPaneView.newLabelPaint(null /* key */), mResources); @@ -205,13 +209,17 @@ public final class MoreSuggestions extends Keyboard { final int x = params.getX(index); final int y = params.getY(index); final int width = params.getWidth(index); - final String word = mSuggestedWords.getWord(index); - final String info = mSuggestedWords.getDebugString(index); - final int indexInMoreSuggestions = index + SUGGESTION_CODE_BASE; - final Key key = new Key( - params, word, info, KeyboardIconsSet.ICON_UNDEFINED, indexInMoreSuggestions, - null /* outputText */, x, y, width, params.mDefaultRowHeight, - 0 /* labelFlags */, Key.BACKGROUND_TYPE_NORMAL); + final String word; + final String info; + if (isIndexSubjectToAutoCorrection(mSuggestedWords, index)) { + // INDEX_OF_AUTO_CORRECTION and INDEX_OF_TYPED_WORD got swapped. + word = mSuggestedWords.getLabel(SuggestedWords.INDEX_OF_TYPED_WORD); + info = mSuggestedWords.getDebugString(SuggestedWords.INDEX_OF_TYPED_WORD); + } else { + word = mSuggestedWords.getLabel(index); + info = mSuggestedWords.getDebugString(index); + } + final Key key = new MoreSuggestionKey(word, info, index, params); params.markAsEdgeKey(key, index); params.onAddKey(key); final int columnNumber = params.getColumnNumber(index); @@ -226,6 +234,19 @@ public final class MoreSuggestions extends Keyboard { } } + static final class MoreSuggestionKey extends Key { + public final int mSuggestedWordIndex; + + public MoreSuggestionKey(final String word, final String info, final int index, + final MoreSuggestionsParam params) { + super(word /* label */, KeyboardIconsSet.ICON_UNDEFINED, Constants.CODE_OUTPUT_TEXT, + word /* outputText */, info, 0 /* labelFlags */, Key.BACKGROUND_TYPE_NORMAL, + params.getX(index), params.getY(index), params.getWidth(index), + params.mDefaultRowHeight, params.mHorizontalGap, params.mVerticalGap); + mSuggestedWordIndex = index; + } + } + private static final class Divider extends Key.Spacer { private final Drawable mIcon; diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java index 0ebe37782..f7b6f919d 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java @@ -20,11 +20,14 @@ import android.content.Context; import android.util.AttributeSet; import android.util.Log; +import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.keyboard.KeyboardActionListener; import com.android.inputmethod.keyboard.MoreKeysKeyboardView; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionsListener; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionKey; /** * A view that renders a virtual {@link MoreSuggestions}. It handles rendering of keys and detecting @@ -33,6 +36,10 @@ import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestions public final class MoreSuggestionsView extends MoreKeysKeyboardView { private static final String TAG = MoreSuggestionsView.class.getSimpleName(); + public static abstract class MoreSuggestionsListener extends KeyboardActionListener.Adapter { + public abstract void onSuggestionSelected(final SuggestedWordInfo info); + } + public MoreSuggestionsView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.moreKeysKeyboardViewStyle); } @@ -42,6 +49,21 @@ public final class MoreSuggestionsView extends MoreKeysKeyboardView { super(context, attrs, defStyle); } + // TODO: Remove redundant override method. + @Override + public void setKeyboard(final Keyboard keyboard) { + super.setKeyboard(keyboard); + // With accessibility mode off, {@link #mAccessibilityDelegate} is set to null at the + // above {@link MoreKeysKeyboardView#setKeyboard(Keyboard)} call. + // With accessibility mode on, {@link #mAccessibilityDelegate} is set to a + // {@link MoreKeysKeyboardAccessibilityDelegate} object at the above + // {@link MoreKeysKeyboardView#setKeyboard(Keyboard)} call. + if (mAccessibilityDelegate != null) { + mAccessibilityDelegate.setOpenAnnounce(R.string.spoken_open_more_suggestions); + mAccessibilityDelegate.setCloseAnnounce(R.string.spoken_close_more_suggestions); + } + } + @Override protected int getDefaultCoordX() { final MoreSuggestions pane = (MoreSuggestions)getKeyboard(); @@ -54,12 +76,17 @@ public final class MoreSuggestionsView extends MoreKeysKeyboardView { public void adjustVerticalCorrectionForModalMode() { // Set vertical correction to zero (Reset more keys keyboard sliding allowance - // {@link R#dimen.more_keys_keyboard_slide_allowance}). + // {@link R#dimen.config_more_keys_keyboard_slide_allowance}). mKeyDetector.setKeyboard(getKeyboard(), -getPaddingLeft(), -getPaddingTop()); } @Override - public void onCodeInput(final int code, final int x, final int y) { + protected void onKeyInput(final Key key, final int x, final int y) { + if (!(key instanceof MoreSuggestionKey)) { + Log.e(TAG, "Expected key is MoreSuggestionKey, but found " + + key.getClass().getName()); + return; + } final Keyboard keyboard = getKeyboard(); if (!(keyboard instanceof MoreSuggestions)) { Log.e(TAG, "Expected keyboard is MoreSuggestions, but found " @@ -67,7 +94,7 @@ public final class MoreSuggestionsView extends MoreKeysKeyboardView { return; } final SuggestedWords suggestedWords = ((MoreSuggestions)keyboard).mSuggestedWords; - final int index = code - MoreSuggestions.SUGGESTION_CODE_BASE; + final int index = ((MoreSuggestionKey)key).mSuggestedWordIndex; if (index < 0 || index >= suggestedWords.size()) { Log.e(TAG, "Selected suggestion has an illegal index: " + index); return; @@ -77,7 +104,6 @@ public final class MoreSuggestionsView extends MoreKeysKeyboardView { + mListener.getClass().getName()); return; } - ((MoreSuggestionsListener)mListener).onSuggestionSelected( - index, suggestedWords.getInfo(index)); + ((MoreSuggestionsListener)mListener).onSuggestionSelected(suggestedWords.getInfo(index)); } } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java index faa5560e4..ad5aad747 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java @@ -28,6 +28,7 @@ import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.support.v4.view.ViewCompat; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; @@ -38,18 +39,20 @@ import android.text.style.StyleSpan; import android.text.style.UnderlineSpan; import android.util.AttributeSet; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; +import com.android.inputmethod.accessibility.AccessibilityUtils; import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.PunctuationSuggestions; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.utils.AutoCorrectionUtils; import com.android.inputmethod.latin.utils.ResourceUtils; +import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.ViewLayoutUtils; import java.util.ArrayList; @@ -64,7 +67,7 @@ final class SuggestionStripLayoutHelper { public final int mPadding; public final int mDividerWidth; public final int mSuggestionsStripHeight; - public final int mSuggestionsCountInStrip; + private final int mSuggestionsCountInStrip; public final int mMoreSuggestionsRowHeight; private int mMaxMoreSuggestionsRow; public final float mMinMoreSuggestionsWidth; @@ -89,21 +92,18 @@ final class SuggestionStripLayoutHelper { private final Drawable mMoreSuggestionsHint; private static final String MORE_SUGGESTIONS_HINT = "\u2026"; private static final String LEFTWARDS_ARROW = "\u2190"; + private static final String RIGHTWARDS_ARROW = "\u2192"; private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD); private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan(); - private final int mSuggestionStripOption; + private final int mSuggestionStripOptions; // These constants are the flag values of - // {@link R.styleable#SuggestionStripView_suggestionStripOption} attribute. + // {@link R.styleable#SuggestionStripView_suggestionStripOptions} attribute. private static final int AUTO_CORRECT_BOLD = 0x01; private static final int AUTO_CORRECT_UNDERLINE = 0x02; private static final int VALID_TYPED_WORD_BOLD = 0x04; - private final TextView mWordToSaveView; - private final TextView mLeftwardsArrowView; - private final TextView mHintToSaveView; - public SuggestionStripLayoutHelper(final Context context, final AttributeSet attrs, final int defStyle, final ArrayList<TextView> wordViews, final ArrayList<View> dividerViews, final ArrayList<TextView> debugInfoViews) { @@ -119,12 +119,13 @@ final class SuggestionStripLayoutHelper { mDividerWidth = dividerView.getMeasuredWidth(); final Resources res = wordView.getResources(); - mSuggestionsStripHeight = res.getDimensionPixelSize(R.dimen.suggestions_strip_height); + mSuggestionsStripHeight = res.getDimensionPixelSize( + R.dimen.config_suggestions_strip_height); final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuggestionStripView, defStyle, R.style.SuggestionStripView); - mSuggestionStripOption = a.getInt( - R.styleable.SuggestionStripView_suggestionStripOption, 0); + mSuggestionStripOptions = a.getInt( + R.styleable.SuggestionStripView_suggestionStripOptions, 0); mAlphaObsoleted = ResourceUtils.getFraction(a, R.styleable.SuggestionStripView_alphaObsoleted, 1.0f); mColorValidTypedWord = a.getColor(R.styleable.SuggestionStripView_colorValidTypedWord, 0); @@ -145,20 +146,17 @@ final class SuggestionStripLayoutHelper { a.recycle(); mMoreSuggestionsHint = getMoreSuggestionsHint(res, - res.getDimension(R.dimen.more_suggestions_hint_text_size), mColorAutoCorrect); + res.getDimension(R.dimen.config_more_suggestions_hint_text_size), + mColorAutoCorrect); mCenterPositionInStrip = mSuggestionsCountInStrip / 2; // Assuming there are at least three suggestions. Also, note that the suggestions are // laid out according to script direction, so this is left of the center for LTR scripts // and right of the center for RTL scripts. mTypedWordPositionWhenAutocorrect = mCenterPositionInStrip - 1; mMoreSuggestionsBottomGap = res.getDimensionPixelOffset( - R.dimen.more_suggestions_bottom_gap); - mMoreSuggestionsRowHeight = res.getDimensionPixelSize(R.dimen.more_suggestions_row_height); - - final LayoutInflater inflater = LayoutInflater.from(context); - mWordToSaveView = (TextView)inflater.inflate(R.layout.suggestion_word, null); - mLeftwardsArrowView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null); - mHintToSaveView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null); + R.dimen.config_more_suggestions_bottom_gap); + mMoreSuggestionsRowHeight = res.getDimensionPixelSize( + R.dimen.config_more_suggestions_row_height); } public int getMaxMoreSuggestionsRow() { @@ -203,23 +201,25 @@ final class SuggestionStripLayoutHelper { if (indexInSuggestedWords >= suggestedWords.size()) { return null; } - final String word = suggestedWords.getWord(indexInSuggestedWords); - final boolean isAutoCorrect = indexInSuggestedWords == 1 - && suggestedWords.willAutoCorrect(); - final boolean isTypedWordValid = indexInSuggestedWords == 0 - && suggestedWords.mTypedWordValid; - if (!isAutoCorrect && !isTypedWordValid) { + final String word = suggestedWords.getLabel(indexInSuggestedWords); + // TODO: don't use the index to decide whether this is the auto-correction/typed word, as + // this is brittle + final boolean isAutoCorrection = suggestedWords.mWillAutoCorrect + && indexInSuggestedWords == SuggestedWords.INDEX_OF_AUTO_CORRECTION; + final boolean isTypedWordValid = suggestedWords.mTypedWordValid + && indexInSuggestedWords == SuggestedWords.INDEX_OF_TYPED_WORD; + if (!isAutoCorrection && !isTypedWordValid) { return word; } final int len = word.length(); final Spannable spannedWord = new SpannableString(word); - final int option = mSuggestionStripOption; - if ((isAutoCorrect && (option & AUTO_CORRECT_BOLD) != 0) - || (isTypedWordValid && (option & VALID_TYPED_WORD_BOLD) != 0)) { + final int options = mSuggestionStripOptions; + if ((isAutoCorrection && (options & AUTO_CORRECT_BOLD) != 0) + || (isTypedWordValid && (options & VALID_TYPED_WORD_BOLD) != 0)) { spannedWord.setSpan(BOLD_SPAN, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } - if (isAutoCorrect && (option & AUTO_CORRECT_UNDERLINE) != 0) { + if (isAutoCorrection && (options & AUTO_CORRECT_UNDERLINE) != 0) { spannedWord.setSpan(UNDERLINE_SPAN, 0, len, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } return spannedWord; @@ -229,7 +229,7 @@ final class SuggestionStripLayoutHelper { final SuggestedWords suggestedWords) { final int indexToDisplayMostImportantSuggestion; final int indexToDisplaySecondMostImportantSuggestion; - if (suggestedWords.willAutoCorrect()) { + if (suggestedWords.mWillAutoCorrect) { indexToDisplayMostImportantSuggestion = SuggestedWords.INDEX_OF_AUTO_CORRECTION; indexToDisplaySecondMostImportantSuggestion = SuggestedWords.INDEX_OF_TYPED_WORD; } else { @@ -246,35 +246,36 @@ final class SuggestionStripLayoutHelper { return indexInSuggestedWords; } - private int getSuggestionTextColor(final int indexInSuggestedWords, - final SuggestedWords suggestedWords) { + private int getSuggestionTextColor(final SuggestedWords suggestedWords, + final int indexInSuggestedWords) { final int positionInStrip = getPositionInSuggestionStrip(indexInSuggestedWords, suggestedWords); - // TODO: Need to revisit this logic with bigram suggestions - final boolean isSuggested = (indexInSuggestedWords != SuggestedWords.INDEX_OF_TYPED_WORD); + // Use identity for strings, not #equals : it's the typed word if it's the same object + final boolean isTypedWord = suggestedWords.getInfo(indexInSuggestedWords).isKindOf( + SuggestedWordInfo.KIND_TYPED); final int color; - if (positionInStrip == mCenterPositionInStrip && suggestedWords.willAutoCorrect()) { + if (positionInStrip == mCenterPositionInStrip && suggestedWords.mWillAutoCorrect) { color = mColorAutoCorrect; - } else if (positionInStrip == mCenterPositionInStrip && suggestedWords.mTypedWordValid) { + } else if (isTypedWord && suggestedWords.mTypedWordValid) { color = mColorValidTypedWord; - } else if (isSuggested) { - color = mColorSuggested; - } else { + } else if (isTypedWord) { color = mColorTypedWord; + } else { + color = mColorSuggested; } if (LatinImeLogger.sDBG && suggestedWords.size() > 1) { // If we auto-correct, then the autocorrection is in slot 0 and the typed word // is in slot 1. if (positionInStrip == mCenterPositionInStrip && AutoCorrectionUtils.shouldBlockAutoCorrectionBySafetyNet( - suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION), - suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD))) { + suggestedWords.getLabel(SuggestedWords.INDEX_OF_AUTO_CORRECTION), + suggestedWords.getLabel(SuggestedWords.INDEX_OF_TYPED_WORD))) { return 0xFFFF0000; } } - if (suggestedWords.mIsObsoleteSuggestions && isSuggested) { + if (suggestedWords.mIsObsoleteSuggestions && !isTypedWord) { return applyAlpha(color, mAlphaObsoleted); } return color; @@ -292,54 +293,64 @@ final class SuggestionStripLayoutHelper { params.gravity = Gravity.CENTER; } - public void layout(final SuggestedWords suggestedWords, final ViewGroup stripView, - final ViewGroup placerView) { - if (suggestedWords.mIsPunctuationSuggestions) { - layoutPunctuationSuggestions(suggestedWords, stripView); - return; + /** + * Layout suggestions to the suggestions strip. And returns the number of suggestions displayed + * in the suggestions strip. + * + * @param suggestedWords suggestions to be shown in the suggestions strip. + * @param stripView the suggestions strip view. + * @param placerView the view where the debug info will be placed. + * @return the number of suggestions displayed in the suggestions strip + */ + public int layoutAndReturnSuggestionCountInStrip(final SuggestedWords suggestedWords, + final ViewGroup stripView, final ViewGroup placerView) { + if (suggestedWords.isPunctuationSuggestions()) { + return layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip( + (PunctuationSuggestions)suggestedWords, stripView); } - final int countInStrip = mSuggestionsCountInStrip; - setupWordViewsTextAndColor(suggestedWords, countInStrip); + setupWordViewsTextAndColor(suggestedWords, mSuggestionsCountInStrip); final TextView centerWordView = mWordViews.get(mCenterPositionInStrip); - final int availableStripWidth = placerView.getWidth() - - placerView.getPaddingRight() - placerView.getPaddingLeft(); - final int centerWidth = getSuggestionWidth(mCenterPositionInStrip, availableStripWidth); - if (getTextScaleX(centerWordView.getText(), centerWidth, centerWordView.getPaint()) - < MIN_TEXT_XSCALE) { + final int stripWidth = stripView.getWidth(); + final int centerWidth = getSuggestionWidth(mCenterPositionInStrip, stripWidth); + final int countInStrip; + if (suggestedWords.size() == 1 || getTextScaleX(centerWordView.getText(), centerWidth, + centerWordView.getPaint()) < MIN_TEXT_XSCALE) { // Layout only the most relevant suggested word at the center of the suggestion strip // by consolidating all slots in the strip. - mMoreSuggestionsAvailable = (suggestedWords.size() > 1); - layoutWord(mCenterPositionInStrip, availableStripWidth - mPadding); + countInStrip = 1; + mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip); + layoutWord(mCenterPositionInStrip, stripWidth - mPadding); stripView.addView(centerWordView); setLayoutWeight(centerWordView, 1.0f, ViewGroup.LayoutParams.MATCH_PARENT); if (SuggestionStripView.DBG) { - layoutDebugInfo(mCenterPositionInStrip, placerView, availableStripWidth); + layoutDebugInfo(mCenterPositionInStrip, placerView, stripWidth); } - return; - } - - mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip); - int x = 0; - for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) { - if (positionInStrip != 0) { - final View divider = mDividerViews.get(positionInStrip); - // Add divider if this isn't the left most suggestion in suggestions strip. - addDivider(stripView, divider); - x += divider.getMeasuredWidth(); - } - - final int width = getSuggestionWidth(positionInStrip, availableStripWidth); - final TextView wordView = layoutWord(positionInStrip, width); - stripView.addView(wordView); - setLayoutWeight(wordView, getSuggestionWeight(positionInStrip), - ViewGroup.LayoutParams.MATCH_PARENT); - x += wordView.getMeasuredWidth(); - - if (SuggestionStripView.DBG) { - layoutDebugInfo(positionInStrip, placerView, x); + } else { + countInStrip = mSuggestionsCountInStrip; + mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip); + int x = 0; + for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) { + if (positionInStrip != 0) { + final View divider = mDividerViews.get(positionInStrip); + // Add divider if this isn't the left most suggestion in suggestions strip. + addDivider(stripView, divider); + x += divider.getMeasuredWidth(); + } + + final int width = getSuggestionWidth(positionInStrip, stripWidth); + final TextView wordView = layoutWord(positionInStrip, width); + stripView.addView(wordView); + setLayoutWeight(wordView, getSuggestionWeight(positionInStrip), + ViewGroup.LayoutParams.MATCH_PARENT); + x += wordView.getMeasuredWidth(); + + if (SuggestionStripView.DBG) { + layoutDebugInfo(positionInStrip, placerView, x); + } } } + return countInStrip; } /** @@ -370,13 +381,19 @@ final class SuggestionStripLayoutHelper { } else { wordView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); } - - // Disable this suggestion if the suggestion is null or empty. - wordView.setEnabled(!TextUtils.isEmpty(word)); + // {@link StyleSpan} in a content description may cause an issue of TTS/TalkBack. + // Use a simple {@link String} to avoid the issue. + wordView.setContentDescription(TextUtils.isEmpty(word) ? null : word.toString()); final CharSequence text = getEllipsizedText(word, width, wordView.getPaint()); final float scaleX = getTextScaleX(word, width, wordView.getPaint()); wordView.setText(text); // TextView.setText() resets text scale x to 1.0. wordView.setTextScaleX(Math.max(scaleX, MIN_TEXT_XSCALE)); + // A <code>wordView</code> should be disabled when <code>word</code> is empty in order to + // make it unclickable. + // With accessibility touch exploration on, <code>wordView</code> should be enabled even + // when it is empty to avoid announcing as "disabled". + wordView.setEnabled(!TextUtils.isEmpty(word) + || AccessibilityUtils.getInstance().isTouchExplorationEnabled()); return wordView; } @@ -415,7 +432,9 @@ final class SuggestionStripLayoutHelper { final int countInStrip) { // Clear all suggestions first for (int positionInStrip = 0; positionInStrip < countInStrip; ++positionInStrip) { - mWordViews.get(positionInStrip).setText(null); + final TextView wordView = mWordViews.get(positionInStrip); + wordView.setText(null); + wordView.setTag(null); // Make this inactive for touches in {@link #layoutWord(int,int)}. if (SuggestionStripView.DBG) { mDebugInfoViews.get(positionInStrip).setText(null); @@ -431,7 +450,7 @@ final class SuggestionStripLayoutHelper { // {@link SuggestionStripView#onClick(View)}. wordView.setTag(indexInSuggestedWords); wordView.setText(getStyledSuggestedWord(suggestedWords, indexInSuggestedWords)); - wordView.setTextColor(getSuggestionTextColor(positionInStrip, suggestedWords)); + wordView.setTextColor(getSuggestionTextColor(suggestedWords, indexInSuggestedWords)); if (SuggestionStripView.DBG) { mDebugInfoViews.get(positionInStrip).setText( suggestedWords.getDebugString(indexInSuggestedWords)); @@ -439,9 +458,9 @@ final class SuggestionStripLayoutHelper { } } - private void layoutPunctuationSuggestions(final SuggestedWords suggestedWords, - final ViewGroup stripView) { - final int countInStrip = Math.min(suggestedWords.size(), PUNCTUATIONS_IN_STRIP); + private int layoutPunctuationSuggestionsAndReturnSuggestionCountInStrip( + final PunctuationSuggestions punctuationSuggestions, final ViewGroup stripView) { + final int countInStrip = Math.min(punctuationSuggestions.size(), PUNCTUATIONS_IN_STRIP); for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) { if (positionInStrip != 0) { // Add divider if this isn't the left most suggestion in suggestions strip. @@ -449,71 +468,69 @@ final class SuggestionStripLayoutHelper { } final TextView wordView = mWordViews.get(positionInStrip); - wordView.setEnabled(true); - wordView.setTextColor(mColorAutoCorrect); + final String punctuation = punctuationSuggestions.getLabel(positionInStrip); // {@link TextView#getTag()} is used to get the index in suggestedWords at // {@link SuggestionStripView#onClick(View)}. wordView.setTag(positionInStrip); - wordView.setText(suggestedWords.getWord(positionInStrip)); + wordView.setText(punctuation); + wordView.setContentDescription(punctuation); wordView.setTextScaleX(1.0f); wordView.setCompoundDrawables(null, null, null, null); + wordView.setTextColor(mColorAutoCorrect); stripView.addView(wordView); setLayoutWeight(wordView, 1.0f, mSuggestionsStripHeight); } - mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip); + mMoreSuggestionsAvailable = (punctuationSuggestions.size() > countInStrip); + return countInStrip; } - public void layoutAddToDictionaryHint(final String word, final ViewGroup stripView, - final int stripWidth, final CharSequence hintText, final OnClickListener listener) { + public void layoutAddToDictionaryHint(final String word, final ViewGroup addToDictionaryStrip) { + final int stripWidth = addToDictionaryStrip.getWidth(); final int width = stripWidth - mDividerWidth - mPadding * 2; - final TextView wordView = mWordToSaveView; + final TextView wordView = (TextView)addToDictionaryStrip.findViewById(R.id.word_to_save); wordView.setTextColor(mColorTypedWord); final int wordWidth = (int)(width * mCenterSuggestionWeight); - final CharSequence text = getEllipsizedText(word, wordWidth, wordView.getPaint()); + final CharSequence wordToSave = getEllipsizedText(word, wordWidth, wordView.getPaint()); final float wordScaleX = wordView.getTextScaleX(); - // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word - // will be extracted at {@link #getAddToDictionaryWord()}. - wordView.setTag(word); - wordView.setText(text); + wordView.setText(wordToSave); wordView.setTextScaleX(wordScaleX); - stripView.addView(wordView); setLayoutWeight(wordView, mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT); - stripView.addView(mDividerViews.get(0)); - - final TextView leftArrowView = mLeftwardsArrowView; - leftArrowView.setTextColor(mColorAutoCorrect); - leftArrowView.setText(LEFTWARDS_ARROW); - stripView.addView(leftArrowView); - - final TextView hintView = mHintToSaveView; - hintView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + final TextView hintView = (TextView)addToDictionaryStrip.findViewById( + R.id.hint_add_to_dictionary); hintView.setTextColor(mColorAutoCorrect); - final int hintWidth = width - wordWidth - leftArrowView.getWidth(); - final float hintScaleX = getTextScaleX(hintText, hintWidth, hintView.getPaint()); - hintView.setText(hintText); + final boolean isRtlLanguage = (ViewCompat.getLayoutDirection(addToDictionaryStrip) + == ViewCompat.LAYOUT_DIRECTION_RTL); + final String arrow = isRtlLanguage ? RIGHTWARDS_ARROW : LEFTWARDS_ARROW; + final Resources res = addToDictionaryStrip.getResources(); + final boolean isRtlSystem = SubtypeLocaleUtils.isRtlLanguage(res.getConfiguration().locale); + final CharSequence hintText = res.getText(R.string.hint_add_to_dictionary); + final String hintWithArrow = (isRtlLanguage == isRtlSystem) + ? (arrow + hintText) : (hintText + arrow); + final int hintWidth = width - wordWidth; + hintView.setTextScaleX(1.0f); // Reset textScaleX. + final float hintScaleX = getTextScaleX(hintWithArrow, hintWidth, hintView.getPaint()); + hintView.setText(hintWithArrow); hintView.setTextScaleX(hintScaleX); - stripView.addView(hintView); setLayoutWeight( hintView, 1.0f - mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT); - - wordView.setOnClickListener(listener); - leftArrowView.setOnClickListener(listener); - hintView.setOnClickListener(listener); - } - - public String getAddToDictionaryWord() { - // String tag is set at - // {@link #layoutAddToDictionaryHint(String,ViewGroup,int,CharSequence,OnClickListener}. - return (String)mWordToSaveView.getTag(); } - public boolean isAddToDictionaryShowing(final View v) { - return v == mWordToSaveView || v == mHintToSaveView || v == mLeftwardsArrowView; + public void layoutImportantNotice(final View importantNoticeStrip, + final String importantNoticeTitle) { + final TextView titleView = (TextView)importantNoticeStrip.findViewById( + R.id.important_notice_title); + final int width = titleView.getWidth() - titleView.getPaddingLeft() + - titleView.getPaddingRight(); + titleView.setTextColor(mColorAutoCorrect); + titleView.setText(importantNoticeTitle); + titleView.setTextScaleX(1.0f); // Reset textScaleX. + final float titleScaleX = getTextScaleX(importantNoticeTitle, width, titleView.getPaint()); + titleView.setTextScaleX(titleScaleX); } - private static void setLayoutWeight(final View v, final float weight, final int height) { + static void setLayoutWeight(final View v, final float weight, final int height) { final ViewGroup.LayoutParams lp = v.getLayoutParams(); if (lp instanceof LinearLayout.LayoutParams) { final LinearLayout.LayoutParams llp = (LinearLayout.LayoutParams)lp; @@ -527,7 +544,7 @@ final class SuggestionStripLayoutHelper { final TextPaint paint) { paint.setTextScaleX(1.0f); final int width = getTextWidth(text, paint); - if (width <= maxWidth) { + if (width <= maxWidth || maxWidth <= 0) { return 1.0f; } return maxWidth / (float)width; diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 75f17c559..8654e12a9 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -18,7 +18,13 @@ package com.android.inputmethod.latin.suggestions; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.support.v4.view.ViewCompat; +import android.text.TextUtils; import android.util.AttributeSet; +import android.util.TypedValue; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -26,11 +32,13 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.TextView; import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.MainKeyboardView; import com.android.inputmethod.keyboard.MoreKeysPanel; import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; @@ -39,10 +47,10 @@ import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.define.ProductionFlag; -import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionsListener; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.research.ResearchLogger; +import com.android.inputmethod.latin.settings.Settings; +import com.android.inputmethod.latin.settings.SettingsValues; +import com.android.inputmethod.latin.suggestions.MoreSuggestionsView.MoreSuggestionsListener; +import com.android.inputmethod.latin.utils.ImportantNoticeUtils; import java.util.ArrayList; @@ -50,29 +58,82 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick OnLongClickListener { public interface Listener { public void addWordToUserDictionary(String word); - public void pickSuggestionManually(int index, SuggestedWordInfo word); + public void showImportantNoticeContents(); + public void pickSuggestionManually(SuggestedWordInfo word); + public void onCodeInput(int primaryCode, int x, int y, boolean isKeyRepeat); } - // The maximum number of suggestions available. See {@link Suggest#mPrefMaxSuggestions}. - public static final int MAX_SUGGESTIONS = 18; - static final boolean DBG = LatinImeLogger.sDBG; + private static final float DEBUG_INFO_TEXT_SIZE_IN_DIP = 6.0f; private final ViewGroup mSuggestionsStrip; + private final ImageButton mVoiceKey; + private final ViewGroup mAddToDictionaryStrip; + private final View mImportantNoticeStrip; MainKeyboardView mMainKeyboardView; private final View mMoreSuggestionsContainer; private final MoreSuggestionsView mMoreSuggestionsView; private final MoreSuggestions.Builder mMoreSuggestionsBuilder; - private final ArrayList<TextView> mWordViews = CollectionUtils.newArrayList(); - private final ArrayList<TextView> mDebugInfoViews = CollectionUtils.newArrayList(); - private final ArrayList<View> mDividerViews = CollectionUtils.newArrayList(); + private final ArrayList<TextView> mWordViews = new ArrayList<>(); + private final ArrayList<TextView> mDebugInfoViews = new ArrayList<>(); + private final ArrayList<View> mDividerViews = new ArrayList<>(); Listener mListener; private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; + private int mSuggestionsCountInStrip; private final SuggestionStripLayoutHelper mLayoutHelper; + private final StripVisibilityGroup mStripVisibilityGroup; + + private static class StripVisibilityGroup { + private final View mSuggestionStripView; + private final View mSuggestionsStrip; + private final View mAddToDictionaryStrip; + private final View mImportantNoticeStrip; + + public StripVisibilityGroup(final View suggestionStripView, + final ViewGroup suggestionsStrip, final ViewGroup addToDictionaryStrip, + final View importantNoticeStrip) { + mSuggestionStripView = suggestionStripView; + mSuggestionsStrip = suggestionsStrip; + mAddToDictionaryStrip = addToDictionaryStrip; + mImportantNoticeStrip = importantNoticeStrip; + showSuggestionsStrip(); + } + + public void setLayoutDirection(final boolean isRtlLanguage) { + final int layoutDirection = isRtlLanguage ? ViewCompat.LAYOUT_DIRECTION_RTL + : ViewCompat.LAYOUT_DIRECTION_LTR; + ViewCompat.setLayoutDirection(mSuggestionStripView, layoutDirection); + ViewCompat.setLayoutDirection(mSuggestionsStrip, layoutDirection); + ViewCompat.setLayoutDirection(mAddToDictionaryStrip, layoutDirection); + ViewCompat.setLayoutDirection(mImportantNoticeStrip, layoutDirection); + } + + public void showSuggestionsStrip() { + mSuggestionsStrip.setVisibility(VISIBLE); + mAddToDictionaryStrip.setVisibility(INVISIBLE); + mImportantNoticeStrip.setVisibility(INVISIBLE); + } + + public void showAddToDictionaryStrip() { + mSuggestionsStrip.setVisibility(INVISIBLE); + mAddToDictionaryStrip.setVisibility(VISIBLE); + mImportantNoticeStrip.setVisibility(INVISIBLE); + } + + public void showImportantNoticeStrip() { + mSuggestionsStrip.setVisibility(INVISIBLE); + mAddToDictionaryStrip.setVisibility(INVISIBLE); + mImportantNoticeStrip.setVisibility(VISIBLE); + } + + public boolean isShowingAddToDictionaryStrip() { + return mAddToDictionaryStrip.getVisibility() == VISIBLE; + } + } /** * Construct a {@link SuggestionStripView} for showing suggestions to be picked by the user. @@ -91,15 +152,23 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick inflater.inflate(R.layout.suggestions_strip, this); mSuggestionsStrip = (ViewGroup)findViewById(R.id.suggestions_strip); - for (int pos = 0; pos < MAX_SUGGESTIONS; pos++) { - final TextView word = (TextView)inflater.inflate(R.layout.suggestion_word, null); + mVoiceKey = (ImageButton)findViewById(R.id.suggestions_strip_voice_key); + mAddToDictionaryStrip = (ViewGroup)findViewById(R.id.add_to_dictionary_strip); + mImportantNoticeStrip = findViewById(R.id.important_notice_strip); + mStripVisibilityGroup = new StripVisibilityGroup(this, mSuggestionsStrip, + mAddToDictionaryStrip, mImportantNoticeStrip); + + for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) { + final TextView word = new TextView(context, null, R.attr.suggestionWordStyle); word.setOnClickListener(this); word.setOnLongClickListener(this); mWordViews.add(word); final View divider = inflater.inflate(R.layout.suggestion_divider, null); - divider.setOnClickListener(this); mDividerViews.add(divider); - mDebugInfoViews.add((TextView)inflater.inflate(R.layout.suggestion_info, null)); + final TextView info = new TextView(context, null, R.attr.suggestionWordStyle); + info.setTextColor(Color.WHITE); + info.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEBUG_INFO_TEXT_SIZE_IN_DIP); + mDebugInfoViews.add(info); } mLayoutHelper = new SuggestionStripLayoutHelper( @@ -112,9 +181,16 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final Resources res = context.getResources(); mMoreSuggestionsModalTolerance = res.getDimensionPixelOffset( - R.dimen.more_suggestions_modal_tolerance); + R.dimen.config_more_suggestions_modal_tolerance); mMoreSuggestionsSlidingDetector = new GestureDetector( context, mMoreSuggestionsSlidingListener); + + final TypedArray keyboardAttr = context.obtainStyledAttributes(attrs, + R.styleable.Keyboard, defStyle, R.style.SuggestionStripView); + final Drawable iconVoice = keyboardAttr.getDrawable(R.styleable.Keyboard_iconShortcutKey); + keyboardAttr.recycle(); + mVoiceKey.setImageDrawable(iconVoice); + mVoiceKey.setOnClickListener(this); } /** @@ -126,13 +202,20 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mMainKeyboardView = (MainKeyboardView)inputView.findViewById(R.id.keyboard_view); } - public void setSuggestions(final SuggestedWords suggestedWords) { + public void updateVisibility(final boolean shouldBeVisible, final boolean isFullscreenMode) { + final int visibility = shouldBeVisible ? VISIBLE : (isFullscreenMode ? GONE : INVISIBLE); + setVisibility(visibility); + final SettingsValues currentSettingsValues = Settings.getInstance().getCurrent(); + mVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : INVISIBLE); + } + + public void setSuggestions(final SuggestedWords suggestedWords, final boolean isRtlLanguage) { clear(); + mStripVisibilityGroup.setLayoutDirection(isRtlLanguage); mSuggestedWords = suggestedWords; - mLayoutHelper.layout(mSuggestedWords, mSuggestionsStrip, this); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.suggestionStripView_setSuggestions(mSuggestedWords); - } + mSuggestionsCountInStrip = mLayoutHelper.layoutAndReturnSuggestionCountInStrip( + mSuggestedWords, mSuggestionsStrip, this); + mStripVisibilityGroup.showSuggestionsStrip(); } public int setMoreSuggestionsHeight(final int remainingHeight) { @@ -140,14 +223,16 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick } public boolean isShowingAddToDictionaryHint() { - return mSuggestionsStrip.getChildCount() > 0 - && mLayoutHelper.isAddToDictionaryShowing(mSuggestionsStrip.getChildAt(0)); + return mStripVisibilityGroup.isShowingAddToDictionaryStrip(); } - public void showAddToDictionaryHint(final String word, final CharSequence hintText) { - clear(); - mLayoutHelper.layoutAddToDictionaryHint( - word, mSuggestionsStrip, getWidth(), hintText, this); + public void showAddToDictionaryHint(final String word) { + mLayoutHelper.layoutAddToDictionaryHint(word, mAddToDictionaryStrip); + // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word + // will be extracted at {@link #onClick(View)}. + mAddToDictionaryStrip.setTag(word); + mAddToDictionaryStrip.setOnClickListener(this); + mStripVisibilityGroup.showAddToDictionaryStrip(); } public boolean dismissAddToDictionaryHint() { @@ -158,31 +243,65 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick return false; } + // This method checks if we should show the important notice (checks on permanent storage if + // it has been shown once already or not, and if in the setup wizard). If applicable, it shows + // the notice. In all cases, it returns true if it was shown, false otherwise. + public boolean maybeShowImportantNoticeTitle() { + if (!ImportantNoticeUtils.shouldShowImportantNotice(getContext())) { + return false; + } + if (getWidth() <= 0) { + return false; + } + final String importantNoticeTitle = ImportantNoticeUtils.getNextImportantNoticeTitle( + getContext()); + if (TextUtils.isEmpty(importantNoticeTitle)) { + return false; + } + if (isShowingMoreSuggestionPanel()) { + dismissMoreSuggestionsPanel(); + } + mLayoutHelper.layoutImportantNotice(mImportantNoticeStrip, importantNoticeTitle); + mStripVisibilityGroup.showImportantNoticeStrip(); + mImportantNoticeStrip.setOnClickListener(this); + return true; + } + public void clear() { mSuggestionsStrip.removeAllViews(); - removeAllViews(); - addView(mSuggestionsStrip); - mMoreSuggestionsView.dismissMoreKeysPanel(); + removeAllDebugInfoViews(); + mStripVisibilityGroup.showSuggestionsStrip(); + dismissMoreSuggestionsPanel(); + } + + private void removeAllDebugInfoViews() { + // The debug info views may be placed as children views of this {@link SuggestionStripView}. + for (final View debugInfoView : mDebugInfoViews) { + final ViewParent parent = debugInfoView.getParent(); + if (parent instanceof ViewGroup) { + ((ViewGroup)parent).removeView(debugInfoView); + } + } } private final MoreSuggestionsListener mMoreSuggestionsListener = new MoreSuggestionsListener() { @Override - public void onSuggestionSelected(final int index, final SuggestedWordInfo wordInfo) { - mListener.pickSuggestionManually(index, wordInfo); - mMoreSuggestionsView.dismissMoreKeysPanel(); + public void onSuggestionSelected(final SuggestedWordInfo wordInfo) { + mListener.pickSuggestionManually(wordInfo); + dismissMoreSuggestionsPanel(); } @Override public void onCancelInput() { - mMoreSuggestionsView.dismissMoreKeysPanel(); + dismissMoreSuggestionsPanel(); } }; private final MoreKeysPanel.Controller mMoreSuggestionsController = new MoreKeysPanel.Controller() { @Override - public void onDismissMoreKeysPanel(final MoreKeysPanel panel) { - mMainKeyboardView.onDismissMoreKeysPanel(panel); + public void onDismissMoreKeysPanel() { + mMainKeyboardView.onDismissMoreKeysPanel(); } @Override @@ -191,11 +310,19 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick } @Override - public void onCancelMoreKeysPanel(final MoreKeysPanel panel) { - mMoreSuggestionsView.dismissMoreKeysPanel(); + public void onCancelMoreKeysPanel() { + dismissMoreSuggestionsPanel(); } }; + public boolean isShowingMoreSuggestionPanel() { + return mMoreSuggestionsView.isShowingInParent(); + } + + public void dismissMoreSuggestionsPanel() { + mMoreSuggestionsView.dismissMoreKeysPanel(); + } + @Override public boolean onLongClick(final View view) { AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback( @@ -204,7 +331,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick } boolean showMoreSuggestions() { - final Keyboard parentKeyboard = KeyboardSwitcher.getInstance().getKeyboard(); + final Keyboard parentKeyboard = mMainKeyboardView.getKeyboard(); if (parentKeyboard == null) { return false; } @@ -212,11 +339,17 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick if (!layoutHelper.mMoreSuggestionsAvailable) { return false; } + // Dismiss another {@link MoreKeysPanel} that may be being showed, for example + // {@link MoreKeysKeyboardView}. + mMainKeyboardView.onDismissMoreKeysPanel(); + // Dismiss all key previews and sliding key input preview that may be being showed. + mMainKeyboardView.dismissAllKeyPreviews(); + mMainKeyboardView.dismissSlidingKeyInputPreview(); final int stripWidth = getWidth(); final View container = mMoreSuggestionsContainer; final int maxWidth = stripWidth - container.getPaddingLeft() - container.getPaddingRight(); final MoreSuggestions.Builder builder = mMoreSuggestionsBuilder; - builder.layout(mSuggestedWords, layoutHelper.mSuggestionsCountInStrip, maxWidth, + builder.layout(mSuggestedWords, mSuggestionsCountInStrip, maxWidth, (int)(maxWidth * layoutHelper.mMinMoreSuggestionsWidth), layoutHelper.getMaxMoreSuggestionsRow(), parentKeyboard); mMoreSuggestionsView.setKeyboard(builder.build()); @@ -227,20 +360,16 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final int pointY = -layoutHelper.mMoreSuggestionsBottomGap; moreKeysPanel.showMoreKeysPanel(this, mMoreSuggestionsController, pointX, pointY, mMoreSuggestionsListener); - mMoreSuggestionsMode = MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING; mOriginX = mLastX; mOriginY = mLastY; - for (int i = 0; i < layoutHelper.mSuggestionsCountInStrip; i++) { + for (int i = 0; i < mSuggestionsCountInStrip; i++) { mWordViews.get(i).setPressed(false); } return true; } - // Working variables for onLongClick and dispatchTouchEvent. - private int mMoreSuggestionsMode = MORE_SUGGESTIONS_IN_MODAL_MODE; - private static final int MORE_SUGGESTIONS_IN_MODAL_MODE = 0; - private static final int MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING = 1; - private static final int MORE_SUGGESTIONS_IN_SLIDING_MODE = 2; + // Working variables for {@link #onLongClick(View)} and + // {@link onInterceptTouchEvent(MotionEvent)}. private int mLastX; private int mLastY; private int mOriginX; @@ -260,36 +389,45 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick }; @Override - public boolean dispatchTouchEvent(final MotionEvent me) { + public boolean onInterceptTouchEvent(final MotionEvent me) { if (!mMoreSuggestionsView.isShowingInParent()) { mLastX = (int)me.getX(); mLastY = (int)me.getY(); - if (mMoreSuggestionsSlidingDetector.onTouchEvent(me)) { - return true; - } - return super.dispatchTouchEvent(me); + return mMoreSuggestionsSlidingDetector.onTouchEvent(me); } final int action = me.getAction(); final int index = me.getActionIndex(); final int x = (int)me.getX(index); final int y = (int)me.getY(index); - - if (mMoreSuggestionsMode == MORE_SUGGESTIONS_CHECKING_MODAL_OR_SLIDING) { - if (Math.abs(x - mOriginX) >= mMoreSuggestionsModalTolerance - || mOriginY - y >= mMoreSuggestionsModalTolerance) { - // Decided to be in the sliding input mode only when the touch point has been moved - // upward. - mMoreSuggestionsMode = MORE_SUGGESTIONS_IN_SLIDING_MODE; - } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) { - // Decided to be in the modal input mode - mMoreSuggestionsMode = MORE_SUGGESTIONS_IN_MODAL_MODE; - mMoreSuggestionsView.adjustVerticalCorrectionForModalMode(); - } + if (Math.abs(x - mOriginX) >= mMoreSuggestionsModalTolerance + || mOriginY - y >= mMoreSuggestionsModalTolerance) { + // Decided to be in the sliding input mode only when the touch point has been moved + // upward. Further {@link MotionEvent}s will be delivered to + // {@link #onTouchEvent(MotionEvent)}. return true; } - // MORE_SUGGESTIONS_IN_SLIDING_MODE + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP) { + // Decided to be in the modal input mode. + mMoreSuggestionsView.adjustVerticalCorrectionForModalMode(); + } + return false; + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) { + // Don't populate accessibility event with suggested words and voice key. + return true; + } + + @Override + public boolean onTouchEvent(final MotionEvent me) { + // In the sliding input mode. {@link MotionEvent} should be forwarded to + // {@link MoreSuggestionsView}. + final int index = me.getActionIndex(); + final int x = (int)me.getX(index); + final int y = (int)me.getY(index); me.setLocation(mMoreSuggestionsView.translateX(x), mMoreSuggestionsView.translateY(y)); mMoreSuggestionsView.onTouchEvent(me); return true; @@ -297,31 +435,52 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick @Override public void onClick(final View view) { - if (mLayoutHelper.isAddToDictionaryShowing(view)) { - mListener.addWordToUserDictionary(mLayoutHelper.getAddToDictionaryWord()); - clear(); + AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback( + Constants.CODE_UNSPECIFIED, this); + if (view == mImportantNoticeStrip) { + mListener.showImportantNoticeContents(); return; } - - final Object tag = view.getTag(); - // Integer tag is set at - // {@link SuggestionStripLayoutHelper#setupWordViewsTextAndColor(SuggestedWords,int)} and - // {@link SuggestionStripLayoutHelper#layoutPunctuationSuggestions(SuggestedWords,ViewGroup} - if (!(tag instanceof Integer)) { + if (view == mVoiceKey) { + mListener.onCodeInput(Constants.CODE_SHORTCUT, + Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, + false /* isKeyRepeat */); return; } - final int index = (Integer) tag; - if (index >= mSuggestedWords.size()) { + final Object tag = view.getTag(); + // {@link String} tag is set at {@link #showAddToDictionaryHint(String,CharSequence)}. + if (tag instanceof String) { + final String wordToSave = (String)tag; + mListener.addWordToUserDictionary(wordToSave); + clear(); return; } - final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index); - mListener.pickSuggestionManually(index, wordInfo); + // {@link Integer} tag is set at + // {@link SuggestionStripLayoutHelper#setupWordViewsTextAndColor(SuggestedWords,int)} and + // {@link SuggestionStripLayoutHelper#layoutPunctuationSuggestions(SuggestedWords,ViewGroup} + if (tag instanceof Integer) { + final int index = (Integer) tag; + if (index >= mSuggestedWords.size()) { + return; + } + final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index); + mListener.pickSuggestionManually(wordInfo); + } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mMoreSuggestionsView.dismissMoreKeysPanel(); + dismissMoreSuggestionsPanel(); + } + + @Override + protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) { + // Called by the framework when the size is known. Show the important notice if applicable. + // This may be overriden by showing suggestions later, if applicable. + if (oldw <= 0 && w > 0) { + maybeShowImportantNoticeTitle(); + } } } diff --git a/java/src/com/android/inputmethod/event/EventDecoderSpec.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripViewAccessor.java index 303b4b4c9..52708455e 100644 --- a/java/src/com/android/inputmethod/event/EventDecoderSpec.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripViewAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2014 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. @@ -14,13 +14,17 @@ * limitations under the License. */ -package com.android.inputmethod.event; +package com.android.inputmethod.latin.suggestions; + +import com.android.inputmethod.latin.SuggestedWords; /** - * Class describing a decoder chain. This will depend on the language and the input medium (soft - * or hard keyboard for example). + * An object that gives basic control of a suggestion strip and some info on it. */ -public class EventDecoderSpec { - public EventDecoderSpec() { - } +public interface SuggestionStripViewAccessor { + public void showAddToDictionaryHint(final String word); + public boolean isShowingAddToDictionaryHint(); + public void dismissAddToDictionaryHint(); + public void setNeutralSuggestionStrip(); + public void showSuggestionStrip(final SuggestedWords suggestedWords); } diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java index 21426d1eb..eda81940f 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java @@ -167,7 +167,9 @@ public class UserDictionaryAddWordContents { // should not insert, because either A. the word exists with no shortcut, in which // case the exact same thing we want to insert is already there, or B. the word // exists with at least one shortcut, in which case it has priority on our word. - if (hasWord(newWord, context)) return CODE_ALREADY_PRESENT; + if (TextUtils.isEmpty(newShortcut) && hasWord(newWord, context)) { + return CODE_ALREADY_PRESENT; + } // Disallow duplicates. If the same word with no shortcut is defined, remove it; if // the same word with the same shortcut is defined, remove it; but we don't mind if @@ -256,7 +258,7 @@ public class UserDictionaryAddWordContents { // The system locale should be inside. We want it at the 2nd spot. locales.remove(systemLocale); // system locale may not be null locales.remove(""); // Remove the empty string if it's there - final ArrayList<LocaleRenderer> localesList = new ArrayList<LocaleRenderer>(); + final ArrayList<LocaleRenderer> localesList = new ArrayList<>(); // Add the passed locale, then the system locale at the top of the list. Add an // "all languages" entry at the bottom of the list. addLocaleDisplayNameToList(activity, localesList, mLocale); diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordFragment.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordFragment.java index 4fc132f68..163443036 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordFragment.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordFragment.java @@ -134,8 +134,8 @@ public class UserDictionaryAddWordFragment extends Fragment final Spinner localeSpinner = (Spinner)mRootView.findViewById(R.id.user_dictionary_add_locale); - final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<LocaleRenderer>(getActivity(), - android.R.layout.simple_spinner_item, localesList); + final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<>( + getActivity(), android.R.layout.simple_spinner_item, localesList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); localeSpinner.setAdapter(adapter); localeSpinner.setOnItemSelectedListener(this); diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java index 32c4950da..624783a70 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java @@ -53,20 +53,24 @@ public class UserDictionaryList extends PreferenceFragment { } public static TreeSet<String> getUserDictionaryLocalesSet(Activity activity) { - @SuppressWarnings("deprecation") - final Cursor cursor = activity.managedQuery(UserDictionary.Words.CONTENT_URI, + final Cursor cursor = activity.getContentResolver().query(UserDictionary.Words.CONTENT_URI, new String[] { UserDictionary.Words.LOCALE }, null, null, null); - final TreeSet<String> localeSet = new TreeSet<String>(); + final TreeSet<String> localeSet = new TreeSet<>(); if (null == cursor) { // The user dictionary service is not present or disabled. Return null. return null; - } else if (cursor.moveToFirst()) { - final int columnIndex = cursor.getColumnIndex(UserDictionary.Words.LOCALE); - do { - final String locale = cursor.getString(columnIndex); - localeSet.add(null != locale ? locale : ""); - } while (cursor.moveToNext()); + } + try { + if (cursor.moveToFirst()) { + final int columnIndex = cursor.getColumnIndex(UserDictionary.Words.LOCALE); + do { + final String locale = cursor.getString(columnIndex); + localeSet.add(null != locale ? locale : ""); + } while (cursor.moveToNext()); + } + } finally { + cursor.close(); } if (!UserDictionarySettings.IS_SHORTCUT_API_SUPPORTED) { // For ICS, we need to show "For all languages" in case that the keyboard locale diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java index 7571e87c5..cf2014a1a 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java @@ -140,6 +140,11 @@ public class UserDictionarySettings extends ListFragment { } mLocale = locale; + // WARNING: The following cursor is never closed! TODO: don't put that in a member, and + // make sure all cursors are correctly closed. Also, this comes from a call to + // Activity#managedQuery, which has been deprecated for a long time (and which FORBIDS + // closing the cursor, so take care when resolving this TODO). We should either use a + // regular query and close the cursor, or switch to a LoaderManager and a CursorLoader. mCursor = createCursor(locale); TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); emptyView.setText(R.string.user_dict_settings_empty_text); diff --git a/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java b/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java index d87f6f3c4..db7f2a56c 100644 --- a/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java @@ -17,53 +17,73 @@ package com.android.inputmethod.latin.utils; import static com.android.inputmethod.latin.Constants.Subtype.KEYBOARD_MODE; +import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.ASCII_CAPABLE; +import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.EMOJI_CAPABLE; import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.IS_ADDITIONAL_SUBTYPE; import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET; import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME; import android.os.Build; import android.text.TextUtils; +import android.util.Log; import android.view.inputmethod.InputMethodSubtype; +import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils; -import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; import java.util.ArrayList; +import java.util.Arrays; public final class AdditionalSubtypeUtils { + private static final String TAG = AdditionalSubtypeUtils.class.getSimpleName(); + private static final InputMethodSubtype[] EMPTY_SUBTYPE_ARRAY = new InputMethodSubtype[0]; private AdditionalSubtypeUtils() { // This utility class is not publicly instantiable. } + @UsedForTesting public static boolean isAdditionalSubtype(final InputMethodSubtype subtype) { return subtype.containsExtraValueKey(IS_ADDITIONAL_SUBTYPE); } private static final String LOCALE_AND_LAYOUT_SEPARATOR = ":"; + private static final int INDEX_OF_LOCALE = 0; + private static final int INDEX_OF_KEYBOARD_LAYOUT = 1; + private static final int INDEX_OF_EXTRA_VALUE = 2; + private static final int LENGTH_WITHOUT_EXTRA_VALUE = (INDEX_OF_KEYBOARD_LAYOUT + 1); + private static final int LENGTH_WITH_EXTRA_VALUE = (INDEX_OF_EXTRA_VALUE + 1); private static final String PREF_SUBTYPE_SEPARATOR = ";"; - public static InputMethodSubtype createAdditionalSubtype(final String localeString, - final String keyboardLayoutSetName, final String extraValue) { - final String layoutExtraValue = KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName; - final String layoutDisplayNameExtraValue; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN - && SubtypeLocaleUtils.isExceptionalLocale(localeString)) { - final String layoutDisplayName = SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName( - keyboardLayoutSetName); - layoutDisplayNameExtraValue = StringUtils.appendToCommaSplittableTextIfNotExists( - UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" + layoutDisplayName, extraValue); - } else { - layoutDisplayNameExtraValue = extraValue; - } - final String additionalSubtypeExtraValue = - StringUtils.appendToCommaSplittableTextIfNotExists( - IS_ADDITIONAL_SUBTYPE, layoutDisplayNameExtraValue); + private static InputMethodSubtype createAdditionalSubtypeInternal( + final String localeString, final String keyboardLayoutSetName, + final boolean isAsciiCapable, final boolean isEmojiCapable) { final int nameId = SubtypeLocaleUtils.getSubtypeNameId(localeString, keyboardLayoutSetName); - return buildInputMethodSubtype( - nameId, localeString, layoutExtraValue, additionalSubtypeExtraValue); + final String platformVersionDependentExtraValues = getPlatformVersionDependentExtraValue( + localeString, keyboardLayoutSetName, isAsciiCapable, isEmojiCapable); + final int platformVersionIndependentSubtypeId = + getPlatformVersionIndependentSubtypeId(localeString, keyboardLayoutSetName); + // NOTE: In KitKat and later, InputMethodSubtypeBuilder#setIsAsciiCapable is also available. + // TODO: Use InputMethodSubtypeBuilder#setIsAsciiCapable when appropriate. + return InputMethodSubtypeCompatUtils.newInputMethodSubtype(nameId, + R.drawable.ic_ime_switcher_dark, localeString, KEYBOARD_MODE, + platformVersionDependentExtraValues, + false /* isAuxiliary */, false /* overrideImplicitlyEnabledSubtype */, + platformVersionIndependentSubtypeId); + } + + public static InputMethodSubtype createDummyAdditionalSubtype( + final String localeString, final String keyboardLayoutSetName) { + return createAdditionalSubtypeInternal(localeString, keyboardLayoutSetName, + false /* isAsciiCapable */, false /* isEmojiCapable */); + } + + public static InputMethodSubtype createAsciiEmojiCapableAdditionalSubtype( + final String localeString, final String keyboardLayoutSetName) { + return createAdditionalSubtypeInternal(localeString, keyboardLayoutSetName, + true /* isAsciiCapable */, true /* isEmojiCapable */); } public static String getPrefSubtype(final InputMethodSubtype subtype) { @@ -79,26 +99,26 @@ public final class AdditionalSubtypeUtils { : basePrefSubtype + LOCALE_AND_LAYOUT_SEPARATOR + extraValue; } - public static InputMethodSubtype createAdditionalSubtype(final String prefSubtype) { - final String elems[] = prefSubtype.split(LOCALE_AND_LAYOUT_SEPARATOR); - if (elems.length < 2 || elems.length > 3) { - throw new RuntimeException("Unknown additional subtype specified: " + prefSubtype); - } - final String localeString = elems[0]; - final String keyboardLayoutSetName = elems[1]; - final String extraValue = (elems.length == 3) ? elems[2] : null; - return createAdditionalSubtype(localeString, keyboardLayoutSetName, extraValue); - } - public static InputMethodSubtype[] createAdditionalSubtypesArray(final String prefSubtypes) { if (TextUtils.isEmpty(prefSubtypes)) { return EMPTY_SUBTYPE_ARRAY; } final String[] prefSubtypeArray = prefSubtypes.split(PREF_SUBTYPE_SEPARATOR); - final ArrayList<InputMethodSubtype> subtypesList = - CollectionUtils.newArrayList(prefSubtypeArray.length); + final ArrayList<InputMethodSubtype> subtypesList = new ArrayList<>(prefSubtypeArray.length); for (final String prefSubtype : prefSubtypeArray) { - final InputMethodSubtype subtype = createAdditionalSubtype(prefSubtype); + final String elems[] = prefSubtype.split(LOCALE_AND_LAYOUT_SEPARATOR); + if (elems.length != LENGTH_WITHOUT_EXTRA_VALUE + && elems.length != LENGTH_WITH_EXTRA_VALUE) { + Log.w(TAG, "Unknown additional subtype specified: " + prefSubtype + " in " + + prefSubtypes); + continue; + } + final String localeString = elems[INDEX_OF_LOCALE]; + final String keyboardLayoutSetName = elems[INDEX_OF_KEYBOARD_LAYOUT]; + // Here we assume that all the additional subtypes have AsciiCapable and EmojiCapable. + // This is actually what the setting dialog for additional subtype is doing. + final InputMethodSubtype subtype = createAsciiEmojiCapableAdditionalSubtype( + localeString, keyboardLayoutSetName); if (subtype.getNameResId() == SubtypeLocaleUtils.UNKNOWN_KEYBOARD_LAYOUT) { // Skip unknown keyboard layout subtype. This may happen when predefined keyboard // layout has been removed. @@ -137,31 +157,81 @@ public final class AdditionalSubtypeUtils { return sb.toString(); } - private static InputMethodSubtype buildInputMethodSubtype(int nameId, String localeString, - String layoutExtraValue, String additionalSubtypeExtraValue) { - // CAVEAT! If you want to change subtypeId after changing the extra values, - // you must change "getInputMethodSubtypeId". But it will remove the additional keyboard - // from the current users. So, you should be really careful to change it. - final int subtypeId = getInputMethodSubtypeId(nameId, localeString, layoutExtraValue, - additionalSubtypeExtraValue); - final String extraValue; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - extraValue = layoutExtraValue + "," + additionalSubtypeExtraValue - + "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE - + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE; - } else { - extraValue = layoutExtraValue + "," + additionalSubtypeExtraValue; + /** + * Returns the extra value that is optimized for the running OS. + * <p> + * Historically the extra value has been used as the last resort to annotate various kinds of + * attributes. Some of these attributes are valid only on some platform versions. Thus we cannot + * assume that the extra values stored in a persistent storage are always valid. We need to + * regenerate the extra value on the fly instead. + * </p> + * @param localeString the locale string (e.g., "en_US"). + * @param keyboardLayoutSetName the keyboard layout set name (e.g., "dvorak"). + * @param isAsciiCapable true when ASCII characters are supported with this layout. + * @param isEmojiCapable true when Unicode Emoji characters are supported with this layout. + * @return extra value that is optimized for the running OS. + * @see #getPlatformVersionIndependentSubtypeId(String, String) + */ + private static String getPlatformVersionDependentExtraValue(final String localeString, + final String keyboardLayoutSetName, final boolean isAsciiCapable, + final boolean isEmojiCapable) { + final ArrayList<String> extraValueItems = new ArrayList<>(); + extraValueItems.add(KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName); + if (isAsciiCapable) { + extraValueItems.add(ASCII_CAPABLE); } - return InputMethodSubtypeCompatUtils.newInputMethodSubtype(nameId, - R.drawable.ic_ime_switcher_dark, localeString, KEYBOARD_MODE, extraValue, - false, false, subtypeId); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && + SubtypeLocaleUtils.isExceptionalLocale(localeString)) { + extraValueItems.add(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" + + SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(keyboardLayoutSetName)); + } + if (isEmojiCapable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + extraValueItems.add(EMOJI_CAPABLE); + } + extraValueItems.add(IS_ADDITIONAL_SUBTYPE); + return TextUtils.join(",", extraValueItems); } - private static int getInputMethodSubtypeId(int nameId, String localeString, - String layoutExtraValue, String additionalSubtypeExtraValue) { - // TODO: Use InputMethodSubtypeBuilder once we use SDK version 19. - return (new InputMethodSubtype(nameId, R.drawable.ic_ime_switcher_dark, - localeString, KEYBOARD_MODE, layoutExtraValue + "," + additionalSubtypeExtraValue, - false, false)).hashCode(); + /** + * Returns the subtype ID that is supposed to be compatible between different version of OSes. + * <p> + * From the compatibility point of view, it is important to keep subtype id predictable and + * stable between different OSes. For this purpose, the calculation code in this method is + * carefully chosen and then fixed. Treat the following code as no more or less than a + * hash function. Each component to be hashed can be different from the corresponding value + * that is used to instantiate {@link InputMethodSubtype} actually. + * For example, you don't need to update <code>compatibilityExtraValueItems</code> in this + * method even when we need to add some new extra values for the actual instance of + * {@link InputMethodSubtype}. + * </p> + * @param localeString the locale string (e.g., "en_US"). + * @param keyboardLayoutSetName the keyboard layout set name (e.g., "dvorak"). + * @return a platform-version independent subtype ID. + * @see #getPlatformVersionDependentExtraValue(String, String, boolean, boolean) + */ + private static int getPlatformVersionIndependentSubtypeId(final String localeString, + final String keyboardLayoutSetName) { + // For compatibility reasons, we concatenate the extra values in the following order. + // - KeyboardLayoutSet + // - AsciiCapable + // - UntranslatableReplacementStringInSubtypeName + // - EmojiCapable + // - isAdditionalSubtype + final ArrayList<String> compatibilityExtraValueItems = new ArrayList<>(); + compatibilityExtraValueItems.add(KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName); + compatibilityExtraValueItems.add(ASCII_CAPABLE); + if (SubtypeLocaleUtils.isExceptionalLocale(localeString)) { + compatibilityExtraValueItems.add(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" + + SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(keyboardLayoutSetName)); + } + compatibilityExtraValueItems.add(EMOJI_CAPABLE); + compatibilityExtraValueItems.add(IS_ADDITIONAL_SUBTYPE); + final String compatibilityExtraValues = TextUtils.join(",", compatibilityExtraValueItems); + return Arrays.hashCode(new Object[] { + localeString, + KEYBOARD_MODE, + compatibilityExtraValues, + false /* isAuxiliary */, + false /* overrideImplicitlyEnabledSubtype */ }); } } diff --git a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java index 08a2a8c5a..7a4150def 100644 --- a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java @@ -31,7 +31,7 @@ public final class ApplicationUtils { // This utility class is not publicly instantiable. } - public static int getAcitivityTitleResId(final Context context, + public static int getActivityTitleResId(final Context context, final Class<? extends Activity> cls) { final ComponentName cn = new ComponentName(context, cls); try { @@ -62,4 +62,22 @@ public final class ApplicationUtils { } return ""; } + + /** + * A utility method to get the application's PackageInfo.versionCode + * @return the application's PackageInfo.versionCode + */ + public static int getVersionCode(final Context context) { + try { + if (context == null) { + return 0; + } + final String packageName = context.getPackageName(); + final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); + return info.versionCode; + } catch (final NameNotFoundException e) { + Log.e(TAG, "Could not find version info.", e); + } + return 0; + } } diff --git a/java/src/com/android/inputmethod/latin/utils/AsyncResultHolder.java b/java/src/com/android/inputmethod/latin/utils/AsyncResultHolder.java index c2e97a36f..d12aad639 100644 --- a/java/src/com/android/inputmethod/latin/utils/AsyncResultHolder.java +++ b/java/src/com/android/inputmethod/latin/utils/AsyncResultHolder.java @@ -20,7 +20,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** - * This class is a holder of a result of asynchronous computation. + * This class is a holder of the result of an asynchronous computation. * * @param <E> the type of the result. */ @@ -36,9 +36,9 @@ public class AsyncResultHolder<E> { } /** - * Sets the result value to this holder. + * Sets the result value of this holder. * - * @param result the value which is set. + * @param result the value to set. */ public void set(final E result) { synchronized(mLock) { @@ -54,12 +54,12 @@ public class AsyncResultHolder<E> { * Causes the current thread to wait unless the value is set or the specified time is elapsed. * * @param defaultValue the default value. - * @param timeOut the time to wait. - * @return if the result is set until the time limit then the result, otherwise defaultValue. + * @param timeOut the maximum time to wait. + * @return if the result is set before the time limit then the result, otherwise defaultValue. */ public E get(final E defaultValue, final long timeOut) { try { - if(mLatch.await(timeOut, TimeUnit.MILLISECONDS)) { + if (mLatch.await(timeOut, TimeUnit.MILLISECONDS)) { return mResult; } else { return defaultValue; diff --git a/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java b/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java index 066c5fd32..34ee2152a 100644 --- a/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java @@ -16,16 +16,10 @@ package com.android.inputmethod.latin.utils; -import com.android.inputmethod.latin.BinaryDictionary; -import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.Suggest; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; - -import android.text.TextUtils; import android.util.Log; -import java.util.concurrent.ConcurrentHashMap; +import com.android.inputmethod.latin.LatinImeLogger; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; public final class AutoCorrectionUtils { private static final boolean DBG = LatinImeLogger.sDBG; @@ -36,58 +30,18 @@ public final class AutoCorrectionUtils { // Purely static class: can't instantiate. } - public static boolean isValidWord(final Suggest suggest, final String word, - final boolean ignoreCase) { - if (TextUtils.isEmpty(word)) { - return false; - } - final ConcurrentHashMap<String, Dictionary> dictionaries = suggest.getUnigramDictionaries(); - final String lowerCasedWord = word.toLowerCase(suggest.mLocale); - for (final String key : dictionaries.keySet()) { - final Dictionary dictionary = dictionaries.get(key); - // It's unclear how realistically 'dictionary' can be null, but the monkey is somehow - // managing to get null in here. Presumably the language is changing to a language with - // no main dictionary and the monkey manages to type a whole word before the thread - // that reads the dictionary is started or something? - // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and - // would be immutable once it's finished initializing, but concretely a null test is - // probably good enough for the time being. - if (null == dictionary) continue; - if (dictionary.isValidWord(word) - || (ignoreCase && dictionary.isValidWord(lowerCasedWord))) { - return true; - } - } - return false; - } - - public static int getMaxFrequency(final ConcurrentHashMap<String, Dictionary> dictionaries, - final String word) { - if (TextUtils.isEmpty(word)) { - return Dictionary.NOT_A_PROBABILITY; - } - int maxFreq = -1; - for (final String key : dictionaries.keySet()) { - final Dictionary dictionary = dictionaries.get(key); - if (null == dictionary) continue; - final int tempFreq = dictionary.getFrequency(word); - if (tempFreq >= maxFreq) { - maxFreq = tempFreq; - } - } - return maxFreq; - } - public static boolean suggestionExceedsAutoCorrectionThreshold( final SuggestedWordInfo suggestion, final String consideredWord, final float autoCorrectionThreshold) { if (null != suggestion) { // Shortlist a whitelisted word - if (suggestion.mKind == SuggestedWordInfo.KIND_WHITELIST) return true; + if (suggestion.isKindOf(SuggestedWordInfo.KIND_WHITELIST)) { + return true; + } final int autoCorrectionSuggestionScore = suggestion.mScore; // TODO: when the normalized score of the first suggestion is nearly equals to // the normalized score of the second suggestion, behave less aggressive. - final float normalizedScore = BinaryDictionary.calcNormalizedScore( + final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore( consideredWord, suggestion.mWord, autoCorrectionSuggestionScore); if (DBG) { Log.d(TAG, "Normalized " + consideredWord + "," + suggestion + "," @@ -118,9 +72,8 @@ public final class AutoCorrectionUtils { if (typedWordLength < MINIMUM_SAFETY_NET_CHAR_LENGTH) { return false; } - final int maxEditDistanceOfNativeDictionary = - (typedWordLength < 5 ? 2 : typedWordLength / 2) + 1; - final int distance = BinaryDictionary.editDistance(typedWord, suggestion); + final int maxEditDistanceOfNativeDictionary = (typedWordLength / 2) + 1; + final int distance = BinaryDictionaryUtils.editDistance(typedWord, suggestion); if (DBG) { Log.d(TAG, "Autocorrected edit distance = " + distance + ", " + maxEditDistanceOfNativeDictionary); diff --git a/java/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtils.java b/java/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtils.java new file mode 100644 index 000000000..5d7deba15 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/BinaryDictionaryUtils.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2014 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.utils; + +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.BinaryDictionary; +import com.android.inputmethod.latin.makedict.DictionaryHeader; +import com.android.inputmethod.latin.makedict.UnsupportedFormatException; +import com.android.inputmethod.latin.personalization.PersonalizationHelper; + +import java.io.File; +import java.io.IOException; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class BinaryDictionaryUtils { + private static final String TAG = BinaryDictionaryUtils.class.getSimpleName(); + + private BinaryDictionaryUtils() { + // This utility class is not publicly instantiable. + } + + static { + JniUtils.loadNativeLibrary(); + } + + private static native boolean createEmptyDictFileNative(String filePath, long dictVersion, + String locale, String[] attributeKeyStringArray, String[] attributeValueStringArray); + private static native float calcNormalizedScoreNative(int[] before, int[] after, int score); + private static native int editDistanceNative(int[] before, int[] after); + private static native int setCurrentTimeForTestNative(int currentTime); + + public static DictionaryHeader getHeader(final File dictFile) + throws IOException, UnsupportedFormatException { + return getHeaderWithOffsetAndLength(dictFile, 0 /* offset */, dictFile.length()); + } + + public static DictionaryHeader getHeaderWithOffsetAndLength(final File dictFile, + final long offset, final long length) throws IOException, UnsupportedFormatException { + // dictType is never used for reading the header. Passing an empty string. + final BinaryDictionary binaryDictionary = new BinaryDictionary( + dictFile.getAbsolutePath(), offset, length, + true /* useFullEditDistance */, null /* locale */, "" /* dictType */, + false /* isUpdatable */); + final DictionaryHeader header = binaryDictionary.getHeader(); + binaryDictionary.close(); + if (header == null) { + throw new IOException(); + } + return header; + } + + public static boolean renameDict(final File dictFile, final File newDictFile) { + if (dictFile.isFile()) { + return dictFile.renameTo(newDictFile); + } else if (dictFile.isDirectory()) { + final String dictName = dictFile.getName(); + final String newDictName = newDictFile.getName(); + if (newDictFile.exists()) { + return false; + } + for (final File file : dictFile.listFiles()) { + if (!file.isFile()) { + continue; + } + final String fileName = file.getName(); + final String newFileName = fileName.replaceFirst( + Pattern.quote(dictName), Matcher.quoteReplacement(newDictName)); + if (!file.renameTo(new File(dictFile, newFileName))) { + return false; + } + } + return dictFile.renameTo(newDictFile); + } + return false; + } + + @UsedForTesting + public static boolean createEmptyDictFile(final String filePath, final long dictVersion, + final Locale locale, final Map<String, String> attributeMap) { + final String[] keyArray = new String[attributeMap.size()]; + final String[] valueArray = new String[attributeMap.size()]; + int index = 0; + for (final String key : attributeMap.keySet()) { + keyArray[index] = key; + valueArray[index] = attributeMap.get(key); + index++; + } + return createEmptyDictFileNative(filePath, dictVersion, locale.toString(), keyArray, + valueArray); + } + + public static float calcNormalizedScore(final String before, final String after, + final int score) { + return calcNormalizedScoreNative(StringUtils.toCodePointArray(before), + StringUtils.toCodePointArray(after), score); + } + + public static int editDistance(final String before, final String after) { + if (before == null || after == null) { + throw new IllegalArgumentException(); + } + return editDistanceNative(StringUtils.toCodePointArray(before), + StringUtils.toCodePointArray(after)); + } + + /** + * Control the current time to be used in the native code. If currentTime >= 0, this method sets + * the current time and gets into test mode. + * In test mode, set timestamp is used as the current time in the native code. + * If currentTime < 0, quit the test mode and returns to using time() to get the current time. + * + * @param currentTime seconds since the unix epoch + * @return current time got in the native code. + */ + @UsedForTesting + public static int setCurrentTimeForTest(final int currentTime) { + final int currentNativeTimestamp = setCurrentTimeForTestNative(currentTime); + PersonalizationHelper.currentTimeChangedForTesting(currentNativeTimestamp); + return currentNativeTimestamp; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/BoundedTreeSet.java b/java/src/com/android/inputmethod/latin/utils/BoundedTreeSet.java deleted file mode 100644 index ae1fd3f79..000000000 --- a/java/src/com/android/inputmethod/latin/utils/BoundedTreeSet.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.utils; - -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; - -import java.util.Collection; -import java.util.Comparator; -import java.util.TreeSet; - -/** - * A TreeSet that is bounded in size and throws everything that's smaller than its limit - */ -public final class BoundedTreeSet extends TreeSet<SuggestedWordInfo> { - private final int mCapacity; - public BoundedTreeSet(final Comparator<SuggestedWordInfo> comparator, final int capacity) { - super(comparator); - mCapacity = capacity; - } - - @Override - public boolean add(final SuggestedWordInfo e) { - if (size() < mCapacity) return super.add(e); - if (comparator().compare(e, last()) > 0) return false; - super.add(e); - pollLast(); // removes the last element - return true; - } - - @Override - public boolean addAll(final Collection<? extends SuggestedWordInfo> e) { - if (null == e) return false; - return super.addAll(e); - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/ByteArrayDictBuffer.java b/java/src/com/android/inputmethod/latin/utils/ByteArrayDictBuffer.java deleted file mode 100644 index 2028298f2..000000000 --- a/java/src/com/android/inputmethod/latin/utils/ByteArrayDictBuffer.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013 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.utils; - -import com.android.inputmethod.latin.makedict.BinaryDictDecoderUtils.DictBuffer; - -/** - * This class provides an implementation for the FusionDictionary buffer interface that is backed - * by a simpled byte array. It allows to create a binary dictionary in memory. - */ -public final class ByteArrayDictBuffer implements DictBuffer { - private byte[] mBuffer; - private int mPosition; - - public ByteArrayDictBuffer(final byte[] buffer) { - mBuffer = buffer; - mPosition = 0; - } - - @Override - public int readUnsignedByte() { - return mBuffer[mPosition++] & 0xFF; - } - - @Override - public int readUnsignedShort() { - final int retval = readUnsignedByte(); - return (retval << 8) + readUnsignedByte(); - } - - @Override - public int readUnsignedInt24() { - final int retval = readUnsignedShort(); - return (retval << 8) + readUnsignedByte(); - } - - @Override - public int readInt() { - final int retval = readUnsignedShort(); - return (retval << 16) + readUnsignedShort(); - } - - @Override - public int position() { - return mPosition; - } - - @Override - public void position(int position) { - mPosition = position; - } - - @Override - public void put(final byte b) { - mBuffer[mPosition++] = b; - } - - @Override - public int limit() { - return mBuffer.length - 1; - } - - @Override - public int capacity() { - return mBuffer.length; - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java b/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java index 3d4404a98..936219332 100644 --- a/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java @@ -21,7 +21,7 @@ import android.text.TextUtils; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.WordComposer; -import com.android.inputmethod.latin.settings.SettingsValues; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; import java.util.Locale; @@ -62,6 +62,22 @@ public final class CapsModeUtils { } /** + * Helper method to find out if a code point is starting punctuation. + * + * This include the Unicode START_PUNCTUATION category, but also some other symbols that are + * starting, like the inverted question mark or the double quote. + * + * @param codePoint the code point + * @return true if it's starting punctuation, false otherwise. + */ + private static boolean isStartPunctuation(final int codePoint) { + return (codePoint == Constants.CODE_DOUBLE_QUOTE || codePoint == Constants.CODE_SINGLE_QUOTE + || codePoint == Constants.CODE_INVERTED_QUESTION_MARK + || codePoint == Constants.CODE_INVERTED_EXCLAMATION_MARK + || Character.getType(codePoint) == Character.START_PUNCTUATION); + } + + /** * Determine what caps mode should be in effect at the current offset in * the text. Only the mode bits set in <var>reqModes</var> will be * checked. Note that the caps mode flags here are explicitly defined @@ -74,7 +90,7 @@ public final class CapsModeUtils { * @param reqModes The modes to be checked: may be any combination of * {@link TextUtils#CAP_MODE_CHARACTERS}, {@link TextUtils#CAP_MODE_WORDS}, and * {@link TextUtils#CAP_MODE_SENTENCES}. - * @param settingsValues The current settings values. + * @param spacingAndPunctuations The current spacing and punctuations settings. * @param hasSpaceBefore Whether we should consider there is a space inserted at the end of cs * * @return Returns the actual capitalization modes that can be in effect @@ -83,7 +99,7 @@ public final class CapsModeUtils { * {@link TextUtils#CAP_MODE_SENTENCES}. */ public static int getCapsMode(final CharSequence cs, final int reqModes, - final SettingsValues settingsValues, final boolean hasSpaceBefore) { + final SpacingAndPunctuations spacingAndPunctuations, final boolean hasSpaceBefore) { // Quick description of what we want to do: // CAP_MODE_CHARACTERS is always on. // CAP_MODE_WORDS is on if there is some whitespace before the cursor. @@ -115,8 +131,7 @@ public final class CapsModeUtils { } else { for (i = cs.length(); i > 0; i--) { final char c = cs.charAt(i - 1); - if (c != Constants.CODE_DOUBLE_QUOTE && c != Constants.CODE_SINGLE_QUOTE - && Character.getType(c) != Character.START_PUNCTUATION) { + if (!isStartPunctuation(c)) { break; } } @@ -139,6 +154,20 @@ public final class CapsModeUtils { j--; } if (j <= 0 || Character.isWhitespace(prevChar)) { + if (spacingAndPunctuations.mUsesGermanRules) { + // In German typography rules, there is a specific case that the first character + // of a new line should not be capitalized if the previous line ends in a comma. + boolean hasNewLine = false; + while (--j >= 0 && Character.isWhitespace(prevChar)) { + if (Constants.CODE_ENTER == prevChar) { + hasNewLine = true; + } + prevChar = cs.charAt(j); + } + if (Constants.CODE_COMMA == prevChar && hasNewLine) { + return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & reqModes; + } + } // There are only spacing chars between the start of the paragraph and the cursor, // defined as a isWhitespace() char that is neither a isSpaceChar() nor a tab. Both // MODE_WORDS and MODE_SENTENCES should be active. @@ -167,8 +196,7 @@ public final class CapsModeUtils { // No other language has such a rule as far as I know, instead putting inside the quotation // mark as the exact thing quoted and handling the surrounding punctuation independently, // e.g. <<Did he say, "let's go home"?>> - // Hence, specifically for English, we treat this special case here. - if (Locale.ENGLISH.getLanguage().equals(settingsValues.mLocale.getLanguage())) { + if (spacingAndPunctuations.mUsesAmericanTypography) { for (; j > 0; j--) { // Here we look to go over any closing punctuation. This is because in dominant // variants of English, the final period is placed within double quotes and maybe @@ -191,17 +219,20 @@ public final class CapsModeUtils { if (c == Constants.CODE_QUESTION_MARK || c == Constants.CODE_EXCLAMATION_MARK) { return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_SENTENCES) & reqModes; } - if (settingsValues.mSentenceSeparator != c || j <= 0) { + if (!spacingAndPunctuations.isSentenceSeparator(c) || j <= 0) { return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & reqModes; } // We found out that we have a period. We need to determine if this is a full stop or // otherwise sentence-ending period, or an abbreviation like "e.g.". An abbreviation - // looks like (\w\.){2,} + // looks like (\w\.){2,}. Moreover, in German, you put periods after digits for dates + // and some other things, and in German specifically we need to not go into autocaps after + // a whitespace-digits-period sequence. // To find out, we will have a simple state machine with the following states : - // START, WORD, PERIOD, ABBREVIATION + // START, WORD, PERIOD, ABBREVIATION, NUMBER // On START : (just before the first period) // letter => WORD + // digit => NUMBER if German; end with caps otherwise // whitespace => end with no caps (it was a stand-alone period) // otherwise => end with caps (several periods/symbols in a row) // On WORD : (within the word just before the first period) @@ -215,6 +246,11 @@ public final class CapsModeUtils { // letter => LETTER // period => PERIOD // otherwise => end with no caps (it was an abbreviation) + // On NUMBER : (period immediately preceded by one or more digits) + // digit => NUMBER + // letter => LETTER (promote to word) + // otherwise => end with no caps (it was a whitespace-digits-period sequence, + // or a punctuation-digits-period sequence like "11.11.") // "Not an abbreviation" in the above chart essentially covers cases like "...yes.". This // should capitalize. @@ -222,6 +258,7 @@ public final class CapsModeUtils { final int WORD = 1; final int PERIOD = 2; final int LETTER = 3; + final int NUMBER = 4; final int caps = (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS | TextUtils.CAP_MODE_SENTENCES) & reqModes; final int noCaps = (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & reqModes; @@ -234,6 +271,8 @@ public final class CapsModeUtils { state = WORD; } else if (Character.isWhitespace(c)) { return noCaps; + } else if (Character.isDigit(c) && spacingAndPunctuations.mUsesGermanRules) { + state = NUMBER; } else { return caps; } @@ -241,7 +280,7 @@ public final class CapsModeUtils { case WORD: if (Character.isLetter(c)) { state = WORD; - } else if (settingsValues.mSentenceSeparator == c) { + } else if (spacingAndPunctuations.isSentenceSeparator(c)) { state = PERIOD; } else { return caps; @@ -257,11 +296,20 @@ public final class CapsModeUtils { case LETTER: if (Character.isLetter(c)) { state = LETTER; - } else if (settingsValues.mSentenceSeparator == c) { + } else if (spacingAndPunctuations.isSentenceSeparator(c)) { state = PERIOD; } else { return noCaps; } + break; + case NUMBER: + if (Character.isLetter(c)) { + state = WORD; + } else if (Character.isDigit(c)) { + state = NUMBER; + } else { + return noCaps; + } } } // Here we arrived at the start of the line. This should behave exactly like whitespace. diff --git a/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java b/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java index cc25102ce..e3aef29ba 100644 --- a/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java @@ -16,90 +16,33 @@ package com.android.inputmethod.latin.utils; -import android.util.SparseArray; - -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; import java.util.Map; import java.util.TreeMap; -import java.util.TreeSet; -import java.util.WeakHashMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; public final class CollectionUtils { private CollectionUtils() { // This utility class is not publicly instantiable. } - public static <K,V> HashMap<K,V> newHashMap() { - return new HashMap<K,V>(); - } - - public static <K, V> WeakHashMap<K, V> newWeakHashMap() { - return new WeakHashMap<K, V>(); - } - - public static <K,V> TreeMap<K,V> newTreeMap() { - return new TreeMap<K,V>(); - } - public static <K, V> Map<K,V> newSynchronizedTreeMap() { - final TreeMap<K,V> treeMap = newTreeMap(); + final TreeMap<K,V> treeMap = new TreeMap<>(); return Collections.synchronizedMap(treeMap); } - public static <K,V> ConcurrentHashMap<K,V> newConcurrentHashMap() { - return new ConcurrentHashMap<K,V>(); - } - - public static <E> HashSet<E> newHashSet() { - return new HashSet<E>(); - } - - public static <E> TreeSet<E> newTreeSet() { - return new TreeSet<E>(); - } - - public static <E> ArrayList<E> newArrayList() { - return new ArrayList<E>(); - } - - public static <E> ArrayList<E> newArrayList(final int initialCapacity) { - return new ArrayList<E>(initialCapacity); - } - - public static <E> ArrayList<E> newArrayList(final Collection<E> collection) { - return new ArrayList<E>(collection); - } - - public static <E> LinkedList<E> newLinkedList() { - return new LinkedList<E>(); - } - - public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() { - return new CopyOnWriteArrayList<E>(); - } - - public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList( - final Collection<E> collection) { - return new CopyOnWriteArrayList<E>(collection); - } - - public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(final E[] array) { - return new CopyOnWriteArrayList<E>(array); - } - - public static <E> ArrayDeque<E> newArrayDeque() { - return new ArrayDeque<E>(); - } + public static <E> ArrayList<E> arrayAsList(final E[] array, final int start, final int end) { + if (array == null) { + throw new NullPointerException(); + } + if (start < 0 || start > end || end > array.length) { + throw new IllegalArgumentException(); + } - public static <E> SparseArray<E> newSparseArray() { - return new SparseArray<E>(); + final ArrayList<E> list = new ArrayList<>(end - start); + for (int i = start; i < end; i++) { + list.add(array[i]); + } + return list; } } diff --git a/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java new file mode 100644 index 000000000..34f59e8bc --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2014 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.utils; + +import com.android.inputmethod.latin.makedict.DictionaryHeader; +import com.android.inputmethod.latin.makedict.ProbabilityInfo; +import com.android.inputmethod.latin.makedict.WeightedString; +import com.android.inputmethod.latin.makedict.WordProperty; + +import java.util.HashMap; + +public class CombinedFormatUtils { + public static final String DICTIONARY_TAG = "dictionary"; + public static final String BIGRAM_TAG = "bigram"; + public static final String SHORTCUT_TAG = "shortcut"; + public static final String PROBABILITY_TAG = "f"; + public static final String HISTORICAL_INFO_TAG = "historicalInfo"; + public static final String HISTORICAL_INFO_SEPARATOR = ":"; + public static final String WORD_TAG = "word"; + public static final String BEGINNING_OF_SENTENCE_TAG = "beginning_of_sentence"; + public static final String NOT_A_WORD_TAG = "not_a_word"; + public static final String BLACKLISTED_TAG = "blacklisted"; + + public static String formatAttributeMap(final HashMap<String, String> attributeMap) { + final StringBuilder builder = new StringBuilder(); + builder.append(DICTIONARY_TAG + "="); + if (attributeMap.containsKey(DictionaryHeader.DICTIONARY_ID_KEY)) { + builder.append(attributeMap.get(DictionaryHeader.DICTIONARY_ID_KEY)); + } + for (final String key : attributeMap.keySet()) { + if (key.equals(DictionaryHeader.DICTIONARY_ID_KEY)) { + continue; + } + final String value = attributeMap.get(key); + builder.append("," + key + "=" + value); + } + builder.append("\n"); + return builder.toString(); + } + + public static String formatWordProperty(final WordProperty wordProperty) { + final StringBuilder builder = new StringBuilder(); + builder.append(" " + WORD_TAG + "=" + wordProperty.mWord); + builder.append(","); + builder.append(formatProbabilityInfo(wordProperty.mProbabilityInfo)); + if (wordProperty.mIsBeginningOfSentence) { + builder.append("," + BEGINNING_OF_SENTENCE_TAG + "=true"); + } + if (wordProperty.mIsNotAWord) { + builder.append("," + NOT_A_WORD_TAG + "=true"); + } + if (wordProperty.mIsBlacklistEntry) { + builder.append("," + BLACKLISTED_TAG + "=true"); + } + builder.append("\n"); + if (wordProperty.mShortcutTargets != null) { + for (final WeightedString shortcutTarget : wordProperty.mShortcutTargets) { + builder.append(" " + SHORTCUT_TAG + "=" + shortcutTarget.mWord); + builder.append(","); + builder.append(formatProbabilityInfo(shortcutTarget.mProbabilityInfo)); + builder.append("\n"); + } + } + if (wordProperty.mBigrams != null) { + for (final WeightedString bigram : wordProperty.mBigrams) { + builder.append(" " + BIGRAM_TAG + "=" + bigram.mWord); + builder.append(","); + builder.append(formatProbabilityInfo(bigram.mProbabilityInfo)); + builder.append("\n"); + } + } + return builder.toString(); + } + + public static String formatProbabilityInfo(final ProbabilityInfo probabilityInfo) { + final StringBuilder builder = new StringBuilder(); + builder.append(PROBABILITY_TAG + "=" + probabilityInfo.mProbability); + if (probabilityInfo.hasHistoricalInfo()) { + builder.append(","); + builder.append(HISTORICAL_INFO_TAG + "="); + builder.append(probabilityInfo.mTimestamp); + builder.append(HISTORICAL_INFO_SEPARATOR); + builder.append(probabilityInfo.mLevel); + builder.append(HISTORICAL_INFO_SEPARATOR); + builder.append(probabilityInfo.mCount); + } + return builder.toString(); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java b/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java index 72f2cd2d9..87df013a6 100644 --- a/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CoordinateUtils.java @@ -16,17 +16,19 @@ package com.android.inputmethod.latin.utils; +import java.util.Arrays; + public final class CoordinateUtils { private static final int INDEX_X = 0; private static final int INDEX_Y = 1; - private static final int ARRAY_SIZE = INDEX_Y + 1; + private static final int ELEMENT_SIZE = INDEX_Y + 1; private CoordinateUtils() { // This utility class is not publicly instantiable. } public static int[] newInstance() { - return new int[ARRAY_SIZE]; + return new int[ELEMENT_SIZE]; } public static int x(final int[] coords) { @@ -46,4 +48,44 @@ public final class CoordinateUtils { destination[INDEX_X] = source[INDEX_X]; destination[INDEX_Y] = source[INDEX_Y]; } + + public static int[] newCoordinateArray(final int arraySize) { + return new int[ELEMENT_SIZE * arraySize]; + } + + public static int[] newCoordinateArray(final int arraySize, + final int defaultX, final int defaultY) { + final int[] result = new int[ELEMENT_SIZE * arraySize]; + for (int i = 0; i < arraySize; ++i) { + setXYInArray(result, i, defaultX, defaultY); + } + return result; + } + + public static int xFromArray(final int[] coordsArray, final int index) { + return coordsArray[ELEMENT_SIZE * index + INDEX_X]; + } + + public static int yFromArray(final int[] coordsArray, final int index) { + return coordsArray[ELEMENT_SIZE * index + INDEX_Y]; + } + + public static int[] coordinateFromArray(final int[] coordsArray, final int index) { + final int baseIndex = ELEMENT_SIZE * index; + return Arrays.copyOfRange(coordsArray, baseIndex, baseIndex + ELEMENT_SIZE); + } + + public static void setXYInArray(final int[] coordsArray, final int index, + final int x, final int y) { + final int baseIndex = ELEMENT_SIZE * index; + coordsArray[baseIndex + INDEX_X] = x; + coordsArray[baseIndex + INDEX_Y] = y; + } + + public static void setCoordinateInArray(final int[] coordsArray, final int index, + final int[] coords) { + final int baseIndex = ELEMENT_SIZE * index; + coordsArray[baseIndex + INDEX_X] = coords[INDEX_X]; + coordsArray[baseIndex + INDEX_Y] = coords[INDEX_Y]; + } } diff --git a/java/src/com/android/inputmethod/latin/utils/CsvUtils.java b/java/src/com/android/inputmethod/latin/utils/CsvUtils.java index 36b927eea..a21a1373b 100644 --- a/java/src/com/android/inputmethod/latin/utils/CsvUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CsvUtils.java @@ -17,6 +17,7 @@ package com.android.inputmethod.latin.utils; import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Constants; import java.util.ArrayList; @@ -57,9 +58,9 @@ public final class CsvUtils { // Note that none of these characters match high or low surrogate characters, so we need not // take care of matching by code point. - private static final char COMMA = ','; - private static final char SPACE = ' '; - private static final char QUOTE = '"'; + private static final char COMMA = Constants.CODE_COMMA; + private static final char SPACE = Constants.CODE_SPACE; + private static final char QUOTE = Constants.CODE_DOUBLE_QUOTE; @SuppressWarnings("serial") public static class CsvParseException extends RuntimeException { @@ -208,7 +209,7 @@ public final class CsvUtils { @UsedForTesting public static String[] split(final int splitFlags, final String line) throws CsvParseException { final boolean trimSpaces = (splitFlags & SPLIT_FLAGS_TRIM_SPACES) != 0; - final ArrayList<String> fields = CollectionUtils.newArrayList(); + final ArrayList<String> fields = new ArrayList<>(); final int length = line.length(); int start = 0; do { diff --git a/java/src/com/android/inputmethod/latin/utils/DialogUtils.java b/java/src/com/android/inputmethod/latin/utils/DialogUtils.java new file mode 100644 index 000000000..a05c932d0 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/DialogUtils.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 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.utils; + +import android.content.Context; +import android.view.ContextThemeWrapper; + +import com.android.inputmethod.latin.R; + +public final class DialogUtils { + private DialogUtils() { + // This utility class is not publicly instantiable. + } + + public static Context getPlatformDialogThemeContext(final Context context) { + // Because {@link AlertDialog.Builder.create()} doesn't honor the specified theme with + // createThemeContextWrapper=false, the result dialog box has unneeded paddings around it. + return new ContextThemeWrapper(context, R.style.platformDialogTheme); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java index 021bf0825..d76ea10c0 100644 --- a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java @@ -20,15 +20,19 @@ import android.content.ContentValues; import android.content.Context; import android.content.res.AssetManager; import android.content.res.Resources; +import android.text.TextUtils; import android.util.Log; import com.android.inputmethod.latin.AssetFileAddress; import com.android.inputmethod.latin.BinaryDictionaryGetter; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.makedict.BinaryDictIOUtils; -import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; +import com.android.inputmethod.latin.makedict.DictionaryHeader; +import com.android.inputmethod.latin.makedict.UnsupportedFormatException; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.Locale; @@ -278,14 +282,36 @@ public class DictionaryInfoUtils { BinaryDictionaryGetter.ID_CATEGORY_SEPARATOR + locale.getLanguage().toString(); } - public static FileHeader getDictionaryFileHeaderOrNull(final File file) { - return BinaryDictIOUtils.getDictionaryFileHeaderOrNull(file, 0, file.length()); + public static DictionaryHeader getDictionaryFileHeaderOrNull(final File file) { + return getDictionaryFileHeaderOrNull(file, 0, file.length()); } + private static DictionaryHeader getDictionaryFileHeaderOrNull(final File file, + final long offset, final long length) { + try { + final DictionaryHeader header = + BinaryDictionaryUtils.getHeaderWithOffsetAndLength(file, offset, length); + return header; + } catch (UnsupportedFormatException e) { + return null; + } catch (IOException e) { + return null; + } + } + + /** + * Returns information of the dictionary. + * + * @param fileAddress the asset dictionary file address. + * @return information of the specified dictionary. + */ private static DictionaryInfo createDictionaryInfoFromFileAddress( final AssetFileAddress fileAddress) { - final FileHeader header = BinaryDictIOUtils.getDictionaryFileHeaderOrNull( + final DictionaryHeader header = getDictionaryFileHeaderOrNull( new File(fileAddress.mFilename), fileAddress.mOffset, fileAddress.mLength); + if (header == null) { + return null; + } final String id = header.getId(); final Locale locale = LocaleUtils.constructLocaleFromString(header.getLocaleString()); final String description = header.getDescription(); @@ -310,7 +336,7 @@ public class DictionaryInfoUtils { public static ArrayList<DictionaryInfo> getCurrentDictionaryFileNameAndVersionInfo( final Context context) { - final ArrayList<DictionaryInfo> dictList = CollectionUtils.newArrayList(); + final ArrayList<DictionaryInfo> dictList = new ArrayList<>(); // Retrieve downloaded dictionaries final File[] directoryList = getCachedDirectoryList(context); @@ -328,7 +354,7 @@ public class DictionaryInfoUtils { // Protect against cases of a less-specific dictionary being found, like an // en dictionary being used for an en_US locale. In this case, the en dictionary // should be used for en_US but discounted for listing purposes. - if (!dictionaryInfo.mLocale.equals(locale)) continue; + if (dictionaryInfo == null || !dictionaryInfo.mLocale.equals(locale)) continue; addOrUpdateDictInfo(dictList, dictionaryInfo); } } @@ -355,4 +381,32 @@ public class DictionaryInfoUtils { return dictList; } + + public static boolean looksValidForDictionaryInsertion(final CharSequence text, + final SpacingAndPunctuations spacingAndPunctuations) { + if (TextUtils.isEmpty(text)) return false; + final int length = text.length(); + // TODO: Make this test "length > Constants.DICTIONARY_MAX_WORD_LENGTH". + if (length >= Constants.DICTIONARY_MAX_WORD_LENGTH) { + return false; + } + int i = 0; + int digitCount = 0; + while (i < length) { + final int codePoint = Character.codePointAt(text, i); + final int charCount = Character.charCount(codePoint); + i += charCount; + if (Character.isDigit(codePoint)) { + // Count digits: see below + digitCount += charCount; + continue; + } + if (!spacingAndPunctuations.isWordCodePoint(codePoint)) return false; + } + // We reject strings entirely comprised of digits to avoid using PIN codes or credit + // card numbers. It would come in handy for word prediction though; a good example is + // when writing one's address where the street number is usually quite discriminative, + // as well as the postal code. + return digitCount < length; + } } diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java new file mode 100644 index 000000000..787e4a59d --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014 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.utils; + +import java.util.List; +import java.util.Locale; + +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.latin.PrevWordsInfo; + +public interface DistracterFilter { + /** + * Determine whether a word is a distracter to words in dictionaries. + * + * @param prevWordsInfo the information of previous words. + * @param testedWord the word that will be tested to see whether it is a distracter to words + * in dictionaries. + * @param locale the locale of word. + * @return true if testedWord is a distracter, otherwise false. + */ + public boolean isDistracterToWordsInDictionaries(final PrevWordsInfo prevWordsInfo, + final String testedWord, final Locale locale); + + public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes); + + public void close(); + + public static final DistracterFilter EMPTY_DISTRACTER_FILTER = new DistracterFilter() { + @Override + public boolean isDistracterToWordsInDictionaries(PrevWordsInfo prevWordsInfo, + String testedWord, Locale locale) { + return false; + } + + @Override + public void close() { + } + + @Override + public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) { + } + }; +} diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatches.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatches.java new file mode 100644 index 000000000..0ee6236b1 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingExactMatches.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2014 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.utils; + +import java.util.List; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import android.content.Context; +import android.util.Log; +import android.util.LruCache; +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.latin.DictionaryFacilitator; +import com.android.inputmethod.latin.PrevWordsInfo; + +/** + * This class is used to prevent distracters being added to personalization + * or user history dictionaries + */ +public class DistracterFilterCheckingExactMatches implements DistracterFilter { + private static final String TAG = DistracterFilterCheckingExactMatches.class.getSimpleName(); + private static final boolean DEBUG = false; + + private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120; + private static final int MAX_DISTRACTERS_CACHE_SIZE = 512; + + private final Context mContext; + private final DictionaryFacilitator mDictionaryFacilitator; + private final LruCache<String, Boolean> mDistractersCache; + private final Object mLock = new Object(); + + /** + * Create a DistracterFilter instance. + * + * @param context the context. + */ + public DistracterFilterCheckingExactMatches(final Context context) { + mContext = context; + mDictionaryFacilitator = new DictionaryFacilitator(); + mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE); + } + + @Override + public void close() { + mDictionaryFacilitator.closeDictionaries(); + } + + @Override + public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) { + } + + private void loadDictionariesForLocale(final Locale newlocale) throws InterruptedException { + mDictionaryFacilitator.resetDictionaries(mContext, newlocale, + false /* useContactsDict */, false /* usePersonalizedDicts */, + false /* forceReloadMainDictionary */, null /* listener */); + mDictionaryFacilitator.waitForLoadingMainDictionary( + TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS, TimeUnit.SECONDS); + } + + /** + * Determine whether a word is a distracter to words in dictionaries. + * + * @param prevWordsInfo the information of previous words. Not used for now. + * @param testedWord the word that will be tested to see whether it is a distracter to words + * in dictionaries. + * @param locale the locale of word. + * @return true if testedWord is a distracter, otherwise false. + */ + @Override + public boolean isDistracterToWordsInDictionaries(final PrevWordsInfo prevWordsInfo, + final String testedWord, final Locale locale) { + if (locale == null) { + return false; + } + if (!locale.equals(mDictionaryFacilitator.getLocale())) { + synchronized (mLock) { + // Reset dictionaries for the locale. + try { + mDistractersCache.evictAll(); + loadDictionariesForLocale(locale); + } catch (final InterruptedException e) { + Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter", + e); + return false; + } + } + } + + final Boolean isCachedDistracter = mDistractersCache.get(testedWord); + if (isCachedDistracter != null && isCachedDistracter) { + if (DEBUG) { + Log.d(TAG, "testedWord: " + testedWord); + Log.d(TAG, "isDistracter: true (cache hit)"); + } + return true; + } + // The tested word is a distracter when there is a word that is exact matched to the tested + // word and its probability is higher than the tested word's probability. + final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord); + final int exactMatchFreq = mDictionaryFacilitator.getMaxFrequencyOfExactMatches(testedWord); + final boolean isDistracter = perfectMatchFreq < exactMatchFreq; + if (DEBUG) { + Log.d(TAG, "testedWord: " + testedWord); + Log.d(TAG, "perfectMatchFreq: " + perfectMatchFreq); + Log.d(TAG, "exactMatchFreq: " + exactMatchFreq); + Log.d(TAG, "isDistracter: " + isDistracter); + } + if (isDistracter) { + // Add the word to the cache. + mDistractersCache.put(testedWord, Boolean.TRUE); + } + return isDistracter; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java new file mode 100644 index 000000000..4ad4ba784 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterCheckingIsInDictionary.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2014 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.utils; + +import java.util.List; +import java.util.Locale; + +import android.view.inputmethod.InputMethodSubtype; + +import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.PrevWordsInfo; + +public class DistracterFilterCheckingIsInDictionary implements DistracterFilter { + private final DistracterFilter mDistracterFilter; + private final Dictionary mDictionary; + + public DistracterFilterCheckingIsInDictionary(final DistracterFilter distracterFilter, + final Dictionary dictionary) { + mDistracterFilter = distracterFilter; + mDictionary = dictionary; + } + + @Override + public boolean isDistracterToWordsInDictionaries(PrevWordsInfo prevWordsInfo, + String testedWord, Locale locale) { + if (mDictionary.isInDictionary(testedWord)) { + // This filter treats entries that are already in the dictionary as non-distracters + // because they have passed the filtering in the past. + return false; + } else { + return mDistracterFilter.isDistracterToWordsInDictionaries( + prevWordsInfo, testedWord, locale); + } + } + + @Override + public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) { + // Do nothing. + } + + @Override + public void close() { + // Do nothing. + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java b/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java new file mode 100644 index 000000000..61da1b789 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2014 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.utils; + +import com.android.inputmethod.annotations.UsedForTesting; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +/** + * Utilities to manage executors. + */ +public class ExecutorUtils { + private static final ConcurrentHashMap<String, ExecutorService> sExecutorMap = + new ConcurrentHashMap<>(); + + private static class ThreadFactoryWithId implements ThreadFactory { + private final String mId; + + public ThreadFactoryWithId(final String id) { + mId = id; + } + + @Override + public Thread newThread(final Runnable r) { + return new Thread(r, "Executor - " + mId); + } + } + + /** + * Gets the executor for the given id. + */ + public static ExecutorService getExecutor(final String id) { + ExecutorService executor = sExecutorMap.get(id); + if (executor == null) { + synchronized(sExecutorMap) { + executor = sExecutorMap.get(id); + if (executor == null) { + executor = Executors.newSingleThreadExecutor(new ThreadFactoryWithId(id)); + sExecutorMap.put(id, executor); + } + } + } + return executor; + } + + /** + * Shutdowns all executors and removes all executors from the executor map for testing. + */ + @UsedForTesting + public static void shutdownAllExecutors() { + synchronized(sExecutorMap) { + for (final ExecutorService executor : sExecutorMap.values()) { + executor.execute(new Runnable() { + @Override + public void run() { + executor.shutdown(); + sExecutorMap.remove(executor); + } + }); + } + } + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/FileUtils.java b/java/src/com/android/inputmethod/latin/utils/FileUtils.java new file mode 100644 index 000000000..f1106a6c6 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/FileUtils.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 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.utils; + +import java.io.File; +import java.io.FilenameFilter; + +/** + * A simple class to help with removing directories recursively. + */ +public class FileUtils { + public static boolean deleteRecursively(final File path) { + if (path.isDirectory()) { + final File[] files = path.listFiles(); + if (files != null) { + for (final File child : files) { + deleteRecursively(child); + } + } + } + return path.delete(); + } + + public static boolean deleteFilteredFiles(final File dir, final FilenameFilter fileNameFilter) { + if (!dir.isDirectory()) { + return false; + } + final File[] files = dir.listFiles(fileNameFilter); + if (files == null) { + return false; + } + boolean hasDeletedAllFiles = true; + for (final File file : files) { + if (!deleteRecursively(file)) { + hasDeletedAllFiles = false; + } + } + return hasDeletedAllFiles; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/FragmentUtils.java b/java/src/com/android/inputmethod/latin/utils/FragmentUtils.java index ee2b97b2a..e300bd1d3 100644 --- a/java/src/com/android/inputmethod/latin/utils/FragmentUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/FragmentUtils.java @@ -26,12 +26,11 @@ import com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordFragmen import com.android.inputmethod.latin.userdictionary.UserDictionaryList; import com.android.inputmethod.latin.userdictionary.UserDictionaryLocalePicker; import com.android.inputmethod.latin.userdictionary.UserDictionarySettings; -import com.android.inputmethod.research.FeedbackFragment; import java.util.HashSet; public class FragmentUtils { - private static final HashSet<String> sLatinImeFragments = new HashSet<String>(); + private static final HashSet<String> sLatinImeFragments = new HashSet<>(); static { sLatinImeFragments.add(DictionarySettingsFragment.class.getName()); sLatinImeFragments.add(AboutPreferences.class.getName()); @@ -43,7 +42,6 @@ public class FragmentUtils { sLatinImeFragments.add(UserDictionaryList.class.getName()); sLatinImeFragments.add(UserDictionaryLocalePicker.class.getName()); sLatinImeFragments.add(UserDictionarySettings.class.getName()); - sLatinImeFragments.add(FeedbackFragment.class.getName()); } public static boolean isValidFragment(String fragmentName) { diff --git a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java new file mode 100644 index 000000000..8b7077879 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2014 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.utils; + +import android.content.Context; +import android.content.SharedPreferences; +import android.provider.Settings; +import android.provider.Settings.SettingNotFoundException; +import android.text.TextUtils; +import android.util.Log; + +import com.android.inputmethod.latin.R; + +public final class ImportantNoticeUtils { + private static final String TAG = ImportantNoticeUtils.class.getSimpleName(); + + // {@link SharedPreferences} name to save the last important notice version that has been + // displayed to users. + private static final String PREFERENCE_NAME = "important_notice_pref"; + private static final String KEY_IMPORTANT_NOTICE_VERSION = "important_notice_version"; + public static final int VERSION_TO_ENABLE_PERSONALIZED_SUGGESTIONS = 1; + + // Copy of the hidden {@link Settings.Secure#USER_SETUP_COMPLETE} settings key. + // The value is zero until each multiuser completes system setup wizard. + // Caveat: This is a hidden API. + private static final String Settings_Secure_USER_SETUP_COMPLETE = "user_setup_complete"; + private static final int USER_SETUP_IS_NOT_COMPLETE = 0; + + private ImportantNoticeUtils() { + // This utility class is not publicly instantiable. + } + + private static boolean isInSystemSetupWizard(final Context context) { + try { + final int userSetupComplete = Settings.Secure.getInt( + context.getContentResolver(), Settings_Secure_USER_SETUP_COMPLETE); + return userSetupComplete == USER_SETUP_IS_NOT_COMPLETE; + } catch (final SettingNotFoundException e) { + Log.w(TAG, "Can't find settings in Settings.Secure: key=" + + Settings_Secure_USER_SETUP_COMPLETE); + return false; + } + } + + private static SharedPreferences getImportantNoticePreferences(final Context context) { + return context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + } + + private static int getCurrentImportantNoticeVersion(final Context context) { + return context.getResources().getInteger(R.integer.config_important_notice_version); + } + + private static int getLastImportantNoticeVersion(final Context context) { + return getImportantNoticePreferences(context).getInt(KEY_IMPORTANT_NOTICE_VERSION, 0); + } + + public static int getNextImportantNoticeVersion(final Context context) { + return getLastImportantNoticeVersion(context) + 1; + } + + private static boolean hasNewImportantNotice(final Context context) { + final int lastVersion = getLastImportantNoticeVersion(context); + return getCurrentImportantNoticeVersion(context) > lastVersion; + } + + public static boolean shouldShowImportantNotice(final Context context) { + if (!hasNewImportantNotice(context)) { + return false; + } + final String importantNoticeTitle = getNextImportantNoticeTitle(context); + if (TextUtils.isEmpty(importantNoticeTitle)) { + return false; + } + if (isInSystemSetupWizard(context)) { + return false; + } + return true; + } + + public static void updateLastImportantNoticeVersion(final Context context) { + getImportantNoticePreferences(context) + .edit() + .putInt(KEY_IMPORTANT_NOTICE_VERSION, getNextImportantNoticeVersion(context)) + .apply(); + } + + public static String getNextImportantNoticeTitle(final Context context) { + final int nextVersion = getCurrentImportantNoticeVersion(context); + final String[] importantNoticeTitleArray = context.getResources().getStringArray( + R.array.important_notice_title_array); + if (nextVersion > 0 && nextVersion < importantNoticeTitleArray.length) { + return importantNoticeTitleArray[nextVersion]; + } + return null; + } + + public static String getNextImportantNoticeContents(final Context context) { + final int nextVersion = getNextImportantNoticeVersion(context); + final String[] importantNoticeContentsArray = context.getResources().getStringArray( + R.array.important_notice_contents_array); + if (nextVersion > 0 && nextVersion < importantNoticeContentsArray.length) { + return importantNoticeContentsArray[nextVersion]; + } + return null; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/JsonUtils.java b/java/src/com/android/inputmethod/latin/utils/JsonUtils.java new file mode 100644 index 000000000..6dd8d9711 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/JsonUtils.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2013 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.utils; + +import android.util.JsonReader; +import android.util.JsonWriter; +import android.util.Log; + +import java.io.Closeable; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class JsonUtils { + private static final String TAG = JsonUtils.class.getSimpleName(); + + private static final String INTEGER_CLASS_NAME = Integer.class.getSimpleName(); + private static final String STRING_CLASS_NAME = String.class.getSimpleName(); + + private static final String EMPTY_STRING = ""; + + public static List<Object> jsonStrToList(final String s) { + final ArrayList<Object> list = new ArrayList<>(); + final JsonReader reader = new JsonReader(new StringReader(s)); + try { + reader.beginArray(); + while (reader.hasNext()) { + reader.beginObject(); + while (reader.hasNext()) { + final String name = reader.nextName(); + if (name.equals(INTEGER_CLASS_NAME)) { + list.add(reader.nextInt()); + } else if (name.equals(STRING_CLASS_NAME)) { + list.add(reader.nextString()); + } else { + Log.w(TAG, "Invalid name: " + name); + reader.skipValue(); + } + } + reader.endObject(); + } + reader.endArray(); + return list; + } catch (final IOException e) { + } finally { + close(reader); + } + return Collections.<Object>emptyList(); + } + + public static String listToJsonStr(final List<Object> list) { + if (list == null || list.isEmpty()) { + return EMPTY_STRING; + } + final StringWriter sw = new StringWriter(); + final JsonWriter writer = new JsonWriter(sw); + try { + writer.beginArray(); + for (final Object o : list) { + writer.beginObject(); + if (o instanceof Integer) { + writer.name(INTEGER_CLASS_NAME).value((Integer)o); + } else if (o instanceof String) { + writer.name(STRING_CLASS_NAME).value((String)o); + } + writer.endObject(); + } + writer.endArray(); + return sw.toString(); + } catch (final IOException e) { + } finally { + close(writer); + } + return EMPTY_STRING; + } + + private static void close(final Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (final IOException e) { + // Ignore + } + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java new file mode 100644 index 000000000..9ec19efa8 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2014 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.utils; + +import android.util.Log; + +import com.android.inputmethod.latin.Dictionary; +import com.android.inputmethod.latin.DictionaryFacilitator; +import com.android.inputmethod.latin.PrevWordsInfo; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +// Note: this class is used as a parameter type of a native method. You should be careful when you +// rename this class or field name. See BinaryDictionary#addMultipleDictionaryEntriesNative(). +public final class LanguageModelParam { + private static final String TAG = LanguageModelParam.class.getSimpleName(); + private static final boolean DEBUG = false; + private static final boolean DEBUG_TOKEN = false; + + // For now, these probability values are being referred to only when we add new entries to + // decaying dynamic binary dictionaries. When these are referred to, what matters is 0 or + // non-0. Thus, it's not meaningful to compare 10, 100, and so on. + // TODO: Revise the logic in ForgettingCurveUtils in native code. + private static final int UNIGRAM_PROBABILITY_FOR_VALID_WORD = 100; + private static final int UNIGRAM_PROBABILITY_FOR_OOV_WORD = Dictionary.NOT_A_PROBABILITY; + private static final int BIGRAM_PROBABILITY_FOR_VALID_WORD = 10; + private static final int BIGRAM_PROBABILITY_FOR_OOV_WORD = Dictionary.NOT_A_PROBABILITY; + + public final String mTargetWord; + public final int[] mWord0; + public final int[] mWord1; + // TODO: this needs to be a list of shortcuts + public final int[] mShortcutTarget; + public final int mUnigramProbability; + public final int mBigramProbability; + public final int mShortcutProbability; + public final boolean mIsNotAWord; + public final boolean mIsBlacklisted; + // Time stamp in seconds. + public final int mTimestamp; + + // Constructor for unigram. TODO: support shortcuts + public LanguageModelParam(final String word, final int unigramProbability, + final int timestamp) { + this(null /* word0 */, word, unigramProbability, Dictionary.NOT_A_PROBABILITY, timestamp); + } + + // Constructor for unigram and bigram. + public LanguageModelParam(final String word0, final String word1, + final int unigramProbability, final int bigramProbability, + final int timestamp) { + mTargetWord = word1; + mWord0 = (word0 == null) ? null : StringUtils.toCodePointArray(word0); + mWord1 = StringUtils.toCodePointArray(word1); + mShortcutTarget = null; + mUnigramProbability = unigramProbability; + mBigramProbability = bigramProbability; + mShortcutProbability = Dictionary.NOT_A_PROBABILITY; + mIsNotAWord = false; + mIsBlacklisted = false; + mTimestamp = timestamp; + } + + // Process a list of words and return a list of {@link LanguageModelParam} objects. + public static ArrayList<LanguageModelParam> createLanguageModelParamsFrom( + final List<String> tokens, final int timestamp, + final DictionaryFacilitator dictionaryFacilitator, + final SpacingAndPunctuations spacingAndPunctuations, + final DistracterFilter distracterFilter) { + final ArrayList<LanguageModelParam> languageModelParams = new ArrayList<>(); + final int N = tokens.size(); + PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; + for (int i = 0; i < N; ++i) { + final String tempWord = tokens.get(i); + if (StringUtils.isEmptyStringOrWhiteSpaces(tempWord)) { + // just skip this token + if (DEBUG_TOKEN) { + Log.d(TAG, "--- isEmptyStringOrWhiteSpaces: \"" + tempWord + "\""); + } + continue; + } + if (!DictionaryInfoUtils.looksValidForDictionaryInsertion( + tempWord, spacingAndPunctuations)) { + if (DEBUG_TOKEN) { + Log.d(TAG, "--- not looksValidForDictionaryInsertion: \"" + + tempWord + "\""); + } + // Sentence terminator found. Split. + prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; + continue; + } + if (DEBUG_TOKEN) { + Log.d(TAG, "--- word: \"" + tempWord + "\""); + } + final LanguageModelParam languageModelParam = + detectWhetherVaildWordOrNotAndGetLanguageModelParam( + prevWordsInfo, tempWord, timestamp, dictionaryFacilitator, + distracterFilter); + if (languageModelParam == null) { + continue; + } + languageModelParams.add(languageModelParam); + prevWordsInfo = prevWordsInfo.getNextPrevWordsInfo( + new PrevWordsInfo.WordInfo(tempWord)); + } + return languageModelParams; + } + + private static LanguageModelParam detectWhetherVaildWordOrNotAndGetLanguageModelParam( + final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp, + final DictionaryFacilitator dictionaryFacilitator, + final DistracterFilter distracterFilter) { + final Locale locale = dictionaryFacilitator.getLocale(); + if (locale == null) { + return null; + } + if (dictionaryFacilitator.isValidWord(targetWord, false /* ignoreCase */)) { + return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp, + true /* isValidWord */, locale, distracterFilter); + } + + final String lowerCaseTargetWord = targetWord.toLowerCase(locale); + if (dictionaryFacilitator.isValidWord(lowerCaseTargetWord, false /* ignoreCase */)) { + // Add the lower-cased word. + return createAndGetLanguageModelParamOfWord(prevWordsInfo, lowerCaseTargetWord, + timestamp, true /* isValidWord */, locale, distracterFilter); + } + + // Treat the word as an OOV word. + return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp, + false /* isValidWord */, locale, distracterFilter); + } + + private static LanguageModelParam createAndGetLanguageModelParamOfWord( + final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp, + final boolean isValidWord, final Locale locale, + final DistracterFilter distracterFilter) { + final String word; + if (StringUtils.getCapitalizationType(targetWord) == StringUtils.CAPITALIZE_FIRST + && !prevWordsInfo.isValid() && !isValidWord) { + word = targetWord.toLowerCase(locale); + } else { + word = targetWord; + } + // Check whether the word is a distracter to words in the dictionaries. + if (distracterFilter.isDistracterToWordsInDictionaries(prevWordsInfo, word, locale)) { + if (DEBUG) { + Log.d(TAG, "The word (" + word + ") is a distracter. Skip this word."); + } + return null; + } + final int unigramProbability = isValidWord ? + UNIGRAM_PROBABILITY_FOR_VALID_WORD : UNIGRAM_PROBABILITY_FOR_OOV_WORD; + if (!prevWordsInfo.isValid()) { + if (DEBUG) { + Log.d(TAG, "--- add unigram: current(" + + (isValidWord ? "Valid" : "OOV") + ") = " + word); + } + return new LanguageModelParam(word, unigramProbability, timestamp); + } + if (DEBUG) { + Log.d(TAG, "--- add bigram: prev = " + prevWordsInfo + ", current(" + + (isValidWord ? "Valid" : "OOV") + ") = " + word); + } + final int bigramProbability = isValidWord ? + BIGRAM_PROBABILITY_FOR_VALID_WORD : BIGRAM_PROBABILITY_FOR_OOV_WORD; + return new LanguageModelParam(prevWordsInfo.mPrevWordsInfo[0].mWord, word, + unigramProbability, bigramProbability, timestamp); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/LatinImeLoggerUtils.java b/java/src/com/android/inputmethod/latin/utils/LatinImeLoggerUtils.java deleted file mode 100644 index e958a7e71..000000000 --- a/java/src/com/android/inputmethod/latin/utils/LatinImeLoggerUtils.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2013 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.utils; - -import android.text.TextUtils; - -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.WordComposer; - -public final class LatinImeLoggerUtils { - private LatinImeLoggerUtils() { - // This utility class is not publicly instantiable. - } - - public static void onNonSeparator(final char code, final int x, final int y) { - UserLogRingCharBuffer.getInstance().push(code, x, y); - LatinImeLogger.logOnInputChar(); - } - - public static void onSeparator(final int code, final int x, final int y) { - // Helper method to log a single code point separator - // TODO: cache this mapping of a code point to a string in a sparse array in StringUtils - onSeparator(new String(new int[]{code}, 0, 1), x, y); - } - - public static void onSeparator(final String separator, final int x, final int y) { - final int length = separator.length(); - for (int i = 0; i < length; i = Character.offsetByCodePoints(separator, i, 1)) { - int codePoint = Character.codePointAt(separator, i); - // TODO: accept code points - UserLogRingCharBuffer.getInstance().push((char)codePoint, x, y); - } - LatinImeLogger.logOnInputSeparator(); - } - - public static void onAutoCorrection(final String typedWord, final String correctedWord, - final String separatorString, final WordComposer wordComposer) { - final boolean isBatchMode = wordComposer.isBatchMode(); - if (!isBatchMode && TextUtils.isEmpty(typedWord)) { - return; - } - // TODO: this fails when the separator is more than 1 code point long, but - // the backend can't handle it yet. The only case when this happens is with - // smileys and other multi-character keys. - final int codePoint = TextUtils.isEmpty(separatorString) ? Constants.NOT_A_CODE - : separatorString.codePointAt(0); - if (!isBatchMode) { - LatinImeLogger.logOnAutoCorrectionForTyping(typedWord, correctedWord, codePoint); - } else { - if (!TextUtils.isEmpty(correctedWord)) { - // We must make sure that InputPointer contains only the relative timestamps, - // not actual timestamps. - LatinImeLogger.logOnAutoCorrectionForGeometric( - "", correctedWord, codePoint, wordComposer.getInputPointers()); - } - } - } - - public static void onAutoCorrectionCancellation() { - LatinImeLogger.logOnAutoCorrectionCancelled(); - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/StaticInnerHandlerWrapper.java b/java/src/com/android/inputmethod/latin/utils/LeakGuardHandlerWrapper.java index 44e5d17b4..dd6fac671 100644 --- a/java/src/com/android/inputmethod/latin/utils/StaticInnerHandlerWrapper.java +++ b/java/src/com/android/inputmethod/latin/utils/LeakGuardHandlerWrapper.java @@ -21,22 +21,22 @@ import android.os.Looper; import java.lang.ref.WeakReference; -public class StaticInnerHandlerWrapper<T> extends Handler { - private final WeakReference<T> mOuterInstanceRef; +public class LeakGuardHandlerWrapper<T> extends Handler { + private final WeakReference<T> mOwnerInstanceRef; - public StaticInnerHandlerWrapper(final T outerInstance) { - this(outerInstance, Looper.myLooper()); + public LeakGuardHandlerWrapper(final T ownerInstance) { + this(ownerInstance, Looper.myLooper()); } - public StaticInnerHandlerWrapper(final T outerInstance, final Looper looper) { + public LeakGuardHandlerWrapper(final T ownerInstance, final Looper looper) { super(looper); - if (outerInstance == null) { - throw new NullPointerException("outerInstance is null"); + if (ownerInstance == null) { + throw new NullPointerException("ownerInstance is null"); } - mOuterInstanceRef = new WeakReference<T>(outerInstance); + mOwnerInstanceRef = new WeakReference<>(ownerInstance); } - public T getOuterInstance() { - return mOuterInstanceRef.get(); + public T getOwnerInstance() { + return mOwnerInstanceRef.get(); } } diff --git a/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java b/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java index 22045aa38..c519a0de6 100644 --- a/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java @@ -30,9 +30,6 @@ import java.util.Locale; * dictionary pack. */ public final class LocaleUtils { - private static final HashMap<String, Long> EMPTY_LT_HASH_MAP = CollectionUtils.newHashMap(); - private static final String LOCALE_AND_TIME_STR_SEPARATER = ","; - private LocaleUtils() { // Intentional empty constructor for utility class. } @@ -162,18 +159,20 @@ public final class LocaleUtils { return LOCALE_MATCH <= level; } - private static final HashMap<String, Locale> sLocaleCache = CollectionUtils.newHashMap(); + private static final HashMap<String, Locale> sLocaleCache = new HashMap<>(); /** * Creates a locale from a string specification. */ public static Locale constructLocaleFromString(final String localeStr) { - if (localeStr == null) + if (localeStr == null) { return null; + } synchronized (sLocaleCache) { - if (sLocaleCache.containsKey(localeStr)) - return sLocaleCache.get(localeStr); - Locale retval = null; + Locale retval = sLocaleCache.get(localeStr); + if (retval != null) { + return retval; + } String[] localeParams = localeStr.split("_", 3); if (localeParams.length == 1) { retval = new Locale(localeParams[0]); @@ -188,38 +187,4 @@ public final class LocaleUtils { return retval; } } - - public static HashMap<String, Long> localeAndTimeStrToHashMap(String str) { - if (TextUtils.isEmpty(str)) { - return EMPTY_LT_HASH_MAP; - } - final String[] ss = str.split(LOCALE_AND_TIME_STR_SEPARATER); - final int N = ss.length; - if (N < 2 || N % 2 != 0) { - return EMPTY_LT_HASH_MAP; - } - final HashMap<String, Long> retval = CollectionUtils.newHashMap(); - for (int i = 0; i < N / 2; ++i) { - final String localeStr = ss[i * 2]; - final long time = Long.valueOf(ss[i * 2 + 1]); - retval.put(localeStr, time); - } - return retval; - } - - public static String localeAndTimeHashMapToStr(HashMap<String, Long> map) { - if (map == null || map.isEmpty()) { - return ""; - } - final StringBuilder builder = new StringBuilder(); - for (String localeStr : map.keySet()) { - if (builder.length() > 0) { - builder.append(LOCALE_AND_TIME_STR_SEPARATER); - } - final Long time = map.get(localeStr); - builder.append(localeStr).append(LOCALE_AND_TIME_STR_SEPARATER); - builder.append(String.valueOf(time)); - } - return builder.toString(); - } } diff --git a/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java new file mode 100644 index 000000000..3cd63612c --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2014 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.utils; + +import java.util.regex.Pattern; + +import com.android.inputmethod.latin.Constants; +import com.android.inputmethod.latin.PrevWordsInfo; +import com.android.inputmethod.latin.PrevWordsInfo.WordInfo; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; + +public final class PrevWordsInfoUtils { + private PrevWordsInfoUtils() { + // Intentional empty constructor for utility class. + } + + private static final Pattern SPACE_REGEX = Pattern.compile("\\s+"); + // Get context information from nth word before the cursor. n = 1 retrieves the words + // immediately before the cursor, n = 2 retrieves the words before that, and so on. This splits + // on whitespace only. + // Also, it won't return words that end in a separator (if the nth word before the cursor + // ends in a separator, it returns information representing beginning-of-sentence). + // Example (when Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM is 2): + // (n = 1) "abc def|" -> abc, def + // (n = 1) "abc def |" -> abc, def + // (n = 1) "abc 'def|" -> empty, 'def + // (n = 1) "abc def. |" -> beginning-of-sentence + // (n = 1) "abc def . |" -> beginning-of-sentence + // (n = 2) "abc def|" -> beginning-of-sentence, abc + // (n = 2) "abc def |" -> beginning-of-sentence, abc + // (n = 2) "abc 'def|" -> empty. The context is different from "abc def", but we cannot + // represent this situation using PrevWordsInfo. See TODO in the method. + // TODO: The next example's result should be "abc, def". This have to be fixed before we + // retrieve the prior context of Beginning-of-Sentence. + // (n = 2) "abc def. |" -> beginning-of-sentence, abc + // (n = 2) "abc def . |" -> abc, def + // (n = 2) "abc|" -> beginning-of-sentence + // (n = 2) "abc |" -> beginning-of-sentence + // (n = 2) "abc. def|" -> beginning-of-sentence + public static PrevWordsInfo getPrevWordsInfoFromNthPreviousWord(final CharSequence prev, + final SpacingAndPunctuations spacingAndPunctuations, final int n) { + if (prev == null) return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; + final String[] w = SPACE_REGEX.split(prev); + final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM]; + for (int i = 0; i < prevWordsInfo.length; i++) { + final int focusedWordIndex = w.length - n - i; + // Referring to the word after the focused word. + if ((focusedWordIndex + 1) >= 0 && (focusedWordIndex + 1) < w.length) { + final String wordFollowingTheNthPrevWord = w[focusedWordIndex + 1]; + if (!wordFollowingTheNthPrevWord.isEmpty()) { + final char firstChar = wordFollowingTheNthPrevWord.charAt(0); + if (spacingAndPunctuations.isWordConnector(firstChar)) { + // The word following the focused word is starting with a word connector. + // TODO: Return meaningful context for this case. + prevWordsInfo[i] = WordInfo.EMPTY_WORD_INFO; + break; + } + } + } + // If we can't find (n + i) words, the context is beginning-of-sentence. + if (focusedWordIndex < 0) { + prevWordsInfo[i] = WordInfo.BEGINNING_OF_SENTENCE; + break; + } + final String focusedWord = w[focusedWordIndex]; + // If the word is, the context is beginning-of-sentence. + final int length = focusedWord.length(); + if (length <= 0) { + prevWordsInfo[i] = WordInfo.BEGINNING_OF_SENTENCE; + break; + } + // If ends in a sentence separator, the context is beginning-of-sentence. + final char lastChar = focusedWord.charAt(length - 1); + if (spacingAndPunctuations.isSentenceSeparator(lastChar)) { + prevWordsInfo[i] = WordInfo.BEGINNING_OF_SENTENCE; + break; + } + // If ends in a word separator or connector, the context is unclear. + // TODO: Return meaningful context for this case. + if (spacingAndPunctuations.isWordSeparator(lastChar) + || spacingAndPunctuations.isWordConnector(lastChar)) { + prevWordsInfo[i] = WordInfo.EMPTY_WORD_INFO; + break; + } + prevWordsInfo[i] = new WordInfo(focusedWord); + } + return new PrevWordsInfo(prevWordsInfo); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java b/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java deleted file mode 100644 index 201a70d42..000000000 --- a/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (C) 2013 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.utils; - -import java.util.Queue; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * An object that executes submitted tasks using a thread. - */ -public class PrioritizedSerialExecutor { - public static final String TAG = PrioritizedSerialExecutor.class.getSimpleName(); - - private final Object mLock = new Object(); - - private final Queue<Runnable> mTasks; - private final Queue<Runnable> mPrioritizedTasks; - private boolean mIsShutdown; - private final ThreadPoolExecutor mThreadPoolExecutor; - - // The task which is running now. - private Runnable mActive; - - public PrioritizedSerialExecutor() { - mTasks = new ConcurrentLinkedQueue<Runnable>(); - mPrioritizedTasks = new ConcurrentLinkedQueue<Runnable>(); - mIsShutdown = false; - mThreadPoolExecutor = new ThreadPoolExecutor(1 /* corePoolSize */, 1 /* maximumPoolSize */, - 0 /* keepAliveTime */, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1)); - } - - /** - * Clears all queued tasks. - */ - public void clearAllTasks() { - synchronized(mLock) { - mTasks.clear(); - mPrioritizedTasks.clear(); - } - } - - /** - * Enqueues the given task into the task queue. - * @param r the enqueued task - */ - public void execute(final Runnable r) { - synchronized(mLock) { - if (!mIsShutdown) { - mTasks.offer(new Runnable() { - @Override - public void run() { - try { - r.run(); - } finally { - scheduleNext(); - } - } - }); - if (mActive == null) { - scheduleNext(); - } - } - } - } - - /** - * Enqueues the given task into the prioritized task queue. - * @param r the enqueued task - */ - public void executePrioritized(final Runnable r) { - synchronized(mLock) { - if (!mIsShutdown) { - mPrioritizedTasks.offer(new Runnable() { - @Override - public void run() { - try { - r.run(); - } finally { - scheduleNext(); - } - } - }); - if (mActive == null) { - scheduleNext(); - } - } - } - } - - private boolean fetchNextTasksLocked() { - mActive = mPrioritizedTasks.poll(); - if (mActive == null) { - mActive = mTasks.poll(); - } - return mActive != null; - } - - private void scheduleNext() { - synchronized(mLock) { - if (fetchNextTasksLocked()) { - mThreadPoolExecutor.execute(mActive); - } - } - } - - public void remove(final Runnable r) { - synchronized(mLock) { - mTasks.remove(r); - mPrioritizedTasks.remove(r); - } - } - - public void replaceAndExecute(final Runnable oldTask, final Runnable newTask) { - synchronized(mLock) { - if (oldTask != null) remove(oldTask); - execute(newTask); - } - } - - public void shutdown() { - synchronized(mLock) { - mIsShutdown = true; - } - } - - public boolean isTerminated() { - synchronized(mLock) { - if (!mIsShutdown) { - return false; - } - return mPrioritizedTasks.isEmpty() && mTasks.isEmpty() && mActive == null; - } - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/RecapitalizeStatus.java b/java/src/com/android/inputmethod/latin/utils/RecapitalizeStatus.java index 0f5cd80db..e3cac97f0 100644 --- a/java/src/com/android/inputmethod/latin/utils/RecapitalizeStatus.java +++ b/java/src/com/android/inputmethod/latin/utils/RecapitalizeStatus.java @@ -37,12 +37,12 @@ public class RecapitalizeStatus { CAPS_MODE_ALL_UPPER }; - private static final int getStringMode(final String string, final String separators) { + private static final int getStringMode(final String string, final int[] sortedSeparators) { if (StringUtils.isIdenticalAfterUpcase(string)) { return CAPS_MODE_ALL_UPPER; } else if (StringUtils.isIdenticalAfterDowncase(string)) { return CAPS_MODE_ALL_LOWER; - } else if (StringUtils.isIdenticalAfterCapitalizeEachWord(string, separators)) { + } else if (StringUtils.isIdenticalAfterCapitalizeEachWord(string, sortedSeparators)) { return CAPS_MODE_FIRST_WORD_UPPER; } else { return CAPS_MODE_ORIGINAL_MIXED_CASE; @@ -60,26 +60,32 @@ public class RecapitalizeStatus { private int mRotationStyleCurrentIndex; private boolean mSkipOriginalMixedCaseMode; private Locale mLocale; - private String mSeparators; + private int[] mSortedSeparators; private String mStringAfter; - private boolean mIsActive; + private boolean mIsStarted; + private boolean mIsEnabled = true; + + private static final int[] EMPTY_STORTED_SEPARATORS = {}; public RecapitalizeStatus() { // By default, initialize with dummy values that won't match any real recapitalize. - initialize(-1, -1, "", Locale.getDefault(), ""); - deactivate(); + start(-1, -1, "", Locale.getDefault(), EMPTY_STORTED_SEPARATORS); + stop(); } - public void initialize(final int cursorStart, final int cursorEnd, final String string, - final Locale locale, final String separators) { + public void start(final int cursorStart, final int cursorEnd, final String string, + final Locale locale, final int[] sortedSeparators) { + if (!mIsEnabled) { + return; + } mCursorStartBefore = cursorStart; mStringBefore = string; mCursorStartAfter = cursorStart; mCursorEndAfter = cursorEnd; mStringAfter = string; - final int initialMode = getStringMode(mStringBefore, separators); + final int initialMode = getStringMode(mStringBefore, sortedSeparators); mLocale = locale; - mSeparators = separators; + mSortedSeparators = sortedSeparators; if (CAPS_MODE_ORIGINAL_MIXED_CASE == initialMode) { mRotationStyleCurrentIndex = 0; mSkipOriginalMixedCaseMode = false; @@ -94,15 +100,27 @@ public class RecapitalizeStatus { mRotationStyleCurrentIndex = currentMode; mSkipOriginalMixedCaseMode = true; } - mIsActive = true; + mIsStarted = true; + } + + public void stop() { + mIsStarted = false; + } + + public boolean isStarted() { + return mIsStarted; + } + + public void enable() { + mIsEnabled = true; } - public void deactivate() { - mIsActive = false; + public void disable() { + mIsEnabled = false; } - public boolean isActive() { - return mIsActive; + public boolean mIsEnabled() { + return mIsEnabled; } public boolean isSetAt(final int cursorStart, final int cursorEnd) { @@ -131,7 +149,7 @@ public class RecapitalizeStatus { mStringAfter = mStringBefore.toLowerCase(mLocale); break; case CAPS_MODE_FIRST_WORD_UPPER: - mStringAfter = StringUtils.capitalizeEachWord(mStringBefore, mSeparators, + mStringAfter = StringUtils.capitalizeEachWord(mStringBefore, mSortedSeparators, mLocale); break; case CAPS_MODE_ALL_UPPER: diff --git a/java/src/com/android/inputmethod/latin/utils/ResizableIntArray.java b/java/src/com/android/inputmethod/latin/utils/ResizableIntArray.java index 7c6fe93ac..64c9e2cff 100644 --- a/java/src/com/android/inputmethod/latin/utils/ResizableIntArray.java +++ b/java/src/com/android/inputmethod/latin/utils/ResizableIntArray.java @@ -34,7 +34,7 @@ public final class ResizableIntArray { throw new ArrayIndexOutOfBoundsException("length=" + mLength + "; index=" + index); } - public void add(final int index, final int val) { + public void addAt(final int index, final int val) { if (index < mLength) { mArray[index] = val; } else { diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java index 22c92446a..093c5a6c1 100644 --- a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java @@ -41,8 +41,7 @@ public final class ResourceUtils { // This utility class is not publicly instantiable. } - private static final HashMap<String, String> sDeviceOverrideValueMap = - CollectionUtils.newHashMap(); + private static final HashMap<String, String> sDeviceOverrideValueMap = new HashMap<>(); private static final String[] BUILD_KEYS_AND_VALUES = { "HARDWARE", Build.HARDWARE, @@ -54,8 +53,8 @@ public final class ResourceUtils { private static final String sBuildKeyValuesDebugString; static { - sBuildKeyValues = CollectionUtils.newHashMap(); - final ArrayList<String> keyValuePairs = CollectionUtils.newArrayList(); + sBuildKeyValues = new HashMap<>(); + final ArrayList<String> keyValuePairs = new ArrayList<>(); final int keyCount = BUILD_KEYS_AND_VALUES.length / 2; for (int i = 0; i < keyCount; i++) { final int index = i * 2; @@ -67,7 +66,8 @@ public final class ResourceUtils { sBuildKeyValuesDebugString = "[" + TextUtils.join(" ", keyValuePairs) + "]"; } - public static String getDeviceOverrideValue(final Resources res, final int overrideResId) { + public static String getDeviceOverrideValue(final Resources res, final int overrideResId, + final String defaultValue) { final int orientation = res.getConfiguration().orientation; final String key = overrideResId + "-" + orientation; if (sDeviceOverrideValueMap.containsKey(key)) { @@ -86,23 +86,6 @@ public final class ResourceUtils { return overrideValue; } - String defaultValue = null; - try { - defaultValue = findDefaultConstant(overrideArray); - // The defaultValue might be an empty string. - if (defaultValue == null) { - Log.w(TAG, "Couldn't find override value nor default value:" - + " resource="+ res.getResourceEntryName(overrideResId) - + " build=" + sBuildKeyValuesDebugString); - } else { - Log.i(TAG, "Found default value:" - + " resource="+ res.getResourceEntryName(overrideResId) - + " build=" + sBuildKeyValuesDebugString - + " default=" + defaultValue); - } - } catch (final DeviceOverridePatternSyntaxError e) { - Log.w(TAG, "Syntax error, ignored", e); - } sDeviceOverrideValueMap.put(key, defaultValue); return defaultValue; } @@ -152,8 +135,7 @@ public final class ResourceUtils { } final String condition = conditionConstant.substring(0, posComma); if (condition.isEmpty()) { - // Default condition. The default condition should be searched by - // {@link #findConstantForDefault(String[])}. + Log.w(TAG, "Array element has no condition: " + conditionConstant); continue; } try { @@ -199,24 +181,6 @@ public final class ResourceUtils { return matchedAll; } - @UsedForTesting - static String findDefaultConstant(final String[] conditionConstantArray) - throws DeviceOverridePatternSyntaxError { - if (conditionConstantArray == null) { - return null; - } - for (final String condition : conditionConstantArray) { - final int posComma = condition.indexOf(','); - if (posComma < 0) { - throw new DeviceOverridePatternSyntaxError("Array element has no comma", condition); - } - if (posComma == 0) { // condition is empty. - return condition.substring(posComma + 1); - } - } - return null; - } - public static int getDefaultKeyboardWidth(final Resources res) { final DisplayMetrics dm = res.getDisplayMetrics(); return dm.widthPixels; @@ -224,22 +188,23 @@ public final class ResourceUtils { public static int getDefaultKeyboardHeight(final Resources res) { final DisplayMetrics dm = res.getDisplayMetrics(); - final String keyboardHeightString = getDeviceOverrideValue(res, R.array.keyboard_heights); + final String keyboardHeightInDp = getDeviceOverrideValue( + res, R.array.keyboard_heights, null /* defaultValue */); final float keyboardHeight; - if (TextUtils.isEmpty(keyboardHeightString)) { - keyboardHeight = res.getDimension(R.dimen.keyboardHeight); + if (TextUtils.isEmpty(keyboardHeightInDp)) { + keyboardHeight = res.getDimension(R.dimen.config_default_keyboard_height); } else { - keyboardHeight = Float.parseFloat(keyboardHeightString) * dm.density; + keyboardHeight = Float.parseFloat(keyboardHeightInDp) * dm.density; } final float maxKeyboardHeight = res.getFraction( - R.fraction.maxKeyboardHeight, dm.heightPixels, dm.heightPixels); + R.fraction.config_max_keyboard_height, dm.heightPixels, dm.heightPixels); float minKeyboardHeight = res.getFraction( - R.fraction.minKeyboardHeight, dm.heightPixels, dm.heightPixels); + R.fraction.config_min_keyboard_height, dm.heightPixels, dm.heightPixels); if (minKeyboardHeight < 0.0f) { // Specified fraction was negative, so it should be calculated against display // width. minKeyboardHeight = -res.getFraction( - R.fraction.minKeyboardHeight, dm.widthPixels, dm.widthPixels); + R.fraction.config_min_keyboard_height, dm.widthPixels, dm.widthPixels); } // Keyboard height will not exceed maxKeyboardHeight and will not be less than // minKeyboardHeight. @@ -260,6 +225,10 @@ public final class ResourceUtils { return dimension >= 0; } + public static float getFloatFromFraction(final Resources res, final int fractionResId) { + return res.getFraction(fractionResId, 1, 1); + } + public static float getFraction(final TypedArray a, final int index, final float defValue) { final TypedValue value = a.peekValue(index); if (value == null || !isFractionValue(value)) { diff --git a/java/src/com/android/inputmethod/latin/utils/RunInLocale.java b/java/src/com/android/inputmethod/latin/utils/RunInLocale.java index 2c9e3b191..1ea16e6ef 100644 --- a/java/src/com/android/inputmethod/latin/utils/RunInLocale.java +++ b/java/src/com/android/inputmethod/latin/utils/RunInLocale.java @@ -30,25 +30,23 @@ public abstract class RunInLocale<T> { * Execute {@link #job(Resources)} method in specified system locale exclusively. * * @param res the resources to use. - * @param newLocale the locale to change to. + * @param newLocale the locale to change to. Run in system locale if null. * @return the value returned from {@link #job(Resources)}. */ public T runInLocale(final Resources res, final Locale newLocale) { synchronized (sLockForRunInLocale) { final Configuration conf = res.getConfiguration(); - final Locale oldLocale = conf.locale; - final boolean needsChange = (newLocale != null && !newLocale.equals(oldLocale)); + if (newLocale == null || newLocale.equals(conf.locale)) { + return job(res); + } + final Locale savedLocale = conf.locale; try { - if (needsChange) { - conf.locale = newLocale; - res.updateConfiguration(conf, null); - } + conf.locale = newLocale; + res.updateConfiguration(conf, null); return job(res); } finally { - if (needsChange) { - conf.locale = oldLocale; - res.updateConfiguration(conf, null); - } + conf.locale = savedLocale; + res.updateConfiguration(conf, null); } } } diff --git a/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java b/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java new file mode 100644 index 000000000..a76a6dfd7 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/ScriptUtils.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin.utils; + +import java.util.Locale; +import java.util.TreeMap; + +/** + * A class to help with handling different writing scripts. + */ +public class ScriptUtils { + // Used for hardware keyboards + public static final int SCRIPT_UNKNOWN = -1; + // TODO: should we use ISO 15924 identifiers instead? + public static final int SCRIPT_LATIN = 0; + public static final int SCRIPT_CYRILLIC = 1; + public static final int SCRIPT_GREEK = 2; + public static final int SCRIPT_ARABIC = 3; + public static final int SCRIPT_HEBREW = 4; + public static final int SCRIPT_ARMENIAN = 5; + public static final int SCRIPT_GEORGIAN = 6; + public static final TreeMap<String, Integer> mSpellCheckerLanguageToScript; + static { + // List of the supported languages and their associated script. We won't check + // words written in another script than the selected script, because we know we + // don't have those in our dictionary so we will underline everything and we + // will never have any suggestions, so it makes no sense checking them, and this + // is done in {@link #shouldFilterOut}. Also, the script is used to choose which + // proximity to pass to the dictionary descent algorithm. + // IMPORTANT: this only contains languages - do not write countries in there. + // Only the language is searched from the map. + mSpellCheckerLanguageToScript = new TreeMap<>(); + mSpellCheckerLanguageToScript.put("cs", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("da", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("de", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("el", SCRIPT_GREEK); + mSpellCheckerLanguageToScript.put("en", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("es", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("fi", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("fr", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("hr", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("it", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("lt", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("lv", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("nb", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("nl", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("pt", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("sl", SCRIPT_LATIN); + mSpellCheckerLanguageToScript.put("ru", SCRIPT_CYRILLIC); + } + /* + * Returns whether the code point is a letter that makes sense for the specified + * locale for this spell checker. + * The dictionaries supported by Latin IME are described in res/xml/spellchecker.xml + * and is limited to EFIGS languages and Russian. + * Hence at the moment this explicitly tests for Cyrillic characters or Latin characters + * as appropriate, and explicitly excludes CJK, Arabic and Hebrew characters. + */ + public static boolean isLetterPartOfScript(final int codePoint, final int scriptId) { + switch (scriptId) { + case SCRIPT_LATIN: + // Our supported latin script dictionaries (EFIGS) at the moment only include + // characters in the C0, C1, Latin Extended A and B, IPA extensions unicode + // blocks. As it happens, those are back-to-back in the code range 0x40 to 0x2AF, + // so the below is a very efficient way to test for it. As for the 0-0x3F, it's + // excluded from isLetter anyway. + return codePoint <= 0x2AF && Character.isLetter(codePoint); + case SCRIPT_CYRILLIC: + // All Cyrillic characters are in the 400~52F block. There are some in the upper + // Unicode range, but they are archaic characters that are not used in modern + // Russian and are not used by our dictionary. + return codePoint >= 0x400 && codePoint <= 0x52F && Character.isLetter(codePoint); + case SCRIPT_GREEK: + // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the + // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters. + // Our dictionary also contains a few words with 0xF2; it would be best to check + // if that's correct, but a web search does return results for these words so + // they are probably okay. + return (codePoint >= 0x370 && codePoint <= 0x3FF) + || (codePoint >= 0x1F00 && codePoint <= 0x1FFF) + || codePoint == 0xF2; + case SCRIPT_ARABIC: + // Arabic letters can be in any of the following blocks: + // Arabic U+0600..U+06FF + // Arabic Supplement U+0750..U+077F + // Arabic Extended-A U+08A0..U+08FF + // Arabic Presentation Forms-A U+FB50..U+FDFF + // Arabic Presentation Forms-B U+FE70..U+FEFF + return (codePoint >= 0x600 && codePoint <= 0x6FF) + || (codePoint >= 0x750 && codePoint <= 0x77F) + || (codePoint >= 0x8A0 && codePoint <= 0x8FF) + || (codePoint >= 0xFB50 && codePoint <= 0xFDFF) + || (codePoint >= 0xFE70 && codePoint <= 0xFEFF); + case SCRIPT_HEBREW: + // Hebrew letters are in the Hebrew unicode block, which spans from U+0590 to U+05FF, + // or in the Alphabetic Presentation Forms block, U+FB00..U+FB4F, but only in the + // Hebrew part of that block, which is U+FB1D..U+FB4F. + return (codePoint >= 0x590 && codePoint <= 0x5FF + || codePoint >= 0xFB1D && codePoint <= 0xFB4F); + case SCRIPT_ARMENIAN: + // Armenian letters are in the Armenian unicode block, U+0530..U+058F and + // Alphabetic Presentation Forms block, U+FB00..U+FB4F, but only in the Armenian part + // of that block, which is U+FB13..U+FB17. + return (codePoint >= 0x530 && codePoint <= 0x58F + || codePoint >= 0xFB13 && codePoint <= 0xFB17); + case SCRIPT_GEORGIAN: + // Georgian letters are in the Georgian unicode block, U+10A0..U+10FF, + // or Georgian supplement block, U+2D00..U+2D2F + return (codePoint >= 0x10A0 && codePoint <= 0x10FF + || codePoint >= 0x2D00 && codePoint <= 0x2D2F); + case SCRIPT_UNKNOWN: + return true; + default: + // Should never come here + throw new RuntimeException("Impossible value of script: " + scriptId); + } + } + + public static int getScriptFromSpellCheckerLocale(final Locale locale) { + final Integer script = mSpellCheckerLanguageToScript.get(locale.getLanguage()); + if (null == script) { + throw new RuntimeException("We have been called with an unsupported language: \"" + + locale.getLanguage() + "\". Framework bug?"); + } + return script; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/SpacebarLanguageUtils.java b/java/src/com/android/inputmethod/latin/utils/SpacebarLanguageUtils.java new file mode 100644 index 000000000..1ca895fdb --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/SpacebarLanguageUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014 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.utils; + +import android.view.inputmethod.InputMethodSubtype; + +public final class SpacebarLanguageUtils { + private SpacebarLanguageUtils() { + // Intentional empty constructor for utility class. + } + + // InputMethodSubtype's display name for spacebar text in its locale. + // isAdditionalSubtype (T=true, F=false) + // locale layout | Middle Full + // ------ ------- - --------- ---------------------- + // en_US qwerty F English English (US) exception + // en_GB qwerty F English English (UK) exception + // es_US spanish F Español Español (EE.UU.) exception + // fr azerty F Français Français + // fr_CA qwerty F Français Français (Canada) + // fr_CH swiss F Français Français (Suisse) + // de qwertz F Deutsch Deutsch + // de_CH swiss T Deutsch Deutsch (Schweiz) + // zz qwerty F QWERTY QWERTY + // fr qwertz T Français Français + // de qwerty T Deutsch Deutsch + // en_US azerty T English English (US) + // zz azerty T AZERTY AZERTY + // Get InputMethodSubtype's full display name in its locale. + public static String getFullDisplayName(final InputMethodSubtype subtype) { + if (SubtypeLocaleUtils.isNoLanguage(subtype)) { + return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype); + } + return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(subtype.getLocale()); + } + + // Get InputMethodSubtype's middle display name in its locale. + public static String getMiddleDisplayName(final InputMethodSubtype subtype) { + if (SubtypeLocaleUtils.isNoLanguage(subtype)) { + return SubtypeLocaleUtils.getKeyboardLayoutSetDisplayName(subtype); + } + return SubtypeLocaleUtils.getSubtypeLanguageDisplayName(subtype.getLocale()); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/SpannableStringUtils.java b/java/src/com/android/inputmethod/latin/utils/SpannableStringUtils.java index b51fd9377..38164cb36 100644 --- a/java/src/com/android/inputmethod/latin/utils/SpannableStringUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/SpannableStringUtils.java @@ -22,6 +22,7 @@ import android.text.Spanned; import android.text.SpannedString; import android.text.TextUtils; import android.text.style.SuggestionSpan; +import android.text.style.URLSpan; public final class SpannableStringUtils { /** @@ -40,12 +41,17 @@ public final class SpannableStringUtils { * are out of range in <code>dest</code>. */ public static void copyNonParagraphSuggestionSpansFrom(Spanned source, int start, int end, - Spannable dest, int destoff) { + Spannable dest, int destoff) { Object[] spans = source.getSpans(start, end, SuggestionSpan.class); for (int i = 0; i < spans.length; i++) { int fl = source.getSpanFlags(spans[i]); - if (0 != (fl & Spannable.SPAN_PARAGRAPH)) continue; + // We don't care about the PARAGRAPH flag in LatinIME code. However, if this flag + // is set, Spannable#setSpan will throw an exception unless the span is on the edge + // of a word. But the spans have been split into two by the getText{Before,After}Cursor + // methods, so after concatenation they may end in the middle of a word. + // Since we don't use them, we can just remove them and avoid crashing. + fl &= ~Spannable.SPAN_PARAGRAPH; int st = source.getSpanStart(spans[i]); int en = source.getSpanEnd(spans[i]); @@ -107,4 +113,16 @@ public final class SpannableStringUtils { return new SpannedString(ss); } + + public static boolean hasUrlSpans(final CharSequence text, + final int startIndex, final int endIndex) { + if (!(text instanceof Spanned)) { + return false; // Not spanned, so no link + } + final Spanned spanned = (Spanned)text; + // getSpans(x, y) does not return spans that start on x or end on y. x-1, y+1 does the + // trick, and works in all cases even if startIndex <= 0 or endIndex >= text.length(). + final URLSpan[] spans = spanned.getSpans(startIndex - 1, endIndex + 1, URLSpan.class); + return null != spans && spans.length > 0; + } } diff --git a/java/src/com/android/inputmethod/research/FeedbackLog.java b/java/src/com/android/inputmethod/latin/utils/StatsUtils.java index 5af194c32..79c19d077 100644 --- a/java/src/com/android/inputmethod/research/FeedbackLog.java +++ b/java/src/com/android/inputmethod/latin/utils/StatsUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2014 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. @@ -14,19 +14,21 @@ * limitations under the License. */ -package com.android.inputmethod.research; +package com.android.inputmethod.latin.utils; import android.content.Context; +import com.android.inputmethod.latin.settings.SettingsValues; -import java.io.File; +public final class StatsUtils { + public static void init(final Context context) { + } + + public static void onCreate(final SettingsValues settingsValues) { + } -public class FeedbackLog extends ResearchLog { - public FeedbackLog(final File outputFile, final Context context) { - super(outputFile, context); + public static void onLoadSettings(final SettingsValues settingsValues) { } - @Override - public boolean isFeedbackLog() { - return true; + public static void onDestroy() { } } diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java index a36548392..ceb038371 100644 --- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java @@ -16,29 +16,24 @@ package com.android.inputmethod.latin.utils; -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.settings.SettingsValues; +import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED; import android.text.TextUtils; -import android.util.JsonReader; -import android.util.JsonWriter; -import android.util.Log; -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; +import com.android.inputmethod.annotations.UsedForTesting; +import com.android.inputmethod.latin.Constants; + import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.Arrays; import java.util.Locale; public final class StringUtils { - private static final String TAG = StringUtils.class.getSimpleName(); public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case public static final int CAPITALIZE_FIRST = 1; // First only public static final int CAPITALIZE_ALL = 2; // All caps + private static final String EMPTY_STRING = ""; + private StringUtils() { // This utility class is not publicly instantiable. } @@ -50,7 +45,7 @@ public final class StringUtils { public static String newSingleCodePointString(int codePoint) { if (Character.charCount(codePoint) == 1) { - // Optimization: avoid creating an temporary array for characters that are + // Optimization: avoid creating a temporary array for characters that are // represented by a single char value return String.valueOf((char) codePoint); } @@ -80,27 +75,16 @@ public final class StringUtils { return containsInArray(text, extraValues.split(SEPARATOR_FOR_COMMA_SPLITTABLE_TEXT)); } - public static String appendToCommaSplittableTextIfNotExists(final String text, - final String extraValues) { - if (TextUtils.isEmpty(extraValues)) { - return text; - } - if (containsInCommaSplittableText(text, extraValues)) { - return extraValues; - } - return extraValues + SEPARATOR_FOR_COMMA_SPLITTABLE_TEXT + text; - } - public static String removeFromCommaSplittableTextIfExists(final String text, final String extraValues) { if (TextUtils.isEmpty(extraValues)) { - return ""; + return EMPTY_STRING; } final String[] elements = extraValues.split(SEPARATOR_FOR_COMMA_SPLITTABLE_TEXT); if (!containsInArray(text, elements)) { return extraValues; } - final ArrayList<String> result = CollectionUtils.newArrayList(elements.length - 1); + final ArrayList<String> result = new ArrayList<>(elements.length - 1); for (final String element : elements) { if (!text.equals(element)) { result.add(element); @@ -162,20 +146,87 @@ public final class StringUtils { private static final int[] EMPTY_CODEPOINTS = {}; - public static int[] toCodePointArray(final String string) { - final int length = string.length(); + public static int[] toCodePointArray(final CharSequence charSequence) { + return toCodePointArray(charSequence, 0, charSequence.length()); + } + + /** + * Converts a range of a string to an array of code points. + * @param charSequence the source string. + * @param startIndex the start index inside the string in java chars, inclusive. + * @param endIndex the end index inside the string in java chars, exclusive. + * @return a new array of code points. At most endIndex - startIndex, but possibly less. + */ + public static int[] toCodePointArray(final CharSequence charSequence, + final int startIndex, final int endIndex) { + final int length = charSequence.length(); if (length <= 0) { return EMPTY_CODEPOINTS; } - final int[] codePoints = new int[string.codePointCount(0, length)]; + final int[] codePoints = + new int[Character.codePointCount(charSequence, startIndex, endIndex)]; + copyCodePointsAndReturnCodePointCount(codePoints, charSequence, startIndex, endIndex, + false /* downCase */); + return codePoints; + } + + /** + * Copies the codepoints in a CharSequence to an int array. + * + * This method assumes there is enough space in the array to store the code points. The size + * can be measured with Character#codePointCount(CharSequence, int, int) before passing to this + * method. If the int array is too small, an ArrayIndexOutOfBoundsException will be thrown. + * Also, this method makes no effort to be thread-safe. Do not modify the CharSequence while + * this method is running, or the behavior is undefined. + * This method can optionally downcase code points before copying them, but it pays no attention + * to locale while doing so. + * + * @param destination the int array. + * @param charSequence the CharSequence. + * @param startIndex the start index inside the string in java chars, inclusive. + * @param endIndex the end index inside the string in java chars, exclusive. + * @param downCase if this is true, code points will be downcased before being copied. + * @return the number of copied code points. + */ + public static int copyCodePointsAndReturnCodePointCount(final int[] destination, + final CharSequence charSequence, final int startIndex, final int endIndex, + final boolean downCase) { int destIndex = 0; - for (int index = 0; index < length; index = string.offsetByCodePoints(index, 1)) { - codePoints[destIndex] = string.codePointAt(index); + for (int index = startIndex; index < endIndex; + index = Character.offsetByCodePoints(charSequence, index, 1)) { + final int codePoint = Character.codePointAt(charSequence, index); + // TODO: stop using this, as it's not aware of the locale and does not always do + // the right thing. + destination[destIndex] = downCase ? Character.toLowerCase(codePoint) : codePoint; destIndex++; } + return destIndex; + } + + public static int[] toSortedCodePointArray(final String string) { + final int[] codePoints = toCodePointArray(string); + Arrays.sort(codePoints); return codePoints; } + /** + * Construct a String from a code point array + * + * @param codePoints a code point array that is null terminated when its logical length is + * shorter than the array length. + * @return a string constructed from the code point array. + */ + public static String getStringFromNullTerminatedCodePointArray(final int[] codePoints) { + int stringLength = codePoints.length; + for (int i = 0; i < codePoints.length; i++) { + if (codePoints[i] == 0) { + stringLength = i; + break; + } + } + return new String(codePoints, 0 /* offset */, stringLength); + } + // This method assumes the text is not null. For the empty string, it returns CAPITALIZE_NONE. public static int getCapitalizationType(final String text) { // If the first char is not uppercase, then the word is either all lower case or @@ -239,65 +290,40 @@ public final class StringUtils { return true; } - @UsedForTesting - public static boolean looksValidForDictionaryInsertion(final CharSequence text, - final SettingsValues settings) { - if (TextUtils.isEmpty(text)) return false; - final int length = text.length(); - int i = 0; - int digitCount = 0; - while (i < length) { - final int codePoint = Character.codePointAt(text, i); - final int charCount = Character.charCount(codePoint); - i += charCount; - if (Character.isDigit(codePoint)) { - // Count digits: see below - digitCount += charCount; - continue; - } - if (!settings.isWordCodePoint(codePoint)) return false; - } - // We reject strings entirely comprised of digits to avoid using PIN codes or credit - // card numbers. It would come in handy for word prediction though; a good example is - // when writing one's address where the street number is usually quite discriminative, - // as well as the postal code. - return digitCount < length; - } - public static boolean isIdenticalAfterCapitalizeEachWord(final String text, - final String separators) { - boolean needCapsNext = true; + final int[] sortedSeparators) { + boolean needsCapsNext = true; final int len = text.length(); for (int i = 0; i < len; i = text.offsetByCodePoints(i, 1)) { final int codePoint = text.codePointAt(i); if (Character.isLetter(codePoint)) { - if ((needCapsNext && !Character.isUpperCase(codePoint)) - || (!needCapsNext && !Character.isLowerCase(codePoint))) { + if ((needsCapsNext && !Character.isUpperCase(codePoint)) + || (!needsCapsNext && !Character.isLowerCase(codePoint))) { return false; } } // We need a capital letter next if this is a separator. - needCapsNext = (-1 != separators.indexOf(codePoint)); + needsCapsNext = (Arrays.binarySearch(sortedSeparators, codePoint) >= 0); } return true; } // TODO: like capitalizeFirst*, this does not work perfectly for Dutch because of the IJ digraph // which should be capitalized together in *some* cases. - public static String capitalizeEachWord(final String text, final String separators, + public static String capitalizeEachWord(final String text, final int[] sortedSeparators, final Locale locale) { final StringBuilder builder = new StringBuilder(); - boolean needCapsNext = true; + boolean needsCapsNext = true; final int len = text.length(); for (int i = 0; i < len; i = text.offsetByCodePoints(i, 1)) { final String nextChar = text.substring(i, text.offsetByCodePoints(i, 1)); - if (needCapsNext) { + if (needsCapsNext) { builder.append(nextChar.toUpperCase(locale)); } else { builder.append(nextChar.toLowerCase(locale)); } // We need a capital letter next if this is a separator. - needCapsNext = (-1 != separators.indexOf(nextChar.codePointAt(0))); + needsCapsNext = (Arrays.binarySearch(sortedSeparators, nextChar.codePointAt(0)) >= 0); } return builder.toString(); } @@ -328,7 +354,7 @@ public final class StringUtils { boolean hasPeriod = false; int codePoint = 0; while (i > 0) { - codePoint = Character.codePointBefore(text, i); + codePoint = Character.codePointBefore(text, i); if (codePoint < Constants.CODE_PERIOD || codePoint > 'z') { // Handwavy heuristic to see if that's a URL character. Anything between period // and z. This includes all lower- and upper-case ascii letters, period, @@ -367,7 +393,49 @@ public final class StringUtils { return false; } - public static boolean isEmptyStringOrWhiteSpaces(String s) { + /** + * Examines the string and returns whether we're inside a double quote. + * + * This is used to decide whether we should put an automatic space before or after a double + * quote character. If we're inside a quotation, then we want to close it, so we want a space + * after and not before. Otherwise, we want to open the quotation, so we want a space before + * and not after. Exception: after a digit, we never want a space because the "inch" or + * "minutes" use cases is dominant after digits. + * In the practice, we determine whether we are in a quotation or not by finding the previous + * double quote character, and looking at whether it's followed by whitespace. If so, that + * was a closing quotation mark, so we're not inside a double quote. If it's not followed + * by whitespace, then it was an opening quotation mark, and we're inside a quotation. + * + * @param text the text to examine. + * @return whether we're inside a double quote. + */ + public static boolean isInsideDoubleQuoteOrAfterDigit(final CharSequence text) { + int i = text.length(); + if (0 == i) return false; + int codePoint = Character.codePointBefore(text, i); + if (Character.isDigit(codePoint)) return true; + int prevCodePoint = 0; + while (i > 0) { + codePoint = Character.codePointBefore(text, i); + if (Constants.CODE_DOUBLE_QUOTE == codePoint) { + // If we see a double quote followed by whitespace, then that + // was a closing quote. + if (Character.isWhitespace(prevCodePoint)) return false; + } + if (Character.isWhitespace(codePoint) && Constants.CODE_DOUBLE_QUOTE == prevCodePoint) { + // If we see a double quote preceded by whitespace, then that + // was an opening quote. No need to continue seeking. + return true; + } + i -= Character.charCount(codePoint); + prevCodePoint = codePoint; + } + // We reached the start of text. If the first char is a double quote, then we're inside + // a double quote. Otherwise we're not. + return Constants.CODE_DOUBLE_QUOTE == codePoint; + } + + public static boolean isEmptyStringOrWhiteSpaces(final String s) { final int N = codePointCount(s); for (int i = 0; i < N; ++i) { if (!Character.isWhitespace(s.codePointAt(i))) { @@ -378,9 +446,9 @@ public final class StringUtils { } @UsedForTesting - public static String byteArrayToHexString(byte[] bytes) { + public static String byteArrayToHexString(final byte[] bytes) { if (bytes == null || bytes.length == 0) { - return ""; + return EMPTY_STRING; } final StringBuilder sb = new StringBuilder(); for (byte b : bytes) { @@ -393,7 +461,7 @@ public final class StringUtils { * Convert hex string to byte array. The string length must be an even number. */ @UsedForTesting - public static byte[] hexStringToByteArray(String hexString) { + public static byte[] hexStringToByteArray(final String hexString) { if (TextUtils.isEmpty(hexString)) { return null; } @@ -410,66 +478,68 @@ public final class StringUtils { return bytes; } - public static List<Object> jsonStrToList(String s) { - final ArrayList<Object> retval = CollectionUtils.newArrayList(); - final JsonReader reader = new JsonReader(new StringReader(s)); - try { - reader.beginArray(); - while(reader.hasNext()) { - reader.beginObject(); - while (reader.hasNext()) { - final String name = reader.nextName(); - if (name.equals(Integer.class.getSimpleName())) { - retval.add(reader.nextInt()); - } else if (name.equals(String.class.getSimpleName())) { - retval.add(reader.nextString()); - } else { - Log.w(TAG, "Invalid name: " + name); - reader.skipValue(); - } - } - reader.endObject(); - } - reader.endArray(); - return retval; - } catch (IOException e) { - } finally { - try { - reader.close(); - } catch (IOException e) { - } + public static String toUpperCaseOfStringForLocale(final String text, + final boolean needsToUpperCase, final Locale locale) { + if (text == null || !needsToUpperCase) return text; + return text.toUpperCase(locale); + } + + public static int toUpperCaseOfCodeForLocale(final int code, final boolean needsToUpperCase, + final Locale locale) { + if (!Constants.isLetterCode(code) || !needsToUpperCase) return code; + final String text = newSingleCodePointString(code); + final String casedText = toUpperCaseOfStringForLocale( + text, needsToUpperCase, locale); + return codePointCount(casedText) == 1 + ? casedText.codePointAt(0) : CODE_UNSPECIFIED; + } + + public static int getTrailingSingleQuotesCount(final CharSequence charSequence) { + final int lastIndex = charSequence.length() - 1; + int i = lastIndex; + while (i >= 0 && charSequence.charAt(i) == Constants.CODE_SINGLE_QUOTE) { + --i; } - return Collections.<Object>emptyList(); + return lastIndex - i; } - public static String listToJsonStr(List<Object> list) { - if (list == null || list.isEmpty()) { - return ""; - } - final StringWriter sw = new StringWriter(); - final JsonWriter writer = new JsonWriter(sw); - try { - writer.beginArray(); - for (final Object o : list) { - writer.beginObject(); - if (o instanceof Integer) { - writer.name(Integer.class.getSimpleName()).value((Integer)o); - } else if (o instanceof String) { - writer.name(String.class.getSimpleName()).value((String)o); - } - writer.endObject(); + @UsedForTesting + public static class Stringizer<E> { + public String stringize(final E element) { + return element != null ? element.toString() : "null"; + } + + @UsedForTesting + public final String join(final E[] array) { + return joinStringArray(toStringArray(array), null /* delimiter */); + } + + @UsedForTesting + public final String join(final E[] array, final String delimiter) { + return joinStringArray(toStringArray(array), delimiter); + } + + protected String[] toStringArray(final E[] array) { + final String[] stringArray = new String[array.length]; + for (int index = 0; index < array.length; index++) { + stringArray[index] = stringize(array[index]); } - writer.endArray(); - return sw.toString(); - } catch (IOException e) { - } finally { - try { - if (writer != null) { - writer.close(); - } - } catch (IOException e) { + return stringArray; + } + + protected String joinStringArray(final String[] stringArray, final String delimiter) { + if (stringArray == null) { + return "null"; + } + if (delimiter == null) { + return Arrays.toString(stringArray); + } + final StringBuilder sb = new StringBuilder(); + for (int index = 0; index < stringArray.length; index++) { + sb.append(index == 0 ? "[" : delimiter); + sb.append(stringArray[index]); } + return sb + "]"; } - return ""; } } diff --git a/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java b/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java index 102a41b4e..351d01400 100644 --- a/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java @@ -25,17 +25,18 @@ import android.os.Build; import android.util.Log; import android.view.inputmethod.InputMethodSubtype; -import com.android.inputmethod.latin.DictionaryFactory; +import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.R; +import java.util.Arrays; import java.util.HashMap; import java.util.Locale; public final class SubtypeLocaleUtils { - static final String TAG = SubtypeLocaleUtils.class.getSimpleName(); - // This class must be located in the same package as LatinIME.java. - private static final String RESOURCE_PACKAGE_NAME = - DictionaryFactory.class.getPackage().getName(); + private static final String TAG = SubtypeLocaleUtils.class.getSimpleName(); + + // This reference class {@link Constants} must be located in the same package as LatinIME.java. + private static final String RESOURCE_PACKAGE_NAME = Constants.class.getPackage().getName(); // Special language code to represent "no language". public static final String NO_LANGUAGE = "zz"; @@ -43,21 +44,19 @@ public final class SubtypeLocaleUtils { public static final String EMOJI = "emoji"; public static final int UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic; - private static boolean sInitialized = false; + private static volatile boolean sInitialized = false; + private static final Object sInitializeLock = new Object(); private static Resources sResources; private static String[] sPredefinedKeyboardLayoutSet; // Keyboard layout to its display name map. - private static final HashMap<String, String> sKeyboardLayoutToDisplayNameMap = - CollectionUtils.newHashMap(); + private static final HashMap<String, String> sKeyboardLayoutToDisplayNameMap = new HashMap<>(); // Keyboard layout to subtype name resource id map. - private static final HashMap<String, Integer> sKeyboardLayoutToNameIdsMap = - CollectionUtils.newHashMap(); + private static final HashMap<String, Integer> sKeyboardLayoutToNameIdsMap = new HashMap<>(); // Exceptional locale to subtype name resource id map. - private static final HashMap<String, Integer> sExceptionalLocaleToNameIdsMap = - CollectionUtils.newHashMap(); + private static final HashMap<String, Integer> sExceptionalLocaleToNameIdsMap = new HashMap<>(); // Exceptional locale to subtype name with layout resource id map. private static final HashMap<String, Integer> sExceptionalLocaleToWithLayoutNameIdsMap = - CollectionUtils.newHashMap(); + new HashMap<>(); private static final String SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_"; private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = @@ -69,16 +68,23 @@ public final class SubtypeLocaleUtils { // Keyboard layout set name for the subtypes that don't have a keyboardLayoutSet extra value. // This is for compatibility to keep the same subtype ids as pre-JellyBean. private static final HashMap<String, String> sLocaleAndExtraValueToKeyboardLayoutSetMap = - CollectionUtils.newHashMap(); + new HashMap<>(); private SubtypeLocaleUtils() { // Intentional empty constructor for utility class. } // Note that this initialization method can be called multiple times. - public static synchronized void init(final Context context) { - if (sInitialized) return; + public static void init(final Context context) { + synchronized (sInitializeLock) { + if (sInitialized == false) { + initLocked(context); + sInitialized = true; + } + } + } + private static void initLocked(final Context context) { final Resources res = context.getResources(); sResources = res; @@ -121,8 +127,6 @@ public final class SubtypeLocaleUtils { final String keyboardLayoutSet = keyboardLayoutSetMap[i + 1]; sLocaleAndExtraValueToKeyboardLayoutSetMap.put(key, keyboardLayoutSet); } - - sInitialized = true; } public static String[] getPredefinedKeyboardLayoutSet() { @@ -166,8 +170,18 @@ public final class SubtypeLocaleUtils { return getSubtypeLocaleDisplayNameInternal(localeString, displayLocale); } + public static String getSubtypeLanguageDisplayName(final String localeString) { + final Locale locale = LocaleUtils.constructLocaleFromString(localeString); + final Locale displayLocale = getDisplayLocaleOfSubtypeLocale(localeString); + return getSubtypeLocaleDisplayNameInternal(locale.getLanguage(), displayLocale); + } + private static String getSubtypeLocaleDisplayNameInternal(final String localeString, final Locale displayLocale) { + if (NO_LANGUAGE.equals(localeString)) { + // No language subtype should be displayed in system locale. + return sResources.getString(R.string.subtype_no_language); + } final Integer exceptionalNameResId = sExceptionalLocaleToNameIdsMap.get(localeString); final String displayName; if (exceptionalNameResId != null) { @@ -178,9 +192,6 @@ public final class SubtypeLocaleUtils { } }; displayName = getExceptionalName.runInLocale(sResources, displayLocale); - } else if (NO_LANGUAGE.equals(localeString)) { - // No language subtype should be displayed in system locale. - return sResources.getString(R.string.subtype_no_language); } else { final Locale locale = LocaleUtils.constructLocaleFromString(localeString); displayName = locale.getDisplayName(displayLocale); @@ -197,12 +208,14 @@ public final class SubtypeLocaleUtils { // es_US spanish F Español (EE.UU.) exception // fr azerty F Français // fr_CA qwerty F Français (Canada) + // fr_CH swiss F Français (Suisse) // de qwertz F Deutsch - // zz qwerty F No language (QWERTY) in system locale + // de_CH swiss T Deutsch (Schweiz) + // zz qwerty F Alphabet (QWERTY) in system locale // fr qwertz T Français (QWERTZ) // de qwerty T Deutsch (QWERTY) // en_US azerty T English (US) (AZERTY) exception - // zz azerty T No language (AZERTY) in system locale + // zz azerty T Alphabet (AZERTY) in system locale private static String getReplacementString(final InputMethodSubtype subtype, final Locale displayLocale) { @@ -289,45 +302,27 @@ public final class SubtypeLocaleUtils { return keyboardLayoutSet; } - // InputMethodSubtype's display name for spacebar text in its locale. - // isAdditionalSubtype (T=true, F=false) - // locale layout | Short Middle Full - // ------ ------- - ---- --------- ---------------------- - // en_US qwerty F En English English (US) exception - // en_GB qwerty F En English English (UK) exception - // es_US spanish F Es Español Español (EE.UU.) exception - // fr azerty F Fr Français Français - // fr_CA qwerty F Fr Français Français (Canada) - // de qwertz F De Deutsch Deutsch - // zz qwerty F QWERTY QWERTY - // fr qwertz T Fr Français Français - // de qwerty T De Deutsch Deutsch - // en_US azerty T En English English (US) - // zz azerty T AZERTY AZERTY - - // Get InputMethodSubtype's full display name in its locale. - public static String getFullDisplayName(final InputMethodSubtype subtype) { - if (isNoLanguage(subtype)) { - return getKeyboardLayoutSetDisplayName(subtype); - } - return getSubtypeLocaleDisplayName(subtype.getLocale()); + // TODO: Get this information from the framework instead of maintaining here by ourselves. + // Sorted list of known Right-To-Left language codes. + private static final String[] SORTED_RTL_LANGUAGES = { + "ar", // Arabic + "fa", // Persian + "iw", // Hebrew + }; + static { + Arrays.sort(SORTED_RTL_LANGUAGES); } - // Get InputMethodSubtype's middle display name in its locale. - public static String getMiddleDisplayName(final InputMethodSubtype subtype) { - if (isNoLanguage(subtype)) { - return getKeyboardLayoutSetDisplayName(subtype); - } - final Locale locale = getSubtypeLocale(subtype); - return getSubtypeLocaleDisplayName(locale.getLanguage()); + public static boolean isRtlLanguage(final Locale locale) { + final String language = locale.getLanguage(); + return Arrays.binarySearch(SORTED_RTL_LANGUAGES, language) >= 0; } - // Get InputMethodSubtype's short display name in its locale. - public static String getShortDisplayName(final InputMethodSubtype subtype) { - if (isNoLanguage(subtype)) { - return ""; - } - final Locale locale = getSubtypeLocale(subtype); - return StringUtils.capitalizeFirstCodePoint(locale.getLanguage(), locale); + public static boolean isRtlLanguage(final InputMethodSubtype subtype) { + return isRtlLanguage(getSubtypeLocale(subtype)); + } + + public static String getCombiningRulesExtraValue(final InputMethodSubtype subtype) { + return subtype.getExtraValueOf(Constants.Subtype.ExtraValue.COMBINING_RULES); } } diff --git a/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java new file mode 100644 index 000000000..5c109a68c --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014 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.utils; + +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.define.ProductionFlag; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.Locale; +import java.util.TreeSet; + +/** + * A TreeSet of SuggestedWordInfo that is bounded in size and throws everything that's smaller + * than its limit + */ +public final class SuggestionResults extends TreeSet<SuggestedWordInfo> { + public final Locale mLocale; + public final ArrayList<SuggestedWordInfo> mRawSuggestions; + private final int mCapacity; + + public SuggestionResults(final Locale locale, final int capacity) { + this(locale, sSuggestedWordInfoComparator, capacity); + } + + public SuggestionResults(final Locale locale, final Comparator<SuggestedWordInfo> comparator, + final int capacity) { + super(comparator); + mLocale = locale; + mCapacity = capacity; + if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) { + mRawSuggestions = new ArrayList<>(); + } else { + mRawSuggestions = null; + } + } + + @Override + public boolean add(final SuggestedWordInfo e) { + if (size() < mCapacity) return super.add(e); + if (comparator().compare(e, last()) > 0) return false; + super.add(e); + pollLast(); // removes the last element + return true; + } + + @Override + public boolean addAll(final Collection<? extends SuggestedWordInfo> e) { + if (null == e) return false; + return super.addAll(e); + } + + private static final class SuggestedWordInfoComparator + implements Comparator<SuggestedWordInfo> { + // This comparator ranks the word info with the higher frequency first. That's because + // that's the order we want our elements in. + @Override + public int compare(final SuggestedWordInfo o1, final SuggestedWordInfo o2) { + if (o1.mScore > o2.mScore) return -1; + if (o1.mScore < o2.mScore) return 1; + if (o1.mCodePointCount < o2.mCodePointCount) return -1; + if (o1.mCodePointCount > o2.mCodePointCount) return 1; + return o1.mWord.compareTo(o2.mWord); + } + } + + private static final SuggestedWordInfoComparator sSuggestedWordInfoComparator = + new SuggestedWordInfoComparator(); +} diff --git a/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java b/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java index afbe2ecad..ab2b00e36 100644 --- a/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java +++ b/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java @@ -22,11 +22,12 @@ import android.content.pm.PackageManager; import android.os.AsyncTask; import android.util.LruCache; +import com.android.inputmethod.compat.AppWorkaroundsUtils; + public final class TargetPackageInfoGetterTask extends AsyncTask<String, Void, PackageInfo> { private static final int MAX_CACHE_ENTRIES = 64; // arbitrary - private static final LruCache<String, PackageInfo> sCache = - new LruCache<String, PackageInfo>(MAX_CACHE_ENTRIES); + private static final LruCache<String, PackageInfo> sCache = new LruCache<>(MAX_CACHE_ENTRIES); public static PackageInfo getCachedPackageInfo(final String packageName) { if (null == packageName) return null; @@ -37,17 +38,13 @@ public final class TargetPackageInfoGetterTask extends sCache.remove(packageName); } - public interface OnTargetPackageInfoKnownListener { - public void onTargetPackageInfoKnown(final PackageInfo info); - } - private Context mContext; - private final OnTargetPackageInfoKnownListener mListener; + private final AsyncResultHolder<AppWorkaroundsUtils> mResult; public TargetPackageInfoGetterTask(final Context context, - final OnTargetPackageInfoKnownListener listener) { + final AsyncResultHolder<AppWorkaroundsUtils> result) { mContext = context; - mListener = listener; + mResult = result; } @Override @@ -65,6 +62,6 @@ public final class TargetPackageInfoGetterTask extends @Override protected void onPostExecute(final PackageInfo info) { - mListener.onTargetPackageInfoKnown(info); + mResult.set(new AppWorkaroundsUtils(info)); } } diff --git a/java/src/com/android/inputmethod/latin/utils/TextRange.java b/java/src/com/android/inputmethod/latin/utils/TextRange.java index 48b443ddd..dbf3b5060 100644 --- a/java/src/com/android/inputmethod/latin/utils/TextRange.java +++ b/java/src/com/android/inputmethod/latin/utils/TextRange.java @@ -31,6 +31,7 @@ public final class TextRange { private final int mCursorIndex; public final CharSequence mWord; + public final boolean mHasUrlSpans; public int getNumberOfCharsInWordBeforeCursor() { return mCursorIndex - mWordAtCursorStartIndex; @@ -95,7 +96,7 @@ public final class TextRange { } } if (spanStart == mWordAtCursorStartIndex && spanEnd == mWordAtCursorEndIndex) { - // If the span does not start and stop here, we ignore it. It probably extends + // If the span does not start and stop here, ignore it. It probably extends // past the start or end of the word, as happens in missing space correction // or EasyEditSpans put by voice input. spans[writeIndex++] = spans[readIndex]; @@ -105,7 +106,7 @@ public final class TextRange { } public TextRange(final CharSequence textAtCursor, final int wordAtCursorStartIndex, - final int wordAtCursorEndIndex, final int cursorIndex) { + final int wordAtCursorEndIndex, final int cursorIndex, final boolean hasUrlSpans) { if (wordAtCursorStartIndex < 0 || cursorIndex < wordAtCursorStartIndex || cursorIndex > wordAtCursorEndIndex || wordAtCursorEndIndex > textAtCursor.length()) { @@ -115,6 +116,7 @@ public final class TextRange { mWordAtCursorStartIndex = wordAtCursorStartIndex; mWordAtCursorEndIndex = wordAtCursorEndIndex; mCursorIndex = cursorIndex; + mHasUrlSpans = hasUrlSpans; mWord = mTextAtCursor.subSequence(mWordAtCursorStartIndex, mWordAtCursorEndIndex); } }
\ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java b/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java index 47ea1ea75..fafba79c2 100644 --- a/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java @@ -22,16 +22,19 @@ import android.graphics.Typeface; import android.util.SparseArray; public final class TypefaceUtils { + private static final char[] KEY_LABEL_REFERENCE_CHAR = { 'M' }; + private static final char[] KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR = { '8' }; + private TypefaceUtils() { // This utility class is not publicly instantiable. } // This sparse array caches key label text height in pixel indexed by key label text size. - private static final SparseArray<Float> sTextHeightCache = CollectionUtils.newSparseArray(); + private static final SparseArray<Float> sTextHeightCache = new SparseArray<>(); // Working variable for the following method. private static final Rect sTextHeightBounds = new Rect(); - public static float getCharHeight(final char[] referenceChar, final Paint paint) { + private static float getCharHeight(final char[] referenceChar, final Paint paint) { final int key = getCharGeometryCacheKey(referenceChar[0], paint); synchronized (sTextHeightCache) { final Float cachedValue = sTextHeightCache.get(key); @@ -47,11 +50,11 @@ public final class TypefaceUtils { } // This sparse array caches key label text width in pixel indexed by key label text size. - private static final SparseArray<Float> sTextWidthCache = CollectionUtils.newSparseArray(); + private static final SparseArray<Float> sTextWidthCache = new SparseArray<>(); // Working variable for the following method. private static final Rect sTextWidthBounds = new Rect(); - public static float getCharWidth(final char[] referenceChar, final Paint paint) { + private static float getCharWidth(final char[] referenceChar, final Paint paint) { final int key = getCharGeometryCacheKey(referenceChar[0], paint); synchronized (sTextWidthCache) { final Float cachedValue = sTextWidthCache.get(key); @@ -66,11 +69,6 @@ public final class TypefaceUtils { } } - public static float getStringWidth(final String string, final Paint paint) { - paint.getTextBounds(string, 0, string.length(), sTextWidthBounds); - return sTextWidthBounds.width(); - } - private static int getCharGeometryCacheKey(final char referenceChar, final Paint paint) { final int labelSize = (int)paint.getTextSize(); final Typeface face = paint.getTypeface(); @@ -86,9 +84,25 @@ public final class TypefaceUtils { } } - public static float getLabelWidth(final String label, final Paint paint) { - final Rect textBounds = new Rect(); - paint.getTextBounds(label, 0, label.length(), textBounds); - return textBounds.width(); + public static float getReferenceCharHeight(final Paint paint) { + return getCharHeight(KEY_LABEL_REFERENCE_CHAR, paint); + } + + public static float getReferenceCharWidth(final Paint paint) { + return getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint); + } + + public static float getReferenceDigitWidth(final Paint paint) { + return getCharWidth(KEY_NUMERIC_HINT_LABEL_REFERENCE_CHAR, paint); + } + + // Working variable for the following method. + private static final Rect sStringWidthBounds = new Rect(); + + public static float getStringWidth(final String string, final Paint paint) { + synchronized (sStringWidthBounds) { + paint.getTextBounds(string, 0, string.length(), sStringWidthBounds); + return sStringWidthBounds.width(); + } } } diff --git a/java/src/com/android/inputmethod/latin/utils/UncachedInputMethodManagerUtils.java b/java/src/com/android/inputmethod/latin/utils/UncachedInputMethodManagerUtils.java new file mode 100644 index 000000000..5df00efb9 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/UncachedInputMethodManagerUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014 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.utils; + +import android.content.Context; +import android.provider.Settings; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; + +/* + * A utility class for {@link InputMethodManager}. Unlike {@link RichInputMethodManager}, this + * class provides synchronous, non-cached access to {@link InputMethodManager}. The setup activity + * is a good example to use this class because {@link InputMethodManagerService} may not be aware of + * this IME immediately after this IME is installed. + */ +public final class UncachedInputMethodManagerUtils { + /** + * Check if the IME specified by the context is enabled. + * CAVEAT: This may cause a round trip IPC. + * + * @param context package context of the IME to be checked. + * @param imm the {@link InputMethodManager}. + * @return true if this IME is enabled. + */ + public static boolean isThisImeEnabled(final Context context, + final InputMethodManager imm) { + final String packageName = context.getPackageName(); + for (final InputMethodInfo imi : imm.getEnabledInputMethodList()) { + if (packageName.equals(imi.getPackageName())) { + return true; + } + } + return false; + } + + /** + * Check if the IME specified by the context is the current IME. + * CAVEAT: This may cause a round trip IPC. + * + * @param context package context of the IME to be checked. + * @param imm the {@link InputMethodManager}. + * @return true if this IME is the current IME. + */ + public static boolean isThisImeCurrent(final Context context, + final InputMethodManager imm) { + final InputMethodInfo imi = getInputMethodInfoOf(context.getPackageName(), imm); + final String currentImeId = Settings.Secure.getString( + context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + return imi != null && imi.getId().equals(currentImeId); + } + + /** + * Get {@link InputMethodInfo} of the IME specified by the package name. + * CAVEAT: This may cause a round trip IPC. + * + * @param packageName package name of the IME. + * @param imm the {@link InputMethodManager}. + * @return the {@link InputMethodInfo} of the IME specified by the <code>packageName</code>, + * or null if not found. + */ + public static InputMethodInfo getInputMethodInfoOf(final String packageName, + final InputMethodManager imm) { + for (final InputMethodInfo imi : imm.getInputMethodList()) { + if (packageName.equals(imi.getPackageName())) { + return imi; + } + } + return null; + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/UsabilityStudyLogUtils.java b/java/src/com/android/inputmethod/latin/utils/UsabilityStudyLogUtils.java deleted file mode 100644 index 06826dac0..000000000 --- a/java/src/com/android/inputmethod/latin/utils/UsabilityStudyLogUtils.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2016 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.utils; - -import android.content.Intent; -import android.content.pm.PackageManager; -import android.inputmethodservice.InputMethodService; -import android.net.Uri; -import android.os.Environment; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Process; -import android.util.Log; -import android.view.MotionEvent; - -import com.android.inputmethod.latin.LatinImeLogger; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.channels.FileChannel; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -public final class UsabilityStudyLogUtils { - // TODO: remove code duplication with ResearchLog class - private static final String USABILITY_TAG = UsabilityStudyLogUtils.class.getSimpleName(); - private static final String FILENAME = "log.txt"; - 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("yyyyMMdd-HHmmss.SSSZ", Locale.US); - - HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task", - Process.THREAD_PRIORITY_BACKGROUND); - handlerThread.start(); - mLoggingHandler = new Handler(handlerThread.getLooper()); - } - - // Initialization-on-demand holder - private static final class OnDemandInitializationHolder { - public static final UsabilityStudyLogUtils sInstance = new UsabilityStudyLogUtils(); - } - - public static UsabilityStudyLogUtils getInstance() { - return OnDemandInitializationHolder.sInstance; - } - - public void init(final 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 (final IOException e) { - Log.e(USABILITY_TAG, "Can't create log file."); - } - } - } - - public static void writeBackSpace(final int x, final int y) { - UsabilityStudyLogUtils.getInstance().write("<backspace>\t" + x + "\t" + y); - } - - public static void writeChar(final char c, final int x, final 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 static void writeMotionEvent(final MotionEvent me) { - final int action = me.getActionMasked(); - final long eventTime = me.getEventTime(); - final int pointerCount = me.getPointerCount(); - for (int index = 0; index < pointerCount; index++) { - final int id = me.getPointerId(index); - final int x = (int)me.getX(index); - final int y = (int)me.getY(index); - final float size = me.getSize(index); - final float pressure = me.getPressure(index); - - final String eventTag; - switch (action) { - case MotionEvent.ACTION_UP: - eventTag = "[Up]"; - break; - case MotionEvent.ACTION_DOWN: - eventTag = "[Down]"; - break; - case MotionEvent.ACTION_POINTER_UP: - eventTag = "[PointerUp]"; - break; - case MotionEvent.ACTION_POINTER_DOWN: - eventTag = "[PointerDown]"; - break; - case MotionEvent.ACTION_MOVE: - eventTag = "[Move]"; - break; - default: - eventTag = "[Action" + action + "]"; - break; - } - getInstance().write(eventTag + eventTime + "," + id + "," + x + "," + y + "," + size - + "," + pressure); - } - } - - 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(Locale.US, "%s\t%d\t%s\n", - mDateFormat.format(mDate), currentTime, log); - if (LatinImeLogger.sDBG) { - Log.d(USABILITY_TAG, "Write: " + log); - } - mWriter.print(printString); - } - }); - } - - private synchronized String getBufferedLogs() { - mWriter.flush(); - final StringBuilder sb = new StringBuilder(); - final BufferedReader br = getBufferedReader(); - String line; - try { - while ((line = br.readLine()) != null) { - sb.append('\n'); - sb.append(line); - } - } catch (final IOException e) { - Log.e(USABILITY_TAG, "Can't read log file."); - } finally { - if (LatinImeLogger.sDBG) { - Log.d(USABILITY_TAG, "Got all buffered logs\n" + sb.toString()); - } - try { - br.close(); - } catch (final IOException e) { - // ignore. - } - } - return sb.toString(); - } - - public void emailResearcherLogsAll() { - mLoggingHandler.post(new Runnable() { - @Override - public void run() { - final Date date = new Date(); - date.setTime(System.currentTimeMillis()); - final String currentDateTimeString = - new SimpleDateFormat("yyyyMMdd-HHmmssZ", Locale.US).format(date); - if (mFile == null) { - Log.w(USABILITY_TAG, "No internal log file found."); - return; - } - if (mIms.checkCallingOrSelfPermission( - android.Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - Log.w(USABILITY_TAG, "Doesn't have the permission WRITE_EXTERNAL_STORAGE"); - return; - } - mWriter.flush(); - final String destPath = Environment.getExternalStorageDirectory() - + "/research-" + currentDateTimeString + ".log"; - final File destFile = new File(destPath); - try { - final FileInputStream srcStream = new FileInputStream(mFile); - final FileOutputStream destStream = new FileOutputStream(destFile); - final FileChannel src = srcStream.getChannel(); - final FileChannel dest = destStream.getChannel(); - src.transferTo(0, src.size(), dest); - src.close(); - srcStream.close(); - dest.close(); - destStream.close(); - } catch (final FileNotFoundException e1) { - Log.w(USABILITY_TAG, e1); - return; - } catch (final IOException e2) { - Log.w(USABILITY_TAG, e2); - return; - } - if (!destFile.exists()) { - Log.w(USABILITY_TAG, "Dest file doesn't exist."); - return; - } - final Intent intent = new Intent(Intent.ACTION_SEND); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (LatinImeLogger.sDBG) { - Log.d(USABILITY_TAG, "Destination file URI is " + destFile.toURI()); - } - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + destPath)); - intent.putExtra(Intent.EXTRA_SUBJECT, - "[Research Logs] " + currentDateTimeString); - mIms.startActivity(intent); - } - }); - } - - public void printAll() { - mLoggingHandler.post(new Runnable() { - @Override - public void run() { - mIms.getCurrentInputConnection().commitText(getBufferedLogs(), 0); - } - }); - } - - public void clearAll() { - mLoggingHandler.post(new Runnable() { - @Override - public void run() { - if (mFile != null && mFile.exists()) { - if (LatinImeLogger.sDBG) { - Log.d(USABILITY_TAG, "Delete log file."); - } - mFile.delete(); - mWriter.close(); - } - } - }); - } - - private BufferedReader getBufferedReader() { - createLogFileIfNotExist(); - try { - return new BufferedReader(new FileReader(mFile)); - } catch (final FileNotFoundException e) { - return null; - } - } - - private PrintWriter getPrintWriter(final File dir, final String filename, - final 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/utils/UserHistoryDictIOUtils.java b/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java deleted file mode 100644 index 635afe7cc..000000000 --- a/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.utils; - -import android.util.Log; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.makedict.BinaryDictIOUtils; -import com.android.inputmethod.latin.makedict.DictDecoder; -import com.android.inputmethod.latin.makedict.DictEncoder; -import com.android.inputmethod.latin.makedict.FormatSpec.FormatOptions; -import com.android.inputmethod.latin.makedict.FusionDictionary; -import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray; -import com.android.inputmethod.latin.makedict.PendingAttribute; -import com.android.inputmethod.latin.makedict.UnsupportedFormatException; -import com.android.inputmethod.latin.personalization.UserHistoryDictionaryBigramList; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; - -/** - * Reads and writes Binary files for a UserHistoryDictionary. - * - * All the methods in this class are static. - */ -public final class UserHistoryDictIOUtils { - private static final String TAG = UserHistoryDictIOUtils.class.getSimpleName(); - private static final boolean DEBUG = false; - private static final String USES_FORGETTING_CURVE_KEY = "USES_FORGETTING_CURVE"; - private static final String USES_FORGETTING_CURVE_VALUE = "1"; - private static final String LAST_UPDATED_TIME_KEY = "date"; - - public interface OnAddWordListener { - /** - * Callback to be notified when a word is added to the dictionary. - * @param word The added word. - * @param shortcutTarget A shortcut target for this word, or null if none. - * @param frequency The frequency for this word. - * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). - * Unspecified if shortcutTarget is null - do not rely on its value. - */ - public void setUnigram(final String word, final String shortcutTarget, final int frequency, - final int shortcutFreq); - public void setBigram(final String word1, final String word2, final int frequency); - } - - @UsedForTesting - public interface BigramDictionaryInterface { - public int getFrequency(final String word1, final String word2); - } - - /** - * Writes dictionary to file. - */ - public static void writeDictionary(final DictEncoder dictEncoder, - final BigramDictionaryInterface dict, final UserHistoryDictionaryBigramList bigrams, - final FormatOptions formatOptions) { - final FusionDictionary fusionDict = constructFusionDictionary(dict, bigrams); - fusionDict.addOptionAttribute(USES_FORGETTING_CURVE_KEY, USES_FORGETTING_CURVE_VALUE); - fusionDict.addOptionAttribute(LAST_UPDATED_TIME_KEY, - String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()))); - try { - dictEncoder.writeDictionary(fusionDict, formatOptions); - Log.d(TAG, "end writing"); - } catch (IOException e) { - Log.e(TAG, "IO exception while writing file", e); - } catch (UnsupportedFormatException e) { - Log.e(TAG, "Unsupported format", e); - } - } - - /** - * Constructs a new FusionDictionary from BigramDictionaryInterface. - */ - @UsedForTesting - static FusionDictionary constructFusionDictionary( - final BigramDictionaryInterface dict, final UserHistoryDictionaryBigramList bigrams) { - final FusionDictionary fusionDict = new FusionDictionary(new PtNodeArray(), - new FusionDictionary.DictionaryOptions(new HashMap<String, String>(), false, - false)); - int profTotal = 0; - for (final String word1 : bigrams.keySet()) { - final HashMap<String, Byte> word1Bigrams = bigrams.getBigrams(word1); - for (final String word2 : word1Bigrams.keySet()) { - final int freq = dict.getFrequency(word1, word2); - if (freq == -1) { - // don't add this bigram. - continue; - } - if (DEBUG) { - if (word1 == null) { - Log.d(TAG, "add unigram: " + word2 + "," + Integer.toString(freq)); - } else { - Log.d(TAG, "add bigram: " + word1 - + "," + word2 + "," + Integer.toString(freq)); - } - profTotal++; - } - if (word1 == null) { // unigram - fusionDict.add(word2, freq, null, false /* isNotAWord */); - } else { // bigram - if (FusionDictionary.findWordInTree(fusionDict.mRootNodeArray, word1) == null) { - fusionDict.add(word1, 2, null, false /* isNotAWord */); - } - fusionDict.setBigram(word1, word2, freq); - } - bigrams.updateBigram(word1, word2, (byte)freq); - } - } - if (DEBUG) { - Log.d(TAG, "add " + profTotal + "words"); - } - return fusionDict; - } - - /** - * Reads dictionary from file. - */ - public static void readDictionaryBinary(final DictDecoder dictDecoder, - final OnAddWordListener dict) { - final TreeMap<Integer, String> unigrams = CollectionUtils.newTreeMap(); - final TreeMap<Integer, Integer> frequencies = CollectionUtils.newTreeMap(); - final TreeMap<Integer, ArrayList<PendingAttribute>> bigrams = CollectionUtils.newTreeMap(); - try { - dictDecoder.readUnigramsAndBigramsBinary(unigrams, frequencies, bigrams); - } catch (IOException e) { - Log.e(TAG, "IO exception while reading file", e); - } catch (UnsupportedFormatException e) { - Log.e(TAG, "Unsupported format", e); - } catch (ArrayIndexOutOfBoundsException e) { - Log.e(TAG, "ArrayIndexOutOfBoundsException while reading file", e); - } - addWordsFromWordMap(unigrams, frequencies, bigrams, dict); - } - - /** - * Adds all unigrams and bigrams in maps to OnAddWordListener. - */ - @UsedForTesting - static void addWordsFromWordMap(final TreeMap<Integer, String> unigrams, - final TreeMap<Integer, Integer> frequencies, - final TreeMap<Integer, ArrayList<PendingAttribute>> bigrams, - final OnAddWordListener to) { - for (Entry<Integer, String> entry : unigrams.entrySet()) { - final String word1 = entry.getValue(); - final int unigramFrequency = frequencies.get(entry.getKey()); - to.setUnigram(word1, null /* shortcutTarget */, unigramFrequency, 0 /* shortcutFreq */); - final ArrayList<PendingAttribute> attrList = bigrams.get(entry.getKey()); - if (attrList != null) { - for (final PendingAttribute attr : attrList) { - final String word2 = unigrams.get(attr.mAddress); - if (word1 == null || word2 == null) { - Log.e(TAG, "Invalid bigram pair detected: " + word1 + ", " + word2); - continue; - } - to.setBigram(word1, word2, - BinaryDictIOUtils.reconstructBigramFrequency(unigramFrequency, - attr.mFrequency)); - } - } - } - - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java b/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java deleted file mode 100644 index 1992b2f5d..000000000 --- a/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.latin.utils; - -import android.util.Log; - -import java.util.concurrent.TimeUnit; - -public final class UserHistoryForgettingCurveUtils { - private static final String TAG = UserHistoryForgettingCurveUtils.class.getSimpleName(); - private static final boolean DEBUG = false; - private static final int DEFAULT_FC_FREQ = 127; - private static final int BOOSTED_FC_FREQ = 200; - private static int FC_FREQ_MAX = DEFAULT_FC_FREQ; - /* package */ static final int COUNT_MAX = 3; - private static final int FC_LEVEL_MAX = 3; - /* package */ static final int ELAPSED_TIME_MAX = 15; - private static final int ELAPSED_TIME_INTERVAL_HOURS = 6; - private static final long ELAPSED_TIME_INTERVAL_MILLIS = - TimeUnit.HOURS.toMillis(ELAPSED_TIME_INTERVAL_HOURS); - private static final int HALF_LIFE_HOURS = 48; - private static final int MAX_PUSH_ELAPSED = (FC_LEVEL_MAX + 1) * (ELAPSED_TIME_MAX + 1); - - public static void boostMaxFreqForDebug() { - FC_FREQ_MAX = BOOSTED_FC_FREQ; - } - - public static void resetMaxFreqForDebug() { - FC_FREQ_MAX = DEFAULT_FC_FREQ; - } - - private UserHistoryForgettingCurveUtils() { - // This utility class is not publicly instantiable. - } - - public static final class ForgettingCurveParams { - private byte mFc; - long mLastTouchedTime = 0; - private final boolean mIsValid; - - private void updateLastTouchedTime() { - mLastTouchedTime = System.currentTimeMillis(); - } - - public ForgettingCurveParams(boolean isValid) { - this(System.currentTimeMillis(), isValid); - } - - private ForgettingCurveParams(long now, boolean isValid) { - this(pushCount((byte)0, isValid), now, now, isValid); - } - - /** This constructor is called when the user history bigram dictionary is being restored. */ - public ForgettingCurveParams(int fc, long now, long last) { - // All words with level >= 1 had been saved. - // Invalid words with level == 0 had been saved. - // Valid words words with level == 0 had *not* been saved. - this(fc, now, last, fcToLevel((byte)fc) > 0); - } - - private ForgettingCurveParams(int fc, long now, long last, boolean isValid) { - mIsValid = isValid; - mFc = (byte)fc; - mLastTouchedTime = last; - updateElapsedTime(now); - } - - public boolean isValid() { - return mIsValid; - } - - public byte getFc() { - updateElapsedTime(System.currentTimeMillis()); - return mFc; - } - - public int getFrequency() { - updateElapsedTime(System.currentTimeMillis()); - return UserHistoryForgettingCurveUtils.fcToFreq(mFc); - } - - public int notifyTypedAgainAndGetFrequency() { - updateLastTouchedTime(); - // TODO: Check whether this word is valid or not - mFc = pushCount(mFc, false); - return UserHistoryForgettingCurveUtils.fcToFreq(mFc); - } - - private void updateElapsedTime(long now) { - final int elapsedTimeCount = - (int)((now - mLastTouchedTime) / ELAPSED_TIME_INTERVAL_MILLIS); - if (elapsedTimeCount <= 0) { - return; - } - if (elapsedTimeCount >= MAX_PUSH_ELAPSED) { - mLastTouchedTime = now; - mFc = 0; - return; - } - for (int i = 0; i < elapsedTimeCount; ++i) { - mLastTouchedTime += ELAPSED_TIME_INTERVAL_MILLIS; - mFc = pushElapsedTime(mFc); - } - } - } - - /* package */ static int fcToElapsedTime(byte fc) { - return fc & 0x0F; - } - - /* package */ static int fcToCount(byte fc) { - return (fc >> 4) & 0x03; - } - - /* package */ static int fcToLevel(byte fc) { - return (fc >> 6) & 0x03; - } - - private static int calcFreq(int elapsedTime, int count, int level) { - if (level <= 0) { - // Reserved words, just return -1 - return -1; - } - if (count == COUNT_MAX) { - // Temporary promote because it's frequently typed recently - ++level; - } - final int et = Math.min(FC_FREQ_MAX, Math.max(0, elapsedTime)); - final int l = Math.min(FC_LEVEL_MAX, Math.max(0, level)); - return MathUtils.SCORE_TABLE[l - 1][et]; - } - - /* pakcage */ static byte calcFc(int elapsedTime, int count, int level) { - final int et = Math.min(FC_FREQ_MAX, Math.max(0, elapsedTime)); - final int c = Math.min(COUNT_MAX, Math.max(0, count)); - final int l = Math.min(FC_LEVEL_MAX, Math.max(0, level)); - return (byte)(et | (c << 4) | (l << 6)); - } - - public static int fcToFreq(byte fc) { - final int elapsedTime = fcToElapsedTime(fc); - final int count = fcToCount(fc); - final int level = fcToLevel(fc); - return calcFreq(elapsedTime, count, level); - } - - public static byte pushElapsedTime(byte fc) { - int elapsedTime = fcToElapsedTime(fc); - int count = fcToCount(fc); - int level = fcToLevel(fc); - if (elapsedTime >= ELAPSED_TIME_MAX) { - // Downgrade level - elapsedTime = 0; - count = COUNT_MAX; - --level; - } else { - ++elapsedTime; - } - return calcFc(elapsedTime, count, level); - } - - public static byte pushCount(byte fc, boolean isValid) { - final int elapsedTime = fcToElapsedTime(fc); - int count = fcToCount(fc); - int level = fcToLevel(fc); - if ((elapsedTime == 0 && count >= COUNT_MAX) || (isValid && level == 0)) { - // Upgrade level - ++level; - count = 0; - if (DEBUG) { - Log.d(TAG, "Upgrade level."); - } - } else { - ++count; - } - return calcFc(0, count, level); - } - - // TODO: isValid should be false for a word whose frequency is 0, - // or that is not in the dictionary. - /** - * Check wheather we should save the bigram to the SQL DB or not - */ - public static boolean needsToSave(byte fc, boolean isValid, boolean addLevel0Bigram) { - int level = fcToLevel(fc); - if (level == 0) { - if (isValid || !addLevel0Bigram) { - return false; - } - } - final int elapsedTime = fcToElapsedTime(fc); - return (elapsedTime < ELAPSED_TIME_MAX - 1 || level > 0); - } - - private static final class MathUtils { - public static final int[][] SCORE_TABLE = new int[FC_LEVEL_MAX][ELAPSED_TIME_MAX + 1]; - static { - for (int i = 0; i < FC_LEVEL_MAX; ++i) { - final float initialFreq; - if (i >= 2) { - initialFreq = FC_FREQ_MAX; - } else if (i == 1) { - initialFreq = FC_FREQ_MAX / 2; - } else if (i == 0) { - initialFreq = FC_FREQ_MAX / 4; - } else { - continue; - } - for (int j = 0; j < ELAPSED_TIME_MAX; ++j) { - final float elapsedHours = j * ELAPSED_TIME_INTERVAL_HOURS; - final float freq = initialFreq - * (float)Math.pow(initialFreq, elapsedHours / HALF_LIFE_HOURS); - final int intFreq = Math.min(FC_FREQ_MAX, Math.max(0, (int)freq)); - SCORE_TABLE[i][j] = intFreq; - } - } - } - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/UserLogRingCharBuffer.java b/java/src/com/android/inputmethod/latin/utils/UserLogRingCharBuffer.java deleted file mode 100644 index a75d353c9..000000000 --- a/java/src/com/android/inputmethod/latin/utils/UserLogRingCharBuffer.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2013 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.utils; - -import android.inputmethodservice.InputMethodService; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.LatinImeLogger; -import com.android.inputmethod.latin.settings.Settings; - -public final class UserLogRingCharBuffer { - public /* for test */ static final int BUFSIZE = 20; - public /* for test */ int mLength = 0; - - private static UserLogRingCharBuffer sUserLogRingCharBuffer = new UserLogRingCharBuffer(); - private static final char PLACEHOLDER_DELIMITER_CHAR = '\uFFFC'; - private static final int INVALID_COORDINATE = -2; - private boolean mEnabled = false; - private int mEnd = 0; - private char[] mCharBuf = new char[BUFSIZE]; - private int[] mXBuf = new int[BUFSIZE]; - private int[] mYBuf = new int[BUFSIZE]; - - private UserLogRingCharBuffer() { - // Intentional empty constructor for singleton. - } - - @UsedForTesting - public static UserLogRingCharBuffer getInstance() { - return sUserLogRingCharBuffer; - } - - public static UserLogRingCharBuffer init(final InputMethodService context, - final boolean enabled, final boolean usabilityStudy) { - if (!(enabled || usabilityStudy)) { - return null; - } - sUserLogRingCharBuffer.mEnabled = true; - UsabilityStudyLogUtils.getInstance().init(context); - return sUserLogRingCharBuffer; - } - - private static int normalize(final int in) { - int ret = in % BUFSIZE; - return ret < 0 ? ret + BUFSIZE : ret; - } - - // TODO: accept code points - @UsedForTesting - public void push(final char c, final int x, final int y) { - if (!mEnabled) { - return; - } - if (LatinImeLogger.sUsabilityStudy) { - 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; - } - mEnd = normalize(mEnd - 1); - --mLength; - return mCharBuf[mEnd]; - } - - public char getBackwardNthChar(final int n) { - if (mLength <= n || n < 0) { - return PLACEHOLDER_DELIMITER_CHAR; - } - return mCharBuf[normalize(mEnd - n - 1)]; - } - - public int getPreviousX(final char c, final int back) { - final int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } - return mXBuf[index]; - } - - public int getPreviousY(final char c, final int back) { - int index = normalize(mEnd - 2 - back); - if (mLength <= back - || Character.toLowerCase(c) != Character.toLowerCase(mCharBuf[index])) { - return INVALID_COORDINATE; - } - return mYBuf[index]; - } - - public String getLastWord(final int ignoreCharCount) { - final StringBuilder sb = new StringBuilder(); - int i = ignoreCharCount; - for (; i < mLength; ++i) { - final char c = mCharBuf[normalize(mEnd - 1 - i)]; - if (!Settings.getInstance().isWordSeparator(c)) { - break; - } - } - for (; i < mLength; ++i) { - char c = mCharBuf[normalize(mEnd - 1 - i)]; - if (!Settings.getInstance().isWordSeparator(c)) { - sb.append(c); - } else { - break; - } - } - return sb.reverse().toString(); - } - - public void reset() { - mLength = 0; - } -} diff --git a/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java b/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java deleted file mode 100644 index 4f86526a7..000000000 --- a/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -/** - * Arrange for the uploading service to be run on regular intervals. - */ -public final class BootBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(final Context context, final Intent intent) { - if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { - UploaderService.cancelAndRescheduleUploadingService(context, - true /* needsRescheduling */); - } - } -} diff --git a/java/src/com/android/inputmethod/research/FeedbackActivity.java b/java/src/com/android/inputmethod/research/FeedbackActivity.java deleted file mode 100644 index 520b88d2f..000000000 --- a/java/src/com/android/inputmethod/research/FeedbackActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.app.Activity; -import android.os.Bundle; - -import com.android.inputmethod.latin.R; - -public class FeedbackActivity extends Activity { - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.research_feedback_activity); - final FeedbackLayout layout = (FeedbackLayout) findViewById(R.id.research_feedback_layout); - layout.setActivity(this); - } - - @Override - public void onBackPressed() { - ResearchLogger.getInstance().onLeavingSendFeedbackDialog(); - super.onBackPressed(); - } -} diff --git a/java/src/com/android/inputmethod/research/FeedbackFragment.java b/java/src/com/android/inputmethod/research/FeedbackFragment.java deleted file mode 100644 index 75fbbf1ba..000000000 --- a/java/src/com/android/inputmethod/research/FeedbackFragment.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.app.Fragment; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextUtils; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Toast; - -import com.android.inputmethod.latin.R; - -public class FeedbackFragment extends Fragment implements OnClickListener { - private static final String TAG = FeedbackFragment.class.getSimpleName(); - - public static final String KEY_FEEDBACK_STRING = "FeedbackString"; - public static final String KEY_INCLUDE_ACCOUNT_NAME = "IncludeAccountName"; - public static final String KEY_HAS_USER_RECORDING = "HasRecording"; - - private EditText mEditText; - private CheckBox mIncludingAccountNameCheckBox; - private CheckBox mIncludingUserRecordingCheckBox; - private Button mSendButton; - private Button mCancelButton; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - final View view = inflater.inflate(R.layout.research_feedback_fragment_layout, container, - false); - mEditText = (EditText) view.findViewById(R.id.research_feedback_contents); - mEditText.requestFocus(); - mIncludingAccountNameCheckBox = (CheckBox) view.findViewById( - R.id.research_feedback_include_account_name); - mIncludingUserRecordingCheckBox = (CheckBox) view.findViewById( - R.id.research_feedback_include_recording_checkbox); - mIncludingUserRecordingCheckBox.setOnClickListener(this); - - mSendButton = (Button) view.findViewById(R.id.research_feedback_send_button); - mSendButton.setOnClickListener(this); - mCancelButton = (Button) view.findViewById(R.id.research_feedback_cancel_button); - mCancelButton.setOnClickListener(this); - - if (savedInstanceState != null) { - restoreState(savedInstanceState); - } else { - final Bundle bundle = getActivity().getIntent().getExtras(); - if (bundle != null) { - restoreState(bundle); - } - } - return view; - } - - @Override - public void onClick(final View view) { - final ResearchLogger researchLogger = ResearchLogger.getInstance(); - if (view == mIncludingUserRecordingCheckBox) { - if (mIncludingUserRecordingCheckBox.isChecked()) { - final Bundle bundle = new Bundle(); - onSaveInstanceState(bundle); - - // Let the user make a recording - getActivity().finish(); - - researchLogger.setFeedbackDialogBundle(bundle); - researchLogger.onLeavingSendFeedbackDialog(); - researchLogger.startRecording(); - } - } else if (view == mSendButton) { - final Editable editable = mEditText.getText(); - final String feedbackContents = editable.toString(); - if (TextUtils.isEmpty(feedbackContents)) { - Toast.makeText(getActivity(), - R.string.research_feedback_empty_feedback_error_message, - Toast.LENGTH_LONG).show(); - } else { - final boolean isIncludingAccountName = mIncludingAccountNameCheckBox.isChecked(); - researchLogger.sendFeedback(feedbackContents, false /* isIncludingHistory */, - isIncludingAccountName, mIncludingUserRecordingCheckBox.isChecked()); - getActivity().finish(); - researchLogger.setFeedbackDialogBundle(null); - researchLogger.onLeavingSendFeedbackDialog(); - } - } else if (view == mCancelButton) { - Log.d(TAG, "Finishing"); - getActivity().finish(); - researchLogger.setFeedbackDialogBundle(null); - researchLogger.onLeavingSendFeedbackDialog(); - } else { - Log.e(TAG, "Unknown view passed to FeedbackFragment.onClick()"); - } - } - - @Override - public void onSaveInstanceState(final Bundle bundle) { - final String savedFeedbackString = mEditText.getText().toString(); - - bundle.putString(KEY_FEEDBACK_STRING, savedFeedbackString); - bundle.putBoolean(KEY_INCLUDE_ACCOUNT_NAME, mIncludingAccountNameCheckBox.isChecked()); - bundle.putBoolean(KEY_HAS_USER_RECORDING, mIncludingUserRecordingCheckBox.isChecked()); - } - - private void restoreState(final Bundle bundle) { - mEditText.setText(bundle.getString(KEY_FEEDBACK_STRING)); - mIncludingAccountNameCheckBox.setChecked(bundle.getBoolean(KEY_INCLUDE_ACCOUNT_NAME)); - mIncludingUserRecordingCheckBox.setChecked(bundle.getBoolean(KEY_HAS_USER_RECORDING)); - } -} diff --git a/java/src/com/android/inputmethod/research/FeedbackLayout.java b/java/src/com/android/inputmethod/research/FeedbackLayout.java deleted file mode 100644 index d283d14b2..000000000 --- a/java/src/com/android/inputmethod/research/FeedbackLayout.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.app.Activity; -import android.content.Context; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.widget.LinearLayout; - -public class FeedbackLayout extends LinearLayout { - private Activity mActivity; - - public FeedbackLayout(Context context) { - super(context); - } - - public FeedbackLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public FeedbackLayout(Context context, AttributeSet attrs, int defstyle) { - super(context, attrs, defstyle); - } - - public void setActivity(Activity activity) { - mActivity = activity; - } - - @Override - public boolean dispatchKeyEventPreIme(KeyEvent event) { - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - if (event.getAction() == KeyEvent.ACTION_DOWN - && event.getRepeatCount() == 0) { - state.startTracking(event, this); - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP - && !event.isCanceled() && state.isTracking(event)) { - mActivity.onBackPressed(); - return true; - } - } - } - return super.dispatchKeyEventPreIme(event); - } -} diff --git a/java/src/com/android/inputmethod/research/FixedLogBuffer.java b/java/src/com/android/inputmethod/research/FixedLogBuffer.java deleted file mode 100644 index 8b64de8ae..000000000 --- a/java/src/com/android/inputmethod/research/FixedLogBuffer.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import java.util.ArrayList; -import java.util.LinkedList; - -/** - * A buffer that holds a fixed number of LogUnits. - * - * LogUnits are added in and shifted out in temporal order. Only a subset of the LogUnits are - * actual words; the other LogUnits do not count toward the word limit. Once the buffer reaches - * capacity, adding another LogUnit that is a word evicts the oldest LogUnits out one at a time to - * stay under the capacity limit. - * - * This variant of a LogBuffer has a limited memory footprint because of its limited size. This - * makes it useful, for example, for recording a window of the user's most recent actions in case - * they want to report an observed error that they do not know how to reproduce. - */ -public class FixedLogBuffer extends LogBuffer { - /* package for test */ int mWordCapacity; - // The number of members of mLogUnits that are actual words. - private int mNumActualWords; - - /** - * Create a new LogBuffer that can hold a fixed number of LogUnits that are words (and - * unlimited number of non-word LogUnits), and that outputs its result to a researchLog. - * - * @param wordCapacity maximum number of words - */ - public FixedLogBuffer(final int wordCapacity) { - super(); - if (wordCapacity <= 0) { - throw new IllegalArgumentException("wordCapacity must be 1 or greater."); - } - mWordCapacity = wordCapacity; - mNumActualWords = 0; - } - - /** - * Adds a new LogUnit to the front of the LIFO queue, evicting existing LogUnit's - * (oldest first) if word capacity is reached. - */ - @Override - public void shiftIn(final LogUnit newLogUnit) { - if (!newLogUnit.hasOneOrMoreWords()) { - // This LogUnit doesn't contain any word, so it doesn't count toward the word-limit. - super.shiftIn(newLogUnit); - return; - } - final int numWordsIncoming = newLogUnit.getNumWords(); - if (mNumActualWords >= mWordCapacity) { - // Give subclass a chance to handle the buffer full condition by shifting out logUnits. - // TODO: Tell onBufferFull() how much space it needs to make to avoid forced eviction. - onBufferFull(); - // If still full, evict. - if (mNumActualWords >= mWordCapacity) { - shiftOutWords(numWordsIncoming); - } - } - super.shiftIn(newLogUnit); - mNumActualWords += numWordsIncoming; - } - - @Override - public LogUnit unshiftIn() { - final LogUnit logUnit = super.unshiftIn(); - if (logUnit != null && logUnit.hasOneOrMoreWords()) { - mNumActualWords -= logUnit.getNumWords(); - } - return logUnit; - } - - public int getNumWords() { - return mNumActualWords; - } - - /** - * Removes all LogUnits from the buffer without calling onShiftOut(). - */ - @Override - public void clear() { - super.clear(); - mNumActualWords = 0; - } - - /** - * Called when the buffer has just shifted in one more word than its maximum, and its about to - * shift out LogUnits to bring it back down to the maximum. - * - * Base class does nothing; subclasses may override if they want to record non-privacy sensitive - * events that fall off the end. - */ - protected void onBufferFull() { - } - - @Override - public LogUnit shiftOut() { - final LogUnit logUnit = super.shiftOut(); - if (logUnit != null && logUnit.hasOneOrMoreWords()) { - mNumActualWords -= logUnit.getNumWords(); - } - return logUnit; - } - - /** - * Remove LogUnits from the front of the LogBuffer until {@code numWords} have been removed. - * - * If there are less than {@code numWords} in the buffer, shifts out all {@code LogUnit}s. - * - * @param numWords the minimum number of words in {@link LogUnit}s to shift out - * @return the number of actual words LogUnit}s shifted out - */ - protected int shiftOutWords(final int numWords) { - int numWordsShiftedOut = 0; - do { - final LogUnit logUnit = shiftOut(); - if (logUnit == null) break; - numWordsShiftedOut += logUnit.getNumWords(); - } while (numWordsShiftedOut < numWords); - return numWordsShiftedOut; - } - - public void shiftOutAll() { - final LinkedList<LogUnit> logUnits = getLogUnits(); - while (!logUnits.isEmpty()) { - shiftOut(); - } - mNumActualWords = 0; - } - - /** - * Returns a list of {@link LogUnit}s at the front of the buffer that have words associated with - * them. - * - * There will be no more than {@code n} words in the returned list. So if 2 words are - * requested, and the first LogUnit has 3 words, it is not returned. If 2 words are requested, - * and the first LogUnit has only 1 word, and the next LogUnit 2 words, only the first LogUnit - * is returned. If the first LogUnit has no words associated with it, and the second LogUnit - * has three words, then only the first LogUnit (which has no associated words) is returned. If - * there are not enough LogUnits in the buffer to meet the word requirement, then all LogUnits - * will be returned. - * - * @param n The maximum number of {@link LogUnit}s with words to return. - * @return The list of the {@link LogUnit}s containing the first n words - */ - public ArrayList<LogUnit> peekAtFirstNWords(int n) { - final LinkedList<LogUnit> logUnits = getLogUnits(); - // Allocate space for n*2 logUnits. There will be at least n, one for each word, and - // there may be additional for punctuation, between-word commands, etc. This should be - // enough that reallocation won't be necessary. - final ArrayList<LogUnit> resultList = new ArrayList<LogUnit>(n * 2); - for (final LogUnit logUnit : logUnits) { - n -= logUnit.getNumWords(); - if (n < 0) break; - resultList.add(logUnit); - } - return resultList; - } -} diff --git a/java/src/com/android/inputmethod/research/JsonUtils.java b/java/src/com/android/inputmethod/research/JsonUtils.java deleted file mode 100644 index 2beebdfae..000000000 --- a/java/src/com/android/inputmethod/research/JsonUtils.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.content.SharedPreferences; -import android.util.JsonWriter; -import android.view.MotionEvent; -import android.view.inputmethod.CompletionInfo; - -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; - -import java.io.IOException; -import java.util.Map; - -/** - * Routines for mapping classes and variables to JSON representations for logging. - */ -/* package */ class JsonUtils { - private JsonUtils() { - // This utility class is not publicly instantiable. - } - - /* package */ static void writeJson(final CompletionInfo[] ci, final JsonWriter jsonWriter) - throws IOException { - jsonWriter.beginArray(); - for (int j = 0; j < ci.length; j++) { - jsonWriter.value(ci[j].toString()); - } - jsonWriter.endArray(); - } - - /* package */ static void writeJson(final SharedPreferences prefs, final JsonWriter jsonWriter) - throws IOException { - jsonWriter.beginObject(); - for (Map.Entry<String,?> entry : prefs.getAll().entrySet()) { - jsonWriter.name(entry.getKey()); - final Object innerValue = entry.getValue(); - if (innerValue == null) { - jsonWriter.nullValue(); - } else if (innerValue instanceof Boolean) { - jsonWriter.value((Boolean) innerValue); - } else if (innerValue instanceof Number) { - jsonWriter.value((Number) innerValue); - } else { - jsonWriter.value(innerValue.toString()); - } - } - jsonWriter.endObject(); - } - - /* package */ static void writeJson(final Key[] keys, final JsonWriter jsonWriter) - throws IOException { - jsonWriter.beginArray(); - for (Key key : keys) { - writeJson(key, jsonWriter); - } - jsonWriter.endArray(); - } - - private static void writeJson(final Key key, final JsonWriter jsonWriter) throws IOException { - jsonWriter.beginObject(); - jsonWriter.name("code").value(key.getCode()); - jsonWriter.name("altCode").value(key.getAltCode()); - jsonWriter.name("x").value(key.getX()); - jsonWriter.name("y").value(key.getY()); - jsonWriter.name("w").value(key.getWidth()); - jsonWriter.name("h").value(key.getHeight()); - jsonWriter.endObject(); - } - - /* package */ static void writeJson(final SuggestedWords words, final JsonWriter jsonWriter) - throws IOException { - jsonWriter.beginObject(); - jsonWriter.name("typedWordValid").value(words.mTypedWordValid); - jsonWriter.name("willAutoCorrect") - .value(words.mWillAutoCorrect); - jsonWriter.name("isPunctuationSuggestions") - .value(words.mIsPunctuationSuggestions); - jsonWriter.name("isObsoleteSuggestions").value(words.mIsObsoleteSuggestions); - jsonWriter.name("isPrediction").value(words.mIsPrediction); - jsonWriter.name("suggestedWords"); - jsonWriter.beginArray(); - final int size = words.size(); - for (int j = 0; j < size; j++) { - final SuggestedWordInfo wordInfo = words.getInfo(j); - jsonWriter.beginObject(); - jsonWriter.name("word").value(wordInfo.toString()); - jsonWriter.name("score").value(wordInfo.mScore); - jsonWriter.name("kind").value(wordInfo.mKind); - jsonWriter.name("sourceDict").value(wordInfo.mSourceDict.mDictType); - jsonWriter.endObject(); - } - jsonWriter.endArray(); - jsonWriter.endObject(); - } - - /* package */ static void writeJson(final MotionEvent me, final JsonWriter jsonWriter) - throws IOException { - jsonWriter.beginObject(); - jsonWriter.name("pointerIds"); - jsonWriter.beginArray(); - final int pointerCount = me.getPointerCount(); - for (int index = 0; index < pointerCount; index++) { - jsonWriter.value(me.getPointerId(index)); - } - jsonWriter.endArray(); - - jsonWriter.name("xyt"); - jsonWriter.beginArray(); - final int historicalSize = me.getHistorySize(); - for (int index = 0; index < historicalSize; index++) { - jsonWriter.beginObject(); - jsonWriter.name("t"); - jsonWriter.value(me.getHistoricalEventTime(index)); - jsonWriter.name("d"); - jsonWriter.beginArray(); - for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { - jsonWriter.beginObject(); - jsonWriter.name("x"); - jsonWriter.value(me.getHistoricalX(pointerIndex, index)); - jsonWriter.name("y"); - jsonWriter.value(me.getHistoricalY(pointerIndex, index)); - jsonWriter.endObject(); - } - jsonWriter.endArray(); - jsonWriter.endObject(); - } - jsonWriter.beginObject(); - jsonWriter.name("t"); - jsonWriter.value(me.getEventTime()); - jsonWriter.name("d"); - jsonWriter.beginArray(); - for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) { - jsonWriter.beginObject(); - jsonWriter.name("x"); - jsonWriter.value(me.getX(pointerIndex)); - jsonWriter.name("y"); - jsonWriter.value(me.getY(pointerIndex)); - jsonWriter.endObject(); - } - jsonWriter.endArray(); - jsonWriter.endObject(); - jsonWriter.endArray(); - jsonWriter.endObject(); - } -} diff --git a/java/src/com/android/inputmethod/research/LogBuffer.java b/java/src/com/android/inputmethod/research/LogBuffer.java deleted file mode 100644 index b07b761f0..000000000 --- a/java/src/com/android/inputmethod/research/LogBuffer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import java.util.LinkedList; - -/** - * Maintain a FIFO queue of LogUnits. - * - * This class provides an unbounded queue. This is useful when the user is aware that their actions - * are being recorded, such as when they are trying to reproduce a bug. In this case, there should - * not be artificial restrictions on how many events that can be saved. - */ -public class LogBuffer { - // TODO: Gracefully handle situations in which this LogBuffer is consuming too much memory. - // This may happen, for example, if the user has forgotten that data is being logged. - private final LinkedList<LogUnit> mLogUnits; - - public LogBuffer() { - mLogUnits = new LinkedList<LogUnit>(); - } - - protected LinkedList<LogUnit> getLogUnits() { - return mLogUnits; - } - - public void clear() { - mLogUnits.clear(); - } - - public void shiftIn(final LogUnit logUnit) { - mLogUnits.add(logUnit); - } - - public LogUnit unshiftIn() { - if (mLogUnits.isEmpty()) { - return null; - } - return mLogUnits.removeLast(); - } - - public LogUnit peekLastLogUnit() { - if (mLogUnits.isEmpty()) { - return null; - } - return mLogUnits.peekLast(); - } - - public boolean isEmpty() { - return mLogUnits.isEmpty(); - } - - public LogUnit shiftOut() { - if (isEmpty()) { - return null; - } - return mLogUnits.removeFirst(); - } -} diff --git a/java/src/com/android/inputmethod/research/LogStatement.java b/java/src/com/android/inputmethod/research/LogStatement.java deleted file mode 100644 index 06b918af5..000000000 --- a/java/src/com/android/inputmethod/research/LogStatement.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.content.SharedPreferences; -import android.util.JsonWriter; -import android.util.Log; -import android.view.MotionEvent; -import android.view.inputmethod.CompletionInfo; - -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.IOException; - -/** - * A template for typed information stored in the logs. - * - * A LogStatement contains a name, keys, and flags about whether the {@code Object[] values} - * associated with the {@code String[] keys} are likely to reveal information about the user. The - * actual values are stored separately. - */ -public class LogStatement { - private static final String TAG = LogStatement.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - - // Constants for particular statements - public static final String TYPE_POINTER_TRACKER_CALL_LISTENER_ON_CODE_INPUT = - "PointerTrackerCallListenerOnCodeInput"; - public static final String KEY_CODE = "code"; - public static final String VALUE_RESEARCH = "research"; - public static final String TYPE_MAIN_KEYBOARD_VIEW_ON_LONG_PRESS = - "MainKeyboardViewOnLongPress"; - public static final String ACTION = "action"; - public static final String VALUE_DOWN = "DOWN"; - public static final String TYPE_MOTION_EVENT = "MotionEvent"; - public static final String KEY_IS_LOGGING_RELATED = "isLoggingRelated"; - - // Keys for internal key/value pairs - private static final String CURRENT_TIME_KEY = "_ct"; - private static final String UPTIME_KEY = "_ut"; - private static final String EVENT_TYPE_KEY = "_ty"; - - // Name specifying the LogStatement type. - private final String mType; - - // mIsPotentiallyPrivate indicates that event contains potentially private information. If - // the word that this event is a part of is determined to be privacy-sensitive, then this - // event should not be included in the output log. The system waits to output until the - // containing word is known. - private final boolean mIsPotentiallyPrivate; - - // mIsPotentiallyRevealing indicates that this statement may disclose details about other - // words typed in other LogUnits. This can happen if the user is not inserting spaces, and - // data from Suggestions and/or Composing text reveals the entire "megaword". For example, - // say the user is typing "for the win", and the system wants to record the bigram "the - // win". If the user types "forthe", omitting the space, the system will give "for the" as - // a suggestion. If the user accepts the autocorrection, the suggestion for "for the" is - // included in the log for the word "the", disclosing that the previous word had been "for". - // For now, we simply do not include this data when logging part of a "megaword". - private final boolean mIsPotentiallyRevealing; - - // mKeys stores the names that are the attributes in the output json objects - private final String[] mKeys; - private static final String[] NULL_KEYS = new String[0]; - - LogStatement(final String name, final boolean isPotentiallyPrivate, - final boolean isPotentiallyRevealing, final String... keys) { - mType = name; - mIsPotentiallyPrivate = isPotentiallyPrivate; - mIsPotentiallyRevealing = isPotentiallyRevealing; - mKeys = (keys == null) ? NULL_KEYS : keys; - } - - public String getType() { - return mType; - } - - public boolean isPotentiallyPrivate() { - return mIsPotentiallyPrivate; - } - - public boolean isPotentiallyRevealing() { - return mIsPotentiallyRevealing; - } - - public String[] getKeys() { - return mKeys; - } - - /** - * Utility function to test whether a key-value pair exists in a LogStatement. - * - * A LogStatement is really just a template -- it does not contain the values, only the - * keys. So the values must be passed in as an argument. - * - * @param queryKey the String that is tested by {@code String.equals()} to the keys in the - * LogStatement - * @param queryValue an Object that must be {@code Object.equals()} to the key's corresponding - * value in the {@code values} array - * @param values the values corresponding to mKeys - * - * @returns {@true} if {@code queryKey} exists in the keys for this LogStatement, and {@code - * queryValue} matches the corresponding value in {@code values} - * - * @throws IllegalArgumentException if {@code values.length} is not equal to keys().length() - */ - public boolean containsKeyValuePair(final String queryKey, final Object queryValue, - final Object[] values) { - if (mKeys.length != values.length) { - throw new IllegalArgumentException("Mismatched number of keys and values."); - } - final int length = mKeys.length; - for (int i = 0; i < length; i++) { - if (mKeys[i].equals(queryKey) && values[i].equals(queryValue)) { - return true; - } - } - return false; - } - - /** - * Utility function to set a value in a LogStatement. - * - * A LogStatement is really just a template -- it does not contain the values, only the - * keys. So the values must be passed in as an argument. - * - * @param queryKey the String that is tested by {@code String.equals()} to the keys in the - * LogStatement - * @param values the array of values corresponding to mKeys - * @param newValue the replacement value to go into the {@code values} array - * - * @returns {@true} if the key exists and the value was successfully set, {@false} otherwise - * - * @throws IllegalArgumentException if {@code values.length} is not equal to keys().length() - */ - public boolean setValue(final String queryKey, final Object[] values, final Object newValue) { - if (mKeys.length != values.length) { - throw new IllegalArgumentException("Mismatched number of keys and values."); - } - final int length = mKeys.length; - for (int i = 0; i < length; i++) { - if (mKeys[i].equals(queryKey)) { - values[i] = newValue; - return true; - } - } - return false; - } - - /** - * Write the contents out through jsonWriter. - * - * The JsonWriter class must have already had {@code JsonWriter.beginArray} called on it. - * - * Note that this method is not thread safe for the same jsonWriter. Callers must ensure - * thread safety. - */ - public boolean outputToLocked(final JsonWriter jsonWriter, final Long time, - final Object... values) { - if (DEBUG) { - if (mKeys.length != values.length) { - Log.d(TAG, "Key and Value list sizes do not match. " + mType); - } - } - try { - jsonWriter.beginObject(); - jsonWriter.name(CURRENT_TIME_KEY).value(System.currentTimeMillis()); - jsonWriter.name(UPTIME_KEY).value(time); - jsonWriter.name(EVENT_TYPE_KEY).value(mType); - final int length = values.length; - for (int i = 0; i < length; i++) { - jsonWriter.name(mKeys[i]); - final Object value = values[i]; - if (value instanceof CharSequence) { - jsonWriter.value(value.toString()); - } else if (value instanceof Number) { - jsonWriter.value((Number) value); - } else if (value instanceof Boolean) { - jsonWriter.value((Boolean) value); - } else if (value instanceof CompletionInfo[]) { - JsonUtils.writeJson((CompletionInfo[]) value, jsonWriter); - } else if (value instanceof SharedPreferences) { - JsonUtils.writeJson((SharedPreferences) value, jsonWriter); - } else if (value instanceof Key[]) { - JsonUtils.writeJson((Key[]) value, jsonWriter); - } else if (value instanceof SuggestedWords) { - JsonUtils.writeJson((SuggestedWords) value, jsonWriter); - } else if (value instanceof MotionEvent) { - JsonUtils.writeJson((MotionEvent) value, jsonWriter); - } else if (value == null) { - jsonWriter.nullValue(); - } else { - if (DEBUG) { - Log.w(TAG, "Unrecognized type to be logged: " - + (value == null ? "<null>" : value.getClass().getName())); - } - jsonWriter.nullValue(); - } - } - jsonWriter.endObject(); - } catch (IOException e) { - e.printStackTrace(); - Log.w(TAG, "Error in JsonWriter; skipping LogStatement"); - return false; - } - return true; - } -} diff --git a/java/src/com/android/inputmethod/research/LogUnit.java b/java/src/com/android/inputmethod/research/LogUnit.java deleted file mode 100644 index 3366df12a..000000000 --- a/java/src/com/android/inputmethod/research/LogUnit.java +++ /dev/null @@ -1,496 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.os.SystemClock; -import android.text.TextUtils; -import android.util.JsonWriter; -import android.util.Log; - -import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -/** - * A group of log statements related to each other. - * - * A LogUnit is collection of LogStatements, each of which is generated by at a particular point - * in the code. (There is no LogStatement class; the data is stored across the instance variables - * here.) A single LogUnit's statements can correspond to all the calls made while in the same - * composing region, or all the calls between committing the last composing region, and the first - * character of the next composing region. - * - * Individual statements in a log may be marked as potentially private. If so, then they are only - * published to a ResearchLog if the ResearchLogger determines that publishing the entire LogUnit - * will not violate the user's privacy. Checks for this may include whether other LogUnits have - * been published recently, or whether the LogUnit contains numbers, etc. - */ -public class LogUnit { - private static final String TAG = LogUnit.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - - private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+"); - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - - private final ArrayList<LogStatement> mLogStatementList; - private final ArrayList<Object[]> mValuesList; - // Assume that mTimeList is sorted in increasing order. Do not insert null values into - // mTimeList. - private final ArrayList<Long> mTimeList; - // Words that this LogUnit generates. Should be null if the data in the LogUnit does not - // generate a genuine word (i.e. separators alone do not count as a word). Should never be - // empty. Note that if the user types spaces explicitly, then normally mWords should contain - // only a single word; it will only contain space-separate multiple words if the user does not - // enter a space, and the system enters one automatically. - private String mWords; - private String[] mWordArray = EMPTY_STRING_ARRAY; - private boolean mMayContainDigit; - private boolean mIsPartOfMegaword; - private boolean mContainsUserDeletions; - - // mCorrectionType indicates whether the word was corrected at all, and if so, the nature of the - // correction. - private int mCorrectionType; - // LogUnits start in this state. If a word is entered without being corrected, it will have - // this CorrectiontType. - public static final int CORRECTIONTYPE_NO_CORRECTION = 0; - // The LogUnit was corrected manually by the user in an unspecified way. - public static final int CORRECTIONTYPE_CORRECTION = 1; - // The LogUnit was corrected manually by the user to a word not in the list of suggestions of - // the first word typed here. (Note: this is a heuristic value, it may be incorrect, for - // example, if the user repositions the cursor). - public static final int CORRECTIONTYPE_DIFFERENT_WORD = 2; - // The LogUnit was corrected manually by the user to a word that was in the list of suggestions - // of the first word typed here. (Again, a heuristic). It is probably a typo correction. - public static final int CORRECTIONTYPE_TYPO = 3; - // TODO: Rather than just tracking the current state, keep a historical record of the LogUnit's - // state and statistics. This should include how many times it has been corrected, whether - // other LogUnit edits were done between edits to this LogUnit, etc. Also track when a LogUnit - // previously contained a word, but was corrected to empty (because it was deleted, and there is - // no known replacement). - - private SuggestedWords mSuggestedWords; - - public LogUnit() { - mLogStatementList = new ArrayList<LogStatement>(); - mValuesList = new ArrayList<Object[]>(); - mTimeList = new ArrayList<Long>(); - mIsPartOfMegaword = false; - mCorrectionType = CORRECTIONTYPE_NO_CORRECTION; - mSuggestedWords = null; - } - - private LogUnit(final ArrayList<LogStatement> logStatementList, - final ArrayList<Object[]> valuesList, - final ArrayList<Long> timeList, - final boolean isPartOfMegaword) { - mLogStatementList = logStatementList; - mValuesList = valuesList; - mTimeList = timeList; - mIsPartOfMegaword = isPartOfMegaword; - mCorrectionType = CORRECTIONTYPE_NO_CORRECTION; - mSuggestedWords = null; - } - - private static final Object[] NULL_VALUES = new Object[0]; - /** - * Adds a new log statement. The time parameter in successive calls to this method must be - * monotonically increasing, or splitByTime() will not work. - */ - public void addLogStatement(final LogStatement logStatement, final long time, - Object... values) { - if (values == null) { - values = NULL_VALUES; - } - mLogStatementList.add(logStatement); - mValuesList.add(values); - mTimeList.add(time); - } - - /** - * Publish the contents of this LogUnit to {@code researchLog}. - * - * For each publishable {@code LogStatement}, invoke {@link LogStatement#outputToLocked}. - * - * @param researchLog where to publish the contents of this {@code LogUnit} - * @param canIncludePrivateData whether the private data in this {@code LogUnit} should be - * included - * - * @throws IOException if publication to the log file is not possible - */ - public synchronized void publishTo(final ResearchLog researchLog, - final boolean canIncludePrivateData) throws IOException { - // Write out any logStatement that passes the privacy filter. - final int size = mLogStatementList.size(); - if (size != 0) { - // Note that jsonWriter is only set to a non-null value if the logUnit start text is - // output and at least one logStatement is output. - JsonWriter jsonWriter = researchLog.getInitializedJsonWriterLocked(); - outputLogUnitStart(jsonWriter, canIncludePrivateData); - for (int i = 0; i < size; i++) { - final LogStatement logStatement = mLogStatementList.get(i); - if (!canIncludePrivateData && logStatement.isPotentiallyPrivate()) { - continue; - } - if (mIsPartOfMegaword && logStatement.isPotentiallyRevealing()) { - continue; - } - logStatement.outputToLocked(jsonWriter, mTimeList.get(i), mValuesList.get(i)); - } - outputLogUnitStop(jsonWriter); - } - } - - private static final String WORD_KEY = "_wo"; - private static final String NUM_WORDS_KEY = "_nw"; - private static final String CORRECTION_TYPE_KEY = "_corType"; - private static final String LOG_UNIT_BEGIN_KEY = "logUnitStart"; - private static final String LOG_UNIT_END_KEY = "logUnitEnd"; - - final LogStatement LOGSTATEMENT_LOG_UNIT_BEGIN_WITH_PRIVATE_DATA = - new LogStatement(LOG_UNIT_BEGIN_KEY, false /* isPotentiallyPrivate */, - false /* isPotentiallyRevealing */, WORD_KEY, CORRECTION_TYPE_KEY, - NUM_WORDS_KEY); - final LogStatement LOGSTATEMENT_LOG_UNIT_BEGIN_WITHOUT_PRIVATE_DATA = - new LogStatement(LOG_UNIT_BEGIN_KEY, false /* isPotentiallyPrivate */, - false /* isPotentiallyRevealing */, NUM_WORDS_KEY); - private void outputLogUnitStart(final JsonWriter jsonWriter, - final boolean canIncludePrivateData) { - final LogStatement logStatement; - if (canIncludePrivateData) { - LOGSTATEMENT_LOG_UNIT_BEGIN_WITH_PRIVATE_DATA.outputToLocked(jsonWriter, - SystemClock.uptimeMillis(), getWordsAsString(), getCorrectionType(), - getNumWords()); - } else { - LOGSTATEMENT_LOG_UNIT_BEGIN_WITHOUT_PRIVATE_DATA.outputToLocked(jsonWriter, - SystemClock.uptimeMillis(), getNumWords()); - } - } - - final LogStatement LOGSTATEMENT_LOG_UNIT_END = - new LogStatement(LOG_UNIT_END_KEY, false /* isPotentiallyPrivate */, - false /* isPotentiallyRevealing */); - private void outputLogUnitStop(final JsonWriter jsonWriter) { - LOGSTATEMENT_LOG_UNIT_END.outputToLocked(jsonWriter, SystemClock.uptimeMillis()); - } - - /** - * Mark the current logUnit as containing data to generate {@code newWords}. - * - * If {@code setWord()} was previously called for this LogUnit, then the method will try to - * determine what kind of correction it is, and update its internal state of the correctionType - * accordingly. - * - * @param newWords The words this LogUnit generates. Caller should not pass null or the empty - * string. - */ - public void setWords(final String newWords) { - if (hasOneOrMoreWords()) { - // The word was already set once, and it is now being changed. See if the new word - // is close to the old word. If so, then the change is probably a typo correction. - // If not, the user may have decided to enter a different word, so flag it. - if (mSuggestedWords != null) { - if (isInSuggestedWords(newWords, mSuggestedWords)) { - mCorrectionType = CORRECTIONTYPE_TYPO; - } else { - mCorrectionType = CORRECTIONTYPE_DIFFERENT_WORD; - } - } else { - // No suggested words, so it's not clear whether it's a typo or different word. - // Mark it as a generic correction. - mCorrectionType = CORRECTIONTYPE_CORRECTION; - } - } else { - mCorrectionType = CORRECTIONTYPE_NO_CORRECTION; - } - mWords = newWords; - - // Update mWordArray - mWordArray = (TextUtils.isEmpty(mWords)) ? EMPTY_STRING_ARRAY - : WHITESPACE_PATTERN.split(mWords); - if (mWordArray.length > 0 && TextUtils.isEmpty(mWordArray[0])) { - // Empty string at beginning of array. Must have been whitespace at the start of the - // word. Remove the empty string. - mWordArray = Arrays.copyOfRange(mWordArray, 1, mWordArray.length); - } - } - - public String getWordsAsString() { - return mWords; - } - - /** - * Retuns the words generated by the data in this LogUnit. - * - * The first word may be an empty string, if the data in the LogUnit started by generating - * whitespace. - * - * @return the array of words. an empty list of there are no words associated with this LogUnit. - */ - public String[] getWordsAsStringArray() { - return mWordArray; - } - - public boolean hasOneOrMoreWords() { - return mWordArray.length >= 1; - } - - public int getNumWords() { - return mWordArray.length; - } - - // TODO: Refactor to eliminate getter/setters - public void setMayContainDigit() { - mMayContainDigit = true; - } - - // TODO: Refactor to eliminate getter/setters - public boolean mayContainDigit() { - return mMayContainDigit; - } - - // TODO: Refactor to eliminate getter/setters - public void setContainsUserDeletions() { - mContainsUserDeletions = true; - } - - // TODO: Refactor to eliminate getter/setters - public boolean containsUserDeletions() { - return mContainsUserDeletions; - } - - // TODO: Refactor to eliminate getter/setters - public void setCorrectionType(final int correctionType) { - mCorrectionType = correctionType; - } - - // TODO: Refactor to eliminate getter/setters - public int getCorrectionType() { - return mCorrectionType; - } - - public boolean isEmpty() { - return mLogStatementList.isEmpty(); - } - - /** - * Split this logUnit, with all events before maxTime staying in the current logUnit, and all - * events after maxTime going into a new LogUnit that is returned. - */ - public LogUnit splitByTime(final long maxTime) { - // Assume that mTimeList is in sorted order. - final int length = mTimeList.size(); - // TODO: find time by binary search, e.g. using Collections#binarySearch() - for (int index = 0; index < length; index++) { - if (mTimeList.get(index) > maxTime) { - final List<LogStatement> laterLogStatements = - mLogStatementList.subList(index, length); - final List<Object[]> laterValues = mValuesList.subList(index, length); - final List<Long> laterTimes = mTimeList.subList(index, length); - - // Create the LogUnit containing the later logStatements and associated data. - final LogUnit newLogUnit = new LogUnit( - new ArrayList<LogStatement>(laterLogStatements), - new ArrayList<Object[]>(laterValues), - new ArrayList<Long>(laterTimes), - true /* isPartOfMegaword */); - newLogUnit.mWords = null; - newLogUnit.mMayContainDigit = mMayContainDigit; - newLogUnit.mContainsUserDeletions = mContainsUserDeletions; - - // Purge the logStatements and associated data from this LogUnit. - laterLogStatements.clear(); - laterValues.clear(); - laterTimes.clear(); - mIsPartOfMegaword = true; - - return newLogUnit; - } - } - return new LogUnit(); - } - - public void append(final LogUnit logUnit) { - mLogStatementList.addAll(logUnit.mLogStatementList); - mValuesList.addAll(logUnit.mValuesList); - mTimeList.addAll(logUnit.mTimeList); - mWords = null; - if (logUnit.mWords != null) { - setWords(logUnit.mWords); - } - mMayContainDigit = mMayContainDigit || logUnit.mMayContainDigit; - mContainsUserDeletions = mContainsUserDeletions || logUnit.mContainsUserDeletions; - mIsPartOfMegaword = false; - } - - public SuggestedWords getSuggestions() { - return mSuggestedWords; - } - - /** - * Initialize the suggestions. - * - * Once set to a non-null value, the suggestions may not be changed again. This is to keep - * track of the list of words that are close to the user's initial effort to type the word. - * Only words that are close to the initial effort are considered typo corrections. - */ - public void initializeSuggestions(final SuggestedWords suggestedWords) { - if (mSuggestedWords == null) { - mSuggestedWords = suggestedWords; - } - } - - private static boolean isInSuggestedWords(final String queryWord, - final SuggestedWords suggestedWords) { - if (TextUtils.isEmpty(queryWord)) { - return false; - } - final int size = suggestedWords.size(); - for (int i = 0; i < size; i++) { - final SuggestedWordInfo wordInfo = suggestedWords.getInfo(i); - if (queryWord.equals(wordInfo.mWord)) { - return true; - } - } - return false; - } - - /** - * Remove data associated with selecting the Research button. - * - * A LogUnit will capture all user interactions with the IME, including the "meta-interactions" - * of using the Research button to control the logging (e.g. by starting and stopping recording - * of a test case). Because meta-interactions should not be part of the normal log, calling - * this method will set a field in the LogStatements of the motion events to indiciate that - * they should be disregarded. - * - * This implementation assumes that the data recorded by the meta-interaction takes the - * form of all events following the first MotionEvent.ACTION_DOWN before the first long-press - * before the last onCodeEvent containing a code matching {@code LogStatement.VALUE_RESEARCH}. - * - * @returns true if data was removed - */ - public boolean removeResearchButtonInvocation() { - // This method is designed to be idempotent. - - // First, find last invocation of "research" key - final int indexOfLastResearchKey = findLastIndexContainingKeyValue( - LogStatement.TYPE_POINTER_TRACKER_CALL_LISTENER_ON_CODE_INPUT, - LogStatement.KEY_CODE, LogStatement.VALUE_RESEARCH); - if (indexOfLastResearchKey < 0) { - // Could not find invocation of "research" key. Leave log as is. - if (DEBUG) { - Log.d(TAG, "Could not find research key"); - } - return false; - } - - // Look for the long press that started the invocation of the research key code input. - final int indexOfLastLongPressBeforeResearchKey = - findLastIndexBefore(LogStatement.TYPE_MAIN_KEYBOARD_VIEW_ON_LONG_PRESS, - indexOfLastResearchKey); - - // Look for DOWN event preceding the long press - final int indexOfLastDownEventBeforeLongPress = - findLastIndexContainingKeyValueBefore(LogStatement.TYPE_MOTION_EVENT, - LogStatement.ACTION, LogStatement.VALUE_DOWN, - indexOfLastLongPressBeforeResearchKey); - - // Flag all LatinKeyboardViewProcessMotionEvents from the DOWN event to the research key as - // logging-related - final int startingIndex = indexOfLastDownEventBeforeLongPress == -1 ? 0 - : indexOfLastDownEventBeforeLongPress; - for (int index = startingIndex; index < indexOfLastResearchKey; index++) { - final LogStatement logStatement = mLogStatementList.get(index); - final String type = logStatement.getType(); - final Object[] values = mValuesList.get(index); - if (type.equals(LogStatement.TYPE_MOTION_EVENT)) { - logStatement.setValue(LogStatement.KEY_IS_LOGGING_RELATED, values, true); - } - } - return true; - } - - /** - * Find the index of the last LogStatement before {@code startingIndex} of type {@code type}. - * - * @param queryType a String that must be {@code String.equals()} to the LogStatement type - * @param startingIndex the index to start the backward search from. Must be less than the - * length of mLogStatementList, or an IndexOutOfBoundsException is thrown. Can be negative, - * in which case -1 is returned. - * - * @return The index of the last LogStatement, -1 if none exists. - */ - private int findLastIndexBefore(final String queryType, final int startingIndex) { - return findLastIndexContainingKeyValueBefore(queryType, null, null, startingIndex); - } - - /** - * Find the index of the last LogStatement before {@code startingIndex} of type {@code type} - * containing the given key-value pair. - * - * @param queryType a String that must be {@code String.equals()} to the LogStatement type - * @param queryKey a String that must be {@code String.equals()} to a key in the LogStatement - * @param queryValue an Object that must be {@code String.equals()} to the key's corresponding - * value - * - * @return The index of the last LogStatement, -1 if none exists. - */ - private int findLastIndexContainingKeyValue(final String queryType, final String queryKey, - final Object queryValue) { - return findLastIndexContainingKeyValueBefore(queryType, queryKey, queryValue, - mLogStatementList.size() - 1); - } - - /** - * Find the index of the last LogStatement before {@code startingIndex} of type {@code type} - * containing the given key-value pair. - * - * @param queryType a String that must be {@code String.equals()} to the LogStatement type - * @param queryKey a String that must be {@code String.equals()} to a key in the LogStatement - * @param queryValue an Object that must be {@code String.equals()} to the key's corresponding - * value - * @param startingIndex the index to start the backward search from. Must be less than the - * length of mLogStatementList, or an IndexOutOfBoundsException is thrown. Can be negative, - * in which case -1 is returned. - * - * @return The index of the last LogStatement, -1 if none exists. - */ - private int findLastIndexContainingKeyValueBefore(final String queryType, final String queryKey, - final Object queryValue, final int startingIndex) { - if (startingIndex < 0) { - return -1; - } - for (int index = startingIndex; index >= 0; index--) { - final LogStatement logStatement = mLogStatementList.get(index); - final String type = logStatement.getType(); - if (type.equals(queryType) && (queryKey == null - || logStatement.containsKeyValuePair(queryKey, queryValue, - mValuesList.get(index)))) { - return index; - } - } - return -1; - } -} diff --git a/java/src/com/android/inputmethod/research/LoggingUtils.java b/java/src/com/android/inputmethod/research/LoggingUtils.java deleted file mode 100644 index 1261d6780..000000000 --- a/java/src/com/android/inputmethod/research/LoggingUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.view.MotionEvent; - -/* package */ class LoggingUtils { - private LoggingUtils() { - // This utility class is not publicly instantiable. - } - - /* package */ static String getMotionEventActionTypeString(final int actionType) { - switch (actionType) { - case MotionEvent.ACTION_CANCEL: return "CANCEL"; - case MotionEvent.ACTION_UP: return "UP"; - case MotionEvent.ACTION_DOWN: return "DOWN"; - case MotionEvent.ACTION_POINTER_UP: return "POINTER_UP"; - case MotionEvent.ACTION_POINTER_DOWN: return "POINTER_DOWN"; - case MotionEvent.ACTION_MOVE: return "MOVE"; - case MotionEvent.ACTION_OUTSIDE: return "OUTSIDE"; - default: return "ACTION_" + actionType; - } - } -} diff --git a/java/src/com/android/inputmethod/research/MainLogBuffer.java b/java/src/com/android/inputmethod/research/MainLogBuffer.java deleted file mode 100644 index 6df7c1708..000000000 --- a/java/src/com/android/inputmethod/research/MainLogBuffer.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.util.Log; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.Suggest; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedList; - -/** - * MainLogBuffer is a FixedLogBuffer that tracks the state of LogUnits to make privacy guarantees. - * - * There are three forms of privacy protection: 1) only words in the main dictionary are allowed to - * be logged in enough detail to determine their contents, 2) only a subset of words are logged - * in detail, such as 10%, and 3) no numbers are logged. - * - * This class maintains a list of LogUnits, each corresponding to a word. As the user completes - * words, they are added here. But if the user backs up over their current word to edit a word - * entered earlier, then it is pulled out of this LogBuffer, changes are then added to the end of - * the LogUnit, and it is pushed back in here when the user is done. Because words may be pulled - * back out even after they are pushed in, we must not publish the contents of this LogBuffer too - * quickly. However, we cannot let the contents pile up either, or it will limit the editing that - * a user can perform. - * - * To balance these requirements (keep history so user can edit, flush history so it does not pile - * up), the LogBuffer is considered "complete" when the user has entered enough words to form an - * n-gram, followed by enough additional non-detailed words (that are in the 90%, as per above). - * Once complete, the n-gram may be published to flash storage (via the ResearchLog class). - * However, the additional non-detailed words are retained, in case the user backspaces to edit - * them. The MainLogBuffer then continues to add words, publishing individual non-detailed words - * as new words arrive. After enough non-detailed words have been pushed out to account for the - * 90% between words, the words at the front of the LogBuffer can be published as an n-gram again. - * - * If the words that would form the valid n-gram are not in the dictionary, then words are pushed - * through the LogBuffer one at a time until an n-gram is found that is entirely composed of - * dictionary words. - * - * If the user closes a session, then the entire LogBuffer is flushed, publishing any embedded - * n-gram containing dictionary words. - */ -public abstract class MainLogBuffer extends FixedLogBuffer { - private static final String TAG = MainLogBuffer.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - - // Keep consistent with switch statement in Statistics.recordPublishabilityResultCode() - public static final int PUBLISHABILITY_PUBLISHABLE = 0; - public static final int PUBLISHABILITY_UNPUBLISHABLE_STOPPING = 1; - public static final int PUBLISHABILITY_UNPUBLISHABLE_INCORRECT_WORD_COUNT = 2; - public static final int PUBLISHABILITY_UNPUBLISHABLE_SAMPLED_TOO_RECENTLY = 3; - public static final int PUBLISHABILITY_UNPUBLISHABLE_DICTIONARY_UNAVAILABLE = 4; - public static final int PUBLISHABILITY_UNPUBLISHABLE_MAY_CONTAIN_DIGIT = 5; - public static final int PUBLISHABILITY_UNPUBLISHABLE_NOT_IN_DICTIONARY = 6; - - // The size of the n-grams logged. E.g. N_GRAM_SIZE = 2 means to sample bigrams. - public static final int N_GRAM_SIZE = 2; - - // TODO: Remove dependence on Suggest, and pass in Dictionary as a parameter to an appropriate - // method. - private final Suggest mSuggest; - @UsedForTesting - private Dictionary mDictionaryForTesting; - private boolean mIsStopping = false; - - /* package for test */ int mNumWordsBetweenNGrams; - - // Counter for words left to suppress before an n-gram can be sampled. Reset to mMinWordPeriod - // after a sample is taken. - /* package for test */ int mNumWordsUntilSafeToSample; - - public MainLogBuffer(final int wordsBetweenSamples, final int numInitialWordsToIgnore, - final Suggest suggest) { - super(N_GRAM_SIZE + wordsBetweenSamples); - mNumWordsBetweenNGrams = wordsBetweenSamples; - mNumWordsUntilSafeToSample = DEBUG ? 0 : numInitialWordsToIgnore; - mSuggest = suggest; - } - - @UsedForTesting - /* package for test */ void setDictionaryForTesting(final Dictionary dictionary) { - mDictionaryForTesting = dictionary; - } - - private Dictionary getDictionary() { - if (mDictionaryForTesting != null) { - return mDictionaryForTesting; - } - if (mSuggest == null || !mSuggest.hasMainDictionary()) return null; - return mSuggest.getMainDictionary(); - } - - public void setIsStopping() { - mIsStopping = true; - } - - /** - * Determines whether the string determined by a series of LogUnits will not violate user - * privacy if published. - * - * @param logUnits a LogUnit list to check for publishability - * @param nGramSize the smallest n-gram acceptable to be published. if - * {@link ResearchLogger#IS_LOGGING_EVERYTHING} is true, then publish if there are more than - * {@code minNGramSize} words in the logUnits, otherwise wait. if {@link - * ResearchLogger#IS_LOGGING_EVERYTHING} is false, then ensure that there are exactly nGramSize - * words in the LogUnits. - * - * @return one of the {@code PUBLISHABILITY_*} result codes defined in this class. - */ - private int getPublishabilityResultCode(final ArrayList<LogUnit> logUnits, - final int nGramSize) { - // Bypass privacy checks when debugging. - if (ResearchLogger.IS_LOGGING_EVERYTHING) { - if (mIsStopping) { - return PUBLISHABILITY_UNPUBLISHABLE_STOPPING; - } - // Only check that it is the right length. If not, wait for later words to make - // complete n-grams. - int numWordsInLogUnitList = 0; - final int length = logUnits.size(); - for (int i = 0; i < length; i++) { - final LogUnit logUnit = logUnits.get(i); - numWordsInLogUnitList += logUnit.getNumWords(); - } - if (numWordsInLogUnitList >= nGramSize) { - return PUBLISHABILITY_PUBLISHABLE; - } else { - return PUBLISHABILITY_UNPUBLISHABLE_INCORRECT_WORD_COUNT; - } - } - - // Check that we are not sampling too frequently. Having sampled recently might disclose - // too much of the user's intended meaning. - if (mNumWordsUntilSafeToSample > 0) { - return PUBLISHABILITY_UNPUBLISHABLE_SAMPLED_TOO_RECENTLY; - } - // Reload the dictionary in case it has changed (e.g., because the user has changed - // languages). - final Dictionary dictionary = getDictionary(); - if (dictionary == null) { - // Main dictionary is unavailable. Since we cannot check it, we cannot tell if a - // word is out-of-vocabulary or not. Therefore, we must judge the entire buffer - // contents to potentially pose a privacy risk. - return PUBLISHABILITY_UNPUBLISHABLE_DICTIONARY_UNAVAILABLE; - } - - // Check each word in the buffer. If any word poses a privacy threat, we cannot upload - // the complete buffer contents in detail. - int numWordsInLogUnitList = 0; - final int length = logUnits.size(); - for (final LogUnit logUnit : logUnits) { - if (!logUnit.hasOneOrMoreWords()) { - // Digits outside words are a privacy threat. - if (logUnit.mayContainDigit()) { - return PUBLISHABILITY_UNPUBLISHABLE_MAY_CONTAIN_DIGIT; - } - } else { - numWordsInLogUnitList += logUnit.getNumWords(); - final String[] words = logUnit.getWordsAsStringArray(); - for (final String word : words) { - // Words not in the dictionary are a privacy threat. - if (ResearchLogger.hasLetters(word) && !(dictionary.isValidWord(word))) { - if (DEBUG) { - Log.d(TAG, "\"" + word + "\" NOT SAFE!: hasLetters: " - + ResearchLogger.hasLetters(word) - + ", isValid: " + (dictionary.isValidWord(word))); - } - return PUBLISHABILITY_UNPUBLISHABLE_NOT_IN_DICTIONARY; - } - } - } - } - - // Finally, only return true if the ngram is the right size. - if (numWordsInLogUnitList == nGramSize) { - return PUBLISHABILITY_PUBLISHABLE; - } else { - return PUBLISHABILITY_UNPUBLISHABLE_INCORRECT_WORD_COUNT; - } - } - - public void shiftAndPublishAll() throws IOException { - final LinkedList<LogUnit> logUnits = getLogUnits(); - while (!logUnits.isEmpty()) { - publishLogUnitsAtFrontOfBuffer(); - } - } - - @Override - protected final void onBufferFull() { - try { - publishLogUnitsAtFrontOfBuffer(); - } catch (final IOException e) { - if (DEBUG) { - Log.w(TAG, "IOException when publishing front of LogBuffer", e); - } - } - } - - /** - * If there is a safe n-gram at the front of this log buffer, publish it with all details, and - * remove the LogUnits that constitute it. - * - * An n-gram might not be "safe" if it violates privacy controls. E.g., it might contain - * numbers, an out-of-vocabulary word, or another n-gram may have been published recently. If - * there is no safe n-gram, then the LogUnits up through the first word-containing LogUnit are - * published, but without disclosing any privacy-related details, such as the word the LogUnit - * generated, motion data, etc. - * - * Note that a LogUnit can hold more than one word if the user types without explicit spaces. - * In this case, the words may be grouped together in such a way that pulling an n-gram off the - * front would require splitting a LogUnit. Splitting a LogUnit is not possible, so this case - * is treated just as the unsafe n-gram case. This may cause n-grams to be sampled at slightly - * less than the target frequency. - */ - protected final void publishLogUnitsAtFrontOfBuffer() throws IOException { - // TODO: Refactor this method to require fewer passes through the LogUnits. Should really - // require only one pass. - ArrayList<LogUnit> logUnits = peekAtFirstNWords(N_GRAM_SIZE); - final int publishabilityResultCode = getPublishabilityResultCode(logUnits, N_GRAM_SIZE); - ResearchLogger.recordPublishabilityResultCode(publishabilityResultCode); - if (publishabilityResultCode == MainLogBuffer.PUBLISHABILITY_PUBLISHABLE) { - // Good n-gram at the front of the buffer. Publish it, disclosing details. - publish(logUnits, true /* canIncludePrivateData */); - shiftOutWords(N_GRAM_SIZE); - mNumWordsUntilSafeToSample = mNumWordsBetweenNGrams; - return; - } - // No good n-gram at front, and buffer is full. Shift out up through the first logUnit - // with associated words (or if there is none, all the existing logUnits). - logUnits.clear(); - LogUnit logUnit = shiftOut(); - while (logUnit != null) { - logUnits.add(logUnit); - final int numWords = logUnit.getNumWords(); - if (numWords > 0) { - mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWords); - break; - } - logUnit = shiftOut(); - } - publish(logUnits, false /* canIncludePrivateData */); - } - - /** - * Called when a list of logUnits should be published. - * - * It is the subclass's responsibility to implement the publication. - * - * @param logUnits The list of logUnits to be published. - * @param canIncludePrivateData Whether the private data in the logUnits can be included in - * publication. - * - * @throws IOException if publication to the log file is not possible - */ - protected abstract void publish(final ArrayList<LogUnit> logUnits, - final boolean canIncludePrivateData) throws IOException; - - @Override - protected int shiftOutWords(final int numWords) { - final int numWordsShiftedOut = super.shiftOutWords(numWords); - mNumWordsUntilSafeToSample = Math.max(0, mNumWordsUntilSafeToSample - numWordsShiftedOut); - if (DEBUG) { - Log.d(TAG, "wordsUntilSafeToSample now at " + mNumWordsUntilSafeToSample); - } - return numWordsShiftedOut; - } -} diff --git a/java/src/com/android/inputmethod/research/MotionEventReader.java b/java/src/com/android/inputmethod/research/MotionEventReader.java deleted file mode 100644 index 3388645b7..000000000 --- a/java/src/com/android/inputmethod/research/MotionEventReader.java +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.util.JsonReader; -import android.util.Log; -import android.view.MotionEvent; -import android.view.MotionEvent.PointerCoords; -import android.view.MotionEvent.PointerProperties; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; - -public class MotionEventReader { - private static final String TAG = MotionEventReader.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - // Assumes that MotionEvent.ACTION_MASK does not have all bits set.` - private static final int UNINITIALIZED_ACTION = ~MotionEvent.ACTION_MASK; - // No legitimate int is negative - private static final int UNINITIALIZED_INT = -1; - // No legitimate long is negative - private static final long UNINITIALIZED_LONG = -1L; - // No legitimate float is negative - private static final float UNINITIALIZED_FLOAT = -1.0f; - - public ReplayData readMotionEventData(final File file) { - final ReplayData replayData = new ReplayData(); - try { - // Read file - final JsonReader jsonReader = new JsonReader(new BufferedReader(new InputStreamReader( - new FileInputStream(file)))); - jsonReader.beginArray(); - while (jsonReader.hasNext()) { - readLogStatement(jsonReader, replayData); - } - jsonReader.endArray(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return replayData; - } - - @UsedForTesting - static class ReplayData { - final ArrayList<Integer> mActions = new ArrayList<Integer>(); - final ArrayList<PointerProperties[]> mPointerPropertiesArrays - = new ArrayList<PointerProperties[]>(); - final ArrayList<PointerCoords[]> mPointerCoordsArrays = new ArrayList<PointerCoords[]>(); - final ArrayList<Long> mTimes = new ArrayList<Long>(); - } - - /** - * Read motion data from a logStatement and store it in {@code replayData}. - * - * Two kinds of logStatements can be read. In the first variant, the MotionEvent data is - * represented as attributes at the top level like so: - * - * <pre> - * { - * "_ct": 1359590400000, - * "_ut": 4381933, - * "_ty": "MotionEvent", - * "action": "UP", - * "isLoggingRelated": false, - * "x": 100, - * "y": 200 - * } - * </pre> - * - * In the second variant, there is a separate attribute for the MotionEvent that includes - * historical data if present: - * - * <pre> - * { - * "_ct": 135959040000, - * "_ut": 4382702, - * "_ty": "MotionEvent", - * "action": "MOVE", - * "isLoggingRelated": false, - * "motionEvent": { - * "pointerIds": [ - * 0 - * ], - * "xyt": [ - * { - * "t": 4382551, - * "d": [ - * { - * "x": 141.25, - * "y": 151.8485107421875, - * "toma": 101.82337188720703, - * "tomi": 101.82337188720703, - * "o": 0.0 - * } - * ] - * }, - * { - * "t": 4382559, - * "d": [ - * { - * "x": 140.7266082763672, - * "y": 151.8485107421875, - * "toma": 101.82337188720703, - * "tomi": 101.82337188720703, - * "o": 0.0 - * } - * ] - * } - * ] - * } - * }, - * </pre> - */ - @UsedForTesting - /* package for test */ void readLogStatement(final JsonReader jsonReader, - final ReplayData replayData) throws IOException { - String logStatementType = null; - int actionType = UNINITIALIZED_ACTION; - int x = UNINITIALIZED_INT; - int y = UNINITIALIZED_INT; - long time = UNINITIALIZED_LONG; - boolean isLoggingRelated = false; - - jsonReader.beginObject(); - while (jsonReader.hasNext()) { - final String key = jsonReader.nextName(); - if (key.equals("_ty")) { - logStatementType = jsonReader.nextString(); - } else if (key.equals("_ut")) { - time = jsonReader.nextLong(); - } else if (key.equals("x")) { - x = jsonReader.nextInt(); - } else if (key.equals("y")) { - y = jsonReader.nextInt(); - } else if (key.equals("action")) { - final String s = jsonReader.nextString(); - if (s.equals("UP")) { - actionType = MotionEvent.ACTION_UP; - } else if (s.equals("DOWN")) { - actionType = MotionEvent.ACTION_DOWN; - } else if (s.equals("MOVE")) { - actionType = MotionEvent.ACTION_MOVE; - } - } else if (key.equals("loggingRelated")) { - isLoggingRelated = jsonReader.nextBoolean(); - } else if (logStatementType != null && logStatementType.equals("MotionEvent") - && key.equals("motionEvent")) { - if (actionType == UNINITIALIZED_ACTION) { - Log.e(TAG, "no actionType assigned in MotionEvent json"); - } - // Second variant of LogStatement. - if (isLoggingRelated) { - jsonReader.skipValue(); - } else { - readEmbeddedMotionEvent(jsonReader, replayData, actionType); - } - } else { - if (DEBUG) { - Log.w(TAG, "Unknown JSON key in LogStatement: " + key); - } - jsonReader.skipValue(); - } - } - jsonReader.endObject(); - - if (logStatementType != null && time != UNINITIALIZED_LONG && x != UNINITIALIZED_INT - && y != UNINITIALIZED_INT && actionType != UNINITIALIZED_ACTION - && logStatementType.equals("MotionEvent") && !isLoggingRelated) { - // First variant of LogStatement. - final PointerProperties pointerProperties = new PointerProperties(); - pointerProperties.id = 0; - pointerProperties.toolType = MotionEvent.TOOL_TYPE_UNKNOWN; - final PointerProperties[] pointerPropertiesArray = { - pointerProperties - }; - final PointerCoords pointerCoords = new PointerCoords(); - pointerCoords.x = x; - pointerCoords.y = y; - pointerCoords.pressure = 1.0f; - pointerCoords.size = 1.0f; - final PointerCoords[] pointerCoordsArray = { - pointerCoords - }; - addMotionEventData(replayData, actionType, time, pointerPropertiesArray, - pointerCoordsArray); - } - } - - private void readEmbeddedMotionEvent(final JsonReader jsonReader, final ReplayData replayData, - final int actionType) throws IOException { - jsonReader.beginObject(); - PointerProperties[] pointerPropertiesArray = null; - while (jsonReader.hasNext()) { // pointerIds/xyt - final String name = jsonReader.nextName(); - if (name.equals("pointerIds")) { - pointerPropertiesArray = readPointerProperties(jsonReader); - } else if (name.equals("xyt")) { - readPointerData(jsonReader, replayData, actionType, pointerPropertiesArray); - } - } - jsonReader.endObject(); - } - - private PointerProperties[] readPointerProperties(final JsonReader jsonReader) - throws IOException { - final ArrayList<PointerProperties> pointerPropertiesArrayList = - new ArrayList<PointerProperties>(); - jsonReader.beginArray(); - while (jsonReader.hasNext()) { - final PointerProperties pointerProperties = new PointerProperties(); - pointerProperties.id = jsonReader.nextInt(); - pointerProperties.toolType = MotionEvent.TOOL_TYPE_UNKNOWN; - pointerPropertiesArrayList.add(pointerProperties); - } - jsonReader.endArray(); - return pointerPropertiesArrayList.toArray( - new PointerProperties[pointerPropertiesArrayList.size()]); - } - - private void readPointerData(final JsonReader jsonReader, final ReplayData replayData, - final int actionType, final PointerProperties[] pointerPropertiesArray) - throws IOException { - if (pointerPropertiesArray == null) { - Log.e(TAG, "PointerIDs must be given before xyt data in json for MotionEvent"); - jsonReader.skipValue(); - return; - } - long time = UNINITIALIZED_LONG; - jsonReader.beginArray(); - while (jsonReader.hasNext()) { // Array of historical data - jsonReader.beginObject(); - final ArrayList<PointerCoords> pointerCoordsArrayList = new ArrayList<PointerCoords>(); - while (jsonReader.hasNext()) { // Time/data object - final String name = jsonReader.nextName(); - if (name.equals("t")) { - time = jsonReader.nextLong(); - } else if (name.equals("d")) { - jsonReader.beginArray(); - while (jsonReader.hasNext()) { // array of data per pointer - final PointerCoords pointerCoords = readPointerCoords(jsonReader); - if (pointerCoords != null) { - pointerCoordsArrayList.add(pointerCoords); - } - } - jsonReader.endArray(); - } else { - jsonReader.skipValue(); - } - } - jsonReader.endObject(); - // Data was recorded as historical events, but must be split apart into - // separate MotionEvents for replaying - if (time != UNINITIALIZED_LONG) { - addMotionEventData(replayData, actionType, time, pointerPropertiesArray, - pointerCoordsArrayList.toArray( - new PointerCoords[pointerCoordsArrayList.size()])); - } else { - Log.e(TAG, "Time not assigned in json for MotionEvent"); - } - } - jsonReader.endArray(); - } - - private PointerCoords readPointerCoords(final JsonReader jsonReader) throws IOException { - jsonReader.beginObject(); - float x = UNINITIALIZED_FLOAT; - float y = UNINITIALIZED_FLOAT; - while (jsonReader.hasNext()) { // x,y - final String name = jsonReader.nextName(); - if (name.equals("x")) { - x = (float) jsonReader.nextDouble(); - } else if (name.equals("y")) { - y = (float) jsonReader.nextDouble(); - } else { - jsonReader.skipValue(); - } - } - jsonReader.endObject(); - - if (Float.compare(x, UNINITIALIZED_FLOAT) == 0 - || Float.compare(y, UNINITIALIZED_FLOAT) == 0) { - Log.w(TAG, "missing x or y value in MotionEvent json"); - return null; - } - final PointerCoords pointerCoords = new PointerCoords(); - pointerCoords.x = x; - pointerCoords.y = y; - pointerCoords.pressure = 1.0f; - pointerCoords.size = 1.0f; - return pointerCoords; - } - - private void addMotionEventData(final ReplayData replayData, final int actionType, - final long time, final PointerProperties[] pointerProperties, - final PointerCoords[] pointerCoords) { - replayData.mActions.add(actionType); - replayData.mTimes.add(time); - replayData.mPointerPropertiesArrays.add(pointerProperties); - replayData.mPointerCoordsArrays.add(pointerCoords); - } -} diff --git a/java/src/com/android/inputmethod/research/Replayer.java b/java/src/com/android/inputmethod/research/Replayer.java deleted file mode 100644 index 903875f3c..000000000 --- a/java/src/com/android/inputmethod/research/Replayer.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.SystemClock; -import android.util.Log; -import android.view.MotionEvent; -import android.view.MotionEvent.PointerCoords; -import android.view.MotionEvent.PointerProperties; - -import com.android.inputmethod.keyboard.KeyboardSwitcher; -import com.android.inputmethod.keyboard.MainKeyboardView; -import com.android.inputmethod.latin.define.ProductionFlag; -import com.android.inputmethod.research.MotionEventReader.ReplayData; - -/** - * Replays a sequence of motion events in realtime on the screen. - * - * Useful for user inspection of logged data. - */ -public class Replayer { - private static final String TAG = Replayer.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - private static final long START_TIME_DELAY_MS = 500; - - private boolean mIsReplaying = false; - private KeyboardSwitcher mKeyboardSwitcher; - - private Replayer() { - } - - private static final Replayer sInstance = new Replayer(); - public static Replayer getInstance() { - return sInstance; - } - - public void setKeyboardSwitcher(final KeyboardSwitcher keyboardSwitcher) { - mKeyboardSwitcher = keyboardSwitcher; - } - - private static final int MSG_MOTION_EVENT = 0; - private static final int MSG_DONE = 1; - private static final int COMPLETION_TIME_MS = 500; - - // TODO: Support historical events and multi-touch. - public void replay(final ReplayData replayData, final Runnable callback) { - if (mIsReplaying) { - return; - } - mIsReplaying = true; - final int numActions = replayData.mActions.size(); - if (DEBUG) { - Log.d(TAG, "replaying " + numActions + " actions"); - } - if (numActions == 0) { - mIsReplaying = false; - return; - } - final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); - - // The reference time relative to the times stored in events. - final long origStartTime = replayData.mTimes.get(0); - // The reference time relative to which events are replayed in the present. - final long currentStartTime = SystemClock.uptimeMillis() + START_TIME_DELAY_MS; - // The adjustment needed to translate times from the original recorded time to the current - // time. - final long timeAdjustment = currentStartTime - origStartTime; - final Handler handler = new Handler(Looper.getMainLooper()) { - // Track the time of the most recent DOWN event, to be passed as a parameter when - // constructing a MotionEvent. It's initialized here to the origStartTime, but this is - // only a precaution. The value should be overwritten by the first ACTION_DOWN event - // before the first use of the variable. Note that this may cause the first few events - // to have incorrect {@code downTime}s. - private long mOrigDownTime = origStartTime; - - @Override - public void handleMessage(final Message msg) { - switch (msg.what) { - case MSG_MOTION_EVENT: - final int index = msg.arg1; - final int action = replayData.mActions.get(index); - final PointerProperties[] pointerPropertiesArray = - replayData.mPointerPropertiesArrays.get(index); - final PointerCoords[] pointerCoordsArray = - replayData.mPointerCoordsArrays.get(index); - final long origTime = replayData.mTimes.get(index); - if (action == MotionEvent.ACTION_DOWN) { - mOrigDownTime = origTime; - } - - final MotionEvent me = MotionEvent.obtain(mOrigDownTime + timeAdjustment, - origTime + timeAdjustment, action, - pointerPropertiesArray.length, pointerPropertiesArray, - pointerCoordsArray, 0, 0, 1.0f, 1.0f, 0, 0, 0, 0); - mainKeyboardView.processMotionEvent(me); - me.recycle(); - break; - case MSG_DONE: - mIsReplaying = false; - ResearchLogger.getInstance().requestIndicatorRedraw(); - break; - } - } - }; - - handler.post(new Runnable() { - @Override - public void run() { - ResearchLogger.getInstance().requestIndicatorRedraw(); - } - }); - for (int i = 0; i < numActions; i++) { - final Message msg = Message.obtain(handler, MSG_MOTION_EVENT, i, 0); - final long msgTime = replayData.mTimes.get(i) + timeAdjustment; - handler.sendMessageAtTime(msg, msgTime); - if (DEBUG) { - Log.d(TAG, "queuing event at " + msgTime); - } - } - - final long presentDoneTime = replayData.mTimes.get(numActions - 1) + timeAdjustment - + COMPLETION_TIME_MS; - handler.sendMessageAtTime(Message.obtain(handler, MSG_DONE), presentDoneTime); - if (callback != null) { - handler.postAtTime(callback, presentDoneTime + 1); - } - } - - public boolean isReplaying() { - return mIsReplaying; - } -} diff --git a/java/src/com/android/inputmethod/research/ReplayerService.java b/java/src/com/android/inputmethod/research/ReplayerService.java deleted file mode 100644 index 88d9033cf..000000000 --- a/java/src/com/android/inputmethod/research/ReplayerService.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.research; - -import android.app.IntentService; -import android.content.Intent; -import android.util.Log; - -import com.android.inputmethod.research.MotionEventReader.ReplayData; - -import java.io.File; -import java.util.concurrent.TimeUnit; - -/** - * Provide a mechanism to invoke the replayer from outside. - * - * In particular, makes access from a host possible through {@code adb am startservice}. - */ -public class ReplayerService extends IntentService { - private static final String TAG = ReplayerService.class.getSimpleName(); - private static final String EXTRA_FILENAME = "com.android.inputmethod.research.extra.FILENAME"; - private static final long MAX_REPLAY_TIME = TimeUnit.SECONDS.toMillis(60); - - public ReplayerService() { - super(ReplayerService.class.getSimpleName()); - } - - @Override - protected void onHandleIntent(final Intent intent) { - final String filename = intent.getStringExtra(EXTRA_FILENAME); - if (filename == null) return; - - final ReplayData replayData = new MotionEventReader().readMotionEventData( - new File(filename)); - synchronized (this) { - Replayer.getInstance().replay(replayData, new Runnable() { - @Override - public void run() { - synchronized (ReplayerService.this) { - ReplayerService.this.notify(); - } - } - }); - try { - wait(MAX_REPLAY_TIME); - } catch (InterruptedException e) { - Log.e(TAG, "Timeout while replaying.", e); - } - } - } -} diff --git a/java/src/com/android/inputmethod/research/ResearchLog.java b/java/src/com/android/inputmethod/research/ResearchLog.java deleted file mode 100644 index 46e620ae5..000000000 --- a/java/src/com/android/inputmethod/research/ResearchLog.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.content.Context; -import android.util.JsonWriter; -import android.util.Log; - -import com.android.inputmethod.annotations.UsedForTesting; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -/** - * Logs the use of the LatinIME keyboard. - * - * This class logs operations on the IME keyboard, including what the user has typed. Data is - * written to a {@link JsonWriter}, which will write to a local file. - * - * The JsonWriter is created on-demand by calling {@link #getInitializedJsonWriterLocked}. - * - * This class uses an executor to perform file-writing operations on a separate thread. It also - * tries to avoid creating unnecessary files if there is nothing to write. It also handles - * flushing, making sure it happens, but not too frequently. - * - * This functionality is off by default. See - * {@link ProductionFlag#USES_DEVELOPMENT_ONLY_DIAGNOSTICS}. - */ -public class ResearchLog { - // TODO: Automatically initialize the JsonWriter rather than requiring the caller to manage it. - private static final String TAG = ResearchLog.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - private static final long FLUSH_DELAY_IN_MS = TimeUnit.SECONDS.toMillis(5); - - /* package */ final ScheduledExecutorService mExecutor; - /* package */ final File mFile; - private final Context mContext; - - // Earlier implementations used a dummy JsonWriter that just swallowed what it was given, but - // this was tricky to do well, because JsonWriter throws an exception if it is passed more than - // one top-level object. - private JsonWriter mJsonWriter = null; - - // true if at least one byte of data has been written out to the log file. This must be - // remembered because JsonWriter requires that calls matching calls to beginObject and - // endObject, as well as beginArray and endArray, and the file is opened lazily, only when - // it is certain that data will be written. Alternatively, the matching call exceptions - // could be caught, but this might suppress other errors. - private boolean mHasWrittenData = false; - - public ResearchLog(final File outputFile, final Context context) { - mExecutor = Executors.newSingleThreadScheduledExecutor(); - mFile = outputFile; - mContext = context; - } - - /** - * Returns true if this is a FeedbackLog. - * - * FeedbackLogs record only the data associated with a Feedback dialog. Instead of normal - * logging, they contain a LogStatement with the complete feedback string and optionally a - * recording of the user's supplied demo of the problem. - */ - public boolean isFeedbackLog() { - return false; - } - - /** - * Waits for any publication requests to finish and closes the {@link JsonWriter} used for - * output. - * - * See class comment for details about {@code JsonWriter} construction. - * - * @param onClosed run after the close() operation has completed asynchronously - */ - private synchronized void close(final Runnable onClosed) { - mExecutor.submit(new Callable<Object>() { - @Override - public Object call() throws Exception { - try { - if (mJsonWriter == null) return null; - // TODO: This is necessary to avoid an exception. Better would be to not even - // open the JsonWriter if the file is not even opened unless there is valid data - // to write. - if (!mHasWrittenData) { - mJsonWriter.beginArray(); - } - mJsonWriter.endArray(); - mHasWrittenData = false; - mJsonWriter.flush(); - mJsonWriter.close(); - if (DEBUG) { - Log.d(TAG, "closed " + mFile); - } - } catch (final Exception e) { - Log.d(TAG, "error when closing ResearchLog:", e); - } finally { - // Marking the file as read-only signals that this log file is ready to be - // uploaded. - if (mFile != null && mFile.exists()) { - mFile.setWritable(false, false); - } - if (onClosed != null) { - onClosed.run(); - } - } - return null; - } - }); - removeAnyScheduledFlush(); - mExecutor.shutdown(); - } - - /** - * Block until the research log has shut down and spooled out all output or {@code timeout} - * occurs. - * - * @param timeout time to wait for close in milliseconds - */ - public void blockingClose(final long timeout) { - close(null); - awaitTermination(timeout, TimeUnit.MILLISECONDS); - } - - /** - * Waits for publication requests to finish, closes the JsonWriter, but then deletes the backing - * output file. - * - * @param onAbort run after the abort() operation has completed asynchronously - */ - private synchronized void abort(final Runnable onAbort) { - mExecutor.submit(new Callable<Object>() { - @Override - public Object call() throws Exception { - try { - if (mJsonWriter == null) return null; - if (mHasWrittenData) { - // TODO: This is necessary to avoid an exception. Better would be to not - // even open the JsonWriter if the file is not even opened unless there is - // valid data to write. - if (!mHasWrittenData) { - mJsonWriter.beginArray(); - } - mJsonWriter.endArray(); - mJsonWriter.close(); - mHasWrittenData = false; - } - } finally { - if (mFile != null) { - mFile.delete(); - } - if (onAbort != null) { - onAbort.run(); - } - } - return null; - } - }); - removeAnyScheduledFlush(); - mExecutor.shutdown(); - } - - /** - * Block until the research log has aborted or {@code timeout} occurs. - * - * @param timeout time to wait for close in milliseconds - */ - public void blockingAbort(final long timeout) { - abort(null); - awaitTermination(timeout, TimeUnit.MILLISECONDS); - } - - @UsedForTesting - public void awaitTermination(final long delay, final TimeUnit timeUnit) { - try { - if (!mExecutor.awaitTermination(delay, timeUnit)) { - Log.e(TAG, "ResearchLog executor timed out while awaiting terminaion"); - } - } catch (final InterruptedException e) { - Log.e(TAG, "ResearchLog executor interrupted while awaiting terminaion", e); - } - } - - /* package */ synchronized void flush() { - removeAnyScheduledFlush(); - mExecutor.submit(mFlushCallable); - } - - private final Callable<Object> mFlushCallable = new Callable<Object>() { - @Override - public Object call() throws Exception { - if (mJsonWriter != null) mJsonWriter.flush(); - return null; - } - }; - - private ScheduledFuture<Object> mFlushFuture; - - private void removeAnyScheduledFlush() { - if (mFlushFuture != null) { - mFlushFuture.cancel(false); - mFlushFuture = null; - } - } - - private void scheduleFlush() { - removeAnyScheduledFlush(); - mFlushFuture = mExecutor.schedule(mFlushCallable, FLUSH_DELAY_IN_MS, TimeUnit.MILLISECONDS); - } - - /** - * Queues up {@code logUnit} to be published in the background. - * - * @param logUnit the {@link LogUnit} to be published - * @param canIncludePrivateData whether private data in the LogUnit should be included - */ - public synchronized void publish(final LogUnit logUnit, final boolean canIncludePrivateData) { - try { - mExecutor.submit(new Callable<Object>() { - @Override - public Object call() throws Exception { - logUnit.publishTo(ResearchLog.this, canIncludePrivateData); - scheduleFlush(); - return null; - } - }); - } catch (final RejectedExecutionException e) { - // TODO: Add code to record loss of data, and report. - if (DEBUG) { - Log.d(TAG, "ResearchLog.publish() rejecting scheduled execution", e); - } - } - } - - /** - * Return a JsonWriter for this ResearchLog. It is initialized the first time this method is - * called. The cached value is returned in future calls. - * - * @throws IOException if opening the JsonWriter is not possible - */ - public JsonWriter getInitializedJsonWriterLocked() throws IOException { - if (mJsonWriter != null) return mJsonWriter; - if (mFile == null) throw new FileNotFoundException(); - try { - final JsonWriter jsonWriter = createJsonWriter(mContext, mFile); - if (jsonWriter == null) throw new IOException("Could not create JsonWriter"); - - jsonWriter.beginArray(); - mJsonWriter = jsonWriter; - mHasWrittenData = true; - return mJsonWriter; - } catch (final IOException e) { - if (DEBUG) { - Log.w(TAG, "Exception when creating JsonWriter", e); - Log.w(TAG, "Closing JsonWriter"); - } - if (mJsonWriter != null) mJsonWriter.close(); - mJsonWriter = null; - throw e; - } - } - - /** - * Create the JsonWriter to write the ResearchLog to. - * - * This method may be overriden in testing to redirect the output. - */ - /* package for test */ JsonWriter createJsonWriter(final Context context, final File file) - throws IOException { - return new JsonWriter(new BufferedWriter(new OutputStreamWriter( - context.openFileOutput(file.getName(), Context.MODE_PRIVATE)))); - } -} diff --git a/java/src/com/android/inputmethod/research/ResearchLogDirectory.java b/java/src/com/android/inputmethod/research/ResearchLogDirectory.java deleted file mode 100644 index d156068d6..000000000 --- a/java/src/com/android/inputmethod/research/ResearchLogDirectory.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.content.Context; -import android.util.Log; - -import java.io.File; -import java.io.FileFilter; - -/** - * Manages log files. - * - * This class handles all aspects where and how research log data is stored. This includes - * generating log filenames in the correct place with the correct names, and cleaning up log files - * under this directory. - */ -public class ResearchLogDirectory { - public static final String TAG = ResearchLogDirectory.class.getSimpleName(); - /* package */ static final String LOG_FILENAME_PREFIX = "researchLog"; - private static final String FILENAME_SUFFIX = ".txt"; - private static final String USER_RECORDING_FILENAME_PREFIX = "recording"; - - private static final ReadOnlyLogFileFilter sUploadableLogFileFilter = - new ReadOnlyLogFileFilter(); - - private final File mFilesDir; - - static class ReadOnlyLogFileFilter implements FileFilter { - @Override - public boolean accept(final File pathname) { - return pathname.getName().startsWith(ResearchLogDirectory.LOG_FILENAME_PREFIX) - && !pathname.canWrite(); - } - } - - /** - * Creates a new ResearchLogDirectory, creating the storage directory if it does not exist. - */ - public ResearchLogDirectory(final Context context) { - mFilesDir = getLoggingDirectory(context); - if (mFilesDir == null) { - throw new NullPointerException("No files directory specified"); - } - if (!mFilesDir.exists()) { - mFilesDir.mkdirs(); - } - } - - private File getLoggingDirectory(final Context context) { - // TODO: Switch to using a subdirectory of getFilesDir(). - return context.getFilesDir(); - } - - /** - * Get an array of log files that are ready for uploading. - * - * A file is ready for uploading if it is marked as read-only. - * - * @return the array of uploadable files - */ - public File[] getUploadableLogFiles() { - try { - return mFilesDir.listFiles(sUploadableLogFileFilter); - } catch (final SecurityException e) { - Log.e(TAG, "Could not cleanup log directory, permission denied", e); - return new File[0]; - } - } - - public void cleanupLogFilesOlderThan(final long time) { - try { - for (final File file : mFilesDir.listFiles()) { - final String filename = file.getName(); - if ((filename.startsWith(LOG_FILENAME_PREFIX) - || filename.startsWith(USER_RECORDING_FILENAME_PREFIX)) - && (file.lastModified() < time)) { - file.delete(); - } - } - } catch (final SecurityException e) { - Log.e(TAG, "Could not cleanup log directory, permission denied", e); - } - } - - public File getLogFilePath(final long time, final long nanoTime) { - return new File(mFilesDir, getUniqueFilename(LOG_FILENAME_PREFIX, time, nanoTime)); - } - - public File getUserRecordingFilePath(final long time, final long nanoTime) { - return new File(mFilesDir, getUniqueFilename(USER_RECORDING_FILENAME_PREFIX, time, - nanoTime)); - } - - private static String getUniqueFilename(final String prefix, final long time, - final long nanoTime) { - return prefix + "-" + time + "-" + nanoTime + FILENAME_SUFFIX; - } -} diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java deleted file mode 100644 index da9c61103..000000000 --- a/java/src/com/android/inputmethod/research/ResearchLogger.java +++ /dev/null @@ -1,1950 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Resources; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.SystemClock; -import android.preference.PreferenceManager; -import android.text.TextUtils; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.inputmethod.CompletionInfo; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.widget.Toast; - -import com.android.inputmethod.keyboard.Key; -import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.KeyboardId; -import com.android.inputmethod.keyboard.KeyboardSwitcher; -import com.android.inputmethod.keyboard.KeyboardView; -import com.android.inputmethod.keyboard.MainKeyboardView; -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.LatinIME; -import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.RichInputConnection; -import com.android.inputmethod.latin.Suggest; -import com.android.inputmethod.latin.SuggestedWords; -import com.android.inputmethod.latin.define.ProductionFlag; -import com.android.inputmethod.latin.utils.InputTypeUtils; -import com.android.inputmethod.latin.utils.TextRange; -import com.android.inputmethod.research.MotionEventReader.ReplayData; -import com.android.inputmethod.research.ui.SplashScreen; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - -// TODO: Add a unit test for every "logging" method (i.e. that is called from the IME and calls -// enqueueEvent to record a LogStatement). -/** - * Logs the use of the LatinIME keyboard. - * - * This class logs operations on the IME keyboard, including what the user has typed. - * Data is stored locally in a file in app-specific storage. - * - * This functionality is off by default. See - * {@link ProductionFlag#USES_DEVELOPMENT_ONLY_DIAGNOSTICS}. - */ -public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChangeListener, - SplashScreen.UserConsentListener { - // TODO: This class has grown quite large and combines several concerns that should be - // separated. The following refactorings will be applied as soon as possible after adding - // support for replaying historical events, fixing some replay bugs, adding some ui constraints - // on the feedback dialog, and adding the survey dialog. - // TODO: Refactor. Move feedback screen code into separate class. - // TODO: Refactor. Move logging invocations into their own class. - // TODO: Refactor. Move currentLogUnit management into separate class. - private static final String TAG = ResearchLogger.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - private static final boolean DEBUG_REPLAY_AFTER_FEEDBACK = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - // Whether the TextView contents are logged at the end of the session. true will disclose - // private info. - private static final boolean LOG_FULL_TEXTVIEW_CONTENTS = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - // Whether the feedback dialog preserves the editable text across invocations. Should be false - // for normal research builds so users do not have to delete the same feedback string they - // entered earlier. Should be true for builds internal to a development team so when the text - // field holds a channel name, the developer does not have to re-enter it when using the - // feedback mechanism to generate multiple tests. - private static final boolean FEEDBACK_DIALOG_SHOULD_PRESERVE_TEXT_FIELD = false; - /* package */ static boolean sIsLogging = false; - private static final int OUTPUT_FORMAT_VERSION = 5; - // Whether all words should be recorded, leaving unsampled word between bigrams. Useful for - // testing. - /* package for test */ static final boolean IS_LOGGING_EVERYTHING = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - // The number of words between n-grams to omit from the log. - private static final int NUMBER_OF_WORDS_BETWEEN_SAMPLES = - IS_LOGGING_EVERYTHING ? 0 : (DEBUG ? 2 : 18); - - // Whether to show an indicator on the screen that logging is on. Currently a very small red - // dot in the lower right hand corner. Most users should not notice it. - private static final boolean IS_SHOWING_INDICATOR = true; - // Change the default indicator to something very visible. Currently two red vertical bars on - // either side of they keyboard. - private static final boolean IS_SHOWING_INDICATOR_CLEARLY = false || - (IS_LOGGING_EVERYTHING && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG); - // FEEDBACK_WORD_BUFFER_SIZE should add 1 because it must also hold the feedback LogUnit itself. - public static final int FEEDBACK_WORD_BUFFER_SIZE = (Integer.MAX_VALUE - 1) + 1; - - // The special output text to invoke a research feedback dialog. - public static final String RESEARCH_KEY_OUTPUT_TEXT = ".research."; - - // constants related to specific log points - private static final String WHITESPACE_SEPARATORS = " \t\n\r"; - private static final int MAX_INPUTVIEW_LENGTH_TO_CAPTURE = 8192; // must be >=1 - private static final String PREF_RESEARCH_SAVED_CHANNEL = "pref_research_saved_channel"; - - private static final long RESEARCHLOG_CLOSE_TIMEOUT_IN_MS = TimeUnit.SECONDS.toMillis(5); - private static final long RESEARCHLOG_ABORT_TIMEOUT_IN_MS = TimeUnit.SECONDS.toMillis(5); - private static final long DURATION_BETWEEN_DIR_CLEANUP_IN_MS = TimeUnit.DAYS.toMillis(1); - private static final long MAX_LOGFILE_AGE_IN_MS = TimeUnit.DAYS.toMillis(4); - - private static final ResearchLogger sInstance = new ResearchLogger(); - private static String sAccountType = null; - private static String sAllowedAccountDomain = null; - private ResearchLog mMainResearchLog; // always non-null after init() is called - // mFeedbackLog records all events for the session, private or not (excepting - // passwords). It is written to permanent storage only if the user explicitly commands - // the system to do so. - // LogUnits are queued in the LogBuffers and published to the ResearchLogs when words are - // complete. - /* package for test */ MainLogBuffer mMainLogBuffer; // always non-null after init() is called - /* package */ ResearchLog mUserRecordingLog; - /* package */ LogBuffer mUserRecordingLogBuffer; - private File mUserRecordingFile = null; - - private boolean mIsPasswordView = false; - private SharedPreferences mPrefs; - - // digits entered by the user are replaced with this codepoint. - /* package for test */ static final int DIGIT_REPLACEMENT_CODEPOINT = - Character.codePointAt("\uE000", 0); // U+E000 is in the "private-use area" - // U+E001 is in the "private-use area" - /* package for test */ static final String WORD_REPLACEMENT_STRING = "\uE001"; - protected static final int SUSPEND_DURATION_IN_MINUTES = 1; - // set when LatinIME should ignore an onUpdateSelection() callback that - // arises from operations in this class - private static boolean sLatinIMEExpectingUpdateSelection = false; - - // used to check whether words are not unique - private Suggest mSuggest; - private MainKeyboardView mMainKeyboardView; - // TODO: Check whether a superclass can be used instead of LatinIME. - /* package for test */ LatinIME mLatinIME; - private final Statistics mStatistics; - private final MotionEventReader mMotionEventReader = new MotionEventReader(); - private final Replayer mReplayer = Replayer.getInstance(); - private ResearchLogDirectory mResearchLogDirectory; - private SplashScreen mSplashScreen; - - private Intent mUploadNowIntent; - - /* package for test */ LogUnit mCurrentLogUnit = new LogUnit(); - - // Gestured or tapped words may be committed after the gesture of the next word has started. - // To ensure that the gesture data of the next word is not associated with the previous word, - // thereby leaking private data, we store the time of the down event that started the second - // gesture, and when committing the earlier word, split the LogUnit. - private long mSavedDownEventTime; - private Bundle mFeedbackDialogBundle = null; - // Whether the feedback dialog is visible, and the user is typing into it. Normal logging is - // not performed on text that the user types into the feedback dialog. - private boolean mInFeedbackDialog = false; - private Handler mUserRecordingTimeoutHandler; - private static final long USER_RECORDING_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(30); - - // Stores a temporary LogUnit while generating a phantom space. Needed because phantom spaces - // are issued out-of-order, immediately before the characters generated by other operations that - // have already outputted LogStatements. - private LogUnit mPhantomSpaceLogUnit = null; - - private ResearchLogger() { - mStatistics = Statistics.getInstance(); - } - - public static ResearchLogger getInstance() { - return sInstance; - } - - public void init(final LatinIME latinIME, final KeyboardSwitcher keyboardSwitcher, - final Suggest suggest) { - assert latinIME != null; - mLatinIME = latinIME; - mPrefs = PreferenceManager.getDefaultSharedPreferences(latinIME); - mPrefs.registerOnSharedPreferenceChangeListener(this); - - // Initialize fields from preferences - sIsLogging = ResearchSettings.readResearchLoggerEnabledFlag(mPrefs); - - // Initialize fields from resources - final Resources res = latinIME.getResources(); - sAccountType = res.getString(R.string.research_account_type); - sAllowedAccountDomain = res.getString(R.string.research_allowed_account_domain); - - // Initialize directory manager - mResearchLogDirectory = new ResearchLogDirectory(mLatinIME); - cleanLogDirectoryIfNeeded(mResearchLogDirectory, System.currentTimeMillis()); - - // Initialize log buffers - resetLogBuffers(); - - // Initialize external services - mUploadNowIntent = new Intent(mLatinIME, UploaderService.class); - mUploadNowIntent.putExtra(UploaderService.EXTRA_UPLOAD_UNCONDITIONALLY, true); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - UploaderService.cancelAndRescheduleUploadingService(mLatinIME, - true /* needsRescheduling */); - } - mReplayer.setKeyboardSwitcher(keyboardSwitcher); - } - - private void resetLogBuffers() { - mMainResearchLog = new ResearchLog(mResearchLogDirectory.getLogFilePath( - System.currentTimeMillis(), System.nanoTime()), mLatinIME); - final int numWordsToIgnore = new Random().nextInt(NUMBER_OF_WORDS_BETWEEN_SAMPLES + 1); - mMainLogBuffer = new MainLogBuffer(NUMBER_OF_WORDS_BETWEEN_SAMPLES, numWordsToIgnore, - mSuggest) { - @Override - protected void publish(final ArrayList<LogUnit> logUnits, - boolean canIncludePrivateData) { - canIncludePrivateData |= IS_LOGGING_EVERYTHING; - for (final LogUnit logUnit : logUnits) { - if (DEBUG) { - final String wordsString = logUnit.getWordsAsString(); - Log.d(TAG, "onPublish: '" + wordsString - + "', hc: " + logUnit.containsUserDeletions() - + ", cipd: " + canIncludePrivateData); - } - for (final String word : logUnit.getWordsAsStringArray()) { - final Dictionary dictionary = getDictionary(); - mStatistics.recordWordEntered( - dictionary != null && dictionary.isValidWord(word), - logUnit.containsUserDeletions()); - } - } - publishLogUnits(logUnits, mMainResearchLog, canIncludePrivateData); - } - }; - } - - private void cleanLogDirectoryIfNeeded(final ResearchLogDirectory researchLogDirectory, - final long now) { - final long lastCleanupTime = ResearchSettings.readResearchLastDirCleanupTime(mPrefs); - if (now - lastCleanupTime < DURATION_BETWEEN_DIR_CLEANUP_IN_MS) return; - final long oldestAllowedFileTime = now - MAX_LOGFILE_AGE_IN_MS; - mResearchLogDirectory.cleanupLogFilesOlderThan(oldestAllowedFileTime); - ResearchSettings.writeResearchLastDirCleanupTime(mPrefs, now); - } - - public void mainKeyboardView_onAttachedToWindow(final MainKeyboardView mainKeyboardView) { - mMainKeyboardView = mainKeyboardView; - maybeShowSplashScreen(); - } - - public void mainKeyboardView_onDetachedFromWindow() { - mMainKeyboardView = null; - } - - public void onDestroy() { - if (mPrefs != null) { - mPrefs.unregisterOnSharedPreferenceChangeListener(this); - } - } - - private void maybeShowSplashScreen() { - if (ResearchSettings.readHasSeenSplash(mPrefs)) return; - if (mSplashScreen != null && mSplashScreen.isShowing()) return; - if (mMainKeyboardView == null) return; - final IBinder windowToken = mMainKeyboardView.getWindowToken(); - if (windowToken == null) return; - - mSplashScreen = new SplashScreen(mLatinIME, this); - mSplashScreen.showSplashScreen(windowToken); - } - - @Override - public void onSplashScreenUserClickedOk() { - if (mPrefs == null) { - mPrefs = PreferenceManager.getDefaultSharedPreferences(mLatinIME); - if (mPrefs == null) return; - } - sIsLogging = true; - ResearchSettings.writeResearchLoggerEnabledFlag(mPrefs, true); - ResearchSettings.writeHasSeenSplash(mPrefs, true); - restart(); - } - - private void checkForEmptyEditor() { - if (mLatinIME == null) { - return; - } - final InputConnection ic = mLatinIME.getCurrentInputConnection(); - if (ic == null) { - return; - } - final CharSequence textBefore = ic.getTextBeforeCursor(1, 0); - if (!TextUtils.isEmpty(textBefore)) { - mStatistics.setIsEmptyUponStarting(false); - return; - } - final CharSequence textAfter = ic.getTextAfterCursor(1, 0); - if (!TextUtils.isEmpty(textAfter)) { - mStatistics.setIsEmptyUponStarting(false); - return; - } - if (textBefore != null && textAfter != null) { - mStatistics.setIsEmptyUponStarting(true); - } - } - - private void start() { - if (DEBUG) { - Log.d(TAG, "start called"); - } - maybeShowSplashScreen(); - requestIndicatorRedraw(); - mStatistics.reset(); - checkForEmptyEditor(); - } - - /* package */ void stop() { - if (DEBUG) { - Log.d(TAG, "stop called"); - } - // Commit mCurrentLogUnit before closing. - commitCurrentLogUnit(); - - try { - mMainLogBuffer.shiftAndPublishAll(); - } catch (final IOException e) { - Log.w(TAG, "IOException when publishing LogBuffer", e); - } - logStatistics(); - commitCurrentLogUnit(); - mMainLogBuffer.setIsStopping(); - try { - mMainLogBuffer.shiftAndPublishAll(); - } catch (final IOException e) { - Log.w(TAG, "IOException when publishing LogBuffer", e); - } - mMainResearchLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); - - resetLogBuffers(); - cancelFeedbackDialog(); - } - - public void abort() { - if (DEBUG) { - Log.d(TAG, "abort called"); - } - mMainLogBuffer.clear(); - mMainResearchLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS); - - resetLogBuffers(); - } - - private void restart() { - stop(); - start(); - } - - @Override - public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { - if (key == null || prefs == null) { - return; - } - requestIndicatorRedraw(); - mPrefs = prefs; - prefsChanged(prefs); - } - - public void onResearchKeySelected(final LatinIME latinIME) { - mCurrentLogUnit.removeResearchButtonInvocation(); - if (mInFeedbackDialog) { - Toast.makeText(latinIME, R.string.research_please_exit_feedback_form, - Toast.LENGTH_LONG).show(); - return; - } - presentFeedbackDialog(latinIME); - } - - public void presentFeedbackDialogFromSettings() { - if (mLatinIME != null) { - presentFeedbackDialog(mLatinIME); - } - } - - public void presentFeedbackDialog(final LatinIME latinIME) { - if (isMakingUserRecording()) { - saveRecording(); - } - mInFeedbackDialog = true; - - final Intent intent = new Intent(); - intent.setClass(mLatinIME, FeedbackActivity.class); - if (mFeedbackDialogBundle == null) { - // Restore feedback field with channel name - final Bundle bundle = new Bundle(); - bundle.putBoolean(FeedbackFragment.KEY_INCLUDE_ACCOUNT_NAME, true); - bundle.putBoolean(FeedbackFragment.KEY_HAS_USER_RECORDING, false); - if (FEEDBACK_DIALOG_SHOULD_PRESERVE_TEXT_FIELD) { - final String savedChannelName = mPrefs.getString(PREF_RESEARCH_SAVED_CHANNEL, ""); - bundle.putString(FeedbackFragment.KEY_FEEDBACK_STRING, savedChannelName); - } - mFeedbackDialogBundle = bundle; - } - intent.putExtras(mFeedbackDialogBundle); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - latinIME.startActivity(intent); - } - - public void setFeedbackDialogBundle(final Bundle bundle) { - mFeedbackDialogBundle = bundle; - } - - public void startRecording() { - final Resources res = mLatinIME.getResources(); - Toast.makeText(mLatinIME, - res.getString(R.string.research_feedback_demonstration_instructions), - Toast.LENGTH_LONG).show(); - startRecordingInternal(); - } - - private void startRecordingInternal() { - if (mUserRecordingLog != null) { - mUserRecordingLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS); - } - mUserRecordingFile = mResearchLogDirectory.getUserRecordingFilePath( - System.currentTimeMillis(), System.nanoTime()); - mUserRecordingLog = new ResearchLog(mUserRecordingFile, mLatinIME); - mUserRecordingLogBuffer = new LogBuffer(); - resetRecordingTimer(); - } - - private boolean isMakingUserRecording() { - return mUserRecordingLog != null; - } - - private void resetRecordingTimer() { - if (mUserRecordingTimeoutHandler == null) { - mUserRecordingTimeoutHandler = new Handler(); - } - clearRecordingTimer(); - mUserRecordingTimeoutHandler.postDelayed(mRecordingHandlerTimeoutRunnable, - USER_RECORDING_TIMEOUT_MS); - } - - private void clearRecordingTimer() { - mUserRecordingTimeoutHandler.removeCallbacks(mRecordingHandlerTimeoutRunnable); - } - - private Runnable mRecordingHandlerTimeoutRunnable = new Runnable() { - @Override - public void run() { - cancelRecording(); - requestIndicatorRedraw(); - final Resources res = mLatinIME.getResources(); - Toast.makeText(mLatinIME, res.getString(R.string.research_feedback_recording_failure), - Toast.LENGTH_LONG).show(); - } - }; - - private void cancelRecording() { - if (mUserRecordingLog != null) { - mUserRecordingLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS); - } - mUserRecordingLog = null; - mUserRecordingLogBuffer = null; - if (mFeedbackDialogBundle != null) { - mFeedbackDialogBundle.putBoolean("HasRecording", false); - } - } - - private void saveRecording() { - commitCurrentLogUnit(); - publishLogBuffer(mUserRecordingLogBuffer, mUserRecordingLog, true); - mUserRecordingLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); - mUserRecordingLog = null; - mUserRecordingLogBuffer = null; - - if (mFeedbackDialogBundle != null) { - mFeedbackDialogBundle.putBoolean(FeedbackFragment.KEY_HAS_USER_RECORDING, true); - } - clearRecordingTimer(); - } - - // TODO: currently unreachable. Remove after being sure enable/disable is - // not needed. - /* - public void enableOrDisable(final boolean showEnable, final LatinIME latinIME) { - if (showEnable) { - if (!sIsLogging) { - setLoggingAllowed(true); - } - resumeLogging(); - Toast.makeText(latinIME, - R.string.research_notify_session_logging_enabled, - Toast.LENGTH_LONG).show(); - } else { - Toast toast = Toast.makeText(latinIME, - R.string.research_notify_session_log_deleting, - Toast.LENGTH_LONG); - toast.show(); - boolean isLogDeleted = abort(); - final long currentTime = System.currentTimeMillis(); - final long resumeTime = currentTime - + TimeUnit.MINUTES.toMillis(SUSPEND_DURATION_IN_MINUTES); - suspendLoggingUntil(resumeTime); - toast.cancel(); - Toast.makeText(latinIME, R.string.research_notify_logging_suspended, - Toast.LENGTH_LONG).show(); - } - } - */ - - /** - * Get the name of the first allowed account on the device. - * - * Allowed accounts must be in the domain given by ALLOWED_ACCOUNT_DOMAIN. - * - * @return The user's account name. - */ - public String getAccountName() { - if (sAccountType == null || sAccountType.isEmpty()) { - return null; - } - if (sAllowedAccountDomain == null || sAllowedAccountDomain.isEmpty()) { - return null; - } - final AccountManager manager = AccountManager.get(mLatinIME); - // Filter first by account type. - final Account[] accounts = manager.getAccountsByType(sAccountType); - - for (final Account account : accounts) { - if (DEBUG) { - Log.d(TAG, account.name); - } - final String[] parts = account.name.split("@"); - if (parts.length > 1 && parts[1].equals(sAllowedAccountDomain)) { - return parts[0]; - } - } - return null; - } - - private static final LogStatement LOGSTATEMENT_FEEDBACK = - new LogStatement("UserFeedback", false, false, "contents", "accountName", "recording"); - public void sendFeedback(final String feedbackContents, final boolean includeHistory, - final boolean isIncludingAccountName, final boolean isIncludingRecording) { - String recording = ""; - if (isIncludingRecording) { - // Try to read recording from recently written json file - if (mUserRecordingFile != null) { - FileChannel channel = null; - try { - channel = new FileInputStream(mUserRecordingFile).getChannel(); - final MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, - channel.size()); - // Android's openFileOutput() creates the file, so we use Android's default - // Charset (UTF-8) here to read it. - recording = Charset.defaultCharset().decode(buffer).toString(); - } catch (FileNotFoundException e) { - Log.e(TAG, "Could not find recording file", e); - } catch (IOException e) { - Log.e(TAG, "Error reading recording file", e); - } finally { - if (channel != null) { - try { - channel.close(); - } catch (IOException e) { - Log.e(TAG, "Error closing recording file", e); - } - } - } - } - } - final LogUnit feedbackLogUnit = new LogUnit(); - final String accountName = isIncludingAccountName ? getAccountName() : ""; - feedbackLogUnit.addLogStatement(LOGSTATEMENT_FEEDBACK, SystemClock.uptimeMillis(), - feedbackContents, accountName, recording); - - final ResearchLog feedbackLog = new FeedbackLog(mResearchLogDirectory.getLogFilePath( - System.currentTimeMillis(), System.nanoTime()), mLatinIME); - final LogBuffer feedbackLogBuffer = new LogBuffer(); - feedbackLogBuffer.shiftIn(feedbackLogUnit); - publishLogBuffer(feedbackLogBuffer, feedbackLog, true /* isIncludingPrivateData */); - feedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); - uploadNow(); - - if (isIncludingRecording && DEBUG_REPLAY_AFTER_FEEDBACK) { - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - @Override - public void run() { - final ReplayData replayData = - mMotionEventReader.readMotionEventData(mUserRecordingFile); - mReplayer.replay(replayData, null); - } - }, TimeUnit.SECONDS.toMillis(1)); - } - - if (FEEDBACK_DIALOG_SHOULD_PRESERVE_TEXT_FIELD) { - // Use feedback string as a channel name to label feedback strings. Here we record the - // string for prepopulating the field next time. - final String channelName = feedbackContents; - if (mPrefs == null) { - return; - } - mPrefs.edit().putString(PREF_RESEARCH_SAVED_CHANNEL, channelName).apply(); - } - } - - public void uploadNow() { - if (DEBUG) { - Log.d(TAG, "calling uploadNow()"); - } - mLatinIME.startService(mUploadNowIntent); - } - - public void onLeavingSendFeedbackDialog() { - mInFeedbackDialog = false; - } - - private void cancelFeedbackDialog() { - if (isMakingUserRecording()) { - cancelRecording(); - } - mInFeedbackDialog = false; - } - - public void initSuggest(final Suggest suggest) { - mSuggest = suggest; - // MainLogBuffer now has an out-of-date Suggest object. Close down MainLogBuffer and create - // a new one. - if (mMainLogBuffer != null) { - restart(); - } - } - - private Dictionary getDictionary() { - if (mSuggest == null) { - return null; - } - return mSuggest.getMainDictionary(); - } - - private void setIsPasswordView(boolean isPasswordView) { - mIsPasswordView = isPasswordView; - } - - /** - * Returns true if logging is permitted. - * - * This method is called when adding a LogStatement to a LogUnit, and when adding a LogUnit to a - * ResearchLog. It is checked in both places in case conditions change between these times, and - * as a defensive measure in case refactoring changes the logging pipeline. - */ - private boolean isAllowedToLogTo(final ResearchLog researchLog) { - // Logging is never allowed in these circumstances - if (mIsPasswordView) return false; - if (!sIsLogging) return false; - if (mInFeedbackDialog) { - // The FeedbackDialog is up. Normal logging should not happen (the user might be trying - // out things while the dialog is up, and their reporting of an issue may not be - // representative of what they normally type). However, after the user has finished - // entering their feedback, the logger packs their comments and an encoded version of - // any demonstration of the issue into a special "FeedbackLog". So if the FeedbackLog - // is the destination, we do want to allow logging to it. - return researchLog.isFeedbackLog(); - } - // No other exclusions. Logging is permitted. - return true; - } - - public void requestIndicatorRedraw() { - if (!IS_SHOWING_INDICATOR) { - return; - } - if (mMainKeyboardView == null) { - return; - } - mMainKeyboardView.invalidateAllKeys(); - } - - private boolean isReplaying() { - return mReplayer.isReplaying(); - } - - private int getIndicatorColor() { - if (isMakingUserRecording()) { - return Color.YELLOW; - } - if (isReplaying()) { - return Color.GREEN; - } - return Color.RED; - } - - public void paintIndicator(KeyboardView view, Paint paint, Canvas canvas, int width, - int height) { - // TODO: Reimplement using a keyboard background image specific to the ResearchLogger - // and remove this method. - // The check for MainKeyboardView ensures that the indicator only decorates the main - // keyboard, not every keyboard. - if (IS_SHOWING_INDICATOR && (isAllowedToLogTo(mMainResearchLog) || isReplaying()) - && view instanceof MainKeyboardView) { - final int savedColor = paint.getColor(); - paint.setColor(getIndicatorColor()); - final Style savedStyle = paint.getStyle(); - paint.setStyle(Style.STROKE); - final float savedStrokeWidth = paint.getStrokeWidth(); - if (IS_SHOWING_INDICATOR_CLEARLY) { - paint.setStrokeWidth(5); - canvas.drawLine(0, 0, 0, height, paint); - canvas.drawLine(width, 0, width, height, paint); - } else { - // Put a tiny dot on the screen so a knowledgeable user can check whether it is - // enabled. The dot is actually a zero-width, zero-height rectangle, placed at the - // lower-right corner of the canvas, painted with a non-zero border width. - paint.setStrokeWidth(3); - canvas.drawRect(width - 1, height - 1, width, height, paint); - } - paint.setColor(savedColor); - paint.setStyle(savedStyle); - paint.setStrokeWidth(savedStrokeWidth); - } - } - - /** - * Buffer a research log event, flagging it as privacy-sensitive. - */ - private synchronized void enqueueEvent(final LogStatement logStatement, - final Object... values) { - enqueueEvent(mCurrentLogUnit, logStatement, values); - } - - private synchronized void enqueueEvent(final LogUnit logUnit, final LogStatement logStatement, - final Object... values) { - assert values.length == logStatement.getKeys().length; - if (isAllowedToLogTo(mMainResearchLog) && logUnit != null) { - final long time = SystemClock.uptimeMillis(); - logUnit.addLogStatement(logStatement, time, values); - } - } - - private void setCurrentLogUnitContainsDigitFlag() { - mCurrentLogUnit.setMayContainDigit(); - } - - private void setCurrentLogUnitContainsUserDeletions() { - mCurrentLogUnit.setContainsUserDeletions(); - } - - private void setCurrentLogUnitCorrectionType(final int correctionType) { - mCurrentLogUnit.setCorrectionType(correctionType); - } - - /* package for test */ void commitCurrentLogUnit() { - if (DEBUG) { - Log.d(TAG, "commitCurrentLogUnit" + (mCurrentLogUnit.hasOneOrMoreWords() ? - ": " + mCurrentLogUnit.getWordsAsString() : "")); - } - if (!mCurrentLogUnit.isEmpty()) { - mMainLogBuffer.shiftIn(mCurrentLogUnit); - if (mUserRecordingLogBuffer != null) { - mUserRecordingLogBuffer.shiftIn(mCurrentLogUnit); - } - mCurrentLogUnit = new LogUnit(); - } else { - if (DEBUG) { - Log.d(TAG, "Warning: tried to commit empty log unit."); - } - } - } - - private static final LogStatement LOGSTATEMENT_UNCOMMIT_CURRENT_LOGUNIT = - new LogStatement("UncommitCurrentLogUnit", false, false); - public void uncommitCurrentLogUnit(final String expectedWord, - final boolean dumpCurrentLogUnit) { - // The user has deleted this word and returned to the previous. Check that the word in the - // logUnit matches the expected word. If so, restore the last log unit committed to be the - // current logUnit. I.e., pull out the last LogUnit from all the LogBuffers, and make - // it the mCurrentLogUnit so the new edits are captured with the word. Optionally dump the - // contents of mCurrentLogUnit (useful if they contain deletions of the next word that - // should not be reported to protect user privacy) - // - // Note that we don't use mLastLogUnit here, because it only goes one word back and is only - // needed for reverts, which only happen one back. - final LogUnit oldLogUnit = mMainLogBuffer.peekLastLogUnit(); - - // Check that expected word matches. It's ok if both strings are null, because this is the - // case where the LogUnit is storing a non-word, e.g. a separator. - if (oldLogUnit != null) { - // Because the word is stored in the LogUnit with digits scrubbed, the comparison must - // be made on a scrubbed version of the expectedWord as well. - final String scrubbedExpectedWord = scrubDigitsFromString(expectedWord); - final String oldLogUnitWords = oldLogUnit.getWordsAsString(); - if (!TextUtils.equals(scrubbedExpectedWord, oldLogUnitWords)) return; - } - - // Uncommit, merging if necessary. - mMainLogBuffer.unshiftIn(); - if (oldLogUnit != null && !dumpCurrentLogUnit) { - oldLogUnit.append(mCurrentLogUnit); - mSavedDownEventTime = Long.MAX_VALUE; - } - if (oldLogUnit == null) { - mCurrentLogUnit = new LogUnit(); - } else { - mCurrentLogUnit = oldLogUnit; - } - enqueueEvent(LOGSTATEMENT_UNCOMMIT_CURRENT_LOGUNIT); - if (DEBUG) { - Log.d(TAG, "uncommitCurrentLogUnit (dump=" + dumpCurrentLogUnit + ") back to " - + (mCurrentLogUnit.hasOneOrMoreWords() ? ": '" - + mCurrentLogUnit.getWordsAsString() + "'" : "")); - } - } - - /** - * Publish all the logUnits in the logBuffer, without doing any privacy filtering. - */ - /* package for test */ void publishLogBuffer(final LogBuffer logBuffer, - final ResearchLog researchLog, final boolean canIncludePrivateData) { - publishLogUnits(logBuffer.getLogUnits(), researchLog, canIncludePrivateData); - } - - private static final LogStatement LOGSTATEMENT_LOG_SEGMENT_OPENING = - new LogStatement("logSegmentStart", false, false, "isIncludingPrivateData"); - private static final LogStatement LOGSTATEMENT_LOG_SEGMENT_CLOSING = - new LogStatement("logSegmentEnd", false, false); - /** - * Publish all LogUnits in a list. - * - * Any privacy checks should be performed before calling this method. - */ - /* package for test */ void publishLogUnits(final List<LogUnit> logUnits, - final ResearchLog researchLog, final boolean canIncludePrivateData) { - final LogUnit openingLogUnit = new LogUnit(); - if (logUnits.isEmpty()) return; - if (!isAllowedToLogTo(researchLog)) return; - // LogUnits not containing private data, such as contextual data for the log, do not require - // logSegment boundary statements. - if (canIncludePrivateData) { - openingLogUnit.addLogStatement(LOGSTATEMENT_LOG_SEGMENT_OPENING, - SystemClock.uptimeMillis(), canIncludePrivateData); - researchLog.publish(openingLogUnit, true /* isIncludingPrivateData */); - } - for (LogUnit logUnit : logUnits) { - if (DEBUG) { - Log.d(TAG, "publishLogBuffer: " + (logUnit.hasOneOrMoreWords() - ? logUnit.getWordsAsString() : "<wordless>") - + ", correction?: " + logUnit.containsUserDeletions()); - } - researchLog.publish(logUnit, canIncludePrivateData); - } - if (canIncludePrivateData) { - final LogUnit closingLogUnit = new LogUnit(); - closingLogUnit.addLogStatement(LOGSTATEMENT_LOG_SEGMENT_CLOSING, - SystemClock.uptimeMillis()); - researchLog.publish(closingLogUnit, true /* isIncludingPrivateData */); - } - } - - public static boolean hasLetters(final String word) { - final int length = word.length(); - for (int i = 0; i < length; i = word.offsetByCodePoints(i, 1)) { - final int codePoint = word.codePointAt(i); - if (Character.isLetter(codePoint)) { - return true; - } - } - return false; - } - - /** - * Commit the portion of mCurrentLogUnit before maxTime as a worded logUnit. - * - * After this operation completes, mCurrentLogUnit will hold any logStatements that happened - * after maxTime. - */ - /* package for test */ void commitCurrentLogUnitAsWord(final String word, final long maxTime, - final boolean isBatchMode) { - if (word == null) { - return; - } - if (word.length() > 0 && hasLetters(word)) { - mCurrentLogUnit.setWords(word); - } - final LogUnit newLogUnit = mCurrentLogUnit.splitByTime(maxTime); - enqueueCommitText(word, isBatchMode); - commitCurrentLogUnit(); - mCurrentLogUnit = newLogUnit; - } - - /** - * Record the time of a MotionEvent.ACTION_DOWN. - * - * Warning: Not thread safe. Only call from the main thread. - */ - private void setSavedDownEventTime(final long time) { - mSavedDownEventTime = time; - } - - public void onWordFinished(final String word, final boolean isBatchMode) { - commitCurrentLogUnitAsWord(word, mSavedDownEventTime, isBatchMode); - mSavedDownEventTime = Long.MAX_VALUE; - } - - private static int scrubDigitFromCodePoint(int codePoint) { - return Character.isDigit(codePoint) ? DIGIT_REPLACEMENT_CODEPOINT : codePoint; - } - - /* package for test */ static String scrubDigitsFromString(final String s) { - if (s == null) return null; - StringBuilder sb = null; - final int length = s.length(); - for (int i = 0; i < length; i = s.offsetByCodePoints(i, 1)) { - final int codePoint = Character.codePointAt(s, i); - if (Character.isDigit(codePoint)) { - if (sb == null) { - sb = new StringBuilder(length); - sb.append(s.substring(0, i)); - } - sb.appendCodePoint(DIGIT_REPLACEMENT_CODEPOINT); - } else { - if (sb != null) { - sb.appendCodePoint(codePoint); - } - } - } - if (sb == null) { - return s; - } else { - return sb.toString(); - } - } - - private String scrubWord(String word) { - final Dictionary dictionary = getDictionary(); - if (dictionary == null) { - return WORD_REPLACEMENT_STRING; - } - if (dictionary.isValidWord(word)) { - return word; - } - return WORD_REPLACEMENT_STRING; - } - - // Specific logging methods follow below. The comments for each logging method should - // indicate what specific method is logged, and how to trigger it from the user interface. - // - // Logging methods can be generally classified into two flavors, "UserAction", which should - // correspond closely to an event that is sensed by the IME, and is usually generated - // directly by the user, and "SystemResponse" which corresponds to an event that the IME - // generates, often after much processing of user input. SystemResponses should correspond - // closely to user-visible events. - // TODO: Consider exposing the UserAction classification in the log output. - - /** - * Log a call to LatinIME.onStartInputViewInternal(). - * - * UserAction: called each time the keyboard is opened up. - */ - private static final LogStatement LOGSTATEMENT_LATIN_IME_ON_START_INPUT_VIEW_INTERNAL = - new LogStatement("LatinImeOnStartInputViewInternal", false, false, "uuid", - "packageName", "inputType", "imeOptions", "fieldId", "display", "model", - "prefs", "versionCode", "versionName", "outputFormatVersion", "logEverything", - "isDevTeamBuild"); - public static void latinIME_onStartInputViewInternal(final EditorInfo editorInfo, - final SharedPreferences prefs) { - final ResearchLogger researchLogger = getInstance(); - if (editorInfo != null) { - final boolean isPassword = InputTypeUtils.isPasswordInputType(editorInfo.inputType) - || InputTypeUtils.isVisiblePasswordInputType(editorInfo.inputType); - getInstance().setIsPasswordView(isPassword); - researchLogger.start(); - final Context context = researchLogger.mLatinIME; - try { - final PackageInfo packageInfo; - packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), - 0); - final Integer versionCode = packageInfo.versionCode; - final String versionName = packageInfo.versionName; - final String uuid = ResearchSettings.readResearchLoggerUuid(researchLogger.mPrefs); - researchLogger.enqueueEvent(LOGSTATEMENT_LATIN_IME_ON_START_INPUT_VIEW_INTERNAL, - uuid, editorInfo.packageName, Integer.toHexString(editorInfo.inputType), - Integer.toHexString(editorInfo.imeOptions), editorInfo.fieldId, - Build.DISPLAY, Build.MODEL, prefs, versionCode, versionName, - OUTPUT_FORMAT_VERSION, IS_LOGGING_EVERYTHING, - researchLogger.isDevTeamBuild()); - // Commit the logUnit so the LatinImeOnStartInputViewInternal event is in its own - // logUnit at the beginning of the log. - researchLogger.commitCurrentLogUnit(); - } catch (final NameNotFoundException e) { - Log.e(TAG, "NameNotFound", e); - } - } - } - - // TODO: Update this heuristic pattern to something more reliable. Developer builds tend to - // have the developer name and year embedded. - private static final Pattern developerBuildRegex = Pattern.compile("[A-Za-z]\\.20[1-9]"); - private boolean isDevTeamBuild() { - try { - final PackageInfo packageInfo; - packageInfo = mLatinIME.getPackageManager().getPackageInfo(mLatinIME.getPackageName(), - 0); - final String versionName = packageInfo.versionName; - return developerBuildRegex.matcher(versionName).find(); - } catch (final NameNotFoundException e) { - Log.e(TAG, "Could not determine package name", e); - return false; - } - } - - /** - * Log a change in preferences. - * - * UserAction: called when the user changes the settings. - */ - private static final LogStatement LOGSTATEMENT_PREFS_CHANGED = - new LogStatement("PrefsChanged", false, false, "prefs"); - public static void prefsChanged(final SharedPreferences prefs) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_PREFS_CHANGED, prefs); - } - - /** - * Log a call to MainKeyboardView.processMotionEvent(). - * - * UserAction: called when the user puts their finger onto the screen (ACTION_DOWN). - * - */ - private static final LogStatement LOGSTATEMENT_MAIN_KEYBOARD_VIEW_PROCESS_MOTION_EVENT = - new LogStatement("MotionEvent", true, false, "action", - LogStatement.KEY_IS_LOGGING_RELATED, "motionEvent"); - public static void mainKeyboardView_processMotionEvent(final MotionEvent me) { - if (me == null) { - return; - } - final int action = me.getActionMasked(); - final long eventTime = me.getEventTime(); - final String actionString = LoggingUtils.getMotionEventActionTypeString(action); - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_MAIN_KEYBOARD_VIEW_PROCESS_MOTION_EVENT, - actionString, false /* IS_LOGGING_RELATED */, MotionEvent.obtain(me)); - if (action == MotionEvent.ACTION_DOWN) { - // Subtract 1 from eventTime so the down event is included in the later - // LogUnit, not the earlier (the test is for inequality). - researchLogger.setSavedDownEventTime(eventTime - 1); - } - // Refresh the timer in case we are capturing user feedback. - if (researchLogger.isMakingUserRecording()) { - researchLogger.resetRecordingTimer(); - } - } - - /** - * Log a call to LatinIME.onCodeInput(). - * - * SystemResponse: The main processing step for entering text. Called when the user performs a - * tap, a flick, a long press, releases a gesture, or taps a punctuation suggestion. - */ - private static final LogStatement LOGSTATEMENT_LATIN_IME_ON_CODE_INPUT = - new LogStatement("LatinImeOnCodeInput", true, false, "code", "x", "y"); - public static void latinIME_onCodeInput(final int code, final int x, final int y) { - final long time = SystemClock.uptimeMillis(); - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_LATIN_IME_ON_CODE_INPUT, - Constants.printableCode(scrubDigitFromCodePoint(code)), x, y); - if (Character.isDigit(code)) { - researchLogger.setCurrentLogUnitContainsDigitFlag(); - } - researchLogger.mStatistics.recordChar(code, time); - } - /** - * Log a call to LatinIME.onDisplayCompletions(). - * - * SystemResponse: The IME has displayed application-specific completions. They may show up - * in the suggestion strip, such as a landscape phone. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_ONDISPLAYCOMPLETIONS = - new LogStatement("LatinIMEOnDisplayCompletions", true, true, - "applicationSpecifiedCompletions"); - public static void latinIME_onDisplayCompletions( - final CompletionInfo[] applicationSpecifiedCompletions) { - // Note; passing an array as a single element in a vararg list. Must create a new - // dummy array around it or it will get expanded. - getInstance().enqueueEvent(LOGSTATEMENT_LATINIME_ONDISPLAYCOMPLETIONS, - new Object[] { applicationSpecifiedCompletions }); - } - - public static boolean getAndClearLatinIMEExpectingUpdateSelection() { - boolean returnValue = sLatinIMEExpectingUpdateSelection; - sLatinIMEExpectingUpdateSelection = false; - return returnValue; - } - - /** - * The IME is finishing; it is either being destroyed, or is about to be hidden. - * - * UserAction: The user has performed an action that has caused the IME to be closed. They may - * have focused on something other than a text field, or explicitly closed it. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_ONFINISHINPUTVIEWINTERNAL = - new LogStatement("LatinIMEOnFinishInputViewInternal", false, false, "isTextTruncated", - "text"); - public static void latinIME_onFinishInputViewInternal(final boolean finishingInput, - final int savedSelectionStart, final int savedSelectionEnd, final InputConnection ic) { - // The finishingInput flag is set in InputMethodService. It is true if called from - // doFinishInput(), which can be called as part of doStartInput(). This can happen at times - // when the IME is not closing, such as when powering up. The finishinInput flag is false - // if called from finishViews(), which is called from hideWindow() and onDestroy(). These - // are the situations in which we want to finish up the researchLog. - if (ic != null && !finishingInput) { - final boolean isTextTruncated; - final String text; - if (LOG_FULL_TEXTVIEW_CONTENTS) { - // Capture the TextView contents. This will trigger onUpdateSelection(), so we - // set sLatinIMEExpectingUpdateSelection so that when onUpdateSelection() is called, - // it can tell that it was generated by the logging code, and not by the user, and - // therefore keep user-visible state as is. - ic.beginBatchEdit(); - ic.performContextMenuAction(android.R.id.selectAll); - CharSequence charSequence = ic.getSelectedText(0); - if (savedSelectionStart != -1 && savedSelectionEnd != -1) { - ic.setSelection(savedSelectionStart, savedSelectionEnd); - } - ic.endBatchEdit(); - sLatinIMEExpectingUpdateSelection = true; - if (TextUtils.isEmpty(charSequence)) { - isTextTruncated = false; - text = ""; - } else { - if (charSequence.length() > MAX_INPUTVIEW_LENGTH_TO_CAPTURE) { - int length = MAX_INPUTVIEW_LENGTH_TO_CAPTURE; - // do not cut in the middle of a supplementary character - final char c = charSequence.charAt(length - 1); - if (Character.isHighSurrogate(c)) { - length--; - } - final CharSequence truncatedCharSequence = charSequence.subSequence(0, - length); - isTextTruncated = true; - text = truncatedCharSequence.toString(); - } else { - isTextTruncated = false; - text = charSequence.toString(); - } - } - } else { - isTextTruncated = true; - text = ""; - } - final ResearchLogger researchLogger = getInstance(); - // Assume that OUTPUT_ENTIRE_BUFFER is only true when we don't care about privacy (e.g. - // during a live user test), so the normal isPotentiallyPrivate and - // isPotentiallyRevealing flags do not apply - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_ONFINISHINPUTVIEWINTERNAL, - isTextTruncated, text); - researchLogger.commitCurrentLogUnit(); - getInstance().stop(); - } - } - - /** - * Log a call to LatinIME.onUpdateSelection(). - * - * UserAction/SystemResponse: The user has moved the cursor or selection. This function may - * be called, however, when the system has moved the cursor, say by inserting a character. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_ONUPDATESELECTION = - new LogStatement("LatinIMEOnUpdateSelection", true, false, "lastSelectionStart", - "lastSelectionEnd", "oldSelStart", "oldSelEnd", "newSelStart", "newSelEnd", - "composingSpanStart", "composingSpanEnd", "expectingUpdateSelection", - "expectingUpdateSelectionFromLogger", "context"); - public static void latinIME_onUpdateSelection(final int lastSelectionStart, - final int lastSelectionEnd, final int oldSelStart, final int oldSelEnd, - final int newSelStart, final int newSelEnd, final int composingSpanStart, - final int composingSpanEnd, final boolean expectingUpdateSelection, - final boolean expectingUpdateSelectionFromLogger, - final RichInputConnection connection) { - String word = ""; - if (connection != null) { - TextRange range = connection.getWordRangeAtCursor(WHITESPACE_SEPARATORS, 1); - if (range != null) { - word = range.mWord.toString(); - } - } - final ResearchLogger researchLogger = getInstance(); - final String scrubbedWord = researchLogger.scrubWord(word); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_ONUPDATESELECTION, lastSelectionStart, - lastSelectionEnd, oldSelStart, oldSelEnd, newSelStart, newSelEnd, - composingSpanStart, composingSpanEnd, expectingUpdateSelection, - expectingUpdateSelectionFromLogger, scrubbedWord); - } - - /** - * Log a call to LatinIME.onTextInput(). - * - * SystemResponse: Raw text is added to the TextView. - */ - public static void latinIME_onTextInput(final String text, final boolean isBatchMode) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.commitCurrentLogUnitAsWord(text, Long.MAX_VALUE, isBatchMode); - } - - /** - * Log a revert of onTextInput() (known in the IME as "EnteredText"). - * - * SystemResponse: Remove the LogUnit recording the textInput - */ - public static void latinIME_handleBackspace_cancelTextInput(final String text) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.uncommitCurrentLogUnit(text, true /* dumpCurrentLogUnit */); - } - - /** - * Log a call to LatinIME.pickSuggestionManually(). - * - * UserAction: The user has chosen a specific word from the suggestion strip. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_PICKSUGGESTIONMANUALLY = - new LogStatement("LatinIMEPickSuggestionManually", true, false, "replacedWord", "index", - "suggestion", "x", "y", "isBatchMode", "score", "kind", "sourceDict"); - /** - * Log a call to LatinIME.pickSuggestionManually(). - * - * @param replacedWord the typed word that this manual suggestion replaces. May not be null. - * @param index the index in the suggestion strip - * @param suggestion the committed suggestion. May not be null. - * @param isBatchMode whether this was input in batch mode, aka gesture. - * @param score the internal score of the suggestion, as output by the dictionary - * @param kind the kind of suggestion, as one of the SuggestedWordInfo#KIND_* constants - * @param sourceDict the source origin of this word, as one of the Dictionary#TYPE_* constants. - */ - public static void latinIME_pickSuggestionManually(final String replacedWord, - final int index, final String suggestion, final boolean isBatchMode, - final int score, final int kind, final String sourceDict) { - final ResearchLogger researchLogger = getInstance(); - // Note : suggestion can't be null here, because it's only called in a place where it - // can't be null. - if (!replacedWord.equals(suggestion.toString())) { - // The user chose something other than what was already there. - researchLogger.setCurrentLogUnitContainsUserDeletions(); - researchLogger.setCurrentLogUnitCorrectionType(LogUnit.CORRECTIONTYPE_TYPO); - } - final String scrubbedWord = scrubDigitsFromString(suggestion); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_PICKSUGGESTIONMANUALLY, - scrubDigitsFromString(replacedWord), index, - scrubbedWord, Constants.SUGGESTION_STRIP_COORDINATE, - Constants.SUGGESTION_STRIP_COORDINATE, isBatchMode, score, kind, sourceDict); - researchLogger.commitCurrentLogUnitAsWord(scrubbedWord, Long.MAX_VALUE, isBatchMode); - researchLogger.mStatistics.recordManualSuggestion(SystemClock.uptimeMillis()); - } - - /** - * Log a call to LatinIME.punctuationSuggestion(). - * - * UserAction: The user has chosen punctuation from the punctuation suggestion strip. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_PUNCTUATIONSUGGESTION = - new LogStatement("LatinIMEPunctuationSuggestion", false, false, "index", "suggestion", - "x", "y", "isPrediction"); - public static void latinIME_punctuationSuggestion(final int index, final String suggestion, - final boolean isBatchMode, final boolean isPrediction) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_PUNCTUATIONSUGGESTION, index, suggestion, - Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, - isPrediction); - researchLogger.commitCurrentLogUnitAsWord(suggestion, Long.MAX_VALUE, isBatchMode); - } - - /** - * Log a call to LatinIME.sendKeyCodePoint(). - * - * SystemResponse: The IME is inserting text into the TextView for non-word-constituent, - * strings (separators, numbers, other symbols). - */ - private static final LogStatement LOGSTATEMENT_LATINIME_SENDKEYCODEPOINT = - new LogStatement("LatinIMESendKeyCodePoint", true, false, "code"); - public static void latinIME_sendKeyCodePoint(final int code) { - final ResearchLogger researchLogger = getInstance(); - final LogUnit phantomSpaceLogUnit = researchLogger.mPhantomSpaceLogUnit; - if (phantomSpaceLogUnit == null) { - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_SENDKEYCODEPOINT, - Constants.printableCode(scrubDigitFromCodePoint(code))); - if (Character.isDigit(code)) { - researchLogger.setCurrentLogUnitContainsDigitFlag(); - } - researchLogger.commitCurrentLogUnit(); - } else { - researchLogger.enqueueEvent(phantomSpaceLogUnit, LOGSTATEMENT_LATINIME_SENDKEYCODEPOINT, - Constants.printableCode(scrubDigitFromCodePoint(code))); - if (Character.isDigit(code)) { - phantomSpaceLogUnit.setMayContainDigit(); - } - researchLogger.mMainLogBuffer.shiftIn(phantomSpaceLogUnit); - if (researchLogger.mUserRecordingLogBuffer != null) { - researchLogger.mUserRecordingLogBuffer.shiftIn(phantomSpaceLogUnit); - } - researchLogger.mPhantomSpaceLogUnit = null; - } - } - - /** - * Log a call to LatinIME.promotePhantomSpace(). - * - * SystemResponse: The IME is inserting a real space in place of a phantom space. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_PROMOTEPHANTOMSPACE = - new LogStatement("LatinIMEPromotePhantomSpace", false, false); - public static void latinIME_promotePhantomSpace() { - // A phantom space is always added before the text that triggered it. The triggering text - // and the events that created it will be in mCurrentLogUnit, but the phantom space should - // be in its own LogUnit, committed before the triggering text. Although it is created - // here, it is not added to the LogBuffer until the following call to - // latinIME_sendKeyCodePoint, because SENDKEYCODEPOINT LogStatement also must go into that - // LogUnit. - final ResearchLogger researchLogger = getInstance(); - researchLogger.mPhantomSpaceLogUnit = new LogUnit(); - researchLogger.enqueueEvent(researchLogger.mPhantomSpaceLogUnit, - LOGSTATEMENT_LATINIME_PROMOTEPHANTOMSPACE); - } - - /** - * Log a call to LatinIME.swapSwapperAndSpace(). - * - * SystemResponse: A symbol has been swapped with a space character. E.g. punctuation may swap - * if a soft space is inserted after a word. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_SWAPSWAPPERANDSPACE = - new LogStatement("LatinIMESwapSwapperAndSpace", false, false, "originalCharacters", - "charactersAfterSwap"); - public static void latinIME_swapSwapperAndSpace(final CharSequence originalCharacters, - final String charactersAfterSwap) { - final ResearchLogger researchLogger = getInstance(); - final LogUnit logUnit; - logUnit = researchLogger.mMainLogBuffer.peekLastLogUnit(); - if (logUnit != null) { - researchLogger.enqueueEvent(logUnit, LOGSTATEMENT_LATINIME_SWAPSWAPPERANDSPACE, - originalCharacters, charactersAfterSwap); - } - } - - /** - * Log a call to LatinIME.maybeDoubleSpacePeriod(). - * - * SystemResponse: Two spaces have been replaced by period space. - */ - public static void latinIME_maybeDoubleSpacePeriod(final String text, - final boolean isBatchMode) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.commitCurrentLogUnitAsWord(text, Long.MAX_VALUE, isBatchMode); - } - - /** - * Log a call to MainKeyboardView.onLongPress(). - * - * UserAction: The user has performed a long-press on a key. - */ - private static final LogStatement LOGSTATEMENT_MAINKEYBOARDVIEW_ONLONGPRESS = - new LogStatement("MainKeyboardViewOnLongPress", false, false); - public static void mainKeyboardView_onLongPress() { - getInstance().enqueueEvent(LOGSTATEMENT_MAINKEYBOARDVIEW_ONLONGPRESS); - } - - /** - * Log a call to MainKeyboardView.setKeyboard(). - * - * SystemResponse: The IME has switched to a new keyboard (e.g. French, English). - * This is typically called right after LatinIME.onStartInputViewInternal (when starting a new - * IME), but may happen at other times if the user explicitly requests a keyboard change. - */ - private static final LogStatement LOGSTATEMENT_MAINKEYBOARDVIEW_SETKEYBOARD = - new LogStatement("MainKeyboardViewSetKeyboard", false, false, "elementId", "locale", - "orientation", "width", "modeName", "action", "navigateNext", - "navigatePrevious", "clobberSettingsKey", "passwordInput", "shortcutKeyEnabled", - "hasShortcutKey", "languageSwitchKeyEnabled", "isMultiLine", "tw", "th", - "keys"); - public static void mainKeyboardView_setKeyboard(final Keyboard keyboard, - final int orientation) { - final KeyboardId kid = keyboard.mId; - final boolean isPasswordView = kid.passwordInput(); - final ResearchLogger researchLogger = getInstance(); - researchLogger.setIsPasswordView(isPasswordView); - researchLogger.enqueueEvent(LOGSTATEMENT_MAINKEYBOARDVIEW_SETKEYBOARD, - KeyboardId.elementIdToName(kid.mElementId), - kid.mLocale + ":" + kid.mSubtype.getExtraValueOf(KEYBOARD_LAYOUT_SET), - orientation, kid.mWidth, KeyboardId.modeName(kid.mMode), kid.imeAction(), - kid.navigateNext(), kid.navigatePrevious(), kid.mClobberSettingsKey, - isPasswordView, kid.mShortcutKeyEnabled, kid.mHasShortcutKey, - kid.mLanguageSwitchKeyEnabled, kid.isMultiLine(), keyboard.mOccupiedWidth, - keyboard.mOccupiedHeight, keyboard.getKeys()); - } - - /** - * Log a call to LatinIME.revertCommit(). - * - * SystemResponse: The IME has reverted commited text. This happens when the user enters - * a word, commits it by pressing space or punctuation, and then reverts the commit by hitting - * backspace. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_REVERTCOMMIT = - new LogStatement("LatinIMERevertCommit", true, false, "committedWord", - "originallyTypedWord", "separatorString"); - public static void latinIME_revertCommit(final String committedWord, - final String originallyTypedWord, final boolean isBatchMode, - final String separatorString) { - // TODO: Prioritize adding a unit test for this method (as it is especially complex) - // TODO: Update the UserRecording LogBuffer as well as the MainLogBuffer - final ResearchLogger researchLogger = getInstance(); - // - // 1. Remove separator LogUnit - final LogUnit lastLogUnit = researchLogger.mMainLogBuffer.peekLastLogUnit(); - // Check that we're not at the beginning of input - if (lastLogUnit == null) return; - // Check that we're after a separator - if (lastLogUnit.getWordsAsString() != null) return; - // Remove separator - final LogUnit separatorLogUnit = researchLogger.mMainLogBuffer.unshiftIn(); - - // 2. Add revert LogStatement - final LogUnit revertedLogUnit = researchLogger.mMainLogBuffer.peekLastLogUnit(); - if (revertedLogUnit == null) return; - if (!revertedLogUnit.getWordsAsString().equals(scrubDigitsFromString(committedWord))) { - // Any word associated with the reverted LogUnit has already had its digits scrubbed, so - // any digits in the committedWord argument must also be scrubbed for an accurate - // comparison. - return; - } - researchLogger.enqueueEvent(revertedLogUnit, LOGSTATEMENT_LATINIME_REVERTCOMMIT, - committedWord, originallyTypedWord, separatorString); - - // 3. Update the word associated with the LogUnit - revertedLogUnit.setWords(originallyTypedWord); - revertedLogUnit.setContainsUserDeletions(); - - // 4. Re-add the separator LogUnit - researchLogger.mMainLogBuffer.shiftIn(separatorLogUnit); - - // 5. Record stats - researchLogger.mStatistics.recordRevertCommit(SystemClock.uptimeMillis()); - } - - /** - * Log a call to PointerTracker.callListenerOnCancelInput(). - * - * UserAction: The user has canceled the input, e.g., by pressing down, but then removing - * outside the keyboard area. - * TODO: Verify - */ - private static final LogStatement LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONCANCELINPUT = - new LogStatement("PointerTrackerCallListenerOnCancelInput", false, false); - public static void pointerTracker_callListenerOnCancelInput() { - getInstance().enqueueEvent(LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONCANCELINPUT); - } - - /** - * Log a call to PointerTracker.callListenerOnCodeInput(). - * - * SystemResponse: The user has entered a key through the normal tapping mechanism. - * LatinIME.onCodeInput will also be called. - */ - private static final LogStatement LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONCODEINPUT = - new LogStatement("PointerTrackerCallListenerOnCodeInput", true, false, "code", - "outputText", "x", "y", "ignoreModifierKey", "altersCode", "isEnabled"); - public static void pointerTracker_callListenerOnCodeInput(final Key key, final int x, - final int y, final boolean ignoreModifierKey, final boolean altersCode, - final int code) { - if (key != null) { - String outputText = key.getOutputText(); - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONCODEINPUT, - Constants.printableCode(scrubDigitFromCodePoint(code)), - outputText == null ? null : scrubDigitsFromString(outputText.toString()), - x, y, ignoreModifierKey, altersCode, key.isEnabled()); - } - } - - /** - * Log a call to PointerTracker.callListenerCallListenerOnRelease(). - * - * UserAction: The user has released their finger or thumb from the screen. - */ - private static final LogStatement LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONRELEASE = - new LogStatement("PointerTrackerCallListenerOnRelease", true, false, "code", - "withSliding", "ignoreModifierKey", "isEnabled"); - public static void pointerTracker_callListenerOnRelease(final Key key, final int primaryCode, - final boolean withSliding, final boolean ignoreModifierKey) { - if (key != null) { - getInstance().enqueueEvent(LOGSTATEMENT_POINTERTRACKER_CALLLISTENERONRELEASE, - Constants.printableCode(scrubDigitFromCodePoint(primaryCode)), withSliding, - ignoreModifierKey, key.isEnabled()); - } - } - - /** - * Log a call to PointerTracker.onDownEvent(). - * - * UserAction: The user has pressed down on a key. - * TODO: Differentiate with LatinIME.processMotionEvent. - */ - private static final LogStatement LOGSTATEMENT_POINTERTRACKER_ONDOWNEVENT = - new LogStatement("PointerTrackerOnDownEvent", true, false, "deltaT", "distanceSquared"); - public static void pointerTracker_onDownEvent(long deltaT, int distanceSquared) { - getInstance().enqueueEvent(LOGSTATEMENT_POINTERTRACKER_ONDOWNEVENT, deltaT, - distanceSquared); - } - - /** - * Log a call to PointerTracker.onMoveEvent(). - * - * UserAction: The user has moved their finger while pressing on the screen. - * TODO: Differentiate with LatinIME.processMotionEvent(). - */ - private static final LogStatement LOGSTATEMENT_POINTERTRACKER_ONMOVEEVENT = - new LogStatement("PointerTrackerOnMoveEvent", true, false, "x", "y", "lastX", "lastY"); - public static void pointerTracker_onMoveEvent(final int x, final int y, final int lastX, - final int lastY) { - getInstance().enqueueEvent(LOGSTATEMENT_POINTERTRACKER_ONMOVEEVENT, x, y, lastX, lastY); - } - - /** - * Log a call to RichInputConnection.commitCompletion(). - * - * SystemResponse: The IME has committed a completion. A completion is an application- - * specific suggestion that is presented in a pop-up menu in the TextView. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_COMMITCOMPLETION = - new LogStatement("RichInputConnectionCommitCompletion", true, false, "completionInfo"); - public static void richInputConnection_commitCompletion(final CompletionInfo completionInfo) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_COMMITCOMPLETION, - completionInfo); - } - - /** - * Log a call to RichInputConnection.revertDoubleSpacePeriod(). - * - * SystemResponse: The IME has reverted ". ", which had previously replaced two typed spaces. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_REVERTDOUBLESPACEPERIOD = - new LogStatement("RichInputConnectionRevertDoubleSpacePeriod", false, false); - public static void richInputConnection_revertDoubleSpacePeriod() { - final ResearchLogger researchLogger = getInstance(); - // An extra LogUnit is added for the period; this is removed here because of the revert. - researchLogger.uncommitCurrentLogUnit(null, true /* dumpCurrentLogUnit */); - // TODO: This will probably be lost as the user backspaces further. Figure out how to put - // it into the right logUnit. - researchLogger.enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_REVERTDOUBLESPACEPERIOD); - } - - /** - * Log a call to RichInputConnection.revertSwapPunctuation(). - * - * SystemResponse: The IME has reverted a punctuation swap. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_REVERTSWAPPUNCTUATION = - new LogStatement("RichInputConnectionRevertSwapPunctuation", false, false); - public static void richInputConnection_revertSwapPunctuation() { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_REVERTSWAPPUNCTUATION); - } - - /** - * Log a call to LatinIME.commitCurrentAutoCorrection(). - * - * SystemResponse: The IME has committed an auto-correction. An auto-correction changes the raw - * text input to another word (or words) that the user more likely desired to type. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_COMMITCURRENTAUTOCORRECTION = - new LogStatement("LatinIMECommitCurrentAutoCorrection", true, true, "typedWord", - "autoCorrection", "separatorString"); - public static void latinIme_commitCurrentAutoCorrection(final String typedWord, - final String autoCorrection, final String separatorString, final boolean isBatchMode, - final SuggestedWords suggestedWords) { - final String scrubbedTypedWord = scrubDigitsFromString(typedWord); - final String scrubbedAutoCorrection = scrubDigitsFromString(autoCorrection); - final ResearchLogger researchLogger = getInstance(); - researchLogger.mCurrentLogUnit.initializeSuggestions(suggestedWords); - researchLogger.onWordFinished(scrubbedAutoCorrection, isBatchMode); - - // Add the autocorrection logStatement at the end of the logUnit for the committed word. - // We have to do this after calling commitCurrentLogUnitAsWord, because it may split the - // current logUnit, and then we have to peek to get the logUnit reference back. - final LogUnit logUnit = researchLogger.mMainLogBuffer.peekLastLogUnit(); - // TODO: Add test to confirm that the commitCurrentAutoCorrection log statement should - // always be added to logUnit (if non-null) and not mCurrentLogUnit. - researchLogger.enqueueEvent(logUnit, LOGSTATEMENT_LATINIME_COMMITCURRENTAUTOCORRECTION, - scrubbedTypedWord, scrubbedAutoCorrection, separatorString); - } - - private boolean isExpectingCommitText = false; - - /** - * Log a call to RichInputConnection.commitText(). - * - * SystemResponse: The IME is committing text. This happens after the user has typed a word - * and then a space or punctuation key. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTIONCOMMITTEXT = - new LogStatement("RichInputConnectionCommitText", true, false, "newCursorPosition"); - public static void richInputConnection_commitText(final String committedWord, - final int newCursorPosition, final boolean isBatchMode) { - final ResearchLogger researchLogger = getInstance(); - // Only include opening and closing logSegments if private data is included - final String scrubbedWord = scrubDigitsFromString(committedWord); - if (!researchLogger.isExpectingCommitText) { - researchLogger.enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTIONCOMMITTEXT, - newCursorPosition); - researchLogger.commitCurrentLogUnitAsWord(scrubbedWord, Long.MAX_VALUE, isBatchMode); - } - researchLogger.isExpectingCommitText = false; - } - - /** - * Shared events for logging committed text. - * - * The "CommitTextEventHappened" LogStatement is written to the log even if privacy rules - * indicate that the word contents should not be logged. It has no contents, and only serves to - * record the event and thereby make it easier to calculate word-level statistics even when the - * word contents are unknown. - */ - private static final LogStatement LOGSTATEMENT_COMMITTEXT = - new LogStatement("CommitText", true /* isPotentiallyPrivate */, - false /* isPotentiallyRevealing */, "committedText", "isBatchMode"); - private static final LogStatement LOGSTATEMENT_COMMITTEXT_EVENT_HAPPENED = - new LogStatement("CommitTextEventHappened", false /* isPotentiallyPrivate */, - false /* isPotentiallyRevealing */); - private void enqueueCommitText(final String word, final boolean isBatchMode) { - // Event containing the word; will be published only if privacy checks pass - enqueueEvent(LOGSTATEMENT_COMMITTEXT, word, isBatchMode); - // Event not containing the word; will always be published - enqueueEvent(LOGSTATEMENT_COMMITTEXT_EVENT_HAPPENED); - } - - /** - * Log a call to RichInputConnection.deleteSurroundingText(). - * - * SystemResponse: The IME has deleted text. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_DELETESURROUNDINGTEXT = - new LogStatement("RichInputConnectionDeleteSurroundingText", true, false, - "beforeLength", "afterLength"); - public static void richInputConnection_deleteSurroundingText(final int beforeLength, - final int afterLength) { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_DELETESURROUNDINGTEXT, - beforeLength, afterLength); - } - - /** - * Log a call to RichInputConnection.finishComposingText(). - * - * SystemResponse: The IME has left the composing text as-is. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_FINISHCOMPOSINGTEXT = - new LogStatement("RichInputConnectionFinishComposingText", false, false); - public static void richInputConnection_finishComposingText() { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_FINISHCOMPOSINGTEXT); - } - - /** - * Log a call to RichInputConnection.performEditorAction(). - * - * SystemResponse: The IME is invoking an action specific to the editor. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_PERFORMEDITORACTION = - new LogStatement("RichInputConnectionPerformEditorAction", false, false, - "imeActionId"); - public static void richInputConnection_performEditorAction(final int imeActionId) { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_PERFORMEDITORACTION, - imeActionId); - } - - /** - * Log a call to RichInputConnection.sendKeyEvent(). - * - * SystemResponse: The IME is telling the TextView that a key is being pressed through an - * alternate channel. - * TODO: only for hardware keys? - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_SENDKEYEVENT = - new LogStatement("RichInputConnectionSendKeyEvent", true, false, "eventTime", "action", - "code"); - public static void richInputConnection_sendKeyEvent(final KeyEvent keyEvent) { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_SENDKEYEVENT, - keyEvent.getEventTime(), keyEvent.getAction(), keyEvent.getKeyCode()); - } - - /** - * Log a call to RichInputConnection.setComposingText(). - * - * SystemResponse: The IME is setting the composing text. Happens each time a character is - * entered. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_SETCOMPOSINGTEXT = - new LogStatement("RichInputConnectionSetComposingText", true, true, "text", - "newCursorPosition"); - public static void richInputConnection_setComposingText(final CharSequence text, - final int newCursorPosition) { - if (text == null) { - throw new RuntimeException("setComposingText is null"); - } - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_SETCOMPOSINGTEXT, text, - newCursorPosition); - } - - /** - * Log a call to RichInputConnection.setSelection(). - * - * SystemResponse: The IME is requesting that the selection change. User-initiated selection- - * change requests do not go through this method -- it's only when the system wants to change - * the selection. - */ - private static final LogStatement LOGSTATEMENT_RICHINPUTCONNECTION_SETSELECTION = - new LogStatement("RichInputConnectionSetSelection", true, false, "from", "to"); - public static void richInputConnection_setSelection(final int from, final int to) { - getInstance().enqueueEvent(LOGSTATEMENT_RICHINPUTCONNECTION_SETSELECTION, from, to); - } - - /** - * Log a call to SuddenJumpingTouchEventHandler.onTouchEvent(). - * - * SystemResponse: The IME has filtered input events in case of an erroneous sensor reading. - */ - private static final LogStatement LOGSTATEMENT_SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT = - new LogStatement("SuddenJumpingTouchEventHandlerOnTouchEvent", true, false, - "motionEvent"); - public static void suddenJumpingTouchEventHandler_onTouchEvent(final MotionEvent me) { - if (me != null) { - getInstance().enqueueEvent(LOGSTATEMENT_SUDDENJUMPINGTOUCHEVENTHANDLER_ONTOUCHEVENT, - MotionEvent.obtain(me)); - } - } - - /** - * Log a call to SuggestionsView.setSuggestions(). - * - * SystemResponse: The IME is setting the suggestions in the suggestion strip. - */ - private static final LogStatement LOGSTATEMENT_SUGGESTIONSTRIPVIEW_SETSUGGESTIONS = - new LogStatement("SuggestionStripViewSetSuggestions", true, true, "suggestedWords"); - public static void suggestionStripView_setSuggestions(final SuggestedWords suggestedWords) { - if (suggestedWords != null) { - getInstance().enqueueEvent(LOGSTATEMENT_SUGGESTIONSTRIPVIEW_SETSUGGESTIONS, - suggestedWords); - } - } - - /** - * The user has indicated a particular point in the log that is of interest. - * - * UserAction: From direct menu invocation. - */ - private static final LogStatement LOGSTATEMENT_USER_TIMESTAMP = - new LogStatement("UserTimestamp", false, false); - public void userTimestamp() { - getInstance().enqueueEvent(LOGSTATEMENT_USER_TIMESTAMP); - } - - /** - * Log a call to LatinIME.onEndBatchInput(). - * - * SystemResponse: The system has completed a gesture. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_ONENDBATCHINPUT = - new LogStatement("LatinIMEOnEndBatchInput", true, false, "enteredText", - "enteredWordPos", "suggestedWords"); - public static void latinIME_onEndBatchInput(final CharSequence enteredText, - final int enteredWordPos, final SuggestedWords suggestedWords) { - final ResearchLogger researchLogger = getInstance(); - if (!TextUtils.isEmpty(enteredText) && hasLetters(enteredText.toString())) { - researchLogger.mCurrentLogUnit.setWords(enteredText.toString()); - } - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_ONENDBATCHINPUT, enteredText, - enteredWordPos, suggestedWords); - researchLogger.mCurrentLogUnit.initializeSuggestions(suggestedWords); - researchLogger.mStatistics.recordGestureInput(enteredText.length(), - SystemClock.uptimeMillis()); - } - - private static final LogStatement LOGSTATEMENT_LATINIME_HANDLEBACKSPACE = - new LogStatement("LatinIMEHandleBackspace", true, false, "numCharacters"); - /** - * Log a call to LatinIME.handleBackspace() that is not a batch delete. - * - * UserInput: The user is deleting one or more characters by hitting the backspace key once. - * The covers single character deletes as well as deleting selections. - * - * @param numCharacters how many characters the backspace operation deleted - * @param shouldUncommitLogUnit whether to uncommit the last {@code LogUnit} in the - * {@code LogBuffer} - */ - public static void latinIME_handleBackspace(final int numCharacters, - final boolean shouldUncommitLogUnit) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_HANDLEBACKSPACE, numCharacters); - if (shouldUncommitLogUnit) { - ResearchLogger.getInstance().uncommitCurrentLogUnit( - null, true /* dumpCurrentLogUnit */); - } - } - - /** - * Log a call to LatinIME.handleBackspace() that is a batch delete. - * - * UserInput: The user is deleting a gestured word by hitting the backspace key once. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_HANDLEBACKSPACE_BATCH = - new LogStatement("LatinIMEHandleBackspaceBatch", true, false, "deletedText", - "numCharacters"); - public static void latinIME_handleBackspace_batch(final CharSequence deletedText, - final int numCharacters) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_HANDLEBACKSPACE_BATCH, deletedText, - numCharacters); - researchLogger.mStatistics.recordGestureDelete(deletedText.length(), - SystemClock.uptimeMillis()); - researchLogger.uncommitCurrentLogUnit(deletedText.toString(), - false /* dumpCurrentLogUnit */); - } - - /** - * Log a long interval between user operation. - * - * UserInput: The user has not done anything for a while. - */ - private static final LogStatement LOGSTATEMENT_ONUSERPAUSE = new LogStatement("OnUserPause", - false, false, "intervalInMs"); - public static void onUserPause(final long interval) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_ONUSERPAUSE, interval); - } - - /** - * Record the current time in case the LogUnit is later split. - * - * If the current logUnit is split, then tapping, motion events, etc. before this time should - * be assigned to one LogUnit, and events after this time should go into the following LogUnit. - */ - public static void recordTimeForLogUnitSplit() { - final ResearchLogger researchLogger = getInstance(); - researchLogger.setSavedDownEventTime(SystemClock.uptimeMillis()); - researchLogger.mSavedDownEventTime = Long.MAX_VALUE; - } - - /** - * Log a call to LatinIME.handleSeparator() - * - * SystemResponse: The system is inserting a separator character, possibly performing auto- - * correction or other actions appropriate at the end of a word. - */ - private static final LogStatement LOGSTATEMENT_LATINIME_HANDLESEPARATOR = - new LogStatement("LatinIMEHandleSeparator", false, false, "primaryCode", - "isComposingWord"); - public static void latinIME_handleSeparator(final int primaryCode, - final boolean isComposingWord) { - final ResearchLogger researchLogger = getInstance(); - researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_HANDLESEPARATOR, primaryCode, - isComposingWord); - } - - /** - * Call this method when the logging system has attempted publication of an n-gram. - * - * Statistics are gathered about the success or failure. - * - * @param publishabilityResultCode a result code as defined by - * {@code MainLogBuffer.PUBLISHABILITY_*} - */ - static void recordPublishabilityResultCode(final int publishabilityResultCode) { - final ResearchLogger researchLogger = getInstance(); - final Statistics statistics = researchLogger.mStatistics; - statistics.recordPublishabilityResultCode(publishabilityResultCode); - } - - /** - * Log statistics. - * - * ContextualData, recorded at the end of a session. - */ - private static final LogStatement LOGSTATEMENT_STATISTICS = - new LogStatement("Statistics", false, false, "charCount", "letterCount", "numberCount", - "spaceCount", "deleteOpsCount", "wordCount", "isEmptyUponStarting", - "isEmptinessStateKnown", "averageTimeBetweenKeys", "averageTimeBeforeDelete", - "averageTimeDuringRepeatedDelete", "averageTimeAfterDelete", - "dictionaryWordCount", "splitWordsCount", "gestureInputCount", - "gestureCharsCount", "gesturesDeletedCount", "manualSuggestionsCount", - "revertCommitsCount", "correctedWordsCount", "autoCorrectionsCount", - "publishableCount", "unpublishableStoppingCount", - "unpublishableIncorrectWordCount", "unpublishableSampledTooRecentlyCount", - "unpublishableDictionaryUnavailableCount", "unpublishableMayContainDigitCount", - "unpublishableNotInDictionaryCount"); - private static void logStatistics() { - final ResearchLogger researchLogger = getInstance(); - final Statistics statistics = researchLogger.mStatistics; - researchLogger.enqueueEvent(LOGSTATEMENT_STATISTICS, statistics.mCharCount, - statistics.mLetterCount, statistics.mNumberCount, statistics.mSpaceCount, - statistics.mDeleteKeyCount, statistics.mWordCount, statistics.mIsEmptyUponStarting, - statistics.mIsEmptinessStateKnown, statistics.mKeyCounter.getAverageTime(), - statistics.mBeforeDeleteKeyCounter.getAverageTime(), - statistics.mDuringRepeatedDeleteKeysCounter.getAverageTime(), - statistics.mAfterDeleteKeyCounter.getAverageTime(), - statistics.mDictionaryWordCount, statistics.mSplitWordsCount, - statistics.mGesturesInputCount, statistics.mGesturesCharsCount, - statistics.mGesturesDeletedCount, statistics.mManualSuggestionsCount, - statistics.mRevertCommitsCount, statistics.mCorrectedWordsCount, - statistics.mAutoCorrectionsCount, statistics.mPublishableCount, - statistics.mUnpublishableStoppingCount, statistics.mUnpublishableIncorrectWordCount, - statistics.mUnpublishableSampledTooRecently, - statistics.mUnpublishableDictionaryUnavailable, - statistics.mUnpublishableMayContainDigit, statistics.mUnpublishableNotInDictionary); - } -} diff --git a/java/src/com/android/inputmethod/research/ResearchSettings.java b/java/src/com/android/inputmethod/research/ResearchSettings.java deleted file mode 100644 index c0bc03fde..000000000 --- a/java/src/com/android/inputmethod/research/ResearchSettings.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.content.SharedPreferences; - -import java.util.UUID; - -public final class ResearchSettings { - public static final String PREF_RESEARCH_LOGGER_UUID = "pref_research_logger_uuid"; - public static final String PREF_RESEARCH_LOGGER_ENABLED_FLAG = - "pref_research_logger_enabled_flag"; - public static final String PREF_RESEARCH_LOGGER_HAS_SEEN_SPLASH = - "pref_research_logger_has_seen_splash"; - public static final String PREF_RESEARCH_LAST_DIR_CLEANUP_TIME = - "pref_research_last_dir_cleanup_time"; - - private ResearchSettings() { - // Intentional empty constructor for singleton. - } - - public static String readResearchLoggerUuid(final SharedPreferences prefs) { - if (prefs.contains(PREF_RESEARCH_LOGGER_UUID)) { - return prefs.getString(PREF_RESEARCH_LOGGER_UUID, null); - } - // Generate a random string as uuid if not yet set - final String newUuid = UUID.randomUUID().toString(); - prefs.edit().putString(PREF_RESEARCH_LOGGER_UUID, newUuid).apply(); - return newUuid; - } - - public static boolean readResearchLoggerEnabledFlag(final SharedPreferences prefs) { - return prefs.getBoolean(PREF_RESEARCH_LOGGER_ENABLED_FLAG, false); - } - - public static void writeResearchLoggerEnabledFlag(final SharedPreferences prefs, - final boolean isEnabled) { - prefs.edit().putBoolean(PREF_RESEARCH_LOGGER_ENABLED_FLAG, isEnabled).apply(); - } - - public static boolean readHasSeenSplash(final SharedPreferences prefs) { - return prefs.getBoolean(PREF_RESEARCH_LOGGER_HAS_SEEN_SPLASH, false); - } - - public static void writeHasSeenSplash(final SharedPreferences prefs, - final boolean hasSeenSplash) { - prefs.edit().putBoolean(PREF_RESEARCH_LOGGER_HAS_SEEN_SPLASH, hasSeenSplash).apply(); - } - - public static long readResearchLastDirCleanupTime(final SharedPreferences prefs) { - return prefs.getLong(PREF_RESEARCH_LAST_DIR_CLEANUP_TIME, 0L); - } - - public static void writeResearchLastDirCleanupTime(final SharedPreferences prefs, - final long lastDirCleanupTime) { - prefs.edit().putLong(PREF_RESEARCH_LAST_DIR_CLEANUP_TIME, lastDirCleanupTime).apply(); - } -} diff --git a/java/src/com/android/inputmethod/research/Statistics.java b/java/src/com/android/inputmethod/research/Statistics.java deleted file mode 100644 index fd323a104..000000000 --- a/java/src/com/android/inputmethod/research/Statistics.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.util.Log; - -import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.util.concurrent.TimeUnit; - -public class Statistics { - private static final String TAG = Statistics.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - - // TODO: Cleanup comments to only including those giving meaningful information. - // Number of characters entered during a typing session - int mCharCount; - // Number of letter characters entered during a typing session - int mLetterCount; - // Number of number characters entered - int mNumberCount; - // Number of space characters entered - int mSpaceCount; - // Number of delete operations entered (taps on the backspace key) - int mDeleteKeyCount; - // Number of words entered during a session. - int mWordCount; - // Number of words found in the dictionary. - int mDictionaryWordCount; - // Number of words split and spaces automatically entered. - int mSplitWordsCount; - // Number of words entered during a session. - int mCorrectedWordsCount; - // Number of gestures that were input. - int mGesturesInputCount; - // Number of gestures that were deleted. - int mGesturesDeletedCount; - // Total number of characters in words entered by gesture. - int mGesturesCharsCount; - // Number of manual suggestions chosen. - int mManualSuggestionsCount; - // Number of times that autocorrection was invoked. - int mAutoCorrectionsCount; - // Number of times a commit was reverted in this session. - int mRevertCommitsCount; - // Whether the text field was empty upon editing - boolean mIsEmptyUponStarting; - boolean mIsEmptinessStateKnown; - - // Counts of how often an n-gram is collected or not, and the reasons for the decision. - // Keep consistent with publishability result code list in MainLogBuffer - int mPublishableCount; - int mUnpublishableStoppingCount; - int mUnpublishableIncorrectWordCount; - int mUnpublishableSampledTooRecently; - int mUnpublishableDictionaryUnavailable; - int mUnpublishableMayContainDigit; - int mUnpublishableNotInDictionary; - - // Timers to count average time to enter a key, first press a delete key, - // between delete keys, and then to return typing after a delete key. - final AverageTimeCounter mKeyCounter = new AverageTimeCounter(); - final AverageTimeCounter mBeforeDeleteKeyCounter = new AverageTimeCounter(); - final AverageTimeCounter mDuringRepeatedDeleteKeysCounter = new AverageTimeCounter(); - final AverageTimeCounter mAfterDeleteKeyCounter = new AverageTimeCounter(); - - static class AverageTimeCounter { - int mCount; - int mTotalTime; - - public void reset() { - mCount = 0; - mTotalTime = 0; - } - - public void add(long deltaTime) { - mCount++; - mTotalTime += deltaTime; - } - - public int getAverageTime() { - if (mCount == 0) { - return 0; - } - return mTotalTime / mCount; - } - } - - // To account for the interruptions when the user's attention is directed elsewhere, times - // longer than MIN_TYPING_INTERMISSION are not counted when estimating this statistic. - public static final long MIN_TYPING_INTERMISSION = TimeUnit.SECONDS.toMillis(2); - public static final long MIN_DELETION_INTERMISSION = TimeUnit.SECONDS.toMillis(10); - - // The last time that a tap was performed - private long mLastTapTime; - // The type of the last keypress (delete key or not) - boolean mIsLastKeyDeleteKey; - - private static final Statistics sInstance = new Statistics(); - - public static Statistics getInstance() { - return sInstance; - } - - private Statistics() { - reset(); - } - - public void reset() { - mCharCount = 0; - mLetterCount = 0; - mNumberCount = 0; - mSpaceCount = 0; - mDeleteKeyCount = 0; - mWordCount = 0; - mDictionaryWordCount = 0; - mSplitWordsCount = 0; - mCorrectedWordsCount = 0; - mGesturesInputCount = 0; - mGesturesDeletedCount = 0; - mManualSuggestionsCount = 0; - mRevertCommitsCount = 0; - mAutoCorrectionsCount = 0; - mIsEmptyUponStarting = true; - mIsEmptinessStateKnown = false; - mKeyCounter.reset(); - mBeforeDeleteKeyCounter.reset(); - mDuringRepeatedDeleteKeysCounter.reset(); - mAfterDeleteKeyCounter.reset(); - mGesturesCharsCount = 0; - mGesturesDeletedCount = 0; - mPublishableCount = 0; - mUnpublishableStoppingCount = 0; - mUnpublishableIncorrectWordCount = 0; - mUnpublishableSampledTooRecently = 0; - mUnpublishableDictionaryUnavailable = 0; - mUnpublishableMayContainDigit = 0; - mUnpublishableNotInDictionary = 0; - - mLastTapTime = 0; - mIsLastKeyDeleteKey = false; - } - - public void recordChar(int codePoint, long time) { - if (DEBUG) { - Log.d(TAG, "recordChar() called"); - } - if (codePoint == Constants.CODE_DELETE) { - mDeleteKeyCount++; - recordUserAction(time, true /* isDeletion */); - } else { - mCharCount++; - if (Character.isDigit(codePoint)) { - mNumberCount++; - } - if (Character.isLetter(codePoint)) { - mLetterCount++; - } - if (Character.isSpaceChar(codePoint)) { - mSpaceCount++; - } - recordUserAction(time, false /* isDeletion */); - } - } - - public void recordWordEntered(final boolean isDictionaryWord, - final boolean containsCorrection) { - mWordCount++; - if (isDictionaryWord) { - mDictionaryWordCount++; - } - if (containsCorrection) { - mCorrectedWordsCount++; - } - } - - public void recordSplitWords() { - mSplitWordsCount++; - } - - public void recordGestureInput(final int numCharsEntered, final long time) { - mGesturesInputCount++; - mGesturesCharsCount += numCharsEntered; - recordUserAction(time, false /* isDeletion */); - } - - public void setIsEmptyUponStarting(final boolean isEmpty) { - mIsEmptyUponStarting = isEmpty; - mIsEmptinessStateKnown = true; - } - - public void recordGestureDelete(final int length, final long time) { - mGesturesDeletedCount++; - recordUserAction(time, true /* isDeletion */); - } - - public void recordManualSuggestion(final long time) { - mManualSuggestionsCount++; - recordUserAction(time, false /* isDeletion */); - } - - public void recordAutoCorrection(final long time) { - mAutoCorrectionsCount++; - recordUserAction(time, false /* isDeletion */); - } - - public void recordRevertCommit(final long time) { - mRevertCommitsCount++; - recordUserAction(time, true /* isDeletion */); - } - - private void recordUserAction(final long time, final boolean isDeletion) { - final long delta = time - mLastTapTime; - if (isDeletion) { - if (delta < MIN_DELETION_INTERMISSION) { - if (mIsLastKeyDeleteKey) { - mDuringRepeatedDeleteKeysCounter.add(delta); - } else { - mBeforeDeleteKeyCounter.add(delta); - } - } else { - ResearchLogger.onUserPause(delta); - } - } else { - if (mIsLastKeyDeleteKey && delta < MIN_DELETION_INTERMISSION) { - mAfterDeleteKeyCounter.add(delta); - } else if (!mIsLastKeyDeleteKey && delta < MIN_TYPING_INTERMISSION) { - mKeyCounter.add(delta); - } else { - ResearchLogger.onUserPause(delta); - } - } - mIsLastKeyDeleteKey = isDeletion; - mLastTapTime = time; - } - - public void recordPublishabilityResultCode(final int publishabilityResultCode) { - // Keep consistent with publishability result code list in MainLogBuffer - switch (publishabilityResultCode) { - case MainLogBuffer.PUBLISHABILITY_PUBLISHABLE: - mPublishableCount++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_STOPPING: - mUnpublishableStoppingCount++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_INCORRECT_WORD_COUNT: - mUnpublishableIncorrectWordCount++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_SAMPLED_TOO_RECENTLY: - mUnpublishableSampledTooRecently++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_DICTIONARY_UNAVAILABLE: - mUnpublishableDictionaryUnavailable++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_MAY_CONTAIN_DIGIT: - mUnpublishableMayContainDigit++; - break; - case MainLogBuffer.PUBLISHABILITY_UNPUBLISHABLE_NOT_IN_DICTIONARY: - mUnpublishableNotInDictionary++; - break; - } - } -} diff --git a/java/src/com/android/inputmethod/research/Uploader.java b/java/src/com/android/inputmethod/research/Uploader.java deleted file mode 100644 index c7ea3e69d..000000000 --- a/java/src/com/android/inputmethod/research/Uploader.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2013 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.research; - -import android.Manifest; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.BatteryManager; -import android.text.TextUtils; -import android.util.Log; - -import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.define.ProductionFlag; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -/** - * Manages the uploading of ResearchLog files. - */ -public final class Uploader { - private static final String TAG = Uploader.class.getSimpleName(); - private static final boolean DEBUG = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - // Set IS_INHIBITING_AUTO_UPLOAD to true for local testing - private static final boolean IS_INHIBITING_UPLOAD = false - && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; - private static final int BUF_SIZE = 1024 * 8; - - private final Context mContext; - private final ResearchLogDirectory mResearchLogDirectory; - private final URL mUrl; - - public Uploader(final Context context) { - mContext = context; - mResearchLogDirectory = new ResearchLogDirectory(context); - - final String urlString = context.getString(R.string.research_logger_upload_url); - if (TextUtils.isEmpty(urlString)) { - mUrl = null; - return; - } - URL url = null; - try { - url = new URL(urlString); - } catch (final MalformedURLException e) { - Log.e(TAG, "Bad URL for uploading", e); - } - mUrl = url; - } - - public boolean isPossibleToUpload() { - return hasUploadingPermission() && mUrl != null && !IS_INHIBITING_UPLOAD; - } - - private boolean hasUploadingPermission() { - final PackageManager packageManager = mContext.getPackageManager(); - return packageManager.checkPermission(Manifest.permission.INTERNET, - mContext.getPackageName()) == PackageManager.PERMISSION_GRANTED; - } - - public boolean isConvenientToUpload() { - return isExternallyPowered() && hasWifiConnection(); - } - - private boolean isExternallyPowered() { - final Intent intent = mContext.registerReceiver(null, new IntentFilter( - Intent.ACTION_BATTERY_CHANGED)); - final int pluggedState = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); - return pluggedState == BatteryManager.BATTERY_PLUGGED_AC - || pluggedState == BatteryManager.BATTERY_PLUGGED_USB; - } - - private boolean hasWifiConnection() { - final ConnectivityManager manager = - (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - final NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - return wifiInfo.isConnected(); - } - - public void doUpload() { - final File[] files = mResearchLogDirectory.getUploadableLogFiles(); - if (files == null) return; - for (final File file : files) { - uploadFile(file); - } - } - - private void uploadFile(final File file) { - if (DEBUG) { - Log.d(TAG, "attempting upload of " + file.getAbsolutePath()); - } - final int contentLength = (int) file.length(); - HttpURLConnection connection = null; - InputStream fileInputStream = null; - try { - fileInputStream = new FileInputStream(file); - connection = (HttpURLConnection) mUrl.openConnection(); - connection.setRequestMethod("PUT"); - connection.setDoOutput(true); - connection.setFixedLengthStreamingMode(contentLength); - final OutputStream outputStream = connection.getOutputStream(); - uploadContents(fileInputStream, outputStream); - if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { - Log.d(TAG, "upload failed: " + connection.getResponseCode()); - final InputStream netInputStream = connection.getInputStream(); - final BufferedReader reader = new BufferedReader(new InputStreamReader( - netInputStream)); - String line; - while ((line = reader.readLine()) != null) { - Log.d(TAG, "| " + reader.readLine()); - } - reader.close(); - return; - } - file.delete(); - if (DEBUG) { - Log.d(TAG, "upload successful"); - } - } catch (final IOException e) { - Log.e(TAG, "Exception uploading file", e); - } finally { - if (fileInputStream != null) { - try { - fileInputStream.close(); - } catch (final IOException e) { - Log.e(TAG, "Exception closing uploaded file", e); - } - } - if (connection != null) { - connection.disconnect(); - } - } - } - - private static void uploadContents(final InputStream is, final OutputStream os) - throws IOException { - // TODO: Switch to NIO. - final byte[] buf = new byte[BUF_SIZE]; - int numBytesRead; - while ((numBytesRead = is.read(buf)) != -1) { - os.write(buf, 0, numBytesRead); - } - } -} diff --git a/java/src/com/android/inputmethod/research/UploaderService.java b/java/src/com/android/inputmethod/research/UploaderService.java deleted file mode 100644 index fd3f2f60e..000000000 --- a/java/src/com/android/inputmethod/research/UploaderService.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.research; - -import android.app.AlarmManager; -import android.app.IntentService; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.SystemClock; - -/** - * Service to invoke the uploader. - * - * Can be regularly invoked, invoked on boot, etc. - */ -public final class UploaderService extends IntentService { - private static final String TAG = UploaderService.class.getSimpleName(); - public static final long RUN_INTERVAL = AlarmManager.INTERVAL_HOUR; - public static final String EXTRA_UPLOAD_UNCONDITIONALLY = UploaderService.class.getName() - + ".extra.UPLOAD_UNCONDITIONALLY"; - - public UploaderService() { - super("Research Uploader Service"); - } - - @Override - protected void onHandleIntent(final Intent intent) { - // We may reach this point either because the alarm fired, or because the system explicitly - // requested that an Upload occur. In the latter case, we want to cancel the alarm in case - // it's about to fire. - cancelAndRescheduleUploadingService(this, false /* needsRescheduling */); - - final Uploader uploader = new Uploader(this); - if (!uploader.isPossibleToUpload()) return; - if (isUploadingUnconditionally(intent.getExtras()) || uploader.isConvenientToUpload()) { - uploader.doUpload(); - } - cancelAndRescheduleUploadingService(this, true /* needsRescheduling */); - } - - private boolean isUploadingUnconditionally(final Bundle bundle) { - if (bundle == null) return false; - if (bundle.containsKey(EXTRA_UPLOAD_UNCONDITIONALLY)) { - return bundle.getBoolean(EXTRA_UPLOAD_UNCONDITIONALLY); - } - return false; - } - - /** - * Arrange for the UploaderService to be run on a regular basis. - * - * Any existing scheduled invocation of UploaderService is removed and optionally rescheduled. - * This may cause problems if this method is called so often that no scheduled invocation is - * ever run. But if the delay is short enough that it will go off when the user is sleeping, - * then there should be no starvation. - * - * @param context {@link Context} object - * @param needsRescheduling whether to schedule a future intent to be delivered to this service - */ - public static void cancelAndRescheduleUploadingService(final Context context, - final boolean needsRescheduling) { - final Intent intent = new Intent(context, UploaderService.class); - final PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); - final AlarmManager alarmManager = (AlarmManager) context.getSystemService( - Context.ALARM_SERVICE); - alarmManager.cancel(pendingIntent); - if (needsRescheduling) { - alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() - + UploaderService.RUN_INTERVAL, pendingIntent); - } - } -} diff --git a/java/src/com/android/inputmethod/research/ui/SplashScreen.java b/java/src/com/android/inputmethod/research/ui/SplashScreen.java deleted file mode 100644 index 78ed668d1..000000000 --- a/java/src/com/android/inputmethod/research/ui/SplashScreen.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2013 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.research.ui; - -import android.app.AlertDialog.Builder; -import android.app.Dialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; -import android.content.Intent; -import android.inputmethodservice.InputMethodService; -import android.net.Uri; -import android.os.IBinder; -import android.view.Window; -import android.view.WindowManager.LayoutParams; - -import com.android.inputmethod.latin.R.string; - -/** - * Show a dialog when the user first opens the keyboard. - * - * The splash screen is a modal dialog box presented when the user opens this keyboard for the first - * time. It is useful for giving specific warnings that must be shown to the user before use. - * - * While the splash screen does share with the setup wizard the common goal of presenting - * information to the user before use, they are presented at different times and with different - * capabilities. The setup wizard is launched by tapping on the icon, and walks the user through - * the setup process. It can, however, be bypassed by enabling the keyboard from Settings directly. - * The splash screen cannot be bypassed, and is therefore more appropriate for obtaining user - * consent. - */ -public class SplashScreen { - public interface UserConsentListener { - public void onSplashScreenUserClickedOk(); - } - - final UserConsentListener mListener; - final Dialog mSplashDialog; - - public SplashScreen(final InputMethodService inputMethodService, - final UserConsentListener listener) { - mListener = listener; - final Builder builder = new Builder(inputMethodService) - .setTitle(string.research_splash_title) - .setMessage(string.research_splash_content) - .setPositiveButton(android.R.string.yes, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mListener.onSplashScreenUserClickedOk(); - mSplashDialog.dismiss(); - } - }) - .setNegativeButton(android.R.string.no, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final String packageName = inputMethodService.getPackageName(); - final Uri packageUri = Uri.parse("package:" + packageName); - final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, - packageUri); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - inputMethodService.startActivity(intent); - } - }) - .setCancelable(true) - .setOnCancelListener( - new OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - inputMethodService.requestHideSelf(0); - } - }); - mSplashDialog = builder.create(); - } - - /** - * Show the splash screen. - * - * The user must consent to the terms presented in the SplashScreen before they can use the - * keyboard. If they cancel instead, they are given the option to uninstall the keybard. - * - * @param windowToken {@link IBinder} to attach dialog to - */ - public void showSplashScreen(final IBinder windowToken) { - final Window window = mSplashDialog.getWindow(); - final LayoutParams lp = window.getAttributes(); - lp.token = windowToken; - lp.type = LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; - window.setAttributes(lp); - window.addFlags(LayoutParams.FLAG_ALT_FOCUSABLE_IM); - mSplashDialog.show(); - } - - public boolean isShowing() { - return mSplashDialog.isShowing(); - } -} |